view src/net/kryshen/indyvon/component.clj @ 60:7e456697924d

Asynchronous drawing (continue).
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 23 Aug 2010 21:24:33 +0400
parents 64b67aa224f4
children fd1bcb67bc32
line source
1 ;;
2 ;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net>
3 ;;
4 ;; This file is part of Indyvon.
5 ;;
7 (ns net.kryshen.indyvon.component
8 "Integrating Indyvon into AWT and Swing components."
9 (:use
10 net.kryshen.indyvon.core)
11 (:import
12 (net.kryshen.indyvon.core Size Bounds)
13 (java.awt Graphics2D Component Dimension Color)
14 (java.awt.geom Rectangle2D$Double)
15 (javax.swing JFrame JPanel)))
17 (defn- font-context [^Component component]
18 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
20 (defn paint-component
21 [^Component component layer ^Graphics2D graphics event-dispatcher]
22 (let [size (.getSize component)
23 width (.width size)
24 height (.height size)
25 update-fn #(.repaint component)]
26 (.clearRect graphics 0 0 width height)
27 (context-draw! layer component graphics event-dispatcher update-fn
28 width height)))
30 (defn preferred-size [component layer]
31 (binding [*target* component
32 *font-context*' (font-context component)]
33 (let [s (layer-size layer)]
34 (Dimension. (:width s) (:height s)))))
36 (defn make-jpanel
37 ([layer]
38 (make-jpanel layer (root-event-dispatcher)))
39 ([layer event-dispatcher]
40 (let [panel
41 (proxy [JPanel] []
42 (paintComponent [g]
43 (paint-component this layer g event-dispatcher))
44 (getPreferredSize []
45 (preferred-size this layer)))]
46 (.setBackground panel (:back-color *theme*))
47 (listen! event-dispatcher panel)
48 panel)))