-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathDrJavelin.jvl
122 lines (99 loc) · 3.59 KB
/
DrJavelin.jvl
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
; DrJavelin
(import javax.swing java.awt java.awt.event java.io java.util)
(def title "DrJavelin")
(def aCurFileName "")
(. javax.swing.UIManager setLookAndFeel
(. javax.swing.UIManager getSystemLookAndFeelClassName)) ; make look native
(def frame (new JFrame))
(defn updateFileName (fileName)
(set! aCurFileName fileName)
(. frame setTitle (str aCurFileName " - " title)))
(updateFileName "")
(def text (new TextArea 20 80))
(def textf (new TextField))
(def button (new JButton "Eval"))
(defn eval-string (code)
(eval (read-string (str "(do " code "\n)"))))
(defn eval-code (code)
(eval-string code))
(. button addActionListener
(reify ActionListener
(actionPerformed (this e)
(eval-code (. text getText)))))
(defn eval-print (code)
(println ">" code)
(prn (eval-code code)))
(. textf addActionListener
(reify ActionListener
(actionPerformed (this e)
(eval-print (. textf getText))
(. textf setText nil))))
(def fc (new javax.swing.JFileChooser))
(. fc setFileFilter (new javax.swing.filechooser.FileNameExtensionFilter "Javelin file (*.jvl)" (. "jvl" split " ")))
(def panel (new JPanel))
(defn char->int (c) (. Character getNumericValue c))
(def menuBar (new JMenuBar))
(def menuFile (new JMenu "File"))
(. menuFile setMnemonic (char->int \f))
(def menuNew (new JMenuItem "New" (char->int \n)))
(def menuOpen (new JMenuItem "Open..." (char->int \o)))
(def menuSave (new JMenuItem "Save" (char->int \s)))
(def menuSaveAs (new JMenuItem "Save As..." (char->int \a)))
(. menuNew setAccelerator (. KeyStroke getKeyStroke "control N"))
(. menuOpen setAccelerator (. KeyStroke getKeyStroke "control O"))
(. menuSave setAccelerator (. KeyStroke getKeyStroke "control S"))
(. menuSaveAs setAccelerator (. KeyStroke getKeyStroke "control alt S"))
(def menuExit (new JMenuItem "Exit" (char->int \x)))
(. menuBar add menuFile)
(. menuFile add menuNew)
(. menuFile add menuOpen)
(. menuFile add menuSave)
(. menuFile add menuSaveAs)
(. menuFile addSeparator)
(. menuFile add menuExit)
(. frame setJMenuBar menuBar)
(. menuNew addActionListener
(reify ActionListener
(actionPerformed (this e)
(updateFileName "")
(. text setText ""))))
(. menuOpen addActionListener
(reify ActionListener
(actionPerformed (this e)
(when (= (. fc showOpenDialog nil) (. javax.swing.JFileChooser -APPROVE_OPTION))
(let (fileName (. (. fc getSelectedFile) getCanonicalPath))
(updateFileName fileName)
(. text setText (slurp fileName)))))))
(defn fileSave (fileName)
(spit fileName (. text getText)))
(defn fileSaveAs ()
(when (= (. fc showSaveDialog nil) (. javax.swing.JFileChooser -APPROVE_OPTION))
(let (fileName (. (. fc getSelectedFile) getCanonicalPath))
(updateFileName fileName)
(fileSave fileName))))
(. menuSave addActionListener
(reify ActionListener
(actionPerformed (this e)
(if (= aCurFileName "")
(fileSaveAs)
(fileSave aCurFileName)))))
(. menuSaveAs addActionListener
(reify ActionListener
(actionPerformed (this e)
(fileSaveAs))))
(. menuExit addActionListener
(reify ActionListener
(actionPerformed (this e)
(. System exit 0))))
(. frame setDefaultCloseOperation (. JFrame -EXIT_ON_CLOSE))
(let (font (new Font "Monospaced" (. Font -PLAIN) 12))
(. text setFont font)
(. textf setFont font))
(. panel setLayout (new BoxLayout panel (. BoxLayout -PAGE_AXIS)))
(. frame add button (. BorderLayout -NORTH))
(. frame add text)
(. panel add textf)
(. frame add panel (. BorderLayout -SOUTH))
(. frame pack)
(. frame setVisible true)
(. textf requestFocus)