changeset 4:0771180bf7c2

Abandoned approach at event dispatching.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 10 Jun 2010 02:54:35 +0400
parents 6bc931b1b755
children 74f1f265c3d9
files project.clj src/indyvon/component.clj src/indyvon/core.clj
diffstat 3 files changed, 101 insertions(+), 38 deletions(-) [+]
line diff
     1.1 --- a/project.clj	Tue Jun 08 15:24:45 2010 +0400
     1.2 +++ b/project.clj	Thu Jun 10 02:54:35 2010 +0400
     1.3 @@ -2,4 +2,5 @@
     1.4    :description "FIXME: write"
     1.5    :dependencies [[org.clojure/clojure "1.2.0-master-SNAPSHOT"]
     1.6                   [org.clojure/clojure-contrib "1.2.0-SNAPSHOT"]]
     1.7 -  :dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"]])
     1.8 +  :dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"]]
     1.9 +  :namespaces [indyvon.core])
     2.1 --- a/src/indyvon/component.clj	Tue Jun 08 15:24:45 2010 +0400
     2.2 +++ b/src/indyvon/component.clj	Thu Jun 10 02:54:35 2010 +0400
     2.3 @@ -1,17 +1,54 @@
     2.4  ;; (ns indyvon.component
     2.5 -;;   (:use indyvon.layer)
     2.6 -;;   (:import (java.awt Graphics Graphics2D))
     2.7 +;;   (:use indyvon.core)
     2.8 +;;   (:import (java.awt Graphics Graphics2D Dimension AWTEvent))
     2.9  ;;   (:gen-class
    2.10 -;;    :name indyvon.Component
    2.11 +;;    :name indyvon.IdvComponent
    2.12  ;;    :extends java.awt.Component
    2.13 -;;    :constructor {[Layer] []}
    2.14 -;;    :state layer
    2.15 -;;    :init init-state))
    2.16 +;;    :constructors {[indyvon.core.Layer] [],
    2.17 +;;                   [indyvon.core.Layer indyvon.core.EventDispatcher] []}
    2.18 +;;    :exposes-methods {enableEvents enableEventsSuper}
    2.19 +;;    :state state
    2.20 +;;    :init init
    2.21 +;;    :post-init post-init))
    2.22  
    2.23 -;; (defn- init-state [layer]
    2.24 -;;   [[] layer])
    2.25 +;; (defrecord State [layer event])
    2.26  
    2.27 -;; (defn -paint [this graphics])
    2.28 +;; (defn- -init
    2.29 +;;   ([layer]
    2.30 +;;      [[] (State. layer (make-event-dispatcher))])
    2.31 +;;   ([layer dispatcher]
    2.32 +;;      [[] (State. layer dispatcher)]))
    2.33  
    2.34 -;; (defn -update [this graphics]
    2.35 -;;      (-paint this graphics))
    2.36 +;; (defn -enableEvents [this mask]
    2.37 +;;   (.enableEventsSuper this mask))
    2.38 +
    2.39 +;; (defn- -post-init [this & args]
    2.40 +;;   (.enableEvents
    2.41 +;;    this
    2.42 +;;    ^long (reduce bit-or
    2.43 +;;                  [AWTEvent/MOUSE_EVENT_MASK
    2.44 +;;                   AWTEvent/MOUSE_MOTION_EVENT_MASK
    2.45 +;;                   AWTEvent/MOUSE_WHEEL_EVENT_MASK
    2.46 +;;                   AWTEvent/KEY_EVENT_MASK])))
    2.47 +
    2.48 +;; (defn- make-update-fn [component]
    2.49 +;;   (fn [] (.repaint component)))
    2.50 +
    2.51 +;; (defn -paint [this g]
    2.52 +;;   (let [layer (-> this .state :layer)
    2.53 +;;         size (.getSize this)
    2.54 +;;         width (.width size)
    2.55 +;;         height (.height size)]
    2.56 +;;     (binding [*graphics* g
    2.57 +;;               *update-fn* (make-update-fn this)]
    2.58 +;;       (render-layer! layer 0 0 width height false))))
    2.59 +
    2.60 +;; (defn -update [this g]
    2.61 +;;      (-paint this g))
    2.62 +
    2.63 +;; (defn -processEvent [this event]
    2.64 +;;   (dispatch (-> this .state :dispatcher) event))
    2.65 +
    2.66 +;; (defn -getPreferredSize [this]
    2.67 +;;   (let [s (-> this .state :layer size)]
    2.68 +;;     (Dimension. (s 0) (s 1))))
     3.1 --- a/src/indyvon/core.clj	Tue Jun 08 15:24:45 2010 +0400
     3.2 +++ b/src/indyvon/core.clj	Thu Jun 10 02:54:35 2010 +0400
     3.3 @@ -1,5 +1,7 @@
     3.4  (ns indyvon.core
     3.5 -  (:import (java.awt Dimension Point Component Graphics2D AWTEvent)))
     3.6 +  (:import (java.awt Dimension Point Component Graphics2D AWTEvent)
     3.7 +           (java.awt.event MouseAdapter MouseMotionAdapter
     3.8 +                           MouseListener MouseMotionListener)))
     3.9  
    3.10  (def ^{:private true} *rx* 0)
    3.11  (def ^{:private true} *ry* 0)
    3.12 @@ -64,33 +66,51 @@
    3.13    (fn [layer event]
    3.14      [layer (.getID event)]))
    3.15  
    3.16 -(defmethod handle-layer-event :default [layer event])
    3.17 +(defmethod handle-layer-event :default [layer event]
    3.18 +           false)
    3.19  
    3.20  (defprotocol EventDispatcher
    3.21    (register [this layer])
    3.22    (commit [this])
    3.23    (dispatch [this event]))
    3.24  
    3.25 +;;(defrecord LayerContextState [hovered contexts])
    3.26 +
    3.27  (defrecord LayerContext [layer rx ry width height update-fn])
    3.28  
    3.29 +;; LayerContext сам реализует EventDispatcher.
    3.30 +;; Дерево диспетчеров-контекстов.
    3.31 +;; Передача события от корня.
    3.32 +
    3.33  (defn make-event-dispatcher []
    3.34 -  (let [contexts-r (ref [])
    3.35 -        contexts-d (ref [])]
    3.36 +  (let [contexts-r (ref []) ; register
    3.37 +        contexts (ref [])   ; dispatch
    3.38 +        hovered (ref [])
    3.39 +        picked (ref [])]
    3.40      (reify
    3.41       EventDispatcher
    3.42       (register [this layer]
    3.43 -      (dosync
    3.44 -       (alter contexts-r conj
    3.45 -              (LayerContext. layer *rx* *ry*
    3.46 -                             *width* *height*
    3.47 -                             *update-fn*))))
    3.48 +               (dosync
    3.49 +                (alter contexts-r conj
    3.50 +                       (LayerContext. layer *rx* *ry*
    3.51 +                                      *width* *height*
    3.52 +                                      *update-fn*))))
    3.53       (commit [this]
    3.54 -      (dosync (ref-set contexts-d @contexts-r)
    3.55 -              (ref-set contexts-r [])))
    3.56 +             (dosync (ref-set contexts @contexts-r)
    3.57 +                     (ref-set contexts-r [])))
    3.58       (dispatch [this event]
    3.59                 (println "dispatch" this event)
    3.60                 ;; TODO
    3.61 -               ))))
    3.62 +               )
    3.63 +     MouseListener
    3.64 +     (mouseClicked [this event])
    3.65 +     (mouseEntered [this event])
    3.66 +     (mouseExited [this event])
    3.67 +     (mousePressed [this event])
    3.68 +     (mouseReleased [this event])
    3.69 +     MouseMotionListener
    3.70 +     (mouseDragged [this event])
    3.71 +     (mouseMoved [this event]))))
    3.72  
    3.73  ;;
    3.74  ;; Connection to AWT.
    3.75 @@ -121,20 +141,25 @@
    3.76    ([layer]
    3.77       (make-component layer (make-event-dispatcher)))
    3.78    ([layer event-dispatcher]
    3.79 -     (proxy [Component] []
    3.80 -       (update [g] (.paint this g))
    3.81 -       (paint [g]
    3.82 -              (let [size (.getSize this)
    3.83 -                    width (.width size)
    3.84 -                    height (.height size)]
    3.85 -                (binding [*graphics* g
    3.86 -                          *update-fn* (make-update-fn this)]
    3.87 -                  (render-layer! layer 0 0 width height false))))
    3.88 -       (getPreferredSize []
    3.89 -                         (let [s (size layer)]
    3.90 -                           (Dimension. (s 0) (s 1))))
    3.91 -       (processEvent [event]
    3.92 -                     (dispatch event-dispatcher event)))))
    3.93 +     (doto
    3.94 +         (proxy [Component] []
    3.95 +           (update [g] (.paint this g))
    3.96 +           (paint [g]
    3.97 +                  (let [size (.getSize this)
    3.98 +                        width (.width size)
    3.99 +                        height (.height size)]
   3.100 +                    (binding [*graphics* g
   3.101 +                              *update-fn* (make-update-fn this)]
   3.102 +                      (render-layer! layer 0 0 width height false))))
   3.103 +           (getPreferredSize []
   3.104 +                             (let [s (size layer)]
   3.105 +                               (Dimension. (s 0) (s 1))))
   3.106 +           (processEvent [event]
   3.107 +                         (dispatch event-dispatcher event)))
   3.108 +       ;; No way to call protected final evenbleEvents even in gen-class,
   3.109 +       ;; have to use the following hack:
   3.110 +       (.addMouseListener (proxy [MouseAdapter] []))
   3.111 +       (.addMouseMotionListener (proxy [MouseMotionAdapter] [])))))
   3.112  
   3.113  (comment
   3.114    (do