view src/indyvon/component.clj @ 12:cd8a378414d1

Support mouse button events.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 14 Jun 2010 05:04:03 +0400
parents ea6fc44f19c8
children 0a2fafca72d8
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 make-component
17 ([layer]
18 (make-component layer (make-event-dispatcher)))
19 ([layer event-dispatcher]
20 (let [component
21 (proxy [Component] []
22 (update [g] (.paint this g))
23 (paint [g]
24 (let [size (.getSize this)
25 width (.width size)
26 height (.height size)
27 context (assoc (default-context)
28 :dispatcher event-dispatcher
29 :update-fn (make-update-fn this))]
30 (draw! context layer g 0 0 width height false))
31 (commit event-dispatcher))
32 (getPreferredSize []
33 ;; TODO: supply context
34 (let [s (size layer nil)]
35 (Dimension. (s 0) (s 1)))))]
36 (listen! event-dispatcher component)
37 component)))
39 (comment
40 (do
41 (def frame (java.awt.Frame. "Test"))
42 (def layer1
43 (reify-layer
44 (render! [this context g]
45 (register-context context)
46 (.setColor g Color/WHITE)
47 (.fillRect g 0 0 (:width context) (:height context)))
48 (size [this context] [30 20])))
49 (def layer2
50 (reify-layer
51 (render! [this context g]
52 (register-context context)
53 (.setColor g Color/BLUE)
54 (.fillRect g 0 0 (:width context) (:height context))
55 (draw! context layer1 g 10 5)
56 (draw! context layer1 g 50 5))
57 (size [this context] [70 65])))
58 (def layer
59 (reify-layer
60 (render! [this context g]
61 ;;(register-context context)
62 (.drawLine g 0 0 (:width context) (:height context))
63 (draw! context layer2 g 15 20))
64 (size [this context] [100 100])))
65 (doto frame
66 (.addWindowListener
67 (proxy [java.awt.event.WindowAdapter] []
68 (windowClosing [event] (.dispose frame))))
69 (.add (make-component layer))
70 (.pack)
71 (.setVisible true))
73 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_ENTERED]
74 [layer context event]
75 (println "1 ENTERED"))
76 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_EXITED]
77 [layer context event]
78 (println "1 EXITED"))
79 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_MOVED]
80 [layer context event]
81 (println "1 MOVED"))
82 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_ENTERED]
83 [layer context event]
84 (println "2 ENTERED"))
85 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_EXITED]
86 [layer context event]
87 (println "2 EXITED"))
88 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_MOVED]
89 [layer context event]
90 (println "2 MOVED"))
91 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_DRAGGED]
92 [layer context event]
93 (println "2 DRAGGED"))
94 )
95 )