view src/indyvon/component.clj @ 19:43f0d78057a9

New event dispatching code that uses weak references to allow listened layers to be garbage-collected.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 17 Jun 2010 20:59:22 +0400
parents 31382464ef27
children a70609bad3a4
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"))
52 (def layer1
53 (reify Layer
54 (render! [this context g]
55 (register-context context)
56 (.setColor g Color/RED)
57 (.fillRect g 0 0 (:width context) (:height context)))
58 (size [this context] [30 20])))
59 (def layer1b (border-layer layer1 2 3))
60 (def layer2
61 (reify Layer
62 (render! [this context g]
63 (register-context context)
64 (.setColor g Color/YELLOW)
65 (.fillRect g 0 0 (:width context) (:height context))
66 (draw! context layer1b g 10 5)
67 (draw! context layer1 g 55 5))
68 (size [this context] [70 65])))
69 (def layer3
70 (border-layer (text-layer "Sample\ntext" :right :bottom)))
71 (def layer
72 (reify Layer
73 (render! [this context g]
74 (.drawLine g 0 0 (:width context) (:height context))
75 (draw! context layer2 g 15 20)
76 (draw! context layer3 g 100 100 80 50))
77 (size [this context] [400 300])))
78 (doto frame
79 (.addWindowListener
80 (proxy [java.awt.event.WindowAdapter] []
81 (windowClosing [event] (.dispose frame))))
82 (.. (getContentPane) (add (make-jpanel layer)))
83 (.pack)
84 (.setVisible true))
86 (add-listener layer1 MouseEvent/MOUSE_ENTERED
87 (fn [context event] (println "1 ENTERED")))
88 (add-listener layer1 MouseEvent/MOUSE_EXITED
89 (fn [context event] (println "1 EXITED")))
90 (add-listener layer1 MouseEvent/MOUSE_MOVED
91 (fn [context event] (println "1 MOVED")))
92 (add-listener layer2 MouseEvent/MOUSE_ENTERED
93 (fn [context event] (println "2 ENTERED")))
94 (add-listener layer2 MouseEvent/MOUSE_EXITED
95 (fn [context event] (println "2 EXITED")))
96 (add-listener layer2 MouseEvent/MOUSE_MOVED
97 (fn [context event] (println "2 MOVED")))
98 (add-listener layer2 MouseEvent/MOUSE_DRAGGED
99 (fn [context event] (println "2 DRAGGED")))
100 )
101 )