view src/indyvon/component.clj @ 14:0a2fafca72d8

Border layer decorator. Font render context. Manual identation for reify and proxy.
author Mikhail Kryshen <mikhail@kryshen.net>
date Tue, 15 Jun 2010 04:35:57 +0400
parents cd8a378414d1
children 87bd822aa815
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)))
13 (defn- make-update-fn [component]
14 (fn [] (.repaint component)))
16 (defn- font-context [component]
17 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
19 (defn make-component
20 ([layer]
21 (make-component layer (make-event-dispatcher)))
22 ([layer event-dispatcher]
23 (let [context (default-context)
24 component
25 (proxy [Component] []
26 (update [g] (.paint this g))
27 (paint [g]
28 (let [size (.getSize this)
29 width (.width size)
30 height (.height size)
31 context (assoc context
32 :font-context (.getFontRenderContext g)
33 :dispatcher event-dispatcher
34 :update-fn (make-update-fn this))]
35 (draw! context layer g 0 0 width height false))
36 (commit event-dispatcher))
37 (getPreferredSize []
38 (let [context (assoc context
39 :font-context (font-context this))
40 s (size layer context)]
41 (Dimension. (s 0) (s 1)))))]
42 (listen! event-dispatcher component)
43 (.setBackground component (-> context :theme :back-color))
44 component)))
46 (comment
47 (do
48 (def frame (java.awt.Frame. "Test"))
49 (def layer1
50 (reify-layer
51 (render! [this context g]
52 (register-context context)
53 (.setColor g Color/RED)
54 (.fillRect g 0 0 (:width context) (:height context)))
55 (size [this context] [30 20])))
56 (def layer1b (border-layer layer1 2 3))
57 (def layer2
58 (reify-layer
59 (render! [this context g]
60 (register-context context)
61 (.setColor g Color/YELLOW)
62 (.fillRect g 0 0 (:width context) (:height context))
63 (draw! context layer1b g 10 5)
64 (draw! context layer1 g 55 5))
65 (size [this context] [70 65])))
66 (def layer
67 (reify-layer
68 (render! [this context g]
69 (.drawLine g 0 0 (:width context) (:height context))
70 (draw! context layer2 g 15 20))
71 (size [this context] [100 100])))
72 (doto frame
73 (.addWindowListener
74 (proxy [java.awt.event.WindowAdapter] []
75 (windowClosing [event] (.dispose frame))))
76 (.add (make-component layer))
77 (.pack)
78 (.setVisible true))
80 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_ENTERED]
81 [layer context event]
82 (println "1 ENTERED"))
83 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_EXITED]
84 [layer context event]
85 (println "1 EXITED"))
86 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_MOVED]
87 [layer context event]
88 (println "1 MOVED"))
89 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_ENTERED]
90 [layer context event]
91 (println "2 ENTERED"))
92 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_EXITED]
93 [layer context event]
94 (println "2 EXITED"))
95 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_MOVED]
96 [layer context event]
97 (println "2 MOVED"))
98 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_DRAGGED]
99 [layer context event]
100 (println "2 DRAGGED"))
101 )
102 )