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))
    )
  )