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 1d2dfe5026a8
children 64b67aa224f4
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 (.clearRect graphics 0 0 width height)
26 (binding [*graphics* graphics
27 *font-context* (.getFontRenderContext graphics)
28 *initial-transform* (.getTransform graphics)
29 *inverse-initial-transform*
30 (-> graphics .getTransform .createInverse)
31 *target* component
32 *event-dispatcher* event-dispatcher
33 *update* #(.repaint component)
34 *width* width
35 *height* height
36 *clip* (Rectangle2D$Double. 0 0 width height)]
37 (render! layer)
38 (commit event-dispatcher))))
40 (defn preferred-size [component layer]
41 (binding [*target* component
42 *font-context*' (font-context component)]
43 (let [s (layer-size layer)]
44 (Dimension. (:width s) (:height s)))))
46 (defn make-jpanel
47 ([layer]
48 (make-jpanel layer (root-event-dispatcher)))
49 ([layer event-dispatcher]
50 (let [panel
51 (proxy [JPanel] []
52 (paintComponent [g]
53 (paint-component this layer g event-dispatcher))
54 (getPreferredSize []
55 (preferred-size this layer)))]
56 (.setBackground panel (:back-color *theme*))
57 (listen! event-dispatcher panel)
58 panel)))