-
Notifications
You must be signed in to change notification settings - Fork 7
/
core.clj
178 lines (163 loc) · 6.64 KB
/
core.clj
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
(ns sketchpad.core
(:gen-class)
(:import (javax.swing.TollTipManager)
(java.awt Toolkit))
(:use [seesaw core graphics color border font meta]
[clojure.pprint]
[clooj.navigate]
[clooj.dev-tools]
[clooj.indent]
[sketchpad.tree.tree]
[sketchpad.tree.utils]
[sketchpad.util.tab]
[sketchpad.util.utils]
[sketchpad.config.prefs])
(:require [sketchpad.wrapper.theme :as theme]
[sketchpad.config.config :as config]
[sketchpad.repl.app.repl :as app.repl]
[sketchpad.state.state :as state]
[sketchpad.editor.editor :as sketchpad.editor]
[sketchpad.project.project :as project]
[sketchpad.menu.menu-bar :as menu]
[sketchpad.wrapper.rsyntaxtextarea :as rsyntaxtextarea]
[sketchpad.editor.info :as info]
[sketchpad.buffer.action :as buffer.action]
[sketchpad.repl.info :as repl.info]
[sketchpad.repl.app.sketchpad-repl :as app.sketchpad-repl]
[sketchpad.state.state :as sketchpad.state]))
(defn set-osx-icon
[icon]
(try
(import 'com.apple.eawt.Application)
(.setDockIconImage (com.apple.eawt.Application/getApplication) icon)
(catch Exception e
false))
true)
; (defn check-buffers
; [e]
; (if (tabs?)
; (let [response (close-or-save-application-dialogue "Quit Application")]
; (cond
; (= response 0)
; (println 0)
; (= response 1)
; (println 1)
; (= response 2)
; (println 2)
; ))))
(defn create-app
[]
(let [buffer-info (info/buffer-info)
buffer-tabbed-panel (sketchpad.editor/buffer-tabbed-panel)
buffer-component {:type :buffer-component
:component {:container (vertical-panel :items[(get-in buffer-tabbed-panel [:component :container])
:fill-h
(get-in buffer-info [:component :container])]
:background config/app-color
:border (empty-border :thickness 0))}}
file-tree {:type :file-tree
:component (file-tree state/app)}
repl-tabbed-panel (app.repl/repl-tabbed-panel)
repl-info (repl.info/repl-info)
repl-component (vertical-panel :items[(get-in repl-tabbed-panel [:component :container])
:fill-h
(get-in repl-info [:component :container])]
:background config/app-color
:border (empty-border :thickness 0))
top-horizontal-split-panel (left-right-split
(get-in file-tree [:component :container])
(get-in buffer-component [:component :container])
:divider-location 0.25
:resize-weight 0.25
:divider-size 3
:border (empty-border :thickness 0)
:background config/app-color)
main-vertical-split-pane (top-bottom-split
top-horizontal-split-panel
repl-component
:divider-location 0.66
:resize-weight 0.66
:divider-size 3
:border (empty-border :thickness 0)
:background config/app-color)
frame (frame :title "SketchPad"
:width 950
:height 700
:on-close :exit
:minimum-size [500 :by 350]
:content main-vertical-split-pane)
app (merge {:current-files (atom {})
:current-file (atom nil)
:current-buffers (atom {})
:current-tab -1
:repls (atom {})
:changed false
:doc-text-area nil
:doc-scroll-pane nil}
@state/app
(gen-map
frame
file-tree
buffer-tabbed-panel
buffer-info
buffer-component
repl-info
repl-tabbed-panel
repl-component
main-vertical-split-pane
top-horizontal-split-panel))]
(when (rsyntaxtextarea/is-osx?)
(let [icon-url (clojure.java.io/resource "sketchpad-lambda-logo.png")
icon (.createImage (Toolkit/getDefaultToolkit) icon-url)]
(.setIconImage frame icon)
(set-osx-icon icon)))
app))
(defn add-behaviors
[app-atom]
(let [app @app-atom]
(setup-tree app-atom)
;; this should happen when the repl tabbed panel is created probably
(repl.info/attach-repl-info-handler app-atom)
;; global
(add-visibility-shortcut app)))
(defn- get-classpath []
(sort (map (memfn getPath)
(seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader))))))
(defn init-projects []
(project/add-project "sketchpad-tmp")
(doall (map #(project/add-project %) (load-project-set))))
;; startup
(defn startup-sketchpad [app-atom]
(let [app @app-atom]
(Thread/setDefaultUncaughtExceptionHandler
(proxy [Thread$UncaughtExceptionHandler] []
(uncaughtException [thread exception]
(println thread) (.printStackTrace exception))))
(add-behaviors app-atom)
(menu/make-menus app-atom)
(init-projects)
(let [tree (app :docs-tree)]
(load-expanded-paths tree)
(load-tree-selection tree))
(let [frame (app :frame)]
(persist-window-shape sketchpad-prefs "main-window" frame)
(on-window-activation frame #(update-project-tree)))
(config/apply-sketchpad-prefs!)
(app :frame)))
(defn show []
(reset! embedded false)
(invoke-later
(reset! sketchpad.state.state/app (create-app))
(->
(startup-sketchpad sketchpad.state.state/app)
show!)))
(defn image-icon [path]
(javax.swing.ImageIcon. (clojure.java.io/resource path)))
(defn -main [& args]
(invoke-later
(reset! sketchpad.state.state/app (create-app))
(let [repl-writer (app.sketchpad-repl/repl-writer (get-in (:application-repl @sketchpad.state.state/app) [:component :text-area]))]
(binding [*err* repl-writer
*out* repl-writer]
(let [app (startup-sketchpad sketchpad.state.state/app)]
(show! app))))))