Transpiled version (69830L) is out of date.
1 | sclass G22LAScriptIDE<A extends G22LAScript> is Swingable { |
2 | settable G22Utils g22utils; |
3 | settable S noScriptSelectedMsg = "Please select or create a script to edit it"; |
4 | |
5 | gettable A script; |
6 | |
7 | transient SingleComponentPanel scp; |
8 | transient JLeftArrowScriptIDE[] ides; |
9 | transient JExtendedTabbedPane tabs; |
10 | transient JButton btnSave, btnDiscardChanges, btnClearForAutoRun; |
11 | transient CollapsibleLeftPanel collapsibleResultPanel; |
12 | transient G22ScriptResultPanel resultPanel; |
13 | transient Mode lastVisibleMode; |
14 | |
15 | settable bool preferEditMode = true; |
16 | |
17 | abstract class Mode { |
18 | G22ScriptMode modeEnum; |
19 | S name; |
20 | gettable bool editable; |
21 | |
22 | *(G22ScriptMode *modeEnum, S *name, bool *editable) {} |
23 | |
24 | simplyCached abstract IVarWithNotify<S> scriptVar(); |
25 | |
26 | void addButtons(JPanel panel) {} |
27 | |
28 | toString { ret name; } |
29 | |
30 | S tabName() { ret scriptVar().has() ? name : "Not " + firstToLower(name); } |
31 | } |
32 | |
33 | class ModeClearedForAutoRun > Mode { |
34 | *() { super(G22ScriptMode.autoRunnable, "Cleared for auto-run", false); } |
35 | |
36 | IVarWithNotify<S> scriptVar_load() { |
37 | var var = new VirtualVar<S>( |
38 | -> script.codeForAutoRun(), |
39 | null /*text -> script.setClearedForAutoRun(text == null ?: new ClearForAutoRun(text))*/); |
40 | addWeakChangeListener(script.varClearedForAutoRun(), var); |
41 | ret var; |
42 | } |
43 | |
44 | void addButtons(JPanel panel) { |
45 | panel.add(jbutton("Forget auto-run code", rThread forgetAutoRunCode)); |
46 | } |
47 | } |
48 | |
49 | class ModeSaved > Mode { |
50 | *() { super(G22ScriptMode.saved, "Saved", false); } |
51 | |
52 | IVarWithNotify<S> scriptVar_load() { |
53 | ret getterVarOnly(script.varText()); |
54 | } |
55 | |
56 | void addButtons(JPanel panel) { |
57 | panel.add(btnClearForAutoRun = jbutton("Clear for auto-run", rThread clearForAutoRun)); |
58 | panel.add(jbutton("Forget code", rThread forgetSaved)); |
59 | } |
60 | } |
61 | |
62 | class ModeEdit > Mode { |
63 | *() { super(G22ScriptMode.edit, "Edit", true); } |
64 | |
65 | IVarWithNotify<S> scriptVar_load() { |
66 | var var = new VirtualVar<S>( |
67 | -> script.textForEditing(), |
68 | text -> script.receiveEditingText(text) |
69 | ); |
70 | addWeakChangeListener(script, var); |
71 | ret var; |
72 | } |
73 | |
74 | void addButtons(JPanel panel) { |
75 | panel.add(btnSave = jbutton("Save", rThread saveEdit)); |
76 | panel.add(btnDiscardChanges = jbutton("Discard changes", rThread discardEdit)); |
77 | } |
78 | } |
79 | |
80 | transient new ModeEdit modeEdit; |
81 | transient new ModeSaved modeSaved; |
82 | transient new ModeClearedForAutoRun modeClearedForAutoRun; |
83 | transient L<Mode> modes = ll( |
84 | modeEdit, |
85 | modeSaved, |
86 | modeClearedForAutoRun |
87 | ); |
88 | |
89 | *(G22Utils *g22utils) {} |
90 | |
91 | cachedVisualize { |
92 | ides = new JLeftArrowScriptIDE[l(modes)]; |
93 | if (scp == null) scp = singleComponentPanel(); |
94 | loadScript(script); |
95 | ret scp; |
96 | } |
97 | |
98 | void setScript(A script) { |
99 | if (this.script != script) |
100 | if (this.script != null) |
101 | fail("Can't set script after initialisation"); |
102 | else |
103 | loadScript(script); |
104 | } |
105 | |
106 | void loadScript(A script) { |
107 | this.script = script; |
108 | if (scp == null) ret; |
109 | if (script == null) |
110 | scp.set(jcenteredlabel(noScriptSelectedMsg())); |
111 | else { |
112 | tabs = jExtendedTabs(); |
113 | resultPanel = new G22ScriptResultPanel; |
114 | collapsibleResultPanel = new CollapsibleLeftPanel(false, "Output", resultPanel.visualize(), tabs.visualize()); |
115 | collapsibleResultPanel.sidePanelMargins = c -> withTopAndLeftMargin(c); |
116 | |
117 | // This places tabs vertically at the right hand side... |
118 | // (not what we want) |
119 | //setTabPlacement(JTabbedPane.RIGHT, tabs); |
120 | |
121 | for (int i, Mode mode : unpair iterateWithIndex(modes)) { |
122 | var ide = ides[i] = g22utils.leftArrowIDE(); |
123 | ide.withResultPanel(false); |
124 | ide.resultPanel = resultPanel; |
125 | ide.collapsibleResultPanel = collapsibleResultPanel; |
126 | ide.wrapSection = c -> wrapEditorSection(mode, c); |
127 | ide.newCompileResult = -> script.newCompileResult(); |
128 | ide.makeParser = -> script.makeParser(); |
129 | modifyIDE(ide); |
130 | var varScript = mode.scriptVar(); |
131 | ide.lvScript(varWithNotifyToLiveValue(S.class, varScript)); |
132 | addTab(tabs, str(mode)); |
133 | mode.addButtons(ide.buttons()); |
134 | ide.visualize(); |
135 | ide.setEditable(mode.editable()); |
136 | varScript.onChangeAndNow(text -> |
137 | setTab(tabs, i, text == null ? jcenteredlabel("Empty") : wrapIDE(mode, ide))); |
138 | ide.popDownButton.onFillingMenu(menu -> |
139 | addMenuItem(menu, "Show History", rThread showHistory)); |
140 | } |
141 | |
142 | script.onChangeAndNow(r { |
143 | for (int i, Mode mode : unpair iterateWithIndex(modes)) |
144 | setTabTitle(tabs, i, mode.tabName()); |
145 | setEnabled(script.isEditing(), btnSave, btnDiscardChanges); |
146 | setEnabled(btnClearForAutoRun, script.isSavedDistinctFromAutoRunVersion()); |
147 | for (ide : ides) |
148 | ide.sectionTitle(str(script)); |
149 | }); |
150 | |
151 | onTabSelectedAndNow(tabs, -> { |
152 | var mode = visibleMode(); |
153 | if (lastVisibleMode != null && lastVisibleMode != mode) { |
154 | // Move selected IDE to same position as previous IDE |
155 | |
156 | var lastIDE = ide(lastVisibleMode); |
157 | var ide = visibleIDE(); |
158 | awtLater(0.5, -> { |
159 | LineAndColumn lac = caretLineAndCol(lastIDE.textArea()); |
160 | moveCaretToLineAndCol(ide.textArea(), lac); |
161 | setEnclosingViewPosition(ide.textArea(), enclosingViewPosition(lastIDE.textArea())); |
162 | focus(ide.textArea()); |
163 | }); |
164 | } |
165 | lastVisibleMode = mode; |
166 | |
167 | tabs.setComponentBesideTabs( |
168 | mode != modeEdit |
169 | ? jfullcenter(withRightMargin(jbutton("Edit script", -> setMode(modeEdit)))) |
170 | : null); |
171 | }); |
172 | |
173 | setMode(preferEditMode || script.isEditing() ? modeEdit : modeSaved); |
174 | scp.set(collapsibleResultPanel); |
175 | } |
176 | } |
177 | |
178 | swappable JComponent wrapEditorSection(Mode mode, JComponent editorSection) { |
179 | /*if (mode != modeEdit) |
180 | ret withTopMargin(northAndCenterWithMargin( |
181 | withRightMargin(jline(jbutton("Edit script", -> setMode(modeEdit)))), |
182 | editorSection)); |
183 | else*/ |
184 | ret editorSection; |
185 | } |
186 | |
187 | swappable JComponent wrapIDE(Mode mode, JLeftArrowScriptIDE ide) { |
188 | ret ide.visualize(); |
189 | } |
190 | |
191 | event settingUpIDE(JLeftArrowScriptIDE ide); |
192 | |
193 | swappable void modifyIDE(JLeftArrowScriptIDE ide) { |
194 | ide.showTitle(false); |
195 | settingUpIDE(ide); |
196 | } |
197 | |
198 | void saveEdit { |
199 | script.completeEdit(); |
200 | if (preferEditMode) |
201 | focusTextArea(); |
202 | else |
203 | setMode(modeSaved); |
204 | } |
205 | |
206 | JLeftArrowScriptIDE ide(Mode mode) { |
207 | if (ides == null) visualize(); |
208 | ret _get(ides, indexOf(modes, mode)); |
209 | } |
210 | |
211 | RSyntaxTextArea visibleTextArea() { |
212 | var ide = visibleIDE(); |
213 | ret ide?.textArea(); |
214 | } |
215 | |
216 | void setMode(Mode mode) { |
217 | var caretPos = caretLineAndCol(visibleTextArea()); |
218 | printVars("setMode", +caretPos); |
219 | selectTab(tabs, indexOf(modes, mode)); |
220 | var ide = visibleIDE(); |
221 | printVars("setMode", +ide, mode := visibleMode()); |
222 | ide.goToPosition_noFocus(caretPos); |
223 | if (mode == modeEdit) |
224 | focusTextArea(); |
225 | } |
226 | |
227 | void focusTextArea { |
228 | focus(visibleTextArea()); |
229 | } |
230 | |
231 | // get currently visible mode |
232 | Mode visibleMode() { |
233 | ret _get(modes, indexOfSelectedTab(tabs)); |
234 | } |
235 | |
236 | JLeftArrowScriptIDE visibleIDE() { |
237 | ret ide(visibleMode()); |
238 | } |
239 | |
240 | void discardEdit { |
241 | setMode(modeSaved); |
242 | script.discardEdit(); |
243 | } |
244 | |
245 | void forgetSaved { |
246 | script.setTextWithHistory(null); |
247 | } |
248 | |
249 | void clearForAutoRun { |
250 | script.clearForAutoRun(); |
251 | setMode(modeClearedForAutoRun); |
252 | } |
253 | |
254 | void forgetAutoRunCode { |
255 | script.forgetAutoRunCode(); |
256 | } |
257 | |
258 | private void selfTest_impl { |
259 | new G22LAScript script; |
260 | setScript((A) script); |
261 | ide(modeEdit).setText("hello"); |
262 | assertEqualsVerbose(null, script.text()); |
263 | assertEqualsVerbose("hello", script.editedText()); |
264 | saveEdit(); |
265 | assertEqualsVerbose("hello", script.text()); |
266 | assertEqualsVerbose(null, script.editedText()); |
267 | } |
268 | |
269 | static void selfTest(G22Utils g22utils) { |
270 | new G22LAScriptIDE(g22utils).selfTest_impl(); |
271 | } |
272 | |
273 | void showHistory { |
274 | showText("Edit history of " + script, loadTextFile(script.historyFile())); |
275 | } |
276 | |
277 | void goToPositionInAllModes(LineAndColumn lac) { |
278 | for (ide : ides) |
279 | ide?.goToPosition_noFocus(lac); |
280 | } |
281 | } |
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, ekrmjmnbrukm, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1034345 |
Snippet name: | G22LAScriptIDE - IDE for a G22LAScript (with the 3 modes, LIVE) |
Eternal ID of this version: | #1034345/120 |
Text MD5: | 46e31e0ea6f40bf408741f937b4a2700 |
Author: | stefan |
Category: | javax / gazelle 22 |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2023-07-30 19:32:40 |
Source code size: | 8661 bytes / 281 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 482 / 1264 |
Version history: | 119 change(s) |
Referenced in: | [show references] |