view src/indyvon/component.clj @ 21:a70609bad3a4

Simpler event dispatching.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sat, 19 Jun 2010 04:27:29 +0400
parents 43f0d78057a9
children dc81033d4122
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.event)
10 (:import (java.awt Component Dimension Color)
11 (java.awt.event MouseEvent)
12 (javax.swing JFrame JPanel)))
14 (defn- font-context [component]
15 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
17 (defn paint-component [component layer context graphics]
18 (let [size (.getSize component)
19 width (.width size)
20 height (.height size)
21 context (assoc context
22 :font-context (.getFontRenderContext graphics)
23 :update-fn #(.repaint component))]
24 (draw! context layer graphics 0 0 width height false))
25 (commit (:dispatcher context)))
27 (defn preferred-size [component layer context]
28 (let [context (assoc context
29 :font-context (font-context component))
30 s (size layer context)]
31 (Dimension. (s 0) (s 1))))
33 (defn make-jpanel
34 ([layer]
35 (make-jpanel layer (make-event-dispatcher)))
36 ([layer event-dispatcher]
37 (let [context (default-context)
38 context (assoc context :dispatcher event-dispatcher)
39 panel
40 (proxy [JPanel] []
41 (paintComponent [g]
42 (paint-component this layer context g))
43 (getPreferredSize []
44 (preferred-size this layer context)))]
45 (listen! event-dispatcher panel)
46 (.setBackground panel (-> context :theme :back-color))
47 panel)))
49 (comment
50 (do
51 (def frame (JFrame. "Test"))
53 (defn handler [context event]
54 (println (:layer context) (.paramString event)))
56 (def layer1
57 (reify Layer
58 (render! [this context g]
59 (mouse-handler context handler)
60 (.setColor g Color/RED)
61 (.fillRect g 0 0 (:width context) (:height context)))
62 (size [this context] [30 20])
63 (toString [this] "layer1")))
65 (def layer1b (border-layer layer1 2 3))
67 (def layer2
68 (reify Layer
69 (render! [this context g]
70 (mouse-handler context handler)
71 (.setColor g Color/YELLOW)
72 (.fillRect g 0 0 (:width context) (:height context))
73 (draw! context layer1b g 10 5)
74 (draw! context layer1 g 55 5))
75 (size [this context] [70 65])
76 (toString [this] "layer2")))
78 (def layer3
79 (border-layer (text-layer "Sample\ntext" :right :bottom)))
81 (def layer
82 (reify Layer
83 (render! [this context g]
84 (.drawLine g 0 0 (:width context) (:height context))
85 (draw! context layer2 g 15 20)
86 (draw! context layer3 g 100 100 80 50))
87 (size [this context] [400 300])
88 (toString [this] "layer")))
90 (doto frame
91 (.addWindowListener
92 (proxy [java.awt.event.WindowAdapter] []
93 (windowClosing [event] (.dispose frame))))
94 (.. (getContentPane) (add (make-jpanel layer)))
95 (.pack)
96 (.setVisible true))
97 )
98 )