// Some of the functions are dependent on the concepts field, // others are global. sclass G22Utils { settable BackgroundProcessesUI backgroundProcessesUI; settable Enterable module; settable G22MasterStuff masterStuff; settable Concepts concepts; gettable CombinedStringifier stringifier = new( o -> o cast BufferedImage ? "Image (" + o.getWidth() + "*" + o.getHeight() + " px)" : null ); ImageSurface stdImageSurface() { var is = pixelatedImageSurface().setAutoZoomToDisplay(true).repaintInThread(false); is.specialPurposed = true; new ImageSurface_PositionToolTip(is); ret is; } ImageSurface stdImageSurface(BufferedImage etc img) { var is = stdImageSurface(); is.setImage(img); ret is; } S stringify(O o) { ret stringifier.toString(o); } event settingUpParser(GazelleV_LeftArrowScriptParser parser); GazelleV_LeftArrowScriptParser leftArrowParser() { new GazelleV_LeftArrowScriptParser parser; parser.g22utils(this); settingUpParser(parser); ret parser; } void basicParserTest() { var parser = leftArrowParser(); print(classContainerPrefixes := parser.classContainerPrefixes()); assertEquals(pair(1, 2), parser.parse("new Pair 1 2")!); } ifclass JLeftArrowScriptIDE JLeftArrowScriptIDE leftArrowIDE() { new JLeftArrowScriptIDE ide; ide.g22utils(this); ret ide; } endif File byteCodePath() { ret assertNotNull(getBytecodePathForClass(this)); } simplyCached ClassNameResolver classNameResolver() { ret new ClassNameResolver().byteCodePath(byteCodePath()).init(); } File databasesMotherDir() { ret javaxDataDir("Gazelle-22"); } AutoCloseable enter() { ret module?.enter(); } S defaultDBName() { ret "Default"; } File lastOpenedDBsFile() { ret newFile(databasesMotherDir(), "Last Opened"); } File autoUpdateFile() { ret newFile(databasesMotherDir(), "Auto-Update"); } bool autoUpdateEnabled() { ret fileExists(autoUpdateFile()); } void setAutoUpdate(bool b) { createOrRemoveFile(autoUpdateFile(), b); } LS dbsToOpen() { new LS dbNames; for (S name : tlft(loadTextFile(lastOpenedDBsFile()))) if (fileExists(newFile(databasesMotherDir(), name))) dbNames.add(name); if (empty(dbNames)) dbNames.add(defaultDBName()); ret dbNames; } void setOpenDBs(Cl dbDirs) { new LS dbNames; for (File dbDir : dbDirs) if (sameFile(databasesMotherDir(), dirOfFile(dbDir))) dbNames.add(fileName(dbDir)); saveTextFile(lastOpenedDBsFile(), lines(dbNames)); } ifclass SimpleCRUD_v2 void setupScriptCRUD(SimpleCRUD_v2 crud) { crud.useNewChangeHandler(true); crud.editableFieldsForItem = x -> ll("description"); //G22LeftArrowScript.f_description().getName()); crud.multiLineField("text"); crud.multiLineField("editingText"); crud.makeTextArea = text -> jMinHeight(200, crud.makeTextArea_base(text)); crud.humanizeFieldNames = false; crud.iconButtons(true); crud.itemToMap_inner2 = c -> litorderedmap( "Description" := str(c), "Status" := or2_rev("Empty", joinNemptiesWithSpacedPlus( c.isClearForAutoRun() ? "Clear for auto-run" : null, c.isSavedDistinctFromAutoRunVersion() ? "Saved (not cleared)" : null, c.isEditing() ? "Editing" : null )), "LoC" := n2(intMax(mapLL linesOfCode_javaTok( c.editingText, c.text, c.codeForAutoRun())))); } endif // e.g. for an image file L labelsForFile(File file) { if (file == null) null; File labelsFile = appendToFileName(file, ".labels"); LS labels = tlft(loadTextFile(labelsFile)); ret map getLabel(labels); } File labelsFile(File file) { if (file == null) null; ret appendToFileName(file, ".labels"); } void setLabelsForFile(File file, L labels) { LS list = map(labels, label -> label.name); File f = labelsFile(file); saveTextFile(f, lines(list)); print("Saved " + nLabels(list) + " (" + joinWithComma(list) + ") to " + f); } G22Label getLabel(S name) { if (empty(name)) null; if (containsNewLine(name)) fail("No newlines in label names allowed: " + name); ret uniqCI(concepts, G22Label, +name); } File fileInDbDir(S name) { ret newFile(conceptsDir(concepts), name); } record GazelleDB(S name, File dir) { simplyCached bool loaded() { ret containsFile(masterStuff.openConceptDirs(), dir); } File conceptsFile() { ret conceptsFileIn(dir); } } L gazelleDBs() { new L dbs; for (File dir : listDirsContainingFileNamed(databasesMotherDir(), "concepts.structure.gz")) dbs.add(new GazelleDB(fileName(dir), dir)); ret dbs; } }