view src/net/kryshen/indyvon/component.clj @ 56:87400ec6d433

Update to clojure 1.2.0.
author Mikhail Kryshen <mikhail@kryshen.net>
date Fri, 20 Aug 2010 03:08:02 +0400
parents 6adbc03a52cb
children 64b67aa224f4
line wrap: on
line source

;;
;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net>
;;
;; This file is part of Indyvon.
;;

(ns net.kryshen.indyvon.component
  "Integrating Indyvon into AWT and Swing components."
  (:use
   net.kryshen.indyvon.core)
  (:import
   (net.kryshen.indyvon.core Size Bounds)
   (java.awt Graphics2D Component Dimension Color)
   (java.awt.geom Rectangle2D$Double)
   (javax.swing JFrame JPanel)))

(defn- font-context [^Component component]
  (.getFontRenderContext (.getFontMetrics component (.getFont component))))

(defn paint-component
  [^Component component layer ^Graphics2D graphics event-dispatcher]
  (let [size (.getSize component)
        width (.width size)
        height (.height size)]
    (.clearRect graphics 0 0 width height)
    (binding [*graphics* graphics
              *font-context* (.getFontRenderContext graphics)
              *initial-transform* (.getTransform graphics)
              *inverse-initial-transform*
                (-> graphics .getTransform .createInverse)
              *target* component
              *event-dispatcher* event-dispatcher
              *update* #(.repaint component)
              *width* width
              *height* height
              *clip* (Rectangle2D$Double. 0 0 width height)]
      (render! layer)
      (commit event-dispatcher))))

(defn preferred-size [component layer]
  (binding [*target* component
            *font-context*' (font-context component)]
    (let [s (layer-size layer)]
      (Dimension. (:width s) (:height s)))))

(defn make-jpanel
  ([layer]
     (make-jpanel layer (root-event-dispatcher)))
  ([layer event-dispatcher]
     (let [panel
           (proxy [JPanel] []
             (paintComponent [g]
                (paint-component this layer g event-dispatcher))
             (getPreferredSize []
                (preferred-size this layer)))]
       (.setBackground panel (:back-color *theme*))
       (listen! event-dispatcher panel)
       panel)))