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 lastOpenedDBFile() {
ret newFile(databasesMotherDir(), "Last Opened");
}
File autoUpdateFile() {
ret newFile(databasesMotherDir(), "Auto-Update");
}
bool autoUpdateEnabled() {
ret fileExists(autoUpdateFile());
}
bool setAutoUpdate(bool b) {
createOrRemoveFile(autoUpdateFile(), b);
}
S dbToOpen() {
S name = loadTextFile(lastOpenedDBFile());
if (nempty(name) && fileExists(newFile(databasesMotherDir(), name)))
ret name;
ret defaultDBName();
}
void openedDB(File dbDir) {
if (sameFile(databasesMotherDir(), dirOfFile(dbDir)))
saveTextFile(lastOpenedDBFile(), fileName(dbDir));
}
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 sameFile(dir, concepts.conceptsDir());
}
File conceptsFile() { ret conceptsFileIn(dir); }
}
L gazelleDBs() {
new L dbs;
dbs.add(new GazelleDB("Legacy DB", programDir()));
for (File dir : listDirsContainingFileNamed(databasesMotherDir(),
"concepts.structure.gz"))
dbs.add(new GazelleDB(fileName(dir), dir));
ret dbs;
}
}