view src/indyvon/component.clj @ 35:0d593970cb76

Separate namespace for demo and experiments.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 08 Jul 2010 06:02:12 +0400
parents 6975b9a71eec
children
line source
1 ;;
2 ;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net>
3 ;;
4 ;; This file is part of Indyvon.
5 ;;
7 (ns indyvon.component
8 (:use indyvon.core
9 indyvon.layers)
10 (:import (indyvon.core Size Bounds)
11 (java.awt Graphics2D Component Dimension Color)
12 (javax.swing JFrame JPanel)))
14 (defn- font-context [^Component component]
15 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
17 (defn paint-component
18 [^Component component layer ^Graphics2D graphics event-dispatcher]
19 (let [size (.getSize component)
20 width (.width size)
21 height (.height size)]
22 (.clearRect graphics 0 0 width height)
23 (let [bounds (Bounds. 0 0 width height)]
24 (binding [*graphics* graphics
25 *font-context* (.getFontRenderContext graphics)
26 *target* component
27 *event-dispatcher* event-dispatcher
28 *update* #(.repaint component)
29 *bounds* bounds
30 *clip* bounds]
31 (render! layer nil)
32 (commit event-dispatcher)))))
34 (defn preferred-size [component layer]
35 (binding [*target* component
36 *font-context*' (font-context component)]
37 (let [s (size layer nil)]
38 (Dimension. (:width s) (:height s)))))
40 (defn make-jpanel
41 ([layer]
42 (make-jpanel layer (root-event-dispatcher)))
43 ([layer event-dispatcher]
44 (let [panel
45 (proxy [JPanel] []
46 (paintComponent [g]
47 (paint-component this layer g event-dispatcher))
48 (getPreferredSize []
49 (preferred-size this layer)))]
50 (.setBackground panel (:back-color *theme*))
51 (listen! event-dispatcher panel)
52 panel)))