Skip to content

Commit d24826d

Browse files
Merge pull request #122 from alhimik45/master
Bug fixes and improvements
2 parents 7fba05b + a5786ab commit d24826d

9 files changed

+421
-229
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.lein-deps-sum
2+
classes/
3+
lib/

project.clj

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
(defproject clooj "0.4.4"
1+
(defproject clooj "0.5"
22
:description "clooj, a small IDE for clojure"
33
:url "https://github.com/arthuredelstein/clooj"
44
:license {:name "Eclipse Public License"
55
:url "http://www.eclipse.org/legal/epl-v10.html"}
66
:main clooj.core
7-
:dependencies [[org.clojure/clojure "1.5.0"]
7+
:dependencies [[org.clojure/clojure "1.5.1"]
88
[clj-inspector "0.0.12"]
99
[slamhound "1.2.0"]
1010
[com.cemerick/pomegranate "0.0.11"]
11-
[com.fifesoft/rsyntaxtextarea "2.0.2"]
12-
[org.clojure/tools.nrepl "0.2.2"]])
11+
[com.fifesoft/rsyntaxtextarea "2.5.0"]
12+
[org.clojure/tools.nrepl "0.2.3"]])

src/clooj/core.clj

+122-52
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,18 @@
77
(:import (javax.swing AbstractListModel BorderFactory JDialog
88
JFrame JLabel JList JMenuBar JOptionPane
99
JPanel JScrollPane JSplitPane JTextArea
10-
JTextField JTree KeyStroke SpringLayout JTextPane
10+
JTextField JTree KeyStroke SpringLayout
11+
JTextPane JCheckBox JButton
1112
ListSelectionModel
1213
UIManager)
1314
(javax.swing.event TreeSelectionListener
1415
TreeExpansionListener)
1516
(javax.swing.tree DefaultMutableTreeNode DefaultTreeModel
1617
TreePath TreeSelectionModel)
1718
(java.awt Insets Rectangle Window)
18-
(java.awt.event AWTEventListener FocusAdapter
19-
MouseAdapter WindowAdapter KeyAdapter)
19+
(java.awt.event AWTEventListener FocusAdapter
20+
MouseAdapter WindowAdapter
21+
ActionListener KeyAdapter)
2022
(java.awt AWTEvent Color Font GridLayout Toolkit)
2123
(java.net URL)
2224
(java.util.concurrent LinkedBlockingQueue)
@@ -34,10 +36,10 @@
3436
[clooj.navigate :as navigate]
3537
[clooj.project :as project]
3638
[clooj.indent :as indent]
37-
[clooj.style :as style]
3839
[clooj.brackets :as brackets]
3940
[clooj.highlighting :as highlighting]
40-
[clooj.search :as search])
41+
[clooj.search :as search]
42+
[clooj.settings :as settings])
4143
(:gen-class
4244
:methods [^{:static true} [show [] void]]))
4345

@@ -72,6 +74,7 @@
7274
(.setBracketMatchingEnabled false)
7375
(.setAutoIndentEnabled false)
7476
(.setAntiAliasingEnabled true)
77+
(.setLineWrap wrap)
7578
))
7679

7780
(def get-clooj-version
@@ -84,46 +87,74 @@
8487
URL. slurp read-string (nth 2))
8588
(catch Exception _ nil)))))
8689

87-
;; font
88-
89-
(defonce current-font (atom nil))
90-
91-
(defn font [name size]
92-
(Font. name Font/PLAIN size))
93-
94-
(def default-font
95-
(cond (utils/is-mac) ["Monaco" 11]
96-
(utils/is-win) ["Courier New" 12]
97-
:else ["Monospaced" 12]))
90+
;; settings
91+
92+
(def default-settings
93+
(merge
94+
(zipmap [:font-name :font-size]
95+
(cond (utils/is-mac) ["Monaco" 11]
96+
(utils/is-win) ["Courier New" 12]
97+
:else ["Monospaced" 12]))
98+
{:line-wrap-doc false
99+
:line-wrap-repl-out false
100+
:line-wrap-repl-in false
101+
:show-only-monospaced-fonts true
102+
}))
103+
104+
(defn load-settings []
105+
(atom
106+
(merge default-settings
107+
(utils/read-value-from-prefs utils/clooj-prefs "settings"))))
108+
109+
(defn save-settings [settings]
110+
(utils/write-value-to-prefs
111+
utils/clooj-prefs
112+
"settings"
113+
settings))
114+
115+
(defn apply-settings [app settings]
116+
117+
(defn set-line-wrapping [text-area mode]
118+
(.setLineWrap text-area mode))
98119

99-
(defn set-font
100-
([app font-name size]
101-
(let [f (font font-name size)]
120+
(defn set-font
121+
[app font-name size]
122+
(let [f (Font. font-name Font/PLAIN size)]
102123
(utils/awt-event
103-
(utils/write-value-to-prefs utils/clooj-prefs "app-font"
104-
[font-name size])
105124
(dorun (map #(.setFont (app %) f)
106125
[:doc-text-area :repl-in-text-area
107126
:repl-out-text-area :arglist-label
108127
:search-text-area :help-text-area
109-
:completion-list]))
110-
(reset! current-font [font-name size]))))
111-
([app font-name]
112-
(let [size (second @current-font)]
113-
(set-font app font-name size))))
114-
115-
(defn load-font [app]
116-
(apply set-font app (or (utils/read-value-from-prefs utils/clooj-prefs "app-font")
117-
default-font)))
128+
:completion-list])))))
129+
130+
(set-line-wrapping
131+
(:doc-text-area app)
132+
(:line-wrap-doc settings))
133+
(set-line-wrapping
134+
(:repl-in-text-area app)
135+
(:line-wrap-repl-in settings))
136+
(set-line-wrapping
137+
(:repl-out-text-area app)
138+
(:line-wrap-repl-out settings))
118139

140+
(set-font app
141+
(:font-name settings)
142+
(:font-size settings))
143+
(reset! (:settings app) settings)
144+
(save-settings settings))
145+
146+
;; font
147+
119148
(defn resize-font [app fun]
120-
(let [[name size] @current-font]
121-
(set-font app name (fun size))))
149+
(apply-settings app (update-in @(:settings app)
150+
[:font-size]
151+
fun)))
122152

123153
(defn grow-font [app] (resize-font app inc))
124154

125155
(defn shrink-font [app] (resize-font app dec))
126156

157+
127158
;; caret finding
128159

129160
(def highlight-agent (agent nil))
@@ -285,11 +316,18 @@
285316
(defn make-scroll-pane [text-area]
286317
(RTextScrollPane. text-area))
287318

288-
(defn setup-search-text-area [app]
319+
(defn setup-search-elements [app]
320+
(.setVisible (:search-match-case-checkbox app) false)
321+
(.setVisible (:search-regex-checkbox app) false)
322+
(doto (:search-close-button app)
323+
(.setVisible false)
324+
(.setBorder nil)
325+
(.addActionListener
326+
(reify ActionListener
327+
(actionPerformed [_ _] (search/stop-find app)))))
289328
(let [sta (doto (app :search-text-area)
290329
(.setVisible false)
291-
(.setBorder (BorderFactory/createLineBorder Color/DARK_GRAY))
292-
(.addFocusListener (proxy [FocusAdapter] [] (focusLost [_] (search/stop-find app)))))]
330+
(.setBorder (BorderFactory/createLineBorder Color/DARK_GRAY)))]
293331
(utils/add-text-change-listener sta #(search/update-find-highlight % app false))
294332
(utils/attach-action-keys sta ["ENTER" #(search/highlight-step app false)]
295333
["shift ENTER" #(search/highlight-step app true)]
@@ -300,11 +338,12 @@
300338
(.setVisible true)
301339
))
302340

303-
(defn exit-if-closed [^java.awt.Window f]
341+
(defn exit-if-closed [^java.awt.Window f app]
304342
(when-not @embedded
305343
(.addWindowListener f
306344
(proxy [WindowAdapter] []
307345
(windowClosing [_]
346+
(save-caret-position app)
308347
(System/exit 0))))))
309348

310349
(def no-project-txt
@@ -326,6 +365,19 @@
326365
(select menu <b>File > New...</b>)<br>
327366
&nbsp;2. edit an existing file by selecting one at left.</html>")
328367

368+
(defn move-caret-to-line [textarea]
369+
"Move caret to choosen line"
370+
371+
(defn current-line []
372+
(inc (.getLineOfOffset textarea (.getCaretPosition textarea))))
373+
374+
(let [line-str (utils/ask-value "Line number:" "Go to Line")
375+
line-num (Integer.
376+
(if (or (nil? line-str) (nil? (re-find #"\d+" line-str)))
377+
(current-line)
378+
(re-find #"\d+" line-str)))]
379+
(utils/scroll-to-line textarea line-num)
380+
(.requestFocus textarea)))
329381

330382
(defn open-project [app]
331383
(when-let [dir (utils/choose-directory (app :f) "Choose a project directory")]
@@ -369,7 +421,7 @@
369421
(defn create-app []
370422
(let [doc-text-panel (JPanel.)
371423
doc-label (JLabel. "Source Editor")
372-
repl-out-text-area (JTextArea.)
424+
repl-out-text-area (make-text-area false)
373425
repl-out-scroll-pane (repl-output/tailing-scroll-pane repl-out-text-area)
374426
repl-out-writer (repl/make-repl-writer repl-out-text-area)
375427
repl-in-text-area (make-text-area false)
@@ -380,6 +432,9 @@
380432
completion-list (JList.)
381433
completion-scroll-pane (JScrollPane. completion-list)
382434
search-text-area (JTextField.)
435+
search-match-case-checkbox (JCheckBox. "Match case")
436+
search-regex-checkbox (JCheckBox. "Regex")
437+
search-close-button (JButton. "X")
383438
arglist-label (create-arglist-label)
384439
pos-label (JLabel.)
385440
frame (JFrame.)
@@ -418,6 +473,9 @@
418473
docs-tree-panel
419474
docs-tree-label
420475
search-text-area
476+
search-match-case-checkbox
477+
search-regex-checkbox
478+
search-close-button
421479
pos-label
422480
repl-out-writer
423481
doc-split-pane
@@ -430,7 +488,8 @@
430488
))
431489
doc-text-area (new-doc-text-area app)
432490
doc-scroll-pane (make-scroll-pane doc-text-area)
433-
app (assoc app :doc-text-area doc-text-area)]
491+
app (assoc app :doc-text-area doc-text-area)
492+
app (assoc app :settings (load-settings))]
434493
(doto frame
435494
(.setBounds 25 50 950 700)
436495
(.setLayout layout)
@@ -442,7 +501,10 @@
442501
(.add doc-label)
443502
(.add pos-label)
444503
(.add search-text-area)
445-
(.add arglist-label))
504+
(.add arglist-label)
505+
(.add search-match-case-checkbox)
506+
(.add search-regex-checkbox)
507+
(.add search-close-button))
446508
(doto docs-tree-panel
447509
(.setLayout (SpringLayout.))
448510
(.add docs-tree-label)
@@ -471,16 +533,21 @@
471533
navigate/attach-navigation-keys)
472534
(.setSyntaxEditingStyle repl-in-text-area
473535
SyntaxConstants/SYNTAX_STYLE_CLOJURE)
536+
(.setSyntaxEditingStyle repl-out-text-area
537+
SyntaxConstants/SYNTAX_STYLE_CLOJURE)
474538
(.setModel docs-tree (DefaultTreeModel. nil))
475539
(utils/constrain-to-parent split-pane :n gap :w gap :s (- gap) :e (- gap))
476540
(utils/constrain-to-parent doc-label :n 0 :w 0 :n 15 :e 0)
477541
(utils/constrain-to-parent doc-scroll-pane :n 16 :w 0 :s -16 :e 0)
478542
(utils/constrain-to-parent pos-label :s -14 :w 0 :s 0 :w 100)
479-
(utils/constrain-to-parent search-text-area :s -15 :w 80 :s 0 :w 300)
543+
(utils/constrain-to-parent search-text-area :s -15 :w 100 :s 0 :w 350)
544+
(utils/constrain-to-parent search-match-case-checkbox :s -15 :w 355 :s 0 :w 470)
545+
(utils/constrain-to-parent search-regex-checkbox :s -15 :w 475 :s 0 :w 550)
546+
(utils/constrain-to-parent search-close-button :s -15 :w 65 :s 0 :w 95)
480547
(utils/constrain-to-parent arglist-label :s -14 :w 80 :s -1 :e -10)
481548
(.layoutContainer layout frame)
482-
(exit-if-closed frame)
483-
(setup-search-text-area app)
549+
(exit-if-closed frame app)
550+
(setup-search-elements app)
484551
(activate-caret-highlighter app)
485552
(setup-temp-writer app)
486553
(utils/attach-action-keys doc-text-area
@@ -522,17 +589,19 @@
522589
(.setText doc-label (str "Source Editor \u2014 " (.getPath file)))
523590
(.setEditable text-area true)
524591
(.setSyntaxEditingStyle text-area
525-
(let [file-name (.getName file-to-open)]
592+
(let [file-name (.getName file-to-open)]
526593
(if (or (.endsWith file-name ".clj")
527594
(.endsWith file-name ".clj~"))
528595
SyntaxConstants/SYNTAX_STYLE_CLOJURE
529596
SyntaxConstants/SYNTAX_STYLE_NONE))))
530597
(do (.setText text-area no-project-txt)
531598
(.setText doc-label (str "Source Editor (No file selected)"))
532599
(.setEditable text-area false)))
533-
(update-caret-position text-area)
600+
534601
(indent/setup-autoindent text-area)
535602
(reset! (app :file) file)
603+
(load-caret-position app)
604+
(update-caret-position text-area)
536605
(repl/apply-namespace-to-repl app)
537606
(reset! changing-file false)))
538607

@@ -556,8 +625,8 @@
556625
(def project-clj-text (.trim
557626
"
558627
(defproject PROJECTNAME \"1.0.0-SNAPSHOT\"
559-
:description \"FIXME: write\"
560-
:dependencies [[org.clojure/clojure \"1.3.0\"]])
628+
:description \"FIXME: write description\"
629+
:dependencies [[org.clojure/clojure \"1.5.1\"]])
561630
"))
562631

563632
(defn specify-source [project-dir title default-namespace]
@@ -690,12 +759,12 @@
690759
["Move/Rename" "M" nil #(project/rename-project app)]
691760
["Remove" nil nil #(remove-project app)])
692761
(utils/add-menu menu-bar "Source" "U"
693-
["Comment-out" "C" "cmd1 SEMICOLON" #(utils/comment-out (:doc-text-area app))]
694-
["Uncomment-out" "U" "cmd1 shift SEMICOLON" #(utils/uncomment-out (:doc-text-area app))]
762+
["Comment" "C" "cmd1 SEMICOLON" #(utils/toggle-comment (:doc-text-area app))]
695763
["Fix indentation" "F" "cmd1 BACK_SLASH" #(indent/fix-indent-selected-lines (:doc-text-area app))]
696764
["Indent lines" "I" "cmd1 CLOSE_BRACKET" #(utils/indent (:doc-text-area app))]
697765
["Unindent lines" "D" "cmd1 OPEN_BRACKET" #(utils/unindent (:doc-text-area app))]
698766
["Name search/docs" "S" "TAB" #(help/show-tab-help app (help/find-focused-text-pane app) inc)]
767+
["Go to line..." "G" "cmd1 L" #(move-caret-to-line (:doc-text-area app))]
699768
;["Go to definition" "G" "cmd1 D" #(goto-definition (repl/get-file-ns app) app)]
700769
)
701770
(utils/add-menu menu-bar "REPL" "R"
@@ -716,8 +785,8 @@
716785
["Go to Project Tree" "P" "cmd1 1" #(.requestFocusInWindow (:docs-tree app))]
717786
["Increase font size" nil "cmd1 PLUS" #(grow-font app)]
718787
["Decrease font size" nil "cmd1 MINUS" #(shrink-font app)]
719-
["Choose font..." nil nil #(apply style/show-font-window
720-
app set-font @current-font)])))
788+
["Settings" nil nil #(settings/show-settings-window
789+
app apply-settings)])))
721790

722791

723792
(defn add-visibility-shortcut [app]
@@ -757,8 +826,9 @@
757826
(setup-tree app)
758827
(let [tree (app :docs-tree)]
759828
(project/load-expanded-paths tree)
760-
(project/load-tree-selection tree))
761-
(load-font app)))
829+
(when (false? (project/load-tree-selection tree))
830+
(repl/start-repl app nil)))
831+
(apply-settings app @(:settings app))))
762832

763833
(defn -show []
764834
(reset! embedded true)

src/clooj/project.clj

+5-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@
121121

122122
(defn load-tree-selection [tree]
123123
(let [path (utils/read-value-from-prefs utils/clooj-prefs "tree-selection")]
124-
(set-tree-selection tree path)))
124+
(if (nil? path)
125+
false
126+
(do
127+
(set-tree-selection tree path)
128+
true))))
125129

126130
;;;;;;;;;;;;;;;;;;;
127131

0 commit comments

Comments
 (0)