Paste number 69519: System tray app with SWT - comments?

Index of paste annotations: 2 | 1

Paste number 69519: System tray app with SWT - comments?
Pasted by: sohail
When:8 months, 2 days ago
Share:Tweet this! | http://paste.lisp.org/+1HN3
Channel:#clojure
Paste contents:
Raw Source | XML | Display As
(ns bugdock
  (:import (org.eclipse.swt SWT)
           (org.eclipse.swt.widgets Display Shell Menu MenuItem TrayItem Listener)
           (org.eclipse.swt.graphics Image)))

(defmacro unless [cond & body]
  `(when (not ~cond)
     ~@body))

(defmacro while [cond & body]
  `(when ~cond
     (loop []
       ~@body
       (when ~cond 
         (recur)))))

(defmacro with-swt [[display-var shell-var] & body]
  `(let [~display-var (new Display)
         ~shell-var (new Shell ~display-var)]
     ~@body
     (.open ~shell-var)
     (while (not (.isDisposed ~shell-var))
       (if (not (.readAndDispatch ~display-var))
         (.sleep ~display-var)))))

(defmacro proxy-listener [arg-list & body]
  `(proxy [Listener] []
     (handleEvent ~arg-list
       ~@body)))

(defn main []
  (with-swt [display shell]
    (let [image (new Image display 16 16)
          tray (.getSystemTray display)
          item (new TrayItem tray (.NONE SWT))
          menu (new Menu shell (.POP_UP SWT))]
      (doto item
        (setToolTipText "SWT TrayItem")
        (addListener (.Show SWT)
                     (proxy-listener [e]
                       (println "Show")))
        (addListener (.Hide SWT)
                     (proxy-listener [e]
                       (println "Hide")))
        (addListener (.Selection SWT)
                     (proxy-listener [e]
                       (println "Selection")))
        (addListener (.DefaultSelection SWT)
                     (proxy-listener [e]
                       (println "Default selection"))))
      (dotimes i 8
        (let [mi (new MenuItem menu (.PUSH SWT))]
          (doto mi
            (setText (str "Item" i))
            (addListener (.Selection SWT)
                         (proxy-listener [e]
                           (println (str "selection " (.widget e))))))
          (when (= 0 i)
            (.setDefaultItem menu mi))))
      (doto item
        (addListener (.MenuDetect SWT)
                     (proxy-listener [e]
                       (.setVisible menu true)))
        (setImage image)))
    (.setBounds shell 50 50 300 200)))
      
(main)

Annotations for this paste:

Annotation number 2: hmm
Pasted by: Chousuke
When:8 months, 2 days ago
Share:Tweet this! | http://paste.lisp.org/+1HN3#2
Paste contents:
Raw Source | Display As
(defmacro proxy-listener [arg-list & body]
  `(proxy [Listener] []
     (~'handleEvent ~arg-list ; to prevent it from expanding to bugdock/handleEvent
       ~@body)))

Annotation number 1: for h4ns
Pasted by: sohail
When:8 months, 2 days ago
Share:Tweet this! | http://paste.lisp.org/+1HN3#1
Paste contents:
Raw Source | Display As
(ns bugdock
  (:import (org.eclipse.swt SWT)
           (org.eclipse.swt.widgets Display Shell Menu MenuItem TrayItem Listener)
           (org.eclipse.swt.graphics Image)))

(defmacro unless [cond & body]
  `(when (not ~cond)
     ~@body))

(defmacro while [cond & body]
  `(when ~cond
     (loop []
       ~@body
       (when ~cond 
         (recur)))))

(defmacro with-swt [[display-var shell-var] & body]
  `(let [~display-var (new Display)
         ~shell-var (new Shell ~display-var)]
     ~@body
     (.open ~shell-var)
     (while (not (.isDisposed ~shell-var))
       (unless (.readAndDispatch ~display-var)
         (.sleep ~display-var)))))

(defmacro proxy-listener [arg-list & body]
  `(proxy [Listener] []
     (handleEvent ~arg-list
       ~@body)))

(defn main []
  (with-swt [display shell]
    (let [image (new Image display 16 16)
          tray (.getSystemTray display)
          item (new TrayItem tray SWT/NONE)
          menu (new Menu shell SWT/POP_UP)]
      (doto item
        (setToolTipText "SWT TrayItem")
        (addListener SWT/Show
                     (proxy-listener [e]
                       (println "Show")))
        (addListener SWT/Hide
                     (proxy-listener [e]
                       (println "Hide")))
        (addListener SWT/Selection
                     (proxy-listener [e]
                       (println "Selection")))
        (addListener SWT/DefaultSelection
                     (proxy-listener [e]
                       (println "Default selection"))))
      (dotimes i 8
        (let [mi (new MenuItem menu SWT/PUSH)]
          (doto mi
            (setText (str "Item" i))
            (addListener (.Selection SWT)
                         (proxy-listener [e]
                           (println (str "selection " (.widget e))))))
          (when (= 0 i)
            (.setDefaultItem menu mi))))
      (doto item
        (addListener SWT/MenuDetect
                     (proxy-listener [e]
                       (.setVisible menu true)))
        (setImage image)))
    (.setBounds shell 50 50 300 200)))
      
(main)

Colorize as:
Show Line Numbers
Index of paste annotations: 2 | 1

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.