concept G22TextsPanel extends G22CRUDAndDetailPanel { transient volatile settable G22LAScriptIDE scriptIDE; SimpleCRUD_v2 makeCRUD() { var crud = new SimpleCRUD_v2<>(g22utils.concepts(), G22Text); crud.noSubclasses(true); crud.entityName = -> "Script"; g22utils.setupScriptCRUD(crud, true); // Full-text search baby!! var ts = crud.tableSearcher(); var basicRowTester = ts.rowTester; ts.rowTester = if2ToF2((pat, map) -> { if (basicRowTester.get(pat, map)) true; long id = toLong(map.get(crud.hID)); G22Text script = g22utils.getScript(id); if (anyContainsIgnoreCase(script.allTexts(), pat)) true; false; }); crud.addButton(new JPopDownButton().content( "Show all scripts as one long text", rThread showHugeText)); ret crud; } JComponent makeDetailView(G22Text script) { scriptIDE(new G22LAScriptIDE(g22utils)); scriptIDE.setScript(script); ret scriptIDE.visualize(); } SimpleCRUD_v2 scriptCRUD() { ret crud(); } selfType g22utils(G22Utils g22utils) { super.g22utils(g22utils); this; } void showHugeText { S text = new G22ScriptUtil(g22utils).makeHugeText(g22utils.list(G22Text)); showFrame("Scripts in project", g22utils.newSyntaxTextArea(text)); } void edit(G22Text script, LineAndColumn lineAndCol) { edit(script); print(+scriptIDE); print("Waiting for script IDE to appear for " + script); var ide = pollWaitUntilNotNull(100, 5.0, -> { if (scriptIDE == null) null; if (scriptIDE.script() != script) null; ret scriptIDE; }); print("Going to position " + lineAndCol + " in " + ide); ide?.goToPositionInAllModes(lineAndCol); } }