view src/indyvon/component.clj @ 17:31382464ef27

Use Swing instead of plain AWT to get double buffering.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 17 Jun 2010 05:42:05 +0400
parents 0fda22fc53d2
children 43f0d78057a9
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 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_ENTERED]
87 [layer context event]
88 (println "1 ENTERED"))
89 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_EXITED]
90 [layer context event]
91 (println "1 EXITED"))
92 (defmethod handle-layer-event [layer1 MouseEvent/MOUSE_MOVED]
93 [layer context event]
94 (println "1 MOVED"))
95 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_ENTERED]
96 [layer context event]
97 (println "2 ENTERED"))
98 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_EXITED]
99 [layer context event]
100 (println "2 EXITED"))
101 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_MOVED]
102 [layer context event]
103 (println "2 MOVED"))
104 (defmethod handle-layer-event [layer2 MouseEvent/MOUSE_DRAGGED]
105 [layer context event]
106 (println "2 DRAGGED"))
107 )
108 )