view src/indyvon/component.clj @ 16:0fda22fc53d2

Remove anchor from Layer protocol. More function text layout calculation.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 17 Jun 2010 05:20:37 +0400
parents 87bd822aa815
children 31382464ef27
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 layer3
67 (border-layer (text-layer "Sample\ntext" :right :bottom)))
68 (def layer
69 (reify Layer
70 (render! [this context g]
71 (.drawLine g 0 0 (:width context) (:height context))
72 (draw! context layer2 g 15 20)
73 (draw! context layer3 g 100 100 80 50))
74 (size [this context] [300 400])))
75 (doto frame
76 (.addWindowListener
77 (proxy [java.awt.event.WindowAdapter] []
78 (windowClosing [event] (.dispose frame))))
79 (.add (make-component layer))
80 (.pack)
81 (.setVisible true))
83 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_ENTERED]
84 [layer context event]
85 (println "1 ENTERED"))
86 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_EXITED]
87 [layer context event]
88 (println "1 EXITED"))
89 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_MOVED]
90 [layer context event]
91 (println "1 MOVED"))
92 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_ENTERED]
93 [layer context event]
94 (println "2 ENTERED"))
95 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_EXITED]
96 [layer context event]
97 (println "2 EXITED"))
98 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_MOVED]
99 [layer context event]
100 (println "2 MOVED"))
101 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_DRAGGED]
102 [layer context event]
103 (println "2 DRAGGED"))
104 )
105 )