Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

191
LINES

< > BotCompany Repo | #1034729 // JLeftArrowScriptIDE backup

JavaX fragment (include)

sclass JLeftArrowScriptIDE is Swingable {
  settable SimpleLiveValue<S> lvScript = stringLiveValue();
  settable S sectionTitle = "Left arrow script";
  
  sS helpText = !include string #1034045;
  
  transient LASCompileResult compileResult;
  transient RSyntaxTextAreaWithSearch taScript;
  transient new Q compileQ;
  transient JButton btnRun;
  transient SingleComponentPanel scpResult;
  transient SingleComponentPanel scpMoreButtons = singleComponentPanel();
  transient JPopDownButton popDownButton;
  
  transient LeftArrowCompletionProvider completionProvider;

  settable transient G22Utils g22utils;
  
  settable double scriptTimeout = 10.0;
  
  settable transient bool showTitle = true;
  
  transient swappable GazelleV_LeftArrowScriptParser makeParser() {
    ret g22utils.leftArrowParser();
  }
  
  class LeftArrowCompletionProvider extends DefaultCompletionProvider {
    @Override
    public L<Completion> getCompletionsImpl(JTextComponent comp) {
      try {
        S text = getText(comp);
        GazelleV_LeftArrowScriptParser parser = makeParser2();
        LeftArrowScriptAutoCompleter completer = new(g22utils, parser);
        enableScaffolding(completer);
        completer.seek(text, getCaretPosition(comp));
        ret map(completer.searcher().withScores(), completion -> {
          BasicCompletion c = new(this, completion!);
          c.setRelevance((int) completion.score());
          ret c;
        });
      } catch print e { ret ll(); }
    }
  }
  
  JComponent wrapStatusLabel(JComponent lbl) {
    popDownButton = swing(-> new JPopDownButton);
    popDownButton.onFillingMenu(menu -> {
      addMenuItems(menu,
        "Show Scripting Help", rThread { showTextWordWrapped("Gazelle 'Left arrow script' Help", helpText) },
        "Show Global Class Names", rThread showGlobalClassNames);
    });

    ret
      centerAndEastWithMargin(
        jBorderlessHigherScrollPane(lbl),
        jfullcenter(
          jline(
            scpMoreButtons,
            btnRun = jbutton("Run" := rThread runScript),
            popDownButton
          )));
  }
  
  cachedVisual swing(-> {
    taScript = g22utils.newSyntaxTextArea(l1 wrapStatusLabel);
    bindTextComponentToLiveValue_bothWays(textArea(), lvScript);
    onCtrlEnter(textArea(), rThread runScript);
    awtCalcEvery(textArea(), 1.0, -> compileQ.add(r compile));

    installCompletionProvider(completionProvider = new LeftArrowCompletionProvider, textArea());

    JComponent vis = taScript.visualize();

    if (showTitle)
      vis = wrapSection(jCenteredSection(sectionTitle, vis));

    if (scpResult != null)
      vis = jhsplit(
        jCenteredSection("Script Result", scpResult),
        vis);
        
    ret vis;
  });
  
  swappable JComponent wrapSection(JComponent c) { ret c; }
  
  RSyntaxTextArea textArea() {
    if (taScript == null) visualize();
    ret taScript.textArea();
  }
  
  void setText(S text) { main setText(textArea(), text); }
  
  bool visible() { ret isShowing(textArea()); }
  
  void compile {
    var script = lvScript!;
    var result = compileResult;
    if (result == null || !eq(result.script, script)) {
      try {
        result = newCompileResult();
        result.script = script;
        result.parser = makeParser();
        result.parsedScript = result.parser.parse(result.script);
        print(result.parsedScript);
      } catch e {
        print(e);
        result.compileError = e;
      }
      compileResult = result;
      showStatus(str(compileResult));
      updateRunButtonState();
    }
  }
  
  void updateRunButtonState() {
    setEnabled(btnRun, runButtonShouldBeEnabled());
  }
  
  swappable bool runButtonShouldBeEnabled() {
    ret compileResult != null && compileResult.runnable();
  }
  
  LASCompileResult freshCompileResult() {
    runInQAndWait(compileQ, r compile);
    ret compileResult;
  }
  
  GazelleV_LeftArrowScript.Script parsedScript() {
    ret freshCompileResult().parsedScript;
  }

  swappable void runScript() {
    var result = freshCompileResult();
    if (result.parsedScript != null) {
      var value = okOrError(-> callCompiledObjectWithTimeout(result.parsedScript));
      showScriptResult(value);
    }
  }
  
  void showScriptResult(OKOrError result) {
    if (result.isOK())
      setStatus(shorten(g22utils.stringify(result!)));
    else
      setStatus(exceptionToStringShorter_dontDropOuterExceptions(result.error()));
  }

  /* compile result used to include result of execution
  class CompileResult > LASCompileResult {
    OKOrError result;
  }*/
  
  void setStatus aka showStatus(S status) {
    taScript?.setStatus(status);
  }

  void showRuntimeError(Throwable e) {
    showStatus(exceptionToStringShorter(e));
  }
  
  void withResultPanel {
    scpResult if null = singleComponentPanel();
  }
  
  swappable VarContext makeVarContextForExecution() { ret new VarContext; }
  
  O callCompiledObjectWithTimeout(double timeoutSeconds default scriptTimeout, GazelleV_LeftArrowScript.Script object, VarContext ctx default makeVarContextForExecution()) {
    O result = evalWithTimeoutOrTypedException(timeoutSeconds, -> object.get(ctx));
    scpResult?.set(G22JavaObjectVisualizer(g22utils, result));
    ret result;
  }
  
  GazelleV_LeftArrowScriptParser makeParser2() {
    var parser = makeParser();
    print("Function containers: " + parser.functionContainers);
    ret parser;
  }
  
  void showGlobalClassNames() {
    showText("Global Class Names", pnlToString(toCIMap(makeParser().globalClassNames())));
  }
  
  // only after visualize
  void setEditable(bool b) {
    main setEditable(textArea(), b);
  }
  
  swappable LASCompileResult newCompileResult() { ret new LASCompileResult; }
  
  void moreButtons(JComponent c) { scpMoreButtons.set(c); }
}

Author comment

Began life as a copy of #1034022

download  show line numbers  debug dex  old transpilations   

Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1034729
Snippet name: JLeftArrowScriptIDE backup
Eternal ID of this version: #1034729/1
Text MD5: b2e94b4babf7a4c7b3640c4adcd7c375
Author: stefan
Category: javax / gui
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-03-07 20:58:11
Source code size: 5957 bytes / 191 lines
Pitched / IR pitched: No / No
Views / Downloads: 56 / 66
Referenced in: [show references]