srecord noeq JG22NetworkElement(G22Utils g22utils, JG22Network parent, G22NetworkElement element) is Swingable { //JExtendedTabbedPane tabs; JTabbedPane tabs; JLeftArrowScriptIDE ide; SingleComponentPanel scpContent = scp(); cachedVisualize { ide = g22utils.leftArrowIDE(); ide.makeParser = -> { var parser = ide.makeParser_base(); element.configureParser(parser); ret parser; }; ide.withResultPanel(false); ide.lvScript(element.varCode()); ide.runScript = -> { var result = ide.freshCompileResult(); if (result.runnable()) { var parsedScript = result!; var visualizeFunction = parsedScript.getFunction("visualize"); O elementInstance = null; var ni = parent.networkInstance; if (ni != null) elementInstance = ni.elementsByBlueprint.get(element); reMutable elementInstance; Component visualized = null; if (visualizeFunction != null) { // TODO: timeout? RunResultWithTimestamps value = runResultWithTimestamps(-> wrap( visualizeFunction.call( new FlexibleVarContext, elementInstance))); ide.showScriptResult(value); if (value.isOK()) visualized = wrap(value!); else visualized = jErrorView(value.error()); } else visualized = new G22JavaObjectVisualizer(g22utils, elementInstance).visualize(); print(+visualized); scpContent.set(visualized); selectTabComponent(tabs, scpContent); } }; tabs = jtabs/*jExtendedTabs*/( //"Hello", jCenteredSection("Hello", jpanel()), "Code", northAndCenter( withSideMargin(withLabel("Node identifier:", jVarTextField(element.varIdentifier()))), ide.visualize()), //"Hello", jCenteredSection("Hello", jpanel()), "Content", jCenteredSection("Content" := scpContent)); var popDownButton = withRightMargin(jfullcenter( jPopDownButton_noText( "Delete node" := rThread deleteElement ))); //var box = tabs.visualize(); var box = centerAndEastWithMargin(tabs, popDownButton); //tabs.setComponentBesideTabs(popDownButton); jMinSize(80, 50, box); setBorder(box, BorderFactory.createLineBorder(Color.green, 5); onMouseDown(tabs/*.tabs*/, event -> { if (!mouseEventIsInBorder(event)) new ComponentDragger(box, event).bringToFront(true).start(); }); new ComponentResizeDragger(box, box); var bounds = or(element.bounds, rect(50, 50, 400, 300)); setBounds(box, bounds); onBoundsChange(box, r { element.bounds(toRect(getBounds(box))); element.network.change(); parent.mainPanel.revalidateMe(); }); ret box; } void deleteElement { parent.deleteElement(this); } }