sclass JLeftArrowScriptIDE is Swingable { settable SimpleLiveValue lvScript = stringLiveValue(); S sectionTitle = "Left arrow script"; sS helpText = !include string #1034045; transient CompileResult compileResult; transient RSyntaxTextAreaWithSearch taScript; transient new Q compileQ; transient JLabel lblCompileResult; transient JButton btnRun; transient LeftArrowCompletionProvider completionProvider; transient AutoCompletion autoComplete; class LeftArrowCompletionProvider extends DefaultCompletionProvider { @Override public L getCompletionByInputText(S inputText) { print("getCompletionByInputText: " + quote(inputText)); ret ll(new BasicCompletion(this, inputText + "YesYes")); } @Override public L getCompletions(JTextComponent comp) { var l = super.getCompletions(comp); print("getCompletions: " + l); } } visual { taScript = liveValueRSyntaxTextArea_bothWays(lvScript); awtCalcEvery(taScript.textArea(), 1.0, -> compileQ.add(r compile)); swing { completionProvider = new LeftArrowCompletionProvider; autoComplete = new AutoCompletion(completionProvider); autoComplete.setAutoCompleteEnabled(true); autoComplete.setAutoActivationEnabled(true); autoComplete.install(taScript.textArea); print("Auto-complete installed on " + taScript.textArea); } ret jCenteredSection(sectionTitle, centerAndSouthWithMargin( taScript.visualize(), centerAndEastWithMargin( lblCompileResult = jlabel(), jline( btnRun = jbutton("Run" := rThread runButtonAction), jPopDownButton_noText( "Show Scripting Help", rThread { showTextWordWrapped("Gazelle 'Left arrow script' Help", helpText) }, ) )))); } bool visible() { ret isShowing(lblCompileResult); } void compile { var script = lvScript!; var result = compileResult; if (result == null || !eq(result.script, script)) { try { result = new CompileResult; result.script = script; result.parser = new GazelleV_LeftArrowScriptParser; modifyParser(result.parser); result.parsedScript = result.parser.parse(result.script); print(result.parsedScript); } catch print e { result.compileError = e; } compileResult = result; setText(lblCompileResult, compileResult); updateRunButtonState(); } } void updateRunButtonState() { setEnabled(btnRun, runButtonShouldBeEnabled()); } swappable bool runButtonShouldBeEnabled() { ret compileResult != null && compileResult.runnable(); } CompileResult freshCompileResult() { runInQAndWait(compileQ, r compile); ret compileResult; } GazelleV_LeftArrowScript.Script parsedScript() { ret freshCompileResult().parsedScript; } swappable void runButtonAction { runScript(); } void runScript { //showText_fast_noWrap("Script Error", renderStackTrace(e)); var result = freshCompileResult(); if (result.parsedScript != null) result.result = okOrError(-> result.parsedScript!); } class CompileResult { S script; GazelleV_LeftArrowScriptParser parser; Throwable compileError; GazelleV_LeftArrowScript.Script parsedScript; OKOrError result; toString { ret compileError != null ? exceptionToStringShorter(compileError) : "Compiled OK"; } bool runnable() { ret parsedScript != null; } } swappable void modifyParser(GazelleV_LeftArrowScriptParser parser) { parser.allowTheWorld(mc()); } void showStatus(S status) { setText(lblCompileResult, status); } void showRuntimeError(Throwable e) { showStatus(exceptionToStringShorter(e)); } }