view src/net/kryshen/indyvon/component.clj @ 67:a19cf5007d14

Asynchronous drawing.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sat, 28 Aug 2010 02:37:30 +0400
parents a1999c1f7289
children 59e1810c0278
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 make-jpanel
  ([layer]
     (make-jpanel layer (root-event-dispatcher)))
  ([layer event-dispatcher]
     (let [panel
           (proxy [JPanel] []
             (paintComponent [g]
                (let [size (.getSize ^Component this)]
                  (draw-root! layer g (.width size) (.height size)
                              event-dispatcher this)))
             (getPreferredSize []
                (let [s (root-size layer (font-context this) this)]
                  (Dimension. (:width s) (:height s)))))]
       (.setBackground panel (:back-color *theme*))
       (add-observer panel layer (fn [_] (.repaint panel)))
       (listen! event-dispatcher panel)
       panel)))