|
16 | 16 | (javax.swing.tree DefaultMutableTreeNode DefaultTreeModel
|
17 | 17 | TreePath TreeSelectionModel)
|
18 | 18 | (java.awt Insets Rectangle Window)
|
19 |
| - (java.awt.event AWTEventListener FocusAdapter |
20 |
| - MouseAdapter WindowAdapter |
| 19 | + (java.awt.event AWTEventListener FocusAdapter |
| 20 | + MouseAdapter WindowAdapter |
21 | 21 | ActionListener KeyAdapter)
|
22 | 22 | (java.awt AWTEvent Color Font GridLayout Toolkit)
|
23 | 23 | (java.net URL)
|
|
26 | 26 | (java.io File FileReader StringReader
|
27 | 27 | BufferedWriter OutputStreamWriter FileOutputStream)
|
28 | 28 | (org.fife.ui.rsyntaxtextarea RSyntaxTextArea SyntaxConstants
|
29 |
| - TokenMakerFactory) |
| 29 | + TokenMakerFactory) |
30 | 30 | (org.fife.ui.rtextarea RTextScrollPane))
|
31 | 31 | (:require [clojure.set]
|
32 | 32 | [clooj.repl.main :as repl]
|
|
55 | 55 | (extend-type RSyntaxTextArea
|
56 | 56 | DynamicWordHighlighter
|
57 | 57 | (addWordToHighlight [word token-type]))
|
58 |
| - |
| 58 | + |
59 | 59 | (defn make-rsyntax-text-area []
|
60 | 60 | (let [tmf (TokenMakerFactory/getDefaultInstance)
|
61 | 61 | token-maker (.getTokenMaker tmf "text/clojure")
|
|
67 | 67 | token-type)))]
|
68 | 68 | (.. rsta getDocument (setTokenMakerFactory tmf))
|
69 | 69 | rsta))
|
70 |
| - |
| 70 | + |
71 | 71 | (defn make-text-area [wrap]
|
72 | 72 | (doto (RSyntaxTextArea.)
|
73 | 73 | (.setAnimateBracketMatching false)
|
|
90 | 90 | ;; settings
|
91 | 91 |
|
92 | 92 | (def default-settings
|
93 |
| - (merge |
94 |
| - (zipmap [:font-name :font-size] |
| 93 | + (merge |
| 94 | + (zipmap [:font-name :font-size] |
95 | 95 | (cond (utils/is-mac) ["Monaco" 11]
|
96 | 96 | (utils/is-win) ["Courier New" 12]
|
97 | 97 | :else ["Monospaced" 12]))
|
|
107 | 107 | (utils/read-value-from-prefs utils/clooj-prefs "settings"))))
|
108 | 108 |
|
109 | 109 | (defn save-settings [settings]
|
110 |
| - (utils/write-value-to-prefs |
111 |
| - utils/clooj-prefs |
| 110 | + (utils/write-value-to-prefs |
| 111 | + utils/clooj-prefs |
112 | 112 | "settings"
|
113 | 113 | settings))
|
114 | 114 |
|
115 | 115 | (defn apply-settings [app settings]
|
116 |
| - |
117 |
| - (defn set-line-wrapping [text-area mode] |
118 |
| - (.setLineWrap text-area mode)) |
119 |
| - |
120 |
| - (defn set-font |
121 |
| - [app font-name size] |
122 |
| - (let [f (Font. font-name Font/PLAIN size)] |
123 |
| - (utils/awt-event |
124 |
| - (dorun (map #(.setFont (app %) f) |
125 |
| - [:doc-text-area :repl-in-text-area |
126 |
| - :repl-out-text-area :arglist-label |
127 |
| - :search-text-area :help-text-area |
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)) |
139 |
| - |
140 |
| - (set-font app |
141 |
| - (:font-name settings) |
142 |
| - (:font-size settings)) |
| 116 | + (letfn [(set-line-wrapping [text-area mode] |
| 117 | + (.setLineWrap text-area mode)) |
| 118 | + (set-font |
| 119 | + [app font-name size] |
| 120 | + (let [f (Font. font-name Font/PLAIN size)] |
| 121 | + (utils/awt-event |
| 122 | + (dorun (map #(.setFont (app %) f) |
| 123 | + [:doc-text-area :repl-in-text-area |
| 124 | + :repl-out-text-area :arglist-label |
| 125 | + :search-text-area :help-text-area |
| 126 | + :completion-list])))))] |
| 127 | + |
| 128 | + (set-line-wrapping |
| 129 | + (:doc-text-area app) |
| 130 | + (:line-wrap-doc settings)) |
| 131 | + (set-line-wrapping |
| 132 | + (:repl-in-text-area app) |
| 133 | + (:line-wrap-repl-in settings)) |
| 134 | + (set-line-wrapping |
| 135 | + (:repl-out-text-area app) |
| 136 | + (:line-wrap-repl-out settings)) |
| 137 | + |
| 138 | + (set-font app |
| 139 | + (:font-name settings) |
| 140 | + (:font-size settings))) |
143 | 141 | (reset! (:settings app) settings)
|
144 | 142 | (save-settings settings))
|
145 | 143 |
|
|
206 | 204 | (highlighting/highlight-brackets text-comp good-enclosures bad-brackets)))))
|
207 | 205 | (catch Throwable t (utils/awt-event (.printStackTrace t))))))
|
208 | 206 | (when ns
|
209 |
| - (send-off arglist-agent |
| 207 | + (send-off arglist-agent |
210 | 208 | (fn [old-pos]
|
211 | 209 | (try
|
212 | 210 | (let [pos (@caret-position text-comp)]
|
|
215 | 213 | (help/arglist-from-caret-pos app ns text pos)]
|
216 | 214 | (utils/awt-event (.setText (:arglist-label app) arglist-text)))))
|
217 | 215 | (catch Throwable t (utils/awt-event (.printStackTrace t)))))))))
|
218 |
| - |
| 216 | + |
219 | 217 | ;; highlighting
|
220 | 218 |
|
221 | 219 | (defn activate-caret-highlighter [app]
|
|
245 | 243 | ;; temp files
|
246 | 244 |
|
247 | 245 | (defn dump-temp-doc [app orig-f txt]
|
248 |
| - (try |
| 246 | + (try |
249 | 247 | (when orig-f
|
250 | 248 | (let [orig (.getAbsolutePath orig-f)
|
251 | 249 | f (.getAbsolutePath (project/get-temp-file orig-f))]
|
|
268 | 266 | (dump-temp-doc app f txt))
|
269 | 267 | pos)
|
270 | 268 | (catch Throwable t (utils/awt-event (.printStackTrace t))))))))
|
271 |
| - |
| 269 | + |
272 | 270 | (defn setup-temp-writer [app]
|
273 | 271 | (let [text-comp (:doc-text-area app)]
|
274 | 272 | (utils/add-text-change-listener text-comp
|
|
283 | 281 | last-dot (.lastIndexOf name ".")
|
284 | 282 | suffix (.substring name (inc last-dot))]
|
285 | 283 | suffix))
|
286 |
| - |
| 284 | + |
287 | 285 | (defn text-file? [f]
|
288 | 286 | (not (some #{(file-suffix f)}
|
289 | 287 | ["jar" "class" "dll" "jpg" "png" "bmp"])))
|
|
310 | 308 | (not= f @(app :file))
|
311 | 309 | (text-file? f))
|
312 | 310 | (restart-doc app f))))))))))
|
313 |
| - |
| 311 | + |
314 | 312 | ;; build gui
|
315 | 313 |
|
316 | 314 | (defn make-scroll-pane [text-area]
|
|
322 | 320 | (doto (:search-close-button app)
|
323 | 321 | (.setVisible false)
|
324 | 322 | (.setBorder nil)
|
325 |
| - (.addActionListener |
| 323 | + (.addActionListener |
326 | 324 | (reify ActionListener
|
327 | 325 | (actionPerformed [_ _] (search/stop-find app)))))
|
328 | 326 | (let [sta (doto (app :search-text-area)
|
|
343 | 341 | (.addWindowListener f
|
344 | 342 | (proxy [WindowAdapter] []
|
345 | 343 | (windowClosing [_]
|
346 |
| - (save-caret-position app) |
| 344 | + (save-caret-position app) |
347 | 345 | (System/exit 0))))))
|
348 | 346 |
|
349 | 347 | (def no-project-txt
|
|
358 | 356 | (select the File > New menu), or
|
359 | 357 | b. open an existing file
|
360 | 358 | (click on it in the tree at left).")
|
361 |
| - |
| 359 | + |
362 | 360 | (def no-file-txt
|
363 | 361 | "To edit source code you need to either: <br>
|
364 |
| - 1. create a new file |
| 362 | + 1. create a new file |
365 | 363 | (select menu <b>File > New...</b>)<br>
|
366 | 364 | 2. edit an existing file by selecting one at left.</html>")
|
367 | 365 |
|
368 |
| -(defn move-caret-to-line [textarea] |
| 366 | +(defn move-caret-to-line |
369 | 367 | "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") |
| 368 | + [textarea] |
| 369 | + (let [current-line (fn [] |
| 370 | + (inc (.getLineOfOffset textarea (.getCaretPosition textarea)))) |
| 371 | + line-str (utils/ask-value "Line number:" "Go to Line") |
375 | 372 | line-num (Integer.
|
376 | 373 | (if (or (nil? line-str) (nil? (re-find #"\d+" line-str)))
|
377 | 374 | (current-line)
|
|
396 | 393 | (utils/attach-action-keys comp
|
397 | 394 | ["cmd1 EQUALS" #(grow-font app)]
|
398 | 395 | ["cmd1 shift EQUALS" #(grow-font app)]
|
399 |
| - ["cmd1 PLUS" #(grow-font app)] |
| 396 | + ["cmd1 PLUS" #(grow-font app)] |
400 | 397 | ["cmd2 MINUS" #(.toBack (:frame app))]
|
401 | 398 | ["cmd2 PLUS" #(.toFront (:frame app))]
|
402 | 399 | ["cmd2 EQUALS" #(.toFront (:frame app))]
|
403 | 400 | ["cmd1 shift O" #(open-project app)]
|
404 | 401 | ["cmd1 K"#(.setText (app :repl-out-text-area) "")]))
|
405 |
| - |
| 402 | + |
406 | 403 | (defn on-window-activation [win fun]
|
407 | 404 | (.addWindowListener win
|
408 | 405 | (proxy [WindowAdapter] []
|
|
587 | 584 | (.read text-area rdr nil))
|
588 | 585 | (.discardAllEdits text-area)
|
589 | 586 | (.setText doc-label (str "Source Editor \u2014 " (.getPath file)))
|
590 |
| - (.setEditable text-area true) |
| 587 | + (.setEditable text-area true) |
591 | 588 | (.setSyntaxEditingStyle text-area
|
592 | 589 | (let [file-name (.getName file-to-open)]
|
593 | 590 | (if (or (.endsWith file-name ".clj")
|
|
597 | 594 | (do (.setText text-area no-project-txt)
|
598 | 595 | (.setText doc-label (str "Source Editor (No file selected)"))
|
599 | 596 | (.setEditable text-area false)))
|
600 |
| - |
| 597 | + |
601 | 598 | (indent/setup-autoindent text-area)
|
602 | 599 | (reset! (app :file) file)
|
603 | 600 | (load-caret-position app)
|
|
628 | 625 | :description \"FIXME: write description\"
|
629 | 626 | :dependencies [[org.clojure/clojure \"1.5.1\"]])
|
630 | 627 | "))
|
631 |
| - |
| 628 | + |
632 | 629 | (defn specify-source [project-dir title default-namespace]
|
633 | 630 | (when-let [namespace (JOptionPane/showInputDialog nil
|
634 | 631 | "Please enter a fully-qualified namespace"
|
|
644 | 641 | the-dir (File. project-dir dirstring)]
|
645 | 642 | (.mkdirs the-dir)
|
646 | 643 | [(File. the-dir (str name ".clj")) namespace])))
|
647 |
| - |
| 644 | + |
648 | 645 | (defn create-file [app project-dir default-namespace]
|
649 | 646 | (when-let [[file namespace] (specify-source project-dir
|
650 | 647 | "Create a source file"
|
|
674 | 671 | "Unable to create project."
|
675 | 672 | "Oops" JOptionPane/ERROR_MESSAGE)
|
676 | 673 | (.printStackTrace e)))))
|
677 |
| - |
| 674 | + |
678 | 675 | (defn rename-file [app]
|
679 | 676 | (when-let [old-file @(app :file)]
|
680 | 677 | (let [tree (app :docs-tree)
|
|
707 | 704 | (defn revert-file [app]
|
708 | 705 | (when-let [f @(:file app)]
|
709 | 706 | (let [temp-file (project/get-temp-file f)]
|
710 |
| - (when (.exists temp-file)) |
| 707 | + (when (.exists temp-file) |
711 | 708 | (let [path (.getAbsolutePath f)]
|
712 | 709 | (when (utils/confirmed? "Revert the file? This cannot be undone." path)
|
713 | 710 | (.delete temp-file)
|
714 | 711 | (project/update-project-tree (:docs-tree app))
|
715 |
| - (restart-doc app f)))))) |
| 712 | + (restart-doc app f))))))) |
716 | 713 |
|
717 | 714 | (defn- dir-rank [dir]
|
718 | 715 | (get {"src" 0 "test" 1 "lib" 2} (.getName dir) 100))
|
719 | 716 |
|
720 | 717 | (defn- find-file [project-path relative-file-path]
|
721 | 718 | (let [classpath-dirs (sort-by dir-rank < (utils/get-directories (File. project-path)))
|
722 |
| - file-candidates (map |
723 |
| - #(File. (str (.getAbsolutePath %) File/separatorChar relative-file-path)) |
| 719 | + file-candidates (map |
| 720 | + #(File. (str (.getAbsolutePath %) File/separatorChar relative-file-path)) |
724 | 721 | classpath-dirs)]
|
725 | 722 | (first (filter #(and (.exists %) (.isFile %)) file-candidates))))
|
726 | 723 |
|
727 | 724 | (defn goto-definition [ns app]
|
728 | 725 | (let [text-comp (:doc-text-area app)
|
729 | 726 | pos (.getCaretPosition text-comp)
|
730 | 727 | text (.getText text-comp)
|
731 |
| - src-file (:file (meta (do (help/token-from-caret-pos ns text pos) nil))) |
| 728 | + src-file (:file (meta (do (help/token-from-caret-pos text pos) nil))) |
732 | 729 | line (:line (meta (do (find-ns (symbol ns))
|
733 |
| - (help/token-from-caret-pos ns text pos) nil))) |
| 730 | + (help/token-from-caret-pos text pos) nil))) |
734 | 731 | project-path (first (project/get-selected-projects app))
|
735 | 732 | file (find-file project-path src-file)]
|
736 | 733 | (when (and file line)
|
|
764 | 761 | ["Indent lines" "I" "cmd1 CLOSE_BRACKET" #(utils/indent (:doc-text-area app))]
|
765 | 762 | ["Unindent lines" "D" "cmd1 OPEN_BRACKET" #(utils/unindent (:doc-text-area app))]
|
766 | 763 | ["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))] |
| 764 | + ["Go to line..." "G" "cmd1 L" #(move-caret-to-line (:doc-text-area app))] |
768 | 765 | ;["Go to definition" "G" "cmd1 D" #(goto-definition (repl/get-file-ns app) app)]
|
769 | 766 | )
|
770 | 767 | (utils/add-menu menu-bar "REPL" "R"
|
|
787 | 784 | ["Decrease font size" nil "cmd1 MINUS" #(shrink-font app)]
|
788 | 785 | ["Settings" nil nil #(settings/show-settings-window
|
789 | 786 | app apply-settings)])))
|
790 |
| - |
791 |
| - |
| 787 | + |
| 788 | + |
792 | 789 | (defn add-visibility-shortcut [app]
|
793 | 790 | (let [shortcuts [(map utils/get-keystroke ["cmd2 EQUALS" "cmd2 PLUS"])]]
|
794 | 791 | (.. Toolkit getDefaultToolkit
|
|
818 | 815 | (help/setup-tab-help (app :repl-in-text-area) app)
|
819 | 816 | (doall (map #(project/add-project app %) (project/load-project-set)))
|
820 | 817 | (let [frame (app :frame)]
|
821 |
| - (utils/persist-window-shape utils/clooj-prefs "main-window" frame) |
| 818 | + (utils/persist-window-shape utils/clooj-prefs "main-window" frame) |
822 | 819 | (utils/enable-mac-fullscreen frame)
|
823 | 820 | (.setVisible frame true)
|
824 | 821 | (on-window-activation frame #(project/update-project-tree (app :docs-tree))))
|
|
0 commit comments