Mercurial > hg > indyvon
view src/indyvon/component.clj @ 21:a70609bad3a4
Simpler event dispatching.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Sat, 19 Jun 2010 04:27:29 +0400 |
parents | 43f0d78057a9 |
children | dc81033d4122 |
line wrap: on
line source
;; ;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net> ;; ;; This file is part of Indyvon. ;; (ns indyvon.component (:use indyvon.core indyvon.event) (:import (java.awt Component Dimension Color) (java.awt.event MouseEvent) (javax.swing JFrame JPanel))) (defn- font-context [component] (.getFontRenderContext (.getFontMetrics component (.getFont component)))) (defn paint-component [component layer context graphics] (let [size (.getSize component) width (.width size) height (.height size) context (assoc context :font-context (.getFontRenderContext graphics) :update-fn #(.repaint component))] (draw! context layer graphics 0 0 width height false)) (commit (:dispatcher context))) (defn preferred-size [component layer context] (let [context (assoc context :font-context (font-context component)) s (size layer context)] (Dimension. (s 0) (s 1)))) (defn make-jpanel ([layer] (make-jpanel layer (make-event-dispatcher))) ([layer event-dispatcher] (let [context (default-context) context (assoc context :dispatcher event-dispatcher) panel (proxy [JPanel] [] (paintComponent [g] (paint-component this layer context g)) (getPreferredSize [] (preferred-size this layer context)))] (listen! event-dispatcher panel) (.setBackground panel (-> context :theme :back-color)) panel))) (comment (do (def frame (JFrame. "Test")) (defn handler [context event] (println (:layer context) (.paramString event))) (def layer1 (reify Layer (render! [this context g] (mouse-handler context handler) (.setColor g Color/RED) (.fillRect g 0 0 (:width context) (:height context))) (size [this context] [30 20]) (toString [this] "layer1"))) (def layer1b (border-layer layer1 2 3)) (def layer2 (reify Layer (render! [this context g] (mouse-handler context handler) (.setColor g Color/YELLOW) (.fillRect g 0 0 (:width context) (:height context)) (draw! context layer1b g 10 5) (draw! context layer1 g 55 5)) (size [this context] [70 65]) (toString [this] "layer2"))) (def layer3 (border-layer (text-layer "Sample\ntext" :right :bottom))) (def layer (reify Layer (render! [this context g] (.drawLine g 0 0 (:width context) (:height context)) (draw! context layer2 g 15 20) (draw! context layer3 g 100 100 80 50)) (size [this context] [400 300]) (toString [this] "layer"))) (doto frame (.addWindowListener (proxy [java.awt.event.WindowAdapter] [] (windowClosing [event] (.dispose frame)))) (.. (getContentPane) (add (make-jpanel layer))) (.pack) (.setVisible true)) ) )