aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/miglayout/example.clj
blob: 45b44370a9fe8eaf9d4f6c66e8f501c443d84b96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
;;  Copyright (c) Stephen C. Gilardi. All rights reserved.  The use and
;;  distribution terms for this software are covered by the Eclipse Public
;;  License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can
;;  be found in the file epl-v10.html at the root of this distribution.  By
;;  using this software in any fashion, you are agreeing to be bound by the
;;  terms of this license.  You must not remove this notice, or any other,
;;  from this software.
;;
;;  clojure.contrib.miglayout.example
;;
;;  Temperature converter using miglayout. Demonstrates accessing components
;;  by their id constraint.
;;
;;  scgilardi (gmail)
;;  Created 31 May 2009

(ns clojure.contrib.miglayout.example
  (:import (javax.swing JButton JFrame JLabel JPanel JTextField))
  (:use (clojure.contrib
         [miglayout :only (miglayout components)]
         [swing-utils :only (add-action-listener)])))

(defn fahrenheit
  "Converts a Celsius temperature to Fahrenheit. Input and output are
  strings. Returns \"input?\" if the input can't be parsed as a Double."
  [celsius]
  (try
   (format "%.2f \u00b0Fahrenheit"
           (+ 32 (* 1.8 (Double/parseDouble celsius))))
   (catch NumberFormatException _
     "input?")))

(defn main
  "Lays out and displays the Temperature Converter UI"
  []
  (let [panel
        (miglayout (JPanel.)
         (JTextField.) {:id :input :width 120}
         (JLabel. "\u00b0Celsius") :wrap
         (JButton. "Convert") {:id :convert}
         (JLabel. "\u00b0Fahrenheit") {:id :output :width 120})
        {:keys [convert input output]} (components panel)]
    (add-action-listener convert
      (fn [evt in out] (.setText out (fahrenheit (.getText in))))
      input output)
    (doto (JFrame. "Temperature Converter")
      (.add panel)
      (.pack)
      (.setVisible true))))