Warning : session_start(): open(/var/lib/php/sessions/sess_adfp733iuhn1i0agt5dfs0dp9d, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning : session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
import java.util.*;
import java.util.zip.*;
import java.util.List;
import java.util.regex.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import java.util.function.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import java.lang.management.*;
import java.security.*;
import java.security.spec.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.imageio.*;
import java.math.*;
import org.fife.ui.autocomplete.*;
import org.fife.rsta.ui.CollapsibleSectionPanel;
import org.fife.rsta.ui.GoToDialog;
import org.fife.rsta.ui.SizeGripIcon;
import org.fife.rsta.ui.search.FindDialog;
import org.fife.rsta.ui.search.ReplaceDialog;
import org.fife.rsta.ui.search.ReplaceToolBar;
import org.fife.rsta.ui.search.SearchEvent;
import org.fife.rsta.ui.search.SearchListener;
import org.fife.rsta.ui.search.FindToolBar;
import org.fife.ui.rsyntaxtextarea.ErrorStrip;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rtextarea.RTextScrollPane;
import org.fife.ui.rtextarea.SearchContext;
import org.fife.ui.rtextarea.SearchEngine;
import org.fife.ui.rtextarea.SearchResult;
import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
import org.fife.ui.rsyntaxtextarea.SyntaxScheme;
import static x30_pkg.x30_util.DynamicObject;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.Const;
import org.apache.bcel.generic.*;
import java.lang.reflect.Type;
import javax.swing.border.TitledBorder;
import java.util.jar.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.DataFlavor;
import java.text.*;
import java.nio.file.Path;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;
import javax.swing.Timer;
import org.fife.ui.rsyntaxtextarea.*;
import java.awt.datatransfer.StringSelection;
import javax.swing.undo.UndoManager;
import javax.swing.border.*;
import java.awt.geom.*;
import java.text.NumberFormat;
import javax.imageio.metadata.*;
import javax.imageio.stream.*;
import java.nio.charset.Charset;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
import java.awt.datatransfer.UnsupportedFlavorException;
import javax.swing.Icon;
public class main {
static public class G22AnalyzersPanel extends G22CRUDAndDetailPanel {
public SimpleCRUD_v2 makeCRUD() {
var crud = new SimpleCRUD_v2<>(g22utils.concepts(), G22Analyzer.class);
crud.entityName = () -> "Analyzer";
g22utils.setupScriptCRUD(crud);
return crud;
}
public JComponent makeDetailView(G22Analyzer script) {
var scriptIDE = new G22AnalyzerIDE(g22utils);
scriptIDE.setScript(script);
return scriptIDE.visualize();
}
public SimpleCRUD_v2 scriptCRUD() {
return crud();
}
public G22AnalyzersPanel g22utils(G22Utils g22utils) {
super.g22utils(g22utils);
return this;
}
}
static public class G22AnalyzerIDE extends G22LAScriptIDE {
public G22AnalyzerIDE(G22Utils g22utils) {
super(g22utils);
}
final public G22AnalyzerIDE setTimeoutToRecognizeAnImage(double timeoutToRecognizeAnImage) {
return timeoutToRecognizeAnImage(timeoutToRecognizeAnImage);
}
public G22AnalyzerIDE timeoutToRecognizeAnImage(double timeoutToRecognizeAnImage) {
this.timeoutToRecognizeAnImage = timeoutToRecognizeAnImage;
return this;
}
final public double getTimeoutToRecognizeAnImage() {
return timeoutToRecognizeAnImage();
}
public double timeoutToRecognizeAnImage() {
return timeoutToRecognizeAnImage;
}
public double timeoutToRecognizeAnImage = 10.0;
transient public IF0 exampleExampleImage;
public BufferedImage exampleExampleImage() {
return exampleExampleImage != null ? exampleExampleImage.get() : exampleExampleImage_base();
}
final public BufferedImage exampleExampleImage_fallback(IF0 _f) {
return _f != null ? _f.get() : exampleExampleImage_base();
}
public BufferedImage exampleExampleImage_base() {
return loadImage2("#1101126");
}
transient public ConceptsComboBox cbExampleImage;
public BufferedImage exampleImage() {
var selected = script.exampleImage.get();
{
var __1 = selected == null ? null : selected.load();
if (__1 != null)
return __1;
}
return exampleExampleImage();
}
{
onSettingUpIDE(ide -> {
ide.runScript = () -> {
G22Analyzer.CompiledAnalyzer analyzer = (G22Analyzer.CompiledAnalyzer) (ide.freshCompileResult());
if (!analyzer.runnable())
return;
var image = exampleImage();
var bg = g22utils.backgroundProcessesUI();
AutoCloseable __2 = bg == null ? null : bg.tempAdd("Run recognizer on example image");
try {
var result = runResultWithTimestamps(() -> analyzer.get(image));
ide.showScriptResult(result);
} finally {
_close(__2);
}
};
});
}
public JComponent visualize_impl() {
cbExampleImage = new ConceptsComboBox<>(g22utils.concepts, G22GalleryImage.class);
var varExampleImage = new FieldVar(script, "exampleImage", () -> script.exampleImage.get(), img -> cset(script, "exampleImage", img));
bindComboBoxToVar_withUserChangeListener(cbExampleImage, varExampleImage, runnableThread(new Runnable() {
public void run() {
try {
visibleIDE().runScript();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "visibleIDE().runScript()";
}
}));
return centerAndSouthWithMargin(super.visualize_impl(), rightAlignedLine(withLabel("Image to analyze:", cbExampleImage)));
}
}
static public class G22Analyzer extends G22LeftArrowScript {
public Ref exampleImage = new Ref();
@Override
public GazelleV_LeftArrowScriptParser makeParser() {
var parser = super.makeParser();
parser.addVar("image", BufferedImage.class, false);
parser.addVar("context", G22AnalysisContext.class, false);
return parser;
}
public class CompiledAnalyzer extends LASCompileResult {
final public CompiledAnalyzer setTimeout(double timeout) {
return timeout(timeout);
}
public CompiledAnalyzer timeout(double timeout) {
this.timeout = timeout;
return this;
}
final public double getTimeout() {
return timeout();
}
public double timeout() {
return timeout;
}
public double timeout = 10;
public G22AnalysisContext createAnalysisContext(BufferedImage image) {
return new G22AnalysisContext(g22utils(), image);
}
public Object get_impl(G22AnalysisContext context) {
VarContext ctx = new VarContext();
ctx.set("image", context.image);
ctx.set("context", context);
return parsedScript.get(ctx);
}
public Object get_impl(BufferedImage image) {
return get_impl(createAnalysisContext(image));
}
public Object get(BufferedImage image) {
return get(createAnalysisContext(image));
}
public Object get(G22AnalysisContext context) {
if (context.analyzerResults.containsKey(analyzer())) {
Object value = context.analyzerResults.get(analyzer());
if (value == G22AnalysisContext.calculating)
throw fail("Recursive call to analyzer " + this);
return ((OKOrError) value).getMandatory();
}
context.analyzerResults.put(analyzer(), G22AnalysisContext.calculating);
var result = okOrError(() -> {
if (parsedScript == null)
rethrow(compileError);
var image = context.image;
if (image == null)
throw fail("Need image");
return g22utils().evalRegisteredCode(timeout, str(G22Analyzer.this), () -> get_impl(context));
});
context.analyzerResults.put(analyzer(), result);
return result.getMandatory();
}
}
public G22Analyzer analyzer() {
return this;
}
public LASCompileResult newCompileResult() {
return new CompiledAnalyzer();
}
public CompiledAnalyzer compileForAutoRun() {
return (CompiledAnalyzer) super.compileForAutoRun();
}
}
static public class SimpleCRUD_v2 extends JConceptsTable {
public JPanel buttons, panel;
public Set unshownFields;
public Set excludeFieldsFromEditing;
public String modifiedField;
public TableSearcher tableSearcher;
public Set multiLineFields;
public Set dontDuplicateFields;
public int formFixer = 12;
public boolean showBackRefs = false;
public int maxRefsToShow = 3;
public boolean showClassNameSelectors = false;
public boolean allowNewFields = false;
public int newFieldsToShow = 3;
public boolean emptyStringsToNull = false;
public int formLabelsWidth = 100;
final public SimpleCRUD_v2 setShowSearchBar(boolean showSearchBar) {
return showSearchBar(showSearchBar);
}
public SimpleCRUD_v2 showSearchBar(boolean showSearchBar) {
this.showSearchBar = showSearchBar;
return this;
}
final public boolean getShowSearchBar() {
return showSearchBar();
}
public boolean showSearchBar() {
return showSearchBar;
}
public boolean showSearchBar = true;
final public SimpleCRUD_v2 setShowAddButton(boolean showAddButton) {
return showAddButton(showAddButton);
}
public SimpleCRUD_v2 showAddButton(boolean showAddButton) {
this.showAddButton = showAddButton;
return this;
}
final public boolean getShowAddButton() {
return showAddButton();
}
public boolean showAddButton() {
return showAddButton;
}
public boolean showAddButton = true;
final public SimpleCRUD_v2 setShowEditButton(boolean showEditButton) {
return showEditButton(showEditButton);
}
public SimpleCRUD_v2 showEditButton(boolean showEditButton) {
this.showEditButton = showEditButton;
return this;
}
final public boolean getShowEditButton() {
return showEditButton();
}
public boolean showEditButton() {
return showEditButton;
}
public boolean showEditButton = true;
final public SimpleCRUD_v2 setIconButtons(boolean iconButtons) {
return iconButtons(iconButtons);
}
public SimpleCRUD_v2 iconButtons(boolean iconButtons) {
this.iconButtons = iconButtons;
return this;
}
final public boolean getIconButtons() {
return iconButtons();
}
public boolean iconButtons() {
return iconButtons;
}
public boolean iconButtons = false;
public SingleComponentPanel scpButtonFiller;
public SimpleCRUD_v2(Class conceptClass) {
super(conceptClass);
}
public SimpleCRUD_v2(Concepts concepts, Class conceptClass) {
super(concepts, conceptClass);
}
public SimpleCRUD_v2 show(String frameTitle) {
make();
showFrame(frameTitle, panel);
return this;
}
public SimpleCRUD_v2 show() {
return show(entityNamePlural());
}
public SimpleCRUD_v2 showMaximized() {
show();
maximizeFrame(panel);
return this;
}
public JPanel makePanel() {
return make();
}
public JPanel make() {
db();
framesBot();
return make_dontStartBots();
}
transient public IF1 > itemToMap_inner;
public Map itemToMap_inner(A a) {
return itemToMap_inner != null ? itemToMap_inner.get(a) : itemToMap_inner_base(a);
}
final public Map itemToMap_inner_fallback(IF1> _f, A a) {
return _f != null ? _f.get(a) : itemToMap_inner_base(a);
}
public Map itemToMap_inner_base(A a) {
return super.itemToMap_base(a);
}
public Map itemToMap_base(A a) {
Map map = itemToMap_inner(a);
if (map == null)
return null;
return putAll(map, moreSpecialFieldsForItem(a));
}
transient public IF1> moreSpecialFieldsForItem;
public Map moreSpecialFieldsForItem(A a) {
return moreSpecialFieldsForItem != null ? moreSpecialFieldsForItem.get(a) : moreSpecialFieldsForItem_base(a);
}
final public Map moreSpecialFieldsForItem_fallback(IF1> _f, A a) {
return _f != null ? _f.get(a) : moreSpecialFieldsForItem_base(a);
}
public Map moreSpecialFieldsForItem_base(A a) {
Map map = litorderedmap();
if (showBackRefs) {
Collection refs = allBackRefs(a);
if (nempty(refs)) {
refs = sortedByConceptID(refs);
int more = l(refs) - maxRefsToShow;
map.put("Referenced by", joinWithComma(takeFirst(maxRefsToShow, refs)) + (more > 0 ? ", " + more + " more" : ""));
}
}
return map;
}
public JPanel make_dontStartBots() {
return (JPanel) visualize();
}
public transient JComponent visualize_cache;
public JComponent visualize() {
if (visualize_cache == null)
visualize_cache = visualize_load();
return visualize_cache;
}
public JComponent visualize_load() {
return markVisualizer(this, visualize_impl());
}
public JComponent visualize_impl() {
dropFields = asList(unshownFields);
makeTable();
{
swing(() -> {
buttons = jRightAlignedLine(flattenToList(!showAddButton ? null : makeAddButton(new Runnable() {
public void run() {
try {
newConcept();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "newConcept();";
}
}), !showEditButton ? null : tableDependButton(table, makeDuplicateButton(new Runnable() {
public void run() {
try {
duplicateConcept(selectedConcept());
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "duplicateConcept(selectedConcept())";
}
})), !showEditButton ? null : tableDependButton(table, makeEditButton(new Runnable() {
public void run() {
try {
editConcept(selectedConcept());
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "editConcept(selectedConcept())";
}
})), tableDependButton(table, makeDeleteButton(new Runnable() {
public void run() {
try {
List l = selectedConcepts();
withDBLock(concepts, new Runnable() {
public void run() {
try {
for (A c : l) c.delete();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "for (A c : l) c.delete()";
}
});
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "List l = selectedConcepts();\r\n withDBLock(concepts, r { for (A c ...";
}
}))));
var buttonBar = centerAndEastWithMargin(scpButtonFiller = singleComponentPanel(), buttons);
if (showSearchBar) {
tableSearcher = tableWithSearcher2(table, "withMargin", true);
panel = centerAndSouthWithMargin(tableSearcher.panel, buttonBar);
} else
panel = centerAndSouthWithMargin(table, buttonBar);
var fEdit = new VF1() {
public void get(Integer row) {
try {
editConcept(getItem(row));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "editConcept(getItem(row))";
}
};
tablePopupMenuItem(table, "Edit", fEdit);
onDoubleClick(table, fEdit);
tablePopupMenuFirst(table, (menu, row) -> {
Concept c = getItem(row);
if (c != null)
addMenuItem(menu, "Delete " + quote(shorten(str(c))), runnableThread(new Runnable() {
public void run() {
try {
deleteConcept(c);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "deleteConcept(c);";
}
}));
});
});
}
return panel;
}
transient public Runnable newConcept;
public void newConcept() {
if (newConcept != null)
newConcept.run();
else
newConcept_base();
}
final public void newConcept_fallback(Runnable _f) {
if (_f != null)
_f.run();
else
newConcept_base();
}
public void newConcept_base() {
duplicateConcept(null);
}
public void duplicateConcept(A oldConcept) {
EditWindow ew = new EditWindow();
ew.item = (A) unlisted(oldConcept == null ? conceptClass : _getClass(oldConcept));
csetAll(ew.item, filters);
ccopyFieldsExcept(oldConcept, ew.item, dontDuplicateFields);
makeComponents(ew);
F0 r = new F0() {
public Boolean get() {
try {
try {
selectAfterUpdate(ew.item);
concepts.register(ew.item);
saveData(ew);
} catch (Throwable e) {
printStackTrace(e);
infoBox(e);
return false;
}
return true;
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "try {\r\n selectAfterUpdate(ew.item);\r\n concepts.register(ew.item...";
}
};
AutoCloseable __2 = tempSetMCOpt("formLayouter1_fixer2", formFixer);
try {
renameSubmitButton("Create", showAForm("New " + entityName(), toObjectArray(listPlus(ew.matrix, r))));
} finally {
_close(__2);
}
}
public void editConcept(A c) {
if (c == null)
return;
EditWindow ew = new EditWindow();
ew.item = c;
makeComponents(ew);
F0 r = new F0() {
public Boolean get() {
try {
try {
if (ew.item != c) {
print("Replacing object: " + c + " => " + ew.item);
replaceConceptAndUpdateRefs(c, ew.item);
}
saveData(ew);
} catch (Throwable e) {
printStackTrace(e);
infoBox(e);
return false;
}
return true;
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "try {\r\n // concept class was changed, replace object\r\n if (ew.i...";
}
};
AutoCloseable __3 = tempSetMCOpt("formLayouter1_fixer2", formFixer);
try {
renameSubmitButton("Save", showAForm("Edit " + entityName() + " #" + c.id, toObjectArray(listPlus(ew.matrix, r))));
} finally {
_close(__3);
}
}
public JComponent fieldComponent(A c, String field) {
Class type = getFieldType(conceptClass, field);
Type genericType = genericFieldType(conceptClass, field);
if (type == Concept.Ref.class)
type = getTypeArgumentAsClass(genericType);
Object value = cget(c, field);
if (type == null)
type = _getClass(value);
print("Field type: " + field + " => " + type);
if (type == boolean.class)
return jCenteredCheckBox(isTrue(value));
else if (contains(multiLineFields, field) || containsNewLines(optCast(String.class, value)))
return makeTextArea((String) value);
else if (isSubtype(type, Concept.class))
return jcomboboxFromConcepts_str(concepts, type, (Concept) value);
else if (isUneditableFieldType(type))
return jlabel(structureOrText_crud(value));
else
try {
return autoComboBox(structureOrText_crud(value), new TreeSet(map(__47 -> structureOrText_crud(__47), collect(list(concepts, conceptClass), field))));
} catch (Throwable e) {
printException(e);
return jTextField(structureOrText_crud(value));
}
}
public void saveComponent(A c, String field, JComponent comp) {
comp = unwrap(comp);
Class type = fieldType(c, field);
Type genericType = genericFieldType(conceptClass, field);
if (type == Concept.Ref.class)
type = getTypeArgumentAsClass(genericType);
if (comp instanceof JTextComponent) {
String text = trimIf(!(comp instanceof JTextArea), getText((JTextComponent) comp));
Object value = postProcessValue(text);
Object converted = convertToField(value, conceptClass, field);
cset(c, field, converted);
} else if (comp instanceof JComboBox) {
String text = getTextTrim((JComboBox) comp);
if (isSubtype(type, Concept.class))
cset(c, field, getConcept(concepts, parseFirstLong(text)));
else {
Object value = postProcessValue(text);
cset(c, field, convertToField(value, conceptClass, field));
}
} else if (comp instanceof JCheckBox)
cset(c, field, isChecked((JCheckBox) comp));
}
transient public IF1> editableFieldsForItem;
public Collection editableFieldsForItem(A c) {
return editableFieldsForItem != null ? editableFieldsForItem.get(c) : editableFieldsForItem_base(c);
}
final public Collection editableFieldsForItem_fallback(IF1> _f, A c) {
return _f != null ? _f.get(c) : editableFieldsForItem_base(c);
}
public Collection editableFieldsForItem_base(A c) {
if (excludeFieldsFromEditing != null && modifiedField != null)
excludeFieldsFromEditing.add(modifiedField);
return listWithoutSet(conceptFieldsInOrder(c), joinSets(excludeFieldsFromEditing, unshownFields, keys(filters)));
}
public void excludeFieldsFromEditing(String... fields) {
excludeFieldsFromEditing = setPlus(excludeFieldsFromEditing, fields);
}
public Collection> possibleClasses() {
return (Collection) moveItemFirst(conceptClass, dropTypeParameter(sortClassesByNameIC(myNonAbstractClassesImplementing(conceptClass))));
}
public JComboBox> classSelectorComponent(A c) {
return setComboBoxRenderer(jTypedComboBox(possibleClasses(), _getClass(c)), customToStringListCellRenderer(__48 -> shortClassName(__48)));
}
public class NewField {
public JTextField tfName = jtextfield();
public JTextField tfValue = jtextfield();
public JComboBox cbRef = jcomboboxFromConcepts_str(concepts, conceptClass);
public JComboBox cbType = jcombobox("String", "Reference");
public SingleComponentPanel scpValue = singleComponentPanel();
public JPanel panel() {
onChangeAndNow(cbType, new Runnable() {
public void run() {
try {
updateSCP();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "updateSCP();";
}
});
return jhgridWithSpacing(withToolTip("Name for new field", withLabel("Name", tfName)), withLabel("Value", westAndCenterWithMargin(cbType, scpValue)));
}
public String typeStr() {
return getText(cbType);
}
public void updateSCP() {
scpValue.setComponent(eqic(typeStr(), "Reference") ? cbRef : withToolTip("Contents of new field", tfValue));
}
public String field() {
return gtt(tfName);
}
public Object value() {
return eqic(typeStr(), "Reference") ? getConcept(concepts, parseFirstLong(getText(cbRef))) : gtt(tfValue);
}
}
public class EditWindow {
public A item;
public Map componentsByField = litorderedmap();
public List matrix = new ArrayList();
public JComboBox> classSelector;
public List newFields = new ArrayList();
}
public void makeComponents(EditWindow ew) {
if (showClassNameSelectors) {
addAll(ew.matrix, makeLabel("Java Class"), ew.classSelector = classSelectorComponent(ew.item));
onChange(ew.classSelector, new Runnable() {
public void run() {
try {
Class extends A> oldClass = _getClass(ew.item);
Class extends A> newClass = getSelectedItem_typed(ew.classSelector);
if (oldClass == newClass)
return;
A oldItem = ew.item;
ew.item = unlisted(newClass);
ccopyFields(oldItem, ew.item);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "Class extends A> oldClass = _getClass(ew.item);\r\n Class extends A>...";
}
});
}
for (String field : editableFieldsForItem(ew.item)) {
JComponent c = fieldComponent(ew.item, field);
ew.componentsByField.put(field, c);
addAll(ew.matrix, makeLabel(field), c);
}
if (allowNewFields && newFieldsToShow > 0) {
addAll(ew.matrix, " ", jlabel());
for (int i = 0; i < newFieldsToShow; i++) {
NewField nf = new NewField();
ew.newFields.add(nf);
addAll(ew.matrix, makeLabel(""), nf.panel());
}
}
}
public void saveData(EditWindow ew) {
for (Map.Entry extends String, ? extends JComponent> __0 : _entrySet(ew.componentsByField)) {
String field = __0.getKey();
JComponent component = __0.getValue();
if (isIdentifier(field))
saveComponent(ew.item, field, component);
}
for (NewField nf : ew.newFields) {
String field = nf.field();
Object value = nf.value();
if (nempty(field) && notNullOrEmptyString(value))
cset(ew.item, field, value);
}
if (modifiedField != null)
cset(ew.item, modifiedField, now());
}
public Object postProcessValue(Object o) {
if (emptyStringsToNull && eq(o, ""))
return null;
return o;
}
public JComponent makeLabel(String label) {
return jMinWidthAtLeast(formLabelsWidth, jlabel(label));
}
transient public IF2 showAForm;
public JComponent showAForm(String title, Object... parts) {
return showAForm != null ? showAForm.get(title, parts) : showAForm_base(title, parts);
}
final public JComponent showAForm_fallback(IF2 _f, String title, Object... parts) {
return _f != null ? _f.get(title, parts) : showAForm_base(title, parts);
}
public JComponent showAForm_base(String title, Object... parts) {
return showFormTitled3(title, parts).visualize();
}
public boolean isUneditableFieldType(Class type) {
return isSubclassOfAny(type, Map.class, List.class, Pair.class);
}
public void hideField(String field) {
hideFields(field);
}
public void hideFields(String... fields) {
unshownFields = createOrAddToSet(unshownFields, fields);
}
transient public IF0 entityName;
public String entityName() {
return entityName != null ? entityName.get() : entityName_base();
}
final public String entityName_fallback(IF0 _f) {
return _f != null ? _f.get() : entityName_base();
}
public String entityName_base() {
return shortClassName(conceptClass);
}
transient public IF0 entityNamePlural;
public String entityNamePlural() {
return entityNamePlural != null ? entityNamePlural.get() : entityNamePlural_base();
}
final public String entityNamePlural_fallback(IF0 _f) {
return _f != null ? _f.get() : entityNamePlural_base();
}
public String entityNamePlural_base() {
return plural(entityName());
}
transient public IF0 entityNameLower;
public String entityNameLower() {
return entityNameLower != null ? entityNameLower.get() : entityNameLower_base();
}
final public String entityNameLower_fallback(IF0 _f) {
return _f != null ? _f.get() : entityNameLower_base();
}
public String entityNameLower_base() {
return firstToLower(entityName());
}
transient public IF0 entityNamePluralLower;
public String entityNamePluralLower() {
return entityNamePluralLower != null ? entityNamePluralLower.get() : entityNamePluralLower_base();
}
final public String entityNamePluralLower_fallback(IF0 _f) {
return _f != null ? _f.get() : entityNamePluralLower_base();
}
public String entityNamePluralLower_base() {
return firstToLower(entityNamePlural());
}
public void addButton(String text, Runnable r) {
addButton(jbutton(text, r));
}
public void addButton(JComponent c) {
buttons.add(c);
}
public JButton makeAddButton(Runnable r) {
return makeButton("Add...", "Create a new " + entityNameLower(), "#1103069", r);
}
public JButton makeDeleteButton(Runnable r) {
return makeButton("Delete", "Delete selected " + entityNamePluralLower(), "#1103067", r);
}
public JButton makeEditButton(Runnable r) {
return makeButton("Edit...", "Edit selected " + entityNameLower(), "#1103068", r);
}
public JButton makeDuplicateButton(Runnable r) {
return makeButton("Duplicate...", "Duplicate selected " + entityNameLower(), "#1103070", r);
}
public JButton makeButton(String text, String iconID, Runnable r) {
return makeButton(text, null, iconID, r);
}
public JButton makeButton(String text, String toolTip, String iconID, Runnable r) {
if (iconButtons)
return toolTip(or2(toolTip, text), jimageButtonScaledToWidth(16, iconID, text, r));
else
return toolTip(toolTip, jbutton(text, r));
}
public void multiLineField(String field) {
multiLineFields = addOrCreate(multiLineFields, field);
}
transient public IF1 makeTextArea;
public JComponent makeTextArea(String text) {
return makeTextArea != null ? makeTextArea.get(text) : makeTextArea_base(text);
}
final public JComponent makeTextArea_fallback(IF1 _f, String text) {
return _f != null ? _f.get(text) : makeTextArea_base(text);
}
public JComponent makeTextArea_base(String text) {
return typeWriterTextArea(text);
}
public void setButtonFiller(JComponent c) {
scpButtonFiller.set(c);
}
}
abstract static public class G22CRUDAndDetailPanel extends Concept {
static final public String _fieldOrder = "selected g22utils crud scpDetail";
public Ref selected = new Ref();
final public G22CRUDAndDetailPanel setG22utils(G22Utils g22utils) {
return g22utils(g22utils);
}
public G22CRUDAndDetailPanel g22utils(G22Utils g22utils) {
this.g22utils = g22utils;
return this;
}
final public G22Utils getG22utils() {
return g22utils();
}
public G22Utils g22utils() {
return g22utils;
}
transient public G22Utils g22utils;
final public SimpleCRUD_v2 getCrud() {
return crud();
}
public SimpleCRUD_v2 crud() {
return crud;
}
transient public SimpleCRUD_v2 crud;
transient public SingleComponentPanel scpDetail;
abstract public SimpleCRUD_v2 makeCRUD();
abstract public JComponent makeDetailView(A a);
public transient JComponent visualize_cache;
public JComponent visualize() {
if (visualize_cache == null)
visualize_cache = visualize_load();
return visualize_cache;
}
public JComponent visualize_load() {
return markVisualizer(this, visualize_impl());
}
public JComponent visualize_impl() {
crud = makeCRUD();
scpDetail = singleComponentPanel(emptyDetailView());
selectAfterUpdate(selected.get());
var crudVis = crud.visualize();
crud.onSelectionChanged(() -> {
var selected = crud.selected();
this.selected.set(selected);
if (selected == null)
scpDetail.set(emptyDetailView());
else {
var view = makeDetailView(selected);
var lvTitle = liveValue_hasChangeListeners(selected, () -> crud.entityName() + " " + selected.id + ": " + selected);
scpDetail.set(jCenteredRaisedLiveValueSection(lvTitle, view));
}
});
return new CollapsibleNorthPanel(true, crud.entityName() + " List", jCenteredSection(crud.entityNamePlural(), crudVis), scpDetail).visualize();
}
public JComponent emptyDetailView() {
return jGazelleLogo();
}
public void addCountToEnclosingTab(boolean b) {
crud.addCountToEnclosingTab(b);
}
public void updateCount() {
crud.update();
}
public void edit(A A) {
crud.setSelected(A);
}
public void setSelected(A A) {
crud.setSelected(A);
}
public void selectAfterUpdate(A A) {
crud.selectAfterUpdate(A);
}
}
static public class G22Utils implements AutoCloseable {
final public G22Utils setBackgroundProcessesUI(IBackgroundProcesses backgroundProcessesUI) {
return backgroundProcessesUI(backgroundProcessesUI);
}
public G22Utils backgroundProcessesUI(IBackgroundProcesses backgroundProcessesUI) {
this.backgroundProcessesUI = backgroundProcessesUI;
return this;
}
final public IBackgroundProcesses getBackgroundProcessesUI() {
return backgroundProcessesUI();
}
public IBackgroundProcesses backgroundProcessesUI() {
return backgroundProcessesUI;
}
public IBackgroundProcesses backgroundProcessesUI;
final public G22Utils setModule(Enterable module) {
return module(module);
}
public G22Utils module(Enterable module) {
this.module = module;
return this;
}
final public Enterable getModule() {
return module();
}
public Enterable module() {
return module;
}
public Enterable module;
final public G22Utils setMasterStuff(G22MasterStuff masterStuff) {
return masterStuff(masterStuff);
}
public G22Utils masterStuff(G22MasterStuff masterStuff) {
this.masterStuff = masterStuff;
return this;
}
final public G22MasterStuff getMasterStuff() {
return masterStuff();
}
public G22MasterStuff masterStuff() {
return masterStuff;
}
public G22MasterStuff masterStuff;
final public G22Utils setConcepts(Concepts concepts) {
return concepts(concepts);
}
public G22Utils concepts(Concepts concepts) {
this.concepts = concepts;
return this;
}
final public Concepts getConcepts() {
return concepts();
}
public Concepts concepts() {
return concepts;
}
public Concepts concepts;
final public G22Utils setProjectActions(G22ProjectActions projectActions) {
return projectActions(projectActions);
}
public G22Utils projectActions(G22ProjectActions projectActions) {
this.projectActions = projectActions;
return this;
}
final public G22ProjectActions getProjectActions() {
return projectActions();
}
public G22ProjectActions projectActions() {
return projectActions;
}
public G22ProjectActions projectActions;
final public G22AutoStarter getAutoStarter() {
return autoStarter();
}
public G22AutoStarter autoStarter() {
return autoStarter;
}
public G22AutoStarter autoStarter = new G22AutoStarter(this);
final public G22Utils setFunctionTimings(FunctionTimings functionTimings) {
return functionTimings(functionTimings);
}
public G22Utils functionTimings(FunctionTimings functionTimings) {
this.functionTimings = functionTimings;
return this;
}
final public FunctionTimings getFunctionTimings() {
return functionTimings();
}
public FunctionTimings functionTimings() {
return functionTimings;
}
public FunctionTimings functionTimings = new FunctionTimings();
final public CombinedStringifier getStringifier() {
return stringifier();
}
public CombinedStringifier stringifier() {
return stringifier;
}
public CombinedStringifier stringifier = new CombinedStringifier(o -> o instanceof BufferedImage ? "Image (" + ((BufferedImage) o).getWidth() + "*" + ((BufferedImage) o).getHeight() + " px)" : null);
public LASClassLoader lasClassLoader() {
return masterStuff == null ? null : masterStuff.lasClassLoader();
}
public ImageSurface stdImageSurface() {
var is = pixelatedImageSurface().setAutoZoomToDisplay(true).repaintInThread(false);
is.defaultImageDir = () -> dbDir();
is.specialPurposed = true;
new ImageSurface_PositionToolTip(is);
return is;
}
public ImageSurface stdImageSurface(MakesBufferedImage img) {
return stdImageSurface(toBufferedImage(img));
}
public ImageSurface stdImageSurface(BufferedImage img) {
var is = stdImageSurface();
is.setImage(img);
return is;
}
public ImageSurface stdImageSurfaceWithSelection(MakesBufferedImage img, Rect selection) {
return stdImageSurfaceWithSelection(toBufferedImage(img), selection);
}
public ImageSurface stdImageSurfaceWithSelection(BufferedImage img, Rect selection) {
var is = stdImageSurface(img);
is.setSelection(selection);
return is;
}
public String stringify(Object o) {
return stringifier.toString(o);
}
transient public Set> onSettingUpParser;
public G22Utils onSettingUpParser(IVF1 f) {
onSettingUpParser = createOrAddToSyncLinkedHashSet(onSettingUpParser, f);
return this;
}
public G22Utils removeSettingUpParserListener(IVF1 f) {
main.remove(onSettingUpParser, f);
return this;
}
public void settingUpParser(GazelleV_LeftArrowScriptParser parser) {
if (onSettingUpParser != null)
for (var listener : onSettingUpParser) pcallF_typed(listener, parser);
}
transient public Set> onSettingUpScriptIDE;
public G22Utils onSettingUpScriptIDE(IVF1 f) {
onSettingUpScriptIDE = createOrAddToSyncLinkedHashSet(onSettingUpScriptIDE, f);
return this;
}
public G22Utils removeSettingUpScriptIDEListener(IVF1 f) {
main.remove(onSettingUpScriptIDE, f);
return this;
}
public void settingUpScriptIDE(JLeftArrowScriptIDE ide) {
if (onSettingUpScriptIDE != null)
for (var listener : onSettingUpScriptIDE) pcallF_typed(listener, ide);
}
public GazelleV_LeftArrowScriptParser leftArrowParser() {
GazelleV_LeftArrowScriptParser parser = new GazelleV_LeftArrowScriptParser();
parser.g22utils(this);
parser.lasClassLoader(lasClassLoader());
settingUpParser(parser);
return parser;
}
public void basicParserTest() {
var parser = leftArrowParser();
print("classContainerPrefixes", parser.classContainerPrefixes());
assertEquals(pair(1, 2), parser.parse("new Pair 1 2").get());
}
public JLeftArrowScriptIDE leftArrowIDE() {
JLeftArrowScriptIDE ide = new JLeftArrowScriptIDE();
ide.g22utils(this);
ide.scriptTimeout(projectWideScriptTimeout());
settingUpScriptIDE(ide);
return ide;
}
public File byteCodePath() {
return assertNotNull(getBytecodePathForClass(this));
}
public ClassNameResolver classNameResolver_cache;
public ClassNameResolver classNameResolver() {
if (classNameResolver_cache == null)
classNameResolver_cache = classNameResolver_load();
return classNameResolver_cache;
}
public ClassNameResolver classNameResolver_load() {
return new ClassNameResolver().byteCodePath(byteCodePath()).init();
}
public File databasesMotherDir() {
return javaxDataDir("Gazelle-22");
}
public AutoCloseable enter() {
return module == null ? null : module.enter();
}
public String defaultDBName() {
return "Default";
}
public File lastOpenedDBsFile() {
return newFile(databasesMotherDir(), "Last Opened");
}
public File autoUpdateFile() {
return newFile(databasesMotherDir(), "Auto-Update");
}
public boolean autoUpdateEnabled() {
return fileExists(autoUpdateFile());
}
public void setAutoUpdate(boolean b) {
createOrRemoveFile(autoUpdateFile(), b);
}
public List dbsToOpen() {
List dbNames = new ArrayList();
for (String name : tlft(loadTextFile(lastOpenedDBsFile()))) if (fileExists(newFile(databasesMotherDir(), name)))
dbNames.add(name);
if (empty(dbNames))
dbNames.add(defaultDBName());
return dbNames;
}
public void setOpenDBs(Collection dbDirs) {
List dbNames = new ArrayList();
for (File dbDir : dbDirs) if (sameFile(databasesMotherDir(), dirOfFile(dbDir)))
dbNames.add(fileName(dbDir));
saveTextFile(lastOpenedDBsFile(), lines(dbNames));
}
public void setupScriptCRUD(SimpleCRUD_v2 crud) {
setupScriptCRUD(crud, false);
}
public void setupScriptCRUD(SimpleCRUD_v2 crud, boolean allowRunOnProjectOpen) {
crud.useNewChangeHandler(true);
crud.editableFieldsForItem = x -> llNonNulls("description", allowRunOnProjectOpen ? "runOnProjectOpen" : null, allowRunOnProjectOpen ? "runOrder" : null);
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 -> scriptToMap(c, allowRunOnProjectOpen);
}
public Map scriptToMap(G22LeftArrowScript c) {
return scriptToMap(c, false);
}
public Map scriptToMap(G22LeftArrowScript c, boolean allowRunOnProjectOpen) {
return litorderedmap("Description", str(c), "Status", renderScriptStatus(c), "LoC", renderScriptLoC(c), "Run on project open", allowRunOnProjectOpen && c.runOnProjectOpen ? "Yes" + appendBracketed("prio " + c.runOrder) : null);
}
public String renderScriptStatus(G22LeftArrowScript c) {
return or2_rev("Empty", joinNemptiesWithSpacedPlus(c.isClearForAutoRun() ? "Clear for auto-run" : null, c.isSavedDistinctFromAutoRunVersion() ? "Saved (not cleared)" : null, c.isEditing() ? "Editing" : null));
}
public String renderScriptLoC(G22LeftArrowScript c) {
return n2(intMax(mapLL(__49 -> linesOfCode_javaTok(__49), c.editingText, c.text, c.codeForAutoRun())));
}
public List labelsForFile(File file) {
if (file == null)
return null;
File labelsFile = appendToFileName(file, ".labels");
List labels = tlft(loadTextFile(labelsFile));
return map(__50 -> getLabel(__50), labels);
}
public File labelsFile(File file) {
if (file == null)
return null;
return appendToFileName(file, ".labels");
}
public void setLabelsForFile(File file, List labels) {
List list = map(labels, label -> label.name);
File f = labelsFile(file);
saveTextFile(f, lines(list));
print("Saved " + nLabels(list) + " (" + joinWithComma(list) + ") to " + f);
}
public G22Label getLabel(String name) {
if (empty(name))
return null;
if (containsNewLine(name))
throw fail("No newlines in label names allowed: " + name);
return uniqCI(concepts, G22Label.class, "name", name);
}
public File dbDir() {
return conceptsDir(concepts);
}
public File fileInDbDir(String name) {
return newFile(dbDir(), name);
}
public class GazelleDB implements IFieldsToList {
public String name;
public File dir;
public GazelleDB() {
}
public GazelleDB(String name, File dir) {
this.dir = dir;
this.name = name;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + name + ", " + dir + ")";
}
public boolean equals(Object o) {
if (!(o instanceof GazelleDB))
return false;
GazelleDB __0 = (GazelleDB) o;
return eq(name, __0.name) && eq(dir, __0.dir);
}
public int hashCode() {
int h = 1669530526;
h = boostHashCombine(h, _hashCode(name));
h = boostHashCombine(h, _hashCode(dir));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { name, dir };
}
public Boolean loaded_cache;
public boolean loaded() {
if (loaded_cache == null)
loaded_cache = loaded_load();
return loaded_cache;
}
public Boolean loaded_load() {
return containsFile(masterStuff.openConceptDirs(), dir);
}
public File conceptsFile() {
return conceptsFileIn(dir);
}
}
public List gazelleDBs() {
List dbs = new ArrayList();
for (File dir : listDirsContainingFileNamed(databasesMotherDir(), "concepts.structure.gz")) dbs.add(new GazelleDB(fileName(dir), dir));
return dbs;
}
public RSyntaxTextAreaWithSearch newSyntaxTextArea() {
return newSyntaxTextArea((IF1) null);
}
public RSyntaxTextAreaWithSearch newSyntaxTextArea(IF1 wrapStatusLabel) {
RSyntaxTextAreaWithSearch ta = new RSyntaxTextAreaWithSearch(wrapStatusLabel);
ta.textArea().setHighlightCurrentLine(false);
ta.menuLessOperation();
return ta;
}
public RSyntaxTextAreaWithSearch newSyntaxTextArea(String text) {
var ta = newSyntaxTextArea();
ta.setText(text);
return ta;
}
public File projectStoryTextFile() {
return newFile(dbDir(), "story.txt");
}
public String projectName() {
return fileName(dbDir());
}
public void close() {
try {
autoStarter.close();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public Object getProjectVar(String name) {
G22Variable var = conceptWhere(concepts, G22Variable.class, "name", name);
return var == null ? null : var.value;
}
public Object waitForProjectVar(String name) {
G22Variable var = optimizedUniq(concepts, G22Variable.class, "name", name);
Object o = var.value;
{
var __2 = o;
if (__2 != null)
return __2;
}
return waitUntilNotNull(var.varValue());
}
public void setTransientProjectVar(String name, Object value) {
G22Variable var = optimizedUniq(concepts, G22Variable.class, "name", name);
var.persistent(false).value(value);
}
public IVarWithNotify liveProjectVar(String name) {
return liveProjectVar(name, null);
}
public IVarWithNotify liveProjectVar(String name, Object defaultValue) {
G22Variable var = optimizedUniq(concepts, G22Variable.class, "name", name);
var.persistent(true);
var.setValueIfNull(defaultValue);
return var.varValue();
}
public IVarWithNotify liveTransientProjectVar(String name) {
return liveTransientProjectVar(name, null);
}
public IVarWithNotify liveTransientProjectVar(String name, Object defaultValue) {
G22Variable var = optimizedUniq(concepts, G22Variable.class, "name", name);
var.persistent(false);
var.setValueIfNull(defaultValue);
return var.varValue();
}
public double defaultScriptTimeout() {
return 10.0;
}
public double projectWideScriptTimeout() {
return or(toDoubleOrNull(getProjectVar("!Script Timeout")), defaultScriptTimeout());
}
public G22Analyzer getAnalyzer(long id) {
var a = getConcept(concepts, G22Analyzer.class, id);
if (a == null)
throw fail("Analyzer not found: " + id);
return a;
}
public G22LeftArrowScript getScript(long id) {
var a = getConcept(concepts, G22LeftArrowScript.class, id);
if (a == null)
throw fail("Script not found: " + id);
return a;
}
public Object callScript(long id) {
var script = getScript(id);
return script.evaluateWithoutTimeout();
}
public Object callAutoRunnableScript(long id) {
var script = getScript(id);
return script.evaluateAutoRunWithoutTimeout();
}
public double defaultTimeout() {
return infinity();
}
public A evalRegisteredCode(String processName, IF0 code) {
return evalRegisteredCode(defaultTimeout(), processName, code);
}
public A evalRegisteredCode(double timeoutSeconds, String processName, IF0 code) {
if (code == null)
return null;
return evalWithTimeoutOrTypedException(timeoutSeconds, () -> {
AutoCloseable __3 = enter();
try {
var process = backgroundProcessesUI.tempAdd(processName);
try {
Thread myThread = currentThread();
process.setInterruptAction(new Runnable() {
public void run() {
try {
cancelThread(myThread);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "cancelThread(myThread)";
}
});
return code.get();
} finally {
_close(process);
}
} finally {
_close(__3);
}
});
}
public Object host() {
AutoCloseable __4 = enter();
try {
return dm_os();
} finally {
_close(__4);
}
}
public A timeFunction(String name, IF0 f) {
return functionTimings.get(name, f);
}
}
public interface IVarWithNotify extends IVar , IF0WithChangeListeners {
default public IVarWithNotify onChange(IVF1 r) {
if (r == null)
return this;
onChange(() -> r.get(get()));
return this;
}
default public IVarWithNotify onChangeAndNow(IVF1 r) {
if (r == null)
return this;
onChangeAndNow(() -> r.get(get()));
return this;
}
}
static abstract public class VF1 implements IVF1 {
public abstract void get(A a);
}
public interface Enterable {
public AutoCloseable enter();
}
static public class OKOrError implements IF0 {
public A value;
final public Throwable getError() {
return error();
}
public Throwable error() {
return error;
}
public Throwable error;
public OKOrError() {
}
public OKOrError(A value) {
this.value = value;
}
public OKOrError(boolean dummy, Throwable error) {
this.error = error;
assertNotNull(error);
}
final public boolean isOK() {
return ok();
}
public boolean ok() {
return error == null;
}
public String toString() {
return ok() ? str(value) : "Error: " + str(error);
}
public A get() {
return !ok() ? null : value;
}
public A getMandatory() {
if (!ok())
throw rethrow(error);
return value;
}
static public OKOrError ok(A a) {
return new OKOrError(a);
}
static public OKOrError error(Throwable error) {
return new OKOrError(false, error);
}
}
static public class LASCompileResult {
final public LASCompileResult setScript(String script) {
return script(script);
}
public LASCompileResult script(String script) {
this.script = script;
return this;
}
final public String getScript() {
return script();
}
public String script() {
return script;
}
public String script;
final public LASCompileResult setParser(GazelleV_LeftArrowScriptParser parser) {
return parser(parser);
}
public LASCompileResult parser(GazelleV_LeftArrowScriptParser parser) {
this.parser = parser;
return this;
}
final public GazelleV_LeftArrowScriptParser getParser() {
return parser();
}
public GazelleV_LeftArrowScriptParser parser() {
return parser;
}
public GazelleV_LeftArrowScriptParser parser;
final public LASCompileResult setCompileError(Throwable compileError) {
return compileError(compileError);
}
public LASCompileResult compileError(Throwable compileError) {
this.compileError = compileError;
return this;
}
final public Throwable getCompileError() {
return compileError();
}
public Throwable compileError() {
return compileError;
}
public Throwable compileError;
public GazelleV_LeftArrowScript.Script parsedScript;
public String toString() {
return compileError != null ? errorToString() : "Compiled OK";
}
public String errorToString() {
return exceptionToStringShorter_dontDropOuterExceptions(compileError);
}
public boolean runnable() {
return parsedScript != null;
}
public void compile() {
try {
parsedScript = parser.parse(script);
print(parsedScript);
} catch (Throwable e) {
print(e);
compileError(e);
}
}
public GazelleV_LeftArrowScript.Script parsedScript() {
return parsedScript;
}
public GazelleV_LeftArrowScript.Script parsedScriptMandatory() {
if (compileError != null)
throw fail(compileError);
return parsedScript;
}
}
static public class ClassNameResolver {
final public ClassNameResolver setByteCodePath(File byteCodePath) {
return byteCodePath(byteCodePath);
}
public ClassNameResolver byteCodePath(File byteCodePath) {
this.byteCodePath = byteCodePath;
return this;
}
final public File getByteCodePath() {
return byteCodePath();
}
public File byteCodePath() {
return byteCodePath;
}
public File byteCodePath = byteCodePathForClass(getClass());
public List importedPackages = itemPlusList("java.lang", endingWith_dropSuffix(standardImports(), ".*"));
public Set allFullyQualifiedClassNames_cache;
public Set allFullyQualifiedClassNames() {
if (allFullyQualifiedClassNames_cache == null)
allFullyQualifiedClassNames_cache = allFullyQualifiedClassNames_load();
return allFullyQualifiedClassNames_cache;
}
public Set allFullyQualifiedClassNames_load() {
Set set = new HashSet();
assertNotNull(byteCodePath);
set.addAll(classNamesInJarOrDir(byteCodePath));
printVars("ClassNameResolver", "byteCodePath", byteCodePath, "classesFound", l(set));
set.addAll(classNamesInLoadedJigsawModules());
return set;
}
public ClassNameResolver init() {
allFullyQualifiedClassNames();
return this;
}
public String findClass(String name) {
for (String pkg : importedPackages) {
String fullName = pkg + "." + name;
if (allFullyQualifiedClassNames().contains(fullName))
return fullName;
}
return null;
}
public void printMe() {
printVars("ClassNameResolver", "byteCodePath", byteCodePath);
print("importedPackages", importedPackages);
}
}
static public class G22GalleryImage extends Concept {
public File path;
public String toString() {
return fileName(path);
}
public boolean imageExists() {
return fileExists(path);
}
public BufferedImage load() {
return loadImage2(path);
}
}
static public class LASClassLoader extends InMemoryClassLoader {
public Map definedClasses = new HashMap();
public Lock lock = lock();
public LASClassLoader(ClassLoader parent) {
super(parent);
}
public LASClassLoader(Class parent) {
super(parent.getClassLoader());
}
public Class> defineLASClass(String name, IF0 generateClass) {
Lock __0 = lock;
lock(__0);
try {
try {
return loadClass(name);
} catch (ClassNotFoundException e) {
print("Generating class " + name);
return defineAClass(name, generateClass.get());
}
} finally {
unlock(__0);
}
}
}
public interface G22ProjectActions {
public void openObjectInProject(long id);
public void openPathInProject(String path);
public void editProjectStory();
public void editScripts();
}
static public class ImageSurface extends Surface {
public BufferedImage image;
public double zoomX = 1, zoomY = 1, zoomFactor = 1.5;
public Rectangle selection;
public List tools = new ArrayList();
public Object overlay;
public List overlays = syncL();
public Runnable onSelectionChange;
final public ImageSurface setVerbose(boolean verbose) {
return verbose(verbose);
}
public ImageSurface verbose(boolean verbose) {
this.verbose = verbose;
return this;
}
final public boolean getVerbose() {
return verbose();
}
public boolean verbose() {
return verbose;
}
public boolean verbose = false;
public boolean noMinimumSize = true;
public String titleForUpload;
public Object onZoom;
public boolean specialPurposed = false;
final public ImageSurface setAllowPaste(boolean allowPaste) {
return allowPaste(allowPaste);
}
public ImageSurface allowPaste(boolean allowPaste) {
this.allowPaste = allowPaste;
return this;
}
final public boolean getAllowPaste() {
return allowPaste();
}
public boolean allowPaste() {
return allowPaste;
}
public boolean allowPaste = false;
final public ImageSurface setZoomable(boolean zoomable) {
return zoomable(zoomable);
}
public ImageSurface zoomable(boolean zoomable) {
this.zoomable = zoomable;
return this;
}
final public boolean getZoomable() {
return zoomable();
}
public boolean zoomable() {
return zoomable;
}
public boolean zoomable = true;
public boolean noAlpha = false;
public Object interpolationMode = RenderingHints.VALUE_INTERPOLATION_BILINEAR;
public Object onNewImage;
public BufferedImage imageToDraw;
public File file;
public boolean autoZoomToDisplay = false;
final public ImageSurface setRepaintInThread(boolean repaintInThread) {
return repaintInThread(repaintInThread);
}
public ImageSurface repaintInThread(boolean repaintInThread) {
this.repaintInThread = repaintInThread;
return this;
}
final public boolean getRepaintInThread() {
return repaintInThread();
}
public boolean repaintInThread() {
return repaintInThread;
}
public boolean repaintInThread = false;
public BoolVar showingVar;
public Pt mousePosition;
transient public Set onMousePositionChanged;
public ImageSurface onMousePositionChanged(Runnable r) {
onMousePositionChanged = createOrAddToSyncLinkedHashSet(onMousePositionChanged, r);
return this;
}
public ImageSurface removeMousePositionChangedListener(Runnable r) {
main.remove(onMousePositionChanged, r);
return this;
}
public void mousePositionChanged() {
if (onMousePositionChanged != null)
for (var listener : onMousePositionChanged) pcallF_typed(listener);
}
transient public Set onImageChanged;
public ImageSurface onImageChanged(Runnable r) {
onImageChanged = createOrAddToSyncLinkedHashSet(onImageChanged, r);
return this;
}
public ImageSurface removeImageChangedListener(Runnable r) {
main.remove(onImageChanged, r);
return this;
}
public void imageChanged() {
if (onImageChanged != null)
for (var listener : onImageChanged) pcallF_typed(listener);
}
transient public Set> onUserModifiedImage;
public ImageSurface onUserModifiedImage(IVF1 f) {
onUserModifiedImage = createOrAddToSyncLinkedHashSet(onUserModifiedImage, f);
return this;
}
public ImageSurface removeUserModifiedImageListener(IVF1 f) {
main.remove(onUserModifiedImage, f);
return this;
}
public void userModifiedImage(BufferedImage image) {
if (onUserModifiedImage != null)
for (var listener : onUserModifiedImage) pcallF_typed(listener, image);
}
public ImageSurface() {
this(dummyImage());
}
static public BufferedImage dummyImage() {
return whiteImage(1);
}
public ImageSurface(MakesBufferedImage image) {
this(image != null ? image.getBufferedImage() : dummyImage());
}
public ImageSurface(BufferedImage image) {
setImage(image);
clearSurface = false;
onResize(this, () -> performAutoZoom());
bindToComponent(this, () -> performAutoZoom(), null);
componentPopupMenu2(this, ImageSurface_popupMenuMaker());
new ImageSurfaceSelector(this);
jHandleFileDrop(this, new VF1() {
public void get(File f) {
try {
setImage(loadBufferedImage(f));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "setImage(loadBufferedImage(f))";
}
});
imageSurfaceOnHover(this, p -> {
mousePosition = p;
mousePositionChanged();
});
}
public ImageSurface(RGBImage image, double zoom) {
this(image);
setZoom(zoom);
}
public void fillPopupMenu(JPopupMenu menu, final Point point) {
if (zoomable) {
JMenuItem miZoomReset = new JMenuItem("Zoom 100%");
miZoomReset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
setZoom(1.0);
centerPoint(point);
}
});
menu.add(miZoomReset);
JMenuItem miZoomIn = new JMenuItem("Zoom in");
miZoomIn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zoomIn(zoomFactor);
centerPoint(point);
}
});
menu.add(miZoomIn);
JMenuItem miZoomOut = new JMenuItem("Zoom out");
miZoomOut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zoomOut(zoomFactor);
centerPoint(point);
}
});
menu.add(miZoomOut);
menu.add(jCheckBoxMenuItem_dyn("Zoom to window", () -> autoZoomToDisplay, b -> {
setAutoZoomToDisplay(b);
}));
addMenuItem(menu, "Show full screen", new Runnable() {
public void run() {
try {
showFullScreen();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "showFullScreen()";
}
});
addMenuItem(menu, "Point: " + point.x + "," + point.y + " (image: " + w() + "*" + h() + ")", null);
menu.addSeparator();
}
if (!specialPurposed)
addMenuItem(menu, "Load image...", new Runnable() {
public void run() {
try {
selectFile("Load image", new VF1() {
public void get(File f) {
try {
setImage(loadImage2(f));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "setImage(loadImage2(f))";
}
});
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "selectFile(\"Load image\",\r\n new VF1() { public void get(File f) c...";
}
});
addMenuItem(menu, "Save image...", new Runnable() {
public void run() {
try {
saveImage();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "saveImage()";
}
});
addMenuItem(menu, "Copy image to clipboard", new Runnable() {
public void run() {
try {
copyImageToClipboard(getImage());
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "copyImageToClipboard(getImage())";
}
});
if (!specialPurposed || allowPaste)
addMenuItem(menu, "Paste image from clipboard", new Runnable() {
public void run() {
try {
loadFromClipboard();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "loadFromClipboard()";
}
});
if (!specialPurposed)
addMenuItem(menu, "Load image snippet...", new Runnable() {
public void run() {
try {
selectImageSnippet(new VF1() {
public void get(String imageID) {
try {
setImage(loadImage2(imageID));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "setImage(loadImage2(imageID))";
}
});
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "selectImageSnippet(new VF1() { public void get(String imageID) ctex {...";
}
});
if (selection != null)
addMenuItem(menu, "Crop", new Runnable() {
public void run() {
try {
crop();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "crop()";
}
});
if (!specialPurposed)
addMenuItem(menu, "No image", new Runnable() {
public void run() {
try {
noImage();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "noImage()";
}
});
}
public void noImage() {
setImage((BufferedImage) null);
}
public void crop() {
if (selection == null)
return;
BufferedImage img = cloneClipBufferedImage(getImage(), selection);
selection = null;
setUserModifiedImage(img);
}
public void setUserModifiedImage(BufferedImage img) {
setImage(img);
userModifiedImage(img);
}
public void loadFromClipboard() {
BufferedImage img = getImageFromClipboard();
if (img != null)
setUserModifiedImage(img);
}
transient public IF0 defaultImageDir;
public File defaultImageDir() {
return defaultImageDir != null ? defaultImageDir.get() : defaultImageDir_base();
}
final public File defaultImageDir_fallback(IF0 _f) {
return _f != null ? _f.get() : defaultImageDir_base();
}
public File defaultImageDir_base() {
return getProgramDir();
}
public void saveImage() {
var image = getImage();
JFileChooser fileChooser = new JFileChooser(defaultImageDir());
if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
try {
main.saveImage(image, file = fileChooser.getSelectedFile());
} catch (Throwable e) {
popup(e);
}
}
}
public void drawImageItself(int w, int h, Graphics2D g) {
int iw = getZoomedWidth(), ih = getZoomedHeight();
if (interpolationMode == RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR || zoomX >= 1 || zoomY >= 1) {
g.drawImage(image, 0, 0, iw, ih, null);
} else
g.drawImage(resizeImage(image, iw, ih), 0, 0, null);
}
public void render(int w, int h, Graphics2D g) {
if (verbose)
_print("render");
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, interpolationMode);
g.setColor(Color.white);
BufferedImage image = or(imageToDraw, this.image);
if (!hasImage())
g.fillRect(0, 0, w, h);
else {
boolean alpha = !noAlpha && hasTransparency(image);
if (alpha)
g.fillRect(0, 0, w, h);
drawImageItself(w, h, g);
int iw = getZoomedWidth(), ih = getZoomedHeight();
if (!alpha) {
g.fillRect(iw, 0, w - iw, h);
g.fillRect(0, ih, iw, h - ih);
}
}
if (overlay != null) {
if (verbose)
_print("render overlay");
pcallF(overlay, g);
}
for (var overlay : cloneList(overlays)) {
try {
overlay.drawOn(g);
} catch (Throwable __e) {
printStackTrace(__e);
}
}
if (selection != null) {
if (verbose)
_print("render selection");
drawSelectionRect(g, selection, Color.green, Color.white);
}
}
public void drawSelectionRect(Graphics2D g, Rectangle selection, Color green, Color white) {
drawSelectionRect(g, selection, green, white, zoomX, zoomY);
}
public void drawSelectionRect(Graphics2D g, Rectangle selection, Color green, Color white, double zoomX, double zoomY) {
g.setColor(green);
int top = (int) (selection.y * zoomY);
int bottom = (int) ((selection.y + selection.height) * zoomY);
int left = (int) (selection.x * zoomX);
int right = (int) ((selection.x + selection.width) * zoomX);
g.drawRect(left - 1, top - 1, right - left + 1, bottom - top + 1);
g.setColor(white);
g.drawRect(left - 2, top - 2, right - left + 3, bottom - top + 3);
}
public ImageSurface setZoom(double zoom) {
setZoom(zoom, zoom);
return this;
}
public void setZoom(double zoomX, double zoomY) {
autoZoomToDisplay = false;
setZoom_dontChangeAutoZoom(zoomX, zoomY);
}
public void setZoom_dontChangeAutoZoom(double zoomX) {
setZoom_dontChangeAutoZoom(zoomX, zoomX);
}
public void setZoom_dontChangeAutoZoom(double zoomX, double zoomY) {
if (this.zoomX == zoomX && this.zoomY == zoomY)
return;
if (verbose)
_print("Setting zoom");
this.zoomX = zoomX;
this.zoomY = zoomY;
revalidateMe();
repaint();
centerPoint(new Point(getImage().getWidth() / 2, getImage().getHeight() / 2));
pcallF(onZoom);
}
public Dimension getMinimumSize() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "getMinimumSize");
if (noMinimumSize)
return new Dimension(1, 1);
int w = getZoomedWidth();
int h = getZoomedHeight();
Dimension min = super.getMinimumSize();
return printIfScaffoldingEnabled(this, new Dimension(Math.max(w, min.width), Math.max(h, min.height)));
}
public int getZoomedHeight() {
return (int) (h() * zoomY);
}
public int getZoomedWidth() {
return (int) (w() * zoomX);
}
public boolean isShowing_quick() {
if (showingVar == null) {
swing(() -> {
if (showingVar == null)
showingVar = componentShowingVar(ImageSurface.this);
});
}
return showingVar.get();
}
public void setImageIfShowing_thisThread(MakesBufferedImage image) {
setImageIfShowing_thisThread(toBufferedImage(image));
}
public void setImageIfShowing_thisThread(BufferedImage image) {
if (isShowing_quick())
setImage_thisThread(image);
}
public void setImage(MakesBufferedImage image) {
swing(() -> {
setImage_thisThread(image);
});
}
public void setImage(BufferedImage img) {
swing(() -> {
setImage_thisThread(img);
});
}
public void setImage_thisThread(MakesBufferedImage img) {
setImage_thisThread(toBufferedImage(img));
}
public void setImage_thisThread(BufferedImage img) {
BufferedImage newImage = img != null ? img : dummyImage();
BufferedImage oldImage = image;
image = newImage;
if (verbose)
print("Old image size:" + imageSize(oldImage) + ", new image size: " + imageSize(newImage));
boolean sameSize = imagesHaveSameSize(oldImage, newImage);
if (!sameSize) {
if (verbose)
_print("New image size");
revalidateMe();
}
quickRepaint();
pcallF(onNewImage);
if (!sameSize && autoZoomToDisplay)
zoomToDisplaySize();
imageChanged();
}
public void setImageAndZoomToDisplay(BufferedImage img) {
setImage(img);
zoomToDisplaySize();
}
public BufferedImage getImage() {
return image;
}
public double getZoomX() {
return zoomX;
}
public double getZoomY() {
return zoomY;
}
public Dimension getPreferredSize() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "getPreferredSize");
return printIfScaffoldingEnabled(this, new Dimension(getZoomedWidth(), getZoomedHeight()));
}
public JScrollPane makeScrollPane() {
JScrollPane scrollPane = new JScrollPane(this);
scrollPane.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
return scrollPane;
}
public void zoomToWindow() {
zoomToDisplaySize();
}
public void zoomToDisplaySize() {
swing(() -> {
if (!hasImage())
return;
Dimension display = getDisplaySize();
if (display.width == 0 || display.height == 0)
return;
int w = w(), h = h();
double xRatio = (display.width - 5) / (double) w;
double yRatio = (display.height - 5) / (double) h;
if (scaffoldingEnabled(this))
printVars("zoomToDisplaySize", "display", display, "w", w, "h", h, "xRatio", xRatio, "yRatio", yRatio);
setZoom_dontChangeAutoZoom(min(xRatio, yRatio));
revalidateMe();
});
}
final public Dimension getDisplaySize() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "getDisplaySize");
Container c = getParent();
while (c != null) {
if (c instanceof JScrollPane)
return c.getSize();
c = c.getParent();
}
return getSize();
}
public void setSelection(Rect r) {
setSelection(toRectangle(r));
}
public void setSelection(Rectangle r) {
if (neq(selection, r)) {
selection = r;
pcallF(onSelectionChange);
quickRepaint();
}
}
public Rectangle getSelection() {
return selection;
}
public RGBImage getRGBImage() {
return new RGBImage(getImage());
}
public void centerPoint(Point p) {
JScrollPane sp = enclosingScrollPane(this);
if (sp == null)
return;
p = new Point((int) (p.x * getZoomX()), (int) (p.y * getZoomY()));
final JViewport viewport = sp.getViewport();
Dimension viewSize = viewport.getExtentSize();
int x = max(0, p.x - viewSize.width / 2);
int y = max(0, p.y - viewSize.height / 2);
p = new Point(x, y);
final Point _p = p;
awtLater(new Runnable() {
public void run() {
try {
viewport.setViewPosition(_p);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "viewport.setViewPosition(_p);";
}
});
}
public Pt pointFromEvent(MouseEvent e) {
return pointFromComponentCoordinates(new Pt(e.getX(), e.getY()));
}
public Pt pointFromComponentCoordinates(Pt p) {
return new Pt((int) (p.x / zoomX), (int) (p.y / zoomY));
}
public Pt pointToComponentCoordinates(double x, double y) {
return new Pt((int) (x * zoomX), (int) (y * zoomY));
}
public void uploadTheImage() {
}
public void showFullScreen() {
showFullScreenImageSurface(getImage());
}
public void zoomIn(double f) {
setZoom(getZoomX() * f, getZoomY() * f);
}
public void zoomOut(double f) {
setZoom(getZoomX() / f, getZoomY() / f);
}
public ImageSurface setFile(File f) {
file = f;
return this;
}
public void setOverlay(IVF1 overlay) {
this.overlay = overlay;
}
public boolean hasImage() {
return image != null;
}
public int w() {
return image.getWidth();
}
public int h() {
return image.getHeight();
}
public void setPixelated(boolean b) {
assertTrue(b);
imageSurface_pixelated(this);
}
public ImageSurface setAutoZoomToDisplay(boolean b) {
if (autoZoomToDisplay = b)
zoomToDisplaySize();
return this;
}
public void quickRepaint() {
if (repaintInThread)
paintImmediately(0, 0, getWidth(), getHeight());
else
repaint();
}
public void setTool(ImageSurfaceMouseHandler tool) {
swing(() -> {
removeAllTools();
addTool(tool);
});
}
public boolean hasTool(AutoCloseable tool) {
return swing(() -> tools.contains(tool));
}
public void addTool(ImageSurfaceMouseHandler tool) {
swing(() -> {
if (!tools.contains(tool))
tool.register(this);
});
}
public void removeTool(AutoCloseable tool) {
swing(() -> {
if (tools.contains(tool)) {
close(tool);
tools.remove(tool);
}
});
}
public void removeAllTools() {
closeAllAndClear(tools);
}
public void performAutoZoom() {
if (autoZoomToDisplay)
zoomToDisplaySize();
}
public void revalidateMe() {
revalidateIncludingFullCenterContainer(this);
}
public void addOverlay(G2Drawable overlay) {
overlays.add(overlay);
repaint();
}
public void clearOverlays() {
if (nempty(overlays)) {
overlays.clear();
repaint();
}
}
public void setOverlay(G2Drawable overlay) {
clearOverlays();
if (overlay != null)
addOverlay(overlay);
}
public void loadImage(File f) {
setImage(loadImage2(f));
}
public JComponent visualize() {
return jscroll_center_borderless(this);
}
public A print(A a) {
return print("", a);
}
public A print(String msg, A a) {
return _print(msg, a);
}
}
static public VF2 ImageSurface_popupMenuMaker() {
return new VF2() {
public void get(ImageSurface is, JPopupMenu menu) {
try {
Point p = is.pointFromEvent(componentPopupMenu_mouseEvent.get()).getPoint();
is.fillPopupMenu(menu, p);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "Point p = is.pointFromEvent(componentPopupMenu_mouseEvent.get()).getPoint();\r...";
}
};
}
static public class CombinedStringifier implements IStringifier {
public CopyOnWriteArrayList> stringifiers = new CopyOnWriteArrayList();
public IStringifier defaultStringifier = new Stringifier_ToString();
public CombinedStringifier(IPartialStringifier ... stringifiers) {
addAll(this.stringifiers, stringifiers);
}
public String toString(A o) {
for (var stringifier : stringifiers) {
String s = stringifier.toStringOpt(o);
if (s != null)
return s;
}
return defaultStringifier.toString(o);
}
public String toString() {
return formatFunctionCall("CombinedStringifier", listPlus((List) stringifiers, defaultStringifier));
}
}
static public class GazelleV_LeftArrowScriptParser extends SimpleLeftToRightParser {
final public GazelleV_LeftArrowScriptParser setG22utils(G22Utils g22utils) {
return g22utils(g22utils);
}
public GazelleV_LeftArrowScriptParser g22utils(G22Utils g22utils) {
this.g22utils = g22utils;
return this;
}
final public G22Utils getG22utils() {
return g22utils();
}
public G22Utils g22utils() {
return g22utils;
}
public G22Utils g22utils = new G22Utils();
public List functionContainers = new ArrayList();
final public GazelleV_LeftArrowScriptParser setLasClassLoader(LASClassLoader lasClassLoader) {
return lasClassLoader(lasClassLoader);
}
public GazelleV_LeftArrowScriptParser lasClassLoader(LASClassLoader lasClassLoader) {
this.lasClassLoader = lasClassLoader;
return this;
}
final public LASClassLoader getLasClassLoader() {
return lasClassLoader();
}
public LASClassLoader lasClassLoader() {
return lasClassLoader;
}
public LASClassLoader lasClassLoader;
final public GazelleV_LeftArrowScriptParser setClassDefPrefix(String classDefPrefix) {
return classDefPrefix(classDefPrefix);
}
public GazelleV_LeftArrowScriptParser classDefPrefix(String classDefPrefix) {
this.classDefPrefix = classDefPrefix;
return this;
}
final public String getClassDefPrefix() {
return classDefPrefix();
}
public String classDefPrefix() {
return classDefPrefix;
}
public String classDefPrefix;
public LinkedHashMap knownVars = new LinkedHashMap();
public BuildingScript currentReturnableScript;
public BuildingScript currentLoop;
public boolean inParens = false;
public int idCounter;
public Map classDefs = new HashMap();
transient public Set>> onKnownVarsSnapshot;
public GazelleV_LeftArrowScriptParser onKnownVarsSnapshot(IVF1> f) {
onKnownVarsSnapshot = createOrAddToSyncLinkedHashSet(onKnownVarsSnapshot, f);
return this;
}
public GazelleV_LeftArrowScriptParser removeKnownVarsSnapshotListener(IVF1> f) {
main.remove(onKnownVarsSnapshot, f);
return this;
}
public void knownVarsSnapshot(Map knownVars) {
if (onKnownVarsSnapshot != null)
for (var listener : onKnownVarsSnapshot) pcallF_typed(listener, knownVars);
}
static public class MethodOnObject implements IFieldsToList {
static final public String _fieldOrder = "object method";
public Object object;
public String method;
public MethodOnObject() {
}
public MethodOnObject(Object object, String method) {
this.method = method;
this.object = object;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + object + ", " + method + ")";
}
public boolean equals(Object o) {
if (!(o instanceof MethodOnObject))
return false;
MethodOnObject __7 = (MethodOnObject) o;
return eq(object, __7.object) && eq(method, __7.method);
}
public int hashCode() {
int h = 791808543;
h = boostHashCombine(h, _hashCode(object));
h = boostHashCombine(h, _hashCode(method));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { object, method };
}
}
static public class EvaluableWrapper implements IFieldsToList {
public GazelleV_LeftArrowScript.Evaluable expr;
public EvaluableWrapper() {
}
public EvaluableWrapper(GazelleV_LeftArrowScript.Evaluable expr) {
this.expr = expr;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + expr + ")";
}
public boolean equals(Object o) {
if (!(o instanceof EvaluableWrapper))
return false;
EvaluableWrapper __8 = (EvaluableWrapper) o;
return eq(expr, __8.expr);
}
public int hashCode() {
int h = 700525824;
h = boostHashCombine(h, _hashCode(expr));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { expr };
}
}
public class BuildingScript {
public int id = ++idCounter;
public boolean returnable, isLoopBody;
public BuildingScript returnableParent, loopParent;
public GazelleV_LeftArrowScript.Script script = new GazelleV_LeftArrowScript.Script();
public List steps = new ArrayList();
public Map functionDefs = new HashMap();
public BuildingScript(boolean returnable) {
this.returnable = returnable;
}
public BuildingScript(boolean returnable, boolean isLoopBody) {
this.isLoopBody = isLoopBody;
this.returnable = returnable;
}
public void add(GazelleV_LeftArrowScript.Evaluable step) {
if (step != null)
steps.add(step);
}
public GazelleV_LeftArrowScript.Evaluable get() {
var lastStep = last(steps);
if (lastStep instanceof GazelleV_LeftArrowScript.ReturnFromScript)
if (((GazelleV_LeftArrowScript.ReturnFromScript) lastStep).script == script)
replaceLast(steps, ((GazelleV_LeftArrowScript.ReturnFromScript) lastStep).value);
if (!returnable && l(steps) == 1 && empty(functionDefs))
return first(steps);
script.functionDefs = functionDefs;
script.steps = toTypedArray(GazelleV_LeftArrowScript.Evaluable.class, steps);
return script;
}
public String toStringLong() {
return pnlToLines(steps);
}
public String toString() {
return formatRecordVars("BuildingScript", "id", id, "returnable", returnable, "returnableParent", returnableParent, "script", script);
}
}
public GazelleV_LeftArrowScript.Script parse(String text) {
setText(text);
return parse();
}
public GazelleV_LeftArrowScript.Script parse() {
return parseReturnableScript();
}
public GazelleV_LeftArrowScript.Script parseReturnableScript() {
return (GazelleV_LeftArrowScript.Script) parseScript(true);
}
public GazelleV_LeftArrowScript.Evaluable parseScript(boolean returnable) {
return parseScript(returnable, false);
}
public GazelleV_LeftArrowScript.Evaluable parseScript(boolean returnable, boolean isLoopBody) {
BuildingScript script = new BuildingScript(returnable, isLoopBody);
script.returnableParent = currentReturnableScript;
script.loopParent = currentLoop;
if (returnable)
currentReturnableScript = script;
if (isLoopBody)
currentLoop = script;
return parseBuildingScript(script);
}
public GazelleV_LeftArrowScript.Evaluable parseBuildingScript(BuildingScript script) {
try {
parseScript_2(script);
var builtScript = script.get();
currentReturnableScript = script.returnableParent;
currentLoop = script.loopParent;
return builtScript;
} catch (Throwable e) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Parsed so far:\n" + script);
throw rethrowAndAppendToMessage(e, squareBracketed(str(lineAndColumn())));
}
}
public void parseScript_2(BuildingScript script) {
AssureAdvance assure = new AssureAdvance();
while (assure.get()) {
knownVarsSnapshot(knownVars);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseScript_2: Next token is " + quote(token()));
if (is(";")) {
next();
continue;
}
if (isOneOf("}", ")"))
break;
if (is("def")) {
parseFunctionDefinition(currentReturnableScript.functionDefs);
continue;
}
if (is("param")) {
consume();
String var = assertIdentifier(tpp());
knownVars.put(var, new LASValueDescriptor());
continue;
}
if (isOneOf("return", "ret")) {
consume();
GazelleV_LeftArrowScript.Evaluable expr;
if (atCmdEnd())
expr = _const(null);
else
expr = parseAssignmentOrExpr();
{
script.add(new GazelleV_LeftArrowScript.ReturnFromScript(currentReturnableScript.script, expr));
continue;
}
}
if (is("continue")) {
consume();
assertCmdEnd();
if (currentLoop == null)
throw fail("continue outside of loop");
{
script.add(new GazelleV_LeftArrowScript.Continue(currentLoop.script));
continue;
}
}
if (is("temp")) {
consume();
GazelleV_LeftArrowScript.Evaluable tempExpr = parseExpr();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("tempExpr", tempExpr);
GazelleV_LeftArrowScript.Evaluable body = parseScript(false);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("body", body);
{
script.add(new GazelleV_LeftArrowScript.TempBlock(tempExpr, body));
continue;
}
}
if (is("class")) {
{
script.add(new GazelleV_LeftArrowScript.ClassDef(new ResolvableLASClass(lasClassLoader, parseClassDef())));
continue;
}
}
script.add(parseAssignmentOrExpr());
}
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseScript_2 done");
knownVarsSnapshot(knownVars);
}
public GazelleV_LeftArrowScript.Evaluable parseAssignmentOrExpr() {
{
var __1 = parseAssignmentOpt();
if (__1 != null)
return __1;
}
return parseExpr();
}
public GazelleV_LeftArrowScript.Assignment parseAssignmentOpt() {
String t = token();
if (isIdentifier(t) && eq(token(1), "<") && eq(token(2), "-")) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Found assignment");
next(3);
GazelleV_LeftArrowScript.Evaluable rhs = parseExpr();
assertNotNull("Expression expected", rhs);
knownVars.put(t, new LASValueDescriptor());
return new GazelleV_LeftArrowScript.Assignment(t, rhs);
}
return null;
}
public GazelleV_LeftArrowScript.Evaluable parseOptionalInnerExpression() {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("parseOptionalInnerExpression", "token", token());
if (atCmdEnd() || is("{"))
return null;
return parseInnerExpr();
}
public GazelleV_LeftArrowScript.Evaluable _const(Object o) {
return new GazelleV_LeftArrowScript.Const(o);
}
public GazelleV_LeftArrowScript.Evaluable parseInnerExpr() {
return parseExpr(true);
}
public GazelleV_LeftArrowScript.Evaluable parseExpr() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "parseExpr");
return parseExpr(false);
}
public GazelleV_LeftArrowScript.Evaluable parseExpr(boolean inner) {
return printIndentedStructIf(scaffoldingEnabled(), "parseExpr done", linkToSrc(() -> parseExpr_impl(inner)));
}
public GazelleV_LeftArrowScript.Evaluable parseExpr_impl(boolean inner) {
if (atEnd())
return null;
String t = token();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("parseExpr", "token", t);
if (is(";"))
return null;
if (is("{"))
return parseCurlyBlock(false);
if (is("-") && empty(nextSpace()) && startsWithDigit(token(1)) || startsWithDigit(t)) {
t = consumeMultiTokenLiteral();
if (swic(t, "0x"))
return _const(parseHexInt(dropFirst(t, 2)));
if (swic(t, "0b"))
return _const(intFromBinary(dropFirst(t, 2)));
if (isInteger(t))
return _const(parseInt(t));
if (endsWith(t, "f"))
return _const(parseFloat(t));
return _const(parseDouble(t));
}
if (isQuoted(t)) {
consume();
return _const(unquote(t));
}
if (isIdentifier(t)) {
if (is("while"))
return parseWhileLoop();
if (is("for"))
return parseForEach();
if (is("if"))
return parseIfStatement();
if (is("repeat"))
return parseRepeatStatement();
if (is("outer")) {
consume();
var a = parseAssignmentOpt();
assertNotNull("Assignment expected", a);
return new GazelleV_LeftArrowScript.AssignmentToOuterVar(a.var, a.expression);
}
consume();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Consumed identifier " + t + ", next token: " + token() + ", inner: " + inner);
return parseExprStartingWithIdentifier(t, inner);
}
if (eq(t, "(")) {
boolean inParensOld = inParens;
inParens = true;
consume();
var e = parseExpr();
consume(")");
inParens = inParensOld;
return inner ? e : parseCall(e);
}
if (isOneOf("&", "|") && empty(nextSpace()) && is(1, token())) {
return parseBinaryOperator();
}
throw fail("Identifier, literal, operator or opening parentheses expected (got: " + quote(t));
}
public GazelleV_LeftArrowScript.Evaluable parseBinaryOperator() {
boolean and = is("&");
next(2);
GazelleV_LeftArrowScript.Evaluable a = parseInnerExpr();
GazelleV_LeftArrowScript.Evaluable b = parseInnerExpr();
return and ? new GazelleV_LeftArrowScript.BoolAnd(a, b) : new GazelleV_LeftArrowScript.BoolOr(a, b);
}
public GazelleV_LeftArrowScript.Evaluable parseExprStartingWithIdentifier(String t, boolean inner) {
if (eq(t, "true"))
return _const(true);
if (eq(t, "false"))
return _const(false);
if (eq(t, "null"))
return _const(null);
if (eq(t, "new")) {
String className = assertIdentifier(tpp());
LASClassDef cd = classDefs.get(className);
if (cd != null)
return new GazelleV_LeftArrowScript.NewObject_LASClass(new ResolvableLASClass(lasClassLoader, cd));
Object o = findExternalObject(className);
if (o instanceof Class)
return new GazelleV_LeftArrowScript.NewObject(((Class) o), parseArguments());
throw new ClassNotFound(className);
}
var type = knownVars.get(t);
if (type != null) {
var e = new GazelleV_LeftArrowScript.GetVar(t).returnType(type);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Found var acccess: " + e + ", " + (!inner ? "Checking for call" : "Returning expression"));
return inner ? e : parseCall(e);
}
if (!inner) {
var fdef = lookupFunction(t);
if (fdef != null)
return new GazelleV_LeftArrowScript.CallFunction(fdef, parseArguments());
}
if (eq(t, "_context"))
return new GazelleV_LeftArrowScript.GetVarContext();
Object o = findExternalObject(t);
if (o == null) {
unconsume();
throw new UnknownObject(t);
} else if (o instanceof EvaluableWrapper) {
return inner ? ((EvaluableWrapper) o).expr : parseCall(((EvaluableWrapper) o).expr);
} else if (inner)
return _const(o);
else if (o instanceof Class) {
Class c = (Class) o;
if (atCmdEnd())
return _const(c);
if (is("("))
return new GazelleV_LeftArrowScript.NewObject(c, parseArguments());
{
var __2 = parseLambdaOpt(c);
if (__2 != null)
return __2;
}
if (isIdentifier()) {
String name = tpp();
if (hasMethodNamed(c, name))
return new GazelleV_LeftArrowScript.CallMethod(_const(c), name, parseArguments());
if (isInterface(c))
return parseLambdaMethodRef(c, name);
var field = getField(((Class) o), name);
if (field != null) {
assertCmdEnd();
if (!isStaticField(field))
throw fail(field + " is not a static field");
return new GazelleV_LeftArrowScript.GetStaticField(field);
}
throw fail(name + " not found in " + ((Class) o) + " (looked for method or field)");
} else
throw fail("Method name expected: " + token());
} else if (o instanceof MethodOnObject) {
if (inner)
throw fail("Can't call methods in arguments");
return new GazelleV_LeftArrowScript.CallMethod(_const(((MethodOnObject) o).object), ((MethodOnObject) o).method, parseArguments());
} else
return parseCall(_const(o));
}
public GazelleV_LeftArrowScript.Evaluable parseLambdaOpt(Class c) {
int nArgs = 0;
while (isIdentifier(token(nArgs))) nArgs++;
if (!(is(nArgs, "-") && is(nArgs + 1, ">")))
return null;
String[] argNames = consumeArray(nArgs);
AutoCloseable __3 = tempAddKnownVars(argNames);
try {
skip(2);
GazelleV_LeftArrowScript.Evaluable body;
if (is("{"))
body = parseReturnableScript();
else
body = parseExpr();
return printIndentedStructIf(scaffoldingEnabled(), "parseLambdaOpt done", new GazelleV_LeftArrowScript.LambdaDef(c, argNames, body));
} finally {
_close(__3);
}
}
public GazelleV_LeftArrowScript.Evaluable parseLambdaMethodRef(Class c, String name) {
var fdef = lookupFunction(name);
if (fdef != null) {
GazelleV_LeftArrowScript.Evaluable[] curriedArguments = parseArguments();
return new GazelleV_LeftArrowScript.CurriedScriptFunctionLambda(c, fdef, curriedArguments);
}
Object function = findExternalObject(name);
if (function == null)
throw new UnknownObject(name);
if (function instanceof MethodOnObject) {
Object target = ((MethodOnObject) function).object;
String targetMethod = ((MethodOnObject) function).method;
GazelleV_LeftArrowScript.Evaluable[] curriedArguments = parseArguments();
return new GazelleV_LeftArrowScript.CurriedMethodLambda(c, target, targetMethod, curriedArguments);
} else if (function instanceof Class) {
Class c2 = (Class) function;
assertCmdEnd();
var ctors = constructorsWithNumberOfArguments(c2, 1);
if (empty(ctors))
throw fail("No single argument constructor found in " + c2);
return new GazelleV_LeftArrowScript.CurriedConstructorLambda(c, toArray(Constructor.class, ctors), null);
} else
throw fail(function + " is not an instantiable class or callable method");
}
public GazelleV_LeftArrowScript.FunctionDef lookupFunction(String name) {
var script = currentReturnableScript;
while (script != null) {
var f = script.functionDefs.get(name);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("lookupFunction", "script", script, "name", name, "f", f);
if (f != null)
return f;
script = script.returnableParent;
}
return null;
}
public GazelleV_LeftArrowScript.Evaluable[] parseArguments() {
return toArrayOrNull(GazelleV_LeftArrowScript.Evaluable.class, parseArgumentsAsList());
}
public List parseArgumentsAsList() {
List l = new ArrayList();
try {
while (true) {
GazelleV_LeftArrowScript.Evaluable a = parseOptionalInnerExpression();
if (a == null)
break;
l.add(a);
}
return l;
} catch (Throwable _e) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Arguments parsed so far: " + l);
throw rethrow(_e);
}
}
public String consumeMultiTokenLiteral() {
return consumeUntilSpaceOr(() -> atCmdEnd());
}
public boolean atCmdEnd() {
return !inParens && atEndOrLineBreak() || is(";") || is("}") || is(")");
}
public void assertCmdEnd() {
if (!atCmdEnd())
throw fail("Expected end of command, token is: " + quote(token()));
}
public GazelleV_LeftArrowScript.Evaluable parseCall(GazelleV_LeftArrowScript.Evaluable target) {
if (atCmdEnd() || !isIdentifier())
return target;
var start = ptr();
String name = tpp();
if (eq(token(), "<") && eq(token(1), "-")) {
next(2);
GazelleV_LeftArrowScript.Evaluable rhs = parseExpr();
return new GazelleV_LeftArrowScript.SetField(target, name, rhs);
}
var args = parseArguments();
if (nempty(args))
return new GazelleV_LeftArrowScript.CallMethod(target, name, args);
else
return linkToSrc(start, new GazelleV_LeftArrowScript.CallMethodOrGetField(target, name));
}
public A linkToSrc(ListAndIndex start, A a) {
if (a instanceof IHasTokenRangeWithSrc && ((IHasTokenRangeWithSrc) a).tokenRangeWithSrc() == null)
((IHasTokenRangeWithSrc) a).setTokenRangeWithSrc(new TokenRangeWithSrc(start, ptr().plus(-1)));
return a;
}
public A linkToSrc(IF0 a) {
var start = ptr();
return linkToSrc(start, a.get());
}
transient public IF1 findExternalObject;
public Object findExternalObject(String name) {
return findExternalObject != null ? findExternalObject.get(name) : findExternalObject_base(name);
}
final public Object findExternalObject_fallback(IF1 _f, String name) {
return _f != null ? _f.get(name) : findExternalObject_base(name);
}
public Object findExternalObject_base(String name) {
try {
String fullName = globalClassNames().get(name);
if (fullName != null)
return Class.forName(fullName);
for (var container : unnullForIteration(functionContainers)) {
if (hasMethodNamed(container, name))
return new MethodOnObject(container, name);
var field = getField(container, name);
if (field != null && isStaticField(field))
return new EvaluableWrapper(new GazelleV_LeftArrowScript.GetStaticField(field));
}
return null;
} catch (Exception __e) {
throw rethrow(__e);
}
}
public GazelleV_LeftArrowScriptParser allowTheWorld() {
return allowTheWorld(mc());
}
public GazelleV_LeftArrowScriptParser allowTheWorld(Object... functionContainers) {
for (Object o : unnullForIteration(reversed(functionContainers))) if (!contains(this.functionContainers, o)) {
this.functionContainers.add(0, o);
globalClassNames_cache = null;
}
return this;
}
public void printFunctionDefs(GazelleV_LeftArrowScript.Script script) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print(values(script.functionDefs));
}
public AutoCloseable tempAddKnownVars(String... vars) {
return tempAddKnownVars(asList(vars));
}
public AutoCloseable tempAddKnownVars(Iterable vars) {
return tempMapPutAll(knownVars, mapWithSingleValue(vars, new LASValueDescriptor()));
}
public GazelleV_LeftArrowScript.FunctionDef parseFunctionDefinition(Map functionDefsToAddTo) {
consume("def");
String functionName = assertIdentifier(tpp());
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseFunctionDefinition " + functionName);
List args = new ArrayList();
while (isIdentifier()) args.add(tpp());
AutoCloseable __4 = tempAddKnownVars(args);
try {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Parsing function body");
var functionBody = parseReturnableCurlyBlock();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Defined function " + functionName + ", adding to " + functionDefsToAddTo);
var fd = new GazelleV_LeftArrowScript.FunctionDef(functionName, args, functionBody);
{
if (functionDefsToAddTo != null)
functionDefsToAddTo.put(functionName, fd);
}
return fd;
} finally {
_close(__4);
}
}
public GazelleV_LeftArrowScript.Script parseReturnableCurlyBlock() {
return (GazelleV_LeftArrowScript.Script) parseCurlyBlock(true);
}
public GazelleV_LeftArrowScript.Evaluable parseCurlyBlock(boolean returnable) {
return parseCurlyBlock(returnable, false);
}
public GazelleV_LeftArrowScript.Evaluable parseCurlyBlock(boolean returnable, boolean isLoopBody) {
consume("{");
boolean inParensOld = inParens;
inParens = false;
var body = parseScript(returnable, isLoopBody);
consume("}");
inParens = inParensOld;
return body;
}
public GazelleV_LeftArrowScript.Evaluable parseWhileLoop() {
consume("while");
var condition = parseExpr();
var body = parseCurlyBlock(false, true);
return new GazelleV_LeftArrowScript.While(condition, body);
}
public GazelleV_LeftArrowScript.Evaluable parseForEach() {
return new ParseForEach().get();
}
public class ParseForEach {
public GazelleV_LeftArrowScript.Evaluable collection, body;
public IF0 finish;
public IF0 enterBody;
public GazelleV_LeftArrowScript.Evaluable get() {
consume("for");
int iIn = relativeIndexOf("in");
if (iIn < 0)
throw fail("for without in");
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("iIn", iIn);
if (iIn == 1) {
String var = consumeIdentifier();
enterBody = () -> tempAddKnownVars(var);
finish = () -> new GazelleV_LeftArrowScript.ForEach(collection, var, body);
} else if (iIn == 2) {
if (consumeOpt("iterator")) {
String var = consumeIdentifier();
enterBody = () -> tempAddKnownVars(var);
finish = () -> new GazelleV_LeftArrowScript.ForIterator(collection, var, body);
} else if (consumeOpt("nested")) {
String var = consumeIdentifier();
enterBody = () -> tempAddKnownVars(var);
finish = () -> new GazelleV_LeftArrowScript.ForNested(collection, var, body);
} else
throw fail("Unknown pattern for 'for' loop");
} else if (iIn == 3) {
if (isOneOf("pair", "Pair")) {
consume();
String varA = consumeIdentifier();
String varB = consumeIdentifier();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("varA", varA, "varB", varB);
enterBody = () -> tempAddKnownVars(varA, varB);
finish = () -> new GazelleV_LeftArrowScript.ForPairs(collection, body, varA, varB);
} else {
String varA = consumeIdentifier();
consume(",");
String varB = consumeIdentifier();
enterBody = () -> tempAddKnownVars(varA, varB);
finish = () -> new GazelleV_LeftArrowScript.ForKeyValue(collection, body, varA, varB);
}
} else if (iIn == 4) {
consume("index");
String varIndex = consumeIdentifier();
consume(",");
String varElement = consumeIdentifier();
enterBody = () -> tempAddKnownVars(varIndex, varElement);
finish = () -> new GazelleV_LeftArrowScript.ForIndex(collection, body, varIndex, varElement);
} else
throw fail("Unknown pattern for 'for' loop");
consume("in");
collection = parseExpr();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("collection", collection);
AutoCloseable __5 = enterBody.get();
try {
body = parseCurlyBlock(false, true);
return finish.get();
} finally {
_close(__5);
}
}
}
public GazelleV_LeftArrowScript.Evaluable parseIfStatement() {
consume("if");
var condition = parseExpr();
var body = parseCurlyBlock(false);
GazelleV_LeftArrowScript.Evaluable elseBranch = null;
if (is("else")) {
consume();
if (is("if"))
elseBranch = parseIfStatement();
else
elseBranch = parseCurlyBlock(false);
}
return new GazelleV_LeftArrowScript.IfThen(condition, body, elseBranch);
}
public GazelleV_LeftArrowScript.Evaluable parseRepeatStatement() {
consume("repeat");
var n = parseExpr();
var body = parseCurlyBlock(false);
return new GazelleV_LeftArrowScript.RepeatN(n, body);
}
public void addVar(String var) {
addVar(var, new LASValueDescriptor());
}
public void addVar(String var, LASValueDescriptor type) {
knownVars.put(var, type);
}
public void addVar(String var, Class type, boolean canBeNull) {
addVar(var, new LASValueDescriptor.NonExact(type, canBeNull));
}
public Map globalClassNames_cache;
public Map globalClassNames() {
if (globalClassNames_cache == null)
globalClassNames_cache = globalClassNames_load();
return globalClassNames_cache;
}
public Map globalClassNames_load() {
var packages = mapToTreeSet(importedPackages(), pkg -> pkg + ".");
Map out = new HashMap();
for (var fc : functionContainers) if (fc instanceof Class) {
if (isAnonymousClass((Class) fc))
continue;
out.put(shortClassName((Class) fc), className((Class) fc));
}
var classContainers = classContainerPrefixes();
for (var className : g22utils.classNameResolver().allFullyQualifiedClassNames()) {
if (isAnonymousClassName(className))
continue;
if (!contains(className, '$')) {
String pkg = longestPrefixInTreeSet(className, packages);
if (pkg != null) {
String shortName = dropPrefix(pkg, className);
if (!shortName.contains("."))
out.put(shortName, className);
}
}
String container = longestPrefixInTreeSet(className, classContainers);
if (container != null)
out.put(dropPrefix(container, className), className);
}
return out;
}
transient public IF0> importedPackages;
public Collection importedPackages() {
return importedPackages != null ? importedPackages.get() : importedPackages_base();
}
final public Collection importedPackages_fallback(IF0> _f) {
return _f != null ? _f.get() : importedPackages_base();
}
public Collection importedPackages_base() {
return itemPlus("java.lang", standardImports_fullyImportedPackages());
}
public TreeSet classContainerPrefixes() {
return mapToTreeSet(functionContainers, fc -> className(fc) + "$");
}
static public class UnknownObject extends RuntimeException implements IFieldsToList {
public String name;
public UnknownObject() {
}
public UnknownObject(String name) {
this.name = name;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + name + ")";
}
public Object[] _fieldsToList() {
return new Object[] { name };
}
public String getMessage() {
return "Unknown object: " + name;
}
}
static public class ClassNotFound extends UnknownObject {
public ClassNotFound(String className) {
super(className);
}
public String getMessage() {
return "Class not found: " + name;
}
}
public LASClassDef parseClassDef() {
consume("class");
LASClassDef classDef = new LASClassDef();
if (nempty(classDefPrefix))
classDef.classDefPrefix(classDefPrefix);
String name = consumeIdentifier();
classDef.userGivenName(name);
consume("{");
while (!is("}")) {
if (is(";")) {
next();
continue;
}
if (is("def")) {
AutoCloseable __6 = tempAddKnownVars("this");
try {
GazelleV_LeftArrowScript.FunctionDef fd = parseFunctionDefinition(null);
classDef.methods.add(fd);
continue;
} finally {
_close(__6);
}
}
LASClassDef.FieldDef fd = new LASClassDef.FieldDef();
fd.name(consumeIdentifier());
consume(":");
String typeName = consumeIdentifier();
Object type = findExternalObject(typeName);
if (!(type instanceof Class))
throw fail("Class not found: " + typeName);
fd.type((Class) type);
classDef.fields.add(fd);
}
consume("}");
classDefs.put(name, classDef);
return classDef;
}
}
static public class G22LeftArrowScript extends ConceptWithChangeListeners {
static final public String _fieldOrder = "description text clearedForAutoRun editingText runOnProjectOpen runOrder runCount lastResultByMode compileResultForAutoRun compileResultForSaved";
public transient FieldVar varDescription_cache;
public FieldVar varDescription() {
if (varDescription_cache == null)
varDescription_cache = varDescription_load();
return varDescription_cache;
}
public FieldVar varDescription_load() {
return new FieldVar(this, "description", () -> description(), description -> description(description));
}
final public G22LeftArrowScript setDescription(String description) {
return description(description);
}
public G22LeftArrowScript description(String description) {
if (!eq(this.description, description)) {
this.description = description;
change();
}
return this;
}
final public String getDescription() {
return description();
}
public String description() {
return description;
}
public String description;
public transient FieldVar varText_cache;
public FieldVar varText() {
if (varText_cache == null)
varText_cache = varText_load();
return varText_cache;
}
public FieldVar varText_load() {
return new FieldVar(this, "text", () -> text(), text -> text(text));
}
final public G22LeftArrowScript setText(String text) {
return text(text);
}
public G22LeftArrowScript text(String text) {
if (!eq(this.text, text)) {
this.text = text;
change();
}
return this;
}
final public String getText() {
return text();
}
public String text() {
return text;
}
public String text;
public transient FieldVar> varClearedForAutoRun_cache;
public FieldVar> varClearedForAutoRun() {
if (varClearedForAutoRun_cache == null)
varClearedForAutoRun_cache = varClearedForAutoRun_load();
return varClearedForAutoRun_cache;
}
public FieldVar> varClearedForAutoRun_load() {
return new FieldVar>(this, "clearedForAutoRun", () -> clearedForAutoRun(), clearedForAutoRun -> clearedForAutoRun(clearedForAutoRun));
}
final public G22LeftArrowScript setClearedForAutoRun(ClearForAutoRun clearedForAutoRun) {
return clearedForAutoRun(clearedForAutoRun);
}
public G22LeftArrowScript clearedForAutoRun(ClearForAutoRun clearedForAutoRun) {
if (!eq(this.clearedForAutoRun, clearedForAutoRun)) {
this.clearedForAutoRun = clearedForAutoRun;
change();
}
return this;
}
final public ClearForAutoRun getClearedForAutoRun() {
return clearedForAutoRun();
}
public ClearForAutoRun clearedForAutoRun() {
return clearedForAutoRun;
}
public ClearForAutoRun clearedForAutoRun;
public transient FieldVar varEditingText_cache;
public FieldVar varEditingText() {
if (varEditingText_cache == null)
varEditingText_cache = varEditingText_load();
return varEditingText_cache;
}
public FieldVar varEditingText_load() {
return new FieldVar(this, "editingText", () -> editingText(), editingText -> editingText(editingText));
}
final public G22LeftArrowScript setEditingText(String editingText) {
return editingText(editingText);
}
public G22LeftArrowScript editingText(String editingText) {
if (!eq(this.editingText, editingText)) {
this.editingText = editingText;
change();
}
return this;
}
final public String getEditingText() {
return editingText();
}
public String editingText() {
return editingText;
}
public String editingText;
public boolean runOnProjectOpen = false;
public String runOrder;
public long runCount;
public Map>> lastResultByMode;
@Override
public void _doneLoading2() {
cMigrateField(this, "code", "text");
}
public String myType() {
return dropPrefix("G22", shortClassName(this));
}
public String toString() {
return or2(description, myType() + " " + id);
}
public void initEditingText() {
editingText(unnull(or(editingText, text)));
}
public void receiveEditingText(String text) {
printVars_shorten("receiveEditingText", "text", text);
editingText(text);
}
public String stableText() {
return text;
}
final public void save() {
completeEdit();
}
public void completeEdit() {
String t = editingText;
printVars_shorten("completeEdit", "t", t);
if (t != null) {
setTextWithHistory(t);
printVars_shorten("completeEdit", "editingText", editingText);
}
}
public void setTextWithHistory(String text) {
if (eq(this.text, text))
return;
text(text);
saveTextToHistory();
}
public String textForEditing() {
initEditingText();
return editingText;
}
public File historyFile() {
return fileInConceptsDir("History/" + shortDynName(this) + id + ".history");
}
public void saveTextToHistory() {
saveFieldToHistory("text", text);
}
public void saveFieldToHistory(String field, String value) {
File historyFile = historyFile();
if (historyFile == null)
return;
String contents = value == null ? " empty" : " (" + nLines(value) + ", " + nChars(value) + "):\n" + indentx(value) + "\n" + "\n";
appendToTextFile(historyFile, "\n===\n" + "Concept ID: " + id + "\n" + "Date: " + dateWithMSUTC() + "\n" + firstToUpper(field) + contents + "===" + "\n");
}
public boolean isSaved() {
return text != null;
}
public boolean isSavedDistinctFromAutoRunVersion() {
return isSaved() && !eq(text, codeForAutoRun());
}
public boolean isEditing() {
return editedText() != null;
}
public boolean isClearForAutoRun() {
return clearedForAutoRun != null;
}
public String editedText() {
return eq(editingText, text) ? null : editingText;
}
public String codeForAutoRun() {
return getVar(clearedForAutoRun());
}
public String safestCode() {
return or(codeForAutoRun(), stableText());
}
public void clearForAutoRun() {
if (!isSaved())
return;
String text = text();
saveFieldToHistory("Auto-runnable code", text);
clearedForAutoRun(new ClearForAutoRun(text));
}
public void forgetAutoRunCode() {
if (!isClearForAutoRun())
return;
saveFieldToHistory("Auto-runnable code", null);
clearedForAutoRun(null);
compileResultForAutoRun = null;
}
public G22Utils g22utils() {
return assertNotNull("g22utils", main.g22utils(_concepts()));
}
public GazelleV_LeftArrowScriptParser makeParser() {
return g22utils().leftArrowParser();
}
public LASCompileResult newCompileResult() {
return new LASCompileResult();
}
transient public LASCompileResult compileResultForAutoRun;
public LASCompileResult compileForAutoRun() {
String code = codeForAutoRun();
if (code == null)
return null;
var cr = compileResultForAutoRun;
if (cr != null && eq(cr.script, code))
return cr;
cr = newCompileResult();
cr.script(code);
var parser = makeParser();
cr.parser(parser);
cr.compile();
return compileResultForAutoRun = cr;
}
transient public LASCompileResult compileResultForSaved;
public LASCompileResult compileSaved() {
String code = stableText();
if (code == null)
return null;
var cr = compileResultForSaved;
if (cr != null && eq(cr.script, code))
return cr;
cr = newCompileResult();
cr.script(code);
var parser = makeParser();
cr.parser(parser);
cr.compile();
return compileResultForSaved = cr;
}
public LASCompileResult safestCompileResult() {
{
var __1 = compileForAutoRun();
if (__1 != null)
return __1;
}
return compileSaved();
}
public Object evaluateWithoutTimeout() {
var cr = safestCompileResult();
if (cr == null)
throw fail("Not saved: " + this);
AutoCloseable __2 = g22utils().enter();
try {
return cr.parsedScriptMandatory().get();
} finally {
_close(__2);
}
}
public Object evaluateAutoRunWithoutTimeout() {
var cr = compileForAutoRun();
if (cr == null)
throw fail("Not cleared for auto-run: " + this);
AutoCloseable __3 = g22utils().enter();
try {
return cr.parsedScriptMandatory().get();
} finally {
_close(__3);
}
}
}
static public class ConceptWithChangeListeners extends Concept implements IHasChangeListeners, ChangeTriggerable {
transient public Set onChange;
public ConceptWithChangeListeners onChange(Runnable r) {
onChange = createOrAddToSyncLinkedHashSet(onChange, r);
return this;
}
public ConceptWithChangeListeners removeChangeListener(Runnable r) {
main.remove(onChange, r);
return this;
}
public void fireChange() {
if (onChange != null)
for (var listener : onChange) pcallF_typed(listener);
}
public void _onChange() {
super._onChange();
fireChange();
}
public void change() {
super.change();
}
}
static public class G22AnalysisContext implements IFieldsToList {
public G22Utils g22utils;
public BufferedImage image;
public G22AnalysisContext() {
}
public G22AnalysisContext(G22Utils g22utils, BufferedImage image) {
this.image = image;
this.g22utils = g22utils;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + g22utils + ", " + image + ")";
}
public Object[] _fieldsToList() {
return new Object[] { g22utils, image };
}
public Map analyzerResults = syncMap();
static public Object calculating;
public Object callAnalyzer(long analyzerID) {
var analyzer = getConcept(g22utils.concepts(), G22Analyzer.class, analyzerID);
if (analyzer == null)
throw fail("Analyzer with ID " + analyzerID + " not found");
return callAnalyzer(analyzer);
}
public Object callAnalyzer(G22Analyzer analyzer) {
return analyzer.compileForAutoRun().get(this);
}
}
static public class CollapsibleNorthPanel extends MetaWithChangeListeners implements Swingable {
public transient FieldVar varSidePanelName_cache;
public FieldVar varSidePanelName() {
if (varSidePanelName_cache == null)
varSidePanelName_cache = varSidePanelName_load();
return varSidePanelName_cache;
}
public FieldVar varSidePanelName_load() {
return new FieldVar(this, "sidePanelName", () -> sidePanelName(), sidePanelName -> sidePanelName(sidePanelName));
}
final public CollapsibleNorthPanel setSidePanelName(String sidePanelName) {
return sidePanelName(sidePanelName);
}
public CollapsibleNorthPanel sidePanelName(String sidePanelName) {
if (!eq(this.sidePanelName, sidePanelName)) {
this.sidePanelName = sidePanelName;
change();
}
return this;
}
final public String getSidePanelName() {
return sidePanelName();
}
public String sidePanelName() {
return sidePanelName;
}
volatile public String sidePanelName;
public JComponent sideComponent, mainComponent;
public JSplitPane splitPane;
public transient FieldVar varExpanded_cache;
public FieldVar varExpanded() {
if (varExpanded_cache == null)
varExpanded_cache = varExpanded_load();
return varExpanded_cache;
}
public FieldVar varExpanded_load() {
return new FieldVar(this, "expanded", () -> expanded(), expanded -> expanded(expanded));
}
final public CollapsibleNorthPanel setExpanded(boolean expanded) {
return expanded(expanded);
}
public CollapsibleNorthPanel expanded(boolean expanded) {
if (!eq(this.expanded, expanded)) {
this.expanded = expanded;
change();
}
return this;
}
final public boolean getExpanded() {
return expanded();
}
public boolean expanded() {
return expanded;
}
volatile public boolean expanded = false;
final public CollapsibleNorthPanel setDefaultSplitPoint(double defaultSplitPoint) {
return defaultSplitPoint(defaultSplitPoint);
}
public CollapsibleNorthPanel defaultSplitPoint(double defaultSplitPoint) {
this.defaultSplitPoint = defaultSplitPoint;
return this;
}
final public double getDefaultSplitPoint() {
return defaultSplitPoint();
}
public double defaultSplitPoint() {
return defaultSplitPoint;
}
public double defaultSplitPoint = 0.5;
public SingleComponentPanel scp = singleComponentPanel();
public CollapsibleNorthPanel(boolean expanded, String sidePanelName, JComponent sideComponent, JComponent mainComponent) {
this.mainComponent = mainComponent;
this.sideComponent = sideComponent;
this.sidePanelName = sidePanelName;
this.expanded = expanded;
}
public void expand() {
setExpanded(true);
}
public void collapse() {
setExpanded(false);
}
public void toggle() {
setExpanded(!expanded);
}
public void updateScp() {
swing(() -> {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "updateScp");
if (expanded) {
splitPane().setBottomComponent(mainComponent);
scp.set(splitPane());
} else {
var collapsedNorthPanel = sidePanelMargins(sidePanelHeading());
scp.set(northAndCenterWithMargin(collapsedNorthPanel, mainComponent));
}
});
}
public JComponent expandButton() {
return jClickableImage_instantToolTip("#1103076", "Expand " + sidePanelName, new Runnable() {
public void run() {
try {
expand();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "expand();";
}
});
}
public JComponent collapseButton() {
return jClickableImage_instantToolTip("#1103104", "Collapse " + sidePanelName, new Runnable() {
public void run() {
try {
collapse();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "collapse();";
}
});
}
public JComponent wrappedSideComponent() {
var c = northAndCenterWithMargin(sidePanelHeading(), sideComponent);
return sidePanelMargins(c);
}
public JComponent expandOrCollapseButton() {
return expanded ? collapseButton() : expandButton();
}
public JComponent sidePanelHeading() {
return rightAlignedLineWithSpacing(5, onLeftClick(new Runnable() {
public void run() {
try {
toggle();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "toggle();";
}
}, liveValueLabel(varSidePanelName())), expandOrCollapseButton());
}
public JSplitPane splitPane() {
if (splitPane == null) {
splitPane = jvsplit(defaultSplitPoint(), wrappedSideComponent(), null);
varExpanded().onChangeAndNow(new Runnable() {
public void run() {
try {
updateScp();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "updateScp();";
}
});
}
return splitPane;
}
transient public IF1 sidePanelMargins;
public JComponent sidePanelMargins(JComponent c) {
return sidePanelMargins != null ? sidePanelMargins.get(c) : sidePanelMargins_base(c);
}
final public JComponent sidePanelMargins_fallback(IF1 _f, JComponent c) {
return _f != null ? _f.get(c) : sidePanelMargins_base(c);
}
public JComponent sidePanelMargins_base(JComponent c) {
return c;
}
public JComponent visualize() {
splitPane();
return scp;
}
}
static public class FieldVar extends VarWithNotify {
public IHasChangeListeners containingObject;
public String fieldName;
public IF0 getter;
public IVF1 setter;
public FieldVar(IHasChangeListeners containingObject, String fieldName, IF0 getter, IVF1 setter) {
this.setter = setter;
this.getter = getter;
this.fieldName = fieldName;
this.containingObject = containingObject;
containingObject.onChangeAndNow(() -> _updateFromObject());
}
public void _updateFromObject() {
set(getter.get());
}
public void fireChange() {
setter.get(get());
super.fireChange();
}
public FieldVar onChange(IVF1 r) {
if (r != null)
onChange(() -> r.get(get()));
return this;
}
}
static public class ImageSurface_PositionToolTip extends ImageSurfaceMouseHandler {
public ImageSurface_PositionToolTip(ImageSurface is) {
if (containsInstance(is.tools, ImageSurface_PositionToolTip.class))
return;
register(is);
}
final public void mouseDragged(MouseEvent e) {
mouseMoved(e);
}
public void mouseMoved(MouseEvent e) {
setToolTip(is, getPt(e));
}
}
static public class SingleComponentPanel extends JPanel {
public SingleComponentPanel() {
super(new BorderLayout());
}
public SingleComponentPanel(Component component) {
this();
if (component != null)
setComponent(component);
}
public void set(Swingable component) {
set(wrap(component));
}
final public void set(Component component) {
setComponent(component);
}
public void setComponent(Component component) {
{
swing(() -> {
if (getComponent() == component)
return;
removeAll();
if (component != null)
add(BorderLayout.CENTER, wrap(component));
_revalidate(SingleComponentPanel.this);
});
}
}
public void setComponentAndRevalidateParent(Component component) {
setComponent(component);
_revalidate(_getParent(this));
}
final public void clear() {
noComponent();
}
public void noComponent() {
setComponent(null);
}
public Component getComponent() {
return swing(() -> getComponentCount() == 0 ? null : getComponent(0));
}
public boolean isEmpty() {
return getComponent() == null;
}
}
static public class Pair implements Comparable> {
public A a;
public B b;
public Pair() {
}
public Pair(A a, B b) {
this.b = b;
this.a = a;
}
public int hashCode() {
return hashCodeFor(a) + 2 * hashCodeFor(b);
}
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Pair))
return false;
Pair t = (Pair) o;
return eq(a, t.a) && eq(b, t.b);
}
public String toString() {
return "<" + a + ", " + b + ">";
}
public int compareTo(Pair p) {
if (p == null)
return 1;
int i = ((Comparable ) a).compareTo(p.a);
if (i != 0)
return i;
return ((Comparable) b).compareTo(p.b);
}
}
static public class G22Variable extends ConceptWithChangeListeners implements IPersistenceInfo {
static final public String _fieldOrder = "name value persistent";
public String name;
public transient FieldVar varValue_cache;
public FieldVar varValue() {
if (varValue_cache == null)
varValue_cache = varValue_load();
return varValue_cache;
}
public FieldVar varValue_load() {
return new FieldVar(this, "value", () -> value(), value -> value(value));
}
final public G22Variable setValue(Object value) {
return value(value);
}
public G22Variable value(Object value) {
if (!eq(this.value, value)) {
this.value = value;
change();
}
return this;
}
final public Object getValue() {
return value();
}
public Object value() {
return value;
}
volatile public Object value;
final public G22Variable setPersistent(boolean persistent) {
return persistent(persistent);
}
public G22Variable persistent(boolean persistent) {
this.persistent = persistent;
return this;
}
final public boolean getPersistent() {
return persistent();
}
public boolean persistent() {
return persistent;
}
public boolean persistent = false;
public Map _persistenceInfo() {
return litmap("value", persistent);
}
public Object get() {
return value;
}
public void setValueIfNull(Object defaultValue) {
if (defaultValue != null && value == null)
value(defaultValue);
}
}
final static public class Rect implements IFieldsToList {
static final public String _fieldOrder = "x y w h";
public int x;
public int y;
public int w;
public int h;
public Rect() {
}
public Rect(int x, int y, int w, int h) {
this.h = h;
this.w = w;
this.y = y;
this.x = x;
}
public boolean equals(Object o) {
if (!(o instanceof Rect))
return false;
Rect __1 = (Rect) o;
return x == __1.x && y == __1.y && w == __1.w && h == __1.h;
}
public int hashCode() {
int h = 2543108;
h = boostHashCombine(h, _hashCode(x));
h = boostHashCombine(h, _hashCode(y));
h = boostHashCombine(h, _hashCode(w));
h = boostHashCombine(h, _hashCode(h));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { x, y, w, h };
}
public Rect(Rectangle r) {
x = r.x;
y = r.y;
w = r.width;
h = r.height;
}
public Rect(Pt p, int w, int h) {
this.h = h;
this.w = w;
x = p.x;
y = p.y;
}
public Rect(Rect r) {
x = r.x;
y = r.y;
w = r.w;
h = r.h;
}
public Rectangle getRectangle() {
return new Rectangle(x, y, w, h);
}
public String toString() {
return x + "," + y + " / " + w + "," + h;
}
public int x1() {
return x;
}
public int y1() {
return y;
}
public int x2() {
return x + w;
}
public int y2() {
return y + h;
}
public boolean contains(Pt p) {
return contains(p.x, p.y);
}
public boolean contains(int _x, int _y) {
return _x >= x && _y >= y && _x < x + w && _y < y + h;
}
public boolean contains(Rectangle r) {
return rectContains(this, r);
}
public boolean empty() {
return w <= 0 || h <= 0;
}
public int getWidth() {
return w;
}
public int getHeight() {
return h;
}
}
static public class FunctionTimings {
public Map data = syncMap();
final public void timeCtex(A function, RunnableWithExceptions r) {
doCtex(function, r);
}
public void doCtex(A function, RunnableWithExceptions r) {
try {
if (r == null)
return;
long time = nanoTime();
try {
r.run();
} finally {
time = nanoTime() - time;
saveTiming(function, time);
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public B get(A function, IF0 f) {
if (f == null)
return null;
Var var = new Var();
time(function, () -> var.set(f.get()));
return var.get();
}
final public void time(A function, Runnable r) {
dO(function, r);
}
public void dO(A function, Runnable r) {
if (r == null)
return;
long time = nanoTime();
try {
r.run();
} finally {
time = nanoTime() - time;
saveTiming(function, time);
}
}
public void saveTiming(A function, long time) {
Average avg = syncMapGetOrCreate(data, function, () -> new Average());
avg.add(time);
}
public Map get() {
return cloneMap(data);
}
final public void clear() {
reset();
}
public void reset() {
data.clear();
}
final public String toString() {
return render();
}
public String render() {
return lines(renderedEntries());
}
public List renderedEntries() {
return ciSorted(map(get(), (f, avg) -> functionToString(f) + ": " + n2(iround(nsToMicroseconds(avg.get()))) + " " + microSymbol() + "s (" + n2(iround(avg.n())) + ")"));
}
public String toStringSingleLine() {
return joinWithComma(renderedEntries());
}
public String functionToString(A f) {
return firstToUpper(str(f));
}
}
static public class JConceptsTable implements Swingable {
public Class extends A> conceptClass;
public Concepts concepts;
public JTable table;
public Map filters;
public String hID = "ID";
final public JConceptsTable setDropFields(List dropFields) {
return dropFields(dropFields);
}
public JConceptsTable dropFields(List dropFields) {
this.dropFields = dropFields;
return this;
}
final public List getDropFields() {
return dropFields();
}
public List dropFields() {
return dropFields;
}
public List dropFields;
final public JConceptsTable setNoSubclasses(boolean noSubclasses) {
return noSubclasses(noSubclasses);
}
public JConceptsTable noSubclasses(boolean noSubclasses) {
this.noSubclasses = noSubclasses;
return this;
}
final public boolean getNoSubclasses() {
return noSubclasses();
}
public boolean noSubclasses() {
return noSubclasses;
}
public boolean noSubclasses = false;
public IF1 postProcess;
public Runnable afterUpdate;
public boolean latestFirst = false;
public IF1, Collection> sorter = __1 -> defaultSort(__1);
public int idWidth = 50;
final public JConceptsTable setUpdateInterval(int updateInterval) {
return updateInterval(updateInterval);
}
public JConceptsTable updateInterval(int updateInterval) {
this.updateInterval = updateInterval;
return this;
}
final public int getUpdateInterval() {
return updateInterval();
}
public int updateInterval() {
return updateInterval;
}
public int updateInterval = 100;
public int firstUpdateInterval = 100;
public boolean humanizeFieldNames = true;
public Float tableFontSize;
public Integer tableRowHeight;
final public JConceptsTable setAddCountToEnclosingTab(boolean addCountToEnclosingTab) {
return addCountToEnclosingTab(addCountToEnclosingTab);
}
public JConceptsTable addCountToEnclosingTab(boolean addCountToEnclosingTab) {
this.addCountToEnclosingTab = addCountToEnclosingTab;
return this;
}
final public boolean getAddCountToEnclosingTab() {
return addCountToEnclosingTab();
}
public boolean addCountToEnclosingTab() {
return addCountToEnclosingTab;
}
public boolean addCountToEnclosingTab = false;
final public JConceptsTable setUseNewChangeHandler(boolean useNewChangeHandler) {
return useNewChangeHandler(useNewChangeHandler);
}
public JConceptsTable useNewChangeHandler(boolean useNewChangeHandler) {
this.useNewChangeHandler = useNewChangeHandler;
return this;
}
final public boolean getUseNewChangeHandler() {
return useNewChangeHandler();
}
public boolean useNewChangeHandler() {
return useNewChangeHandler;
}
public boolean useNewChangeHandler = false;
final public JConceptsTable setDefaultAction(IVF1 defaultAction) {
return defaultAction(defaultAction);
}
public JConceptsTable defaultAction(IVF1 defaultAction) {
this.defaultAction = defaultAction;
return this;
}
final public IVF1 getDefaultAction() {
return defaultAction();
}
public IVF1 defaultAction() {
return defaultAction;
}
public IVF1 defaultAction;
public int count;
transient public Set onSelectionChanged;
public JConceptsTable onSelectionChanged(Runnable r) {
onSelectionChanged = createOrAddToSyncLinkedHashSet(onSelectionChanged, r);
return this;
}
public JConceptsTable removeSelectionChangedListener(Runnable r) {
main.remove(onSelectionChanged, r);
return this;
}
public void selectionChanged() {
if (onSelectionChanged != null)
for (var listener : onSelectionChanged) pcallF_typed(listener);
}
transient public Set onSingleSelectionChanged;
public JConceptsTable onSingleSelectionChanged(Runnable r) {
onSingleSelectionChanged = createOrAddToSyncLinkedHashSet(onSingleSelectionChanged, r);
return this;
}
public JConceptsTable removeSingleSelectionChangedListener(Runnable r) {
main.remove(onSingleSelectionChanged, r);
return this;
}
public void singleSelectionChanged() {
if (onSingleSelectionChanged != null)
for (var listener : onSingleSelectionChanged) pcallF_typed(listener);
}
public AWTOnConceptChanges changeHandler;
public AWTOnConceptChangesByClass newChangeHandler;
public boolean updatingList = false;
final public JConceptsTable setSelectAfterUpdate(A selectAfterUpdate) {
return selectAfterUpdate(selectAfterUpdate);
}
public JConceptsTable selectAfterUpdate(A selectAfterUpdate) {
this.selectAfterUpdate = selectAfterUpdate;
return this;
}
final public A getSelectAfterUpdate() {
return selectAfterUpdate();
}
public A selectAfterUpdate() {
return selectAfterUpdate;
}
public A selectAfterUpdate;
public A lastSelected;
public JConceptsTable() {
}
public JConceptsTable(Class extends A> conceptClass) {
this.conceptClass = conceptClass;
}
public JConceptsTable(Concepts concepts, Class extends A> conceptClass) {
this.conceptClass = conceptClass;
this.concepts = concepts;
}
transient public IF1 > itemToMap;
public Map itemToMap(A a) {
return itemToMap != null ? itemToMap.get(a) : itemToMap_base(a);
}
final public Map itemToMap_fallback(IF1> _f, A a) {
return _f != null ? _f.get(a) : itemToMap_base(a);
}
public Map itemToMap_base(A a) {
return putAll(specialFieldsForItem(a), mapValues(__51 -> renderForTable_noStruct(__51), itemToMap_inner2(a)));
}
transient public IF1> itemToMap_inner2;
public Map itemToMap_inner2(A a) {
return itemToMap_inner2 != null ? itemToMap_inner2.get(a) : itemToMap_inner2_base(a);
}
final public Map itemToMap_inner2_fallback(IF1> _f, A a) {
return _f != null ? _f.get(a) : itemToMap_inner2_base(a);
}
public Map itemToMap_inner2_base(A a) {
return allConceptFieldsAsMapExcept(a, dropFields);
}
transient public IF1> specialFieldsForItem;
public Map specialFieldsForItem(A a) {
return specialFieldsForItem != null ? specialFieldsForItem.get(a) : specialFieldsForItem_base(a);
}
final public Map specialFieldsForItem_fallback(IF1> _f, A a) {
return _f != null ? _f.get(a) : specialFieldsForItem_base(a);
}
public Map specialFieldsForItem_base(A a) {
Map map = litorderedmap(hID, str(a.id));
mapPut(map, "Java Class", javaClassDescForItem(a));
return map;
}
public String javaClassDescForItem(A a) {
String className = dynShortClassName(a);
if (neq(className, shortClassName(conceptClass))) {
String text = className;
String realClass = shortClassName(a);
if (neq(className, realClass))
text += " as " + realClass;
return text;
}
return null;
}
public String defaultTitle() {
return plural(shortClassName(conceptClass));
}
public void showAsFrame() {
showAsFrame(defaultTitle());
}
public void showAsFrame(String title) {
makeTable();
showFrame(title, table);
}
public void makeTable() {
if (table != null)
return;
if (concepts == null)
concepts = db_mainConcepts();
table = sexyTable();
if (tableFontSize != null) {
setTableFontSizes(tableFontSize, table);
if (tableRowHeight == null)
tableRowHeight = iround(tableFontSize * 1.5);
}
if (tableRowHeight != null)
setRowHeight(table, tableRowHeight);
if (useNewChangeHandler) {
newChangeHandler = new AWTOnConceptChangesByClass(concepts, conceptClass, table, () -> _update()).delay(updateInterval).firstDelay(firstUpdateInterval);
newChangeHandler.install();
} else {
changeHandler = new AWTOnConceptChanges(concepts, table, () -> _update()).delay(updateInterval).firstDelay(firstUpdateInterval);
changeHandler.install();
}
onTableSelectionChanged(table, () -> {
if (updatingList)
return;
selectionChanged();
});
onSelectionChanged(() -> {
var a = selected();
if (a != lastSelected) {
lastSelected = a;
singleSelectionChanged();
}
});
onDoubleClickOrEnter(table, () -> {
A a = selected();
if (a != null && defaultAction != null)
pcallF(defaultAction, a);
});
}
public void update() {
{
swing(() -> {
_update();
});
}
}
public void _update() {
if (table == null)
return;
updatingList = true;
boolean allRestored = false;
A selectAfterUpdate = selectAfterUpdate();
try {
List data = new ArrayList();
Set selection;
if (selectAfterUpdate != null) {
selection = litset(selectAfterUpdate._conceptID());
selectAfterUpdate(null);
} else
selection = toSet(selectedConceptIDs());
Collection extends A> l = conceptsWhere(concepts, conceptClass, mapToParams(filters));
if (noSubclasses)
l = filter(l, x -> x.getClass() == conceptClass);
l = postProcess(sorter, l);
for (A c : l) addIfNotNull(data, itemToMap(c));
if (latestFirst)
reverseInPlace(data);
data = (List) postProcess(postProcess, data);
count = l(data);
dataToTable_uneditable(data, table);
if (humanizeFieldNames)
humanizeTableColumns();
tableColumnMaxWidth(table, 0, idWidth);
allRestored = restoreSelection(selection);
if (addCountToEnclosingTab)
updateEnclosingTabTitle();
} finally {
updatingList = false;
}
pcallF(afterUpdate);
if (!allRestored || selectAfterUpdate != null)
selectionChanged();
}
public void updateEnclosingTabTitle() {
updateEnclosingTabTitleWithCount(table, count);
}
public void humanizeTableColumns() {
int n = tableColumnCount(table);
for (int i = 0; i < n; i++) setColumnName(table, i, humanizeFormLabel(getColumnName(table, i)));
}
public JComponent visualize() {
return table();
}
public JTable table() {
makeTable();
return table;
}
public A selectedConcept() {
return (A) concepts.getConcept(toLong(selectedTableCell(table, 0)));
}
public A selected() {
return selectedConcept();
}
public long getItemID(int row) {
return toLong(getTableCell(table, row, 0));
}
public A getItem(int row) {
return (A) concepts.getConcept(getItemID(row));
}
public int indexOfConcept(final A c) {
if (c == null)
return -1;
return swing(new F0() {
public Integer get() {
try {
int n = tableRowCount(table);
for (int row = 0; row < n; row++) if (toLong(getTableCell(table, row, 0)) == c.id)
return row;
return -1;
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "int n = tableRowCount(table);\r\n for row to n:\r\n if (toLong(getTab...";
}
});
}
public List selectedConcepts() {
return swing(() -> {
int[] rows = table.getSelectedRows();
List l = new ArrayList();
for (int row : rows) l.add(getItem(row));
return l;
});
}
public List selectedConceptIDs() {
return swing(() -> {
int[] rows = table.getSelectedRows();
List l = emptyList(l(rows));
for (int row : rows) l.add(getItemID(row));
return l;
});
}
public boolean restoreSelection(Set selection) {
return swing(() -> {
int n = tableRowCount(table);
IntBuffer toSelect = new IntBuffer();
for (int row = 0; row < n; row++) if (selection.contains(getItemID(row)))
toSelect.add(row);
selectTableRows(table, toSelect.toIntArray());
return toSelect.size() == selection.size();
});
}
public void setSelected(A a) {
selectRow(table, indexOfConcept(a));
}
public Collection defaultSort(Collection l) {
return sortByConceptID(l);
}
public JConceptsTable addFilter(String field, Object value) {
filters = orderedMapPutOrCreate(filters, field, value);
return this;
}
public void onSelectionChangedAndNow(Runnable r) {
if (r == null)
return;
onSelectionChanged(r);
r.run();
}
}
static public class ConceptsComboBox extends JComboBox {
public Concepts concepts;
public Class conceptClass;
public AWTOnConceptChanges updater;
final public ConceptsComboBox setAllowNull(boolean allowNull) {
return allowNull(allowNull);
}
public ConceptsComboBox allowNull(boolean allowNull) {
this.allowNull = allowNull;
return this;
}
final public boolean getAllowNull() {
return allowNull();
}
public boolean allowNull() {
return allowNull;
}
public boolean allowNull = false;
public ConceptsComboBox(Concepts concepts, Class conceptClass) {
this.conceptClass = conceptClass;
this.concepts = concepts;
updateItems();
updater = new AWTOnConceptChanges(concepts, this, () -> updateItems());
updater.install();
}
public void updateItems() {
var l = sortTheList(asList(freshList()));
if (allowNull)
l = nullPlus(l);
setComboBoxItems_notifyListeners(this, l);
}
transient public IF0> freshList;
public Collection freshList() {
return freshList != null ? freshList.get() : freshList_base();
}
final public Collection freshList_fallback(IF0> _f) {
return _f != null ? _f.get() : freshList_base();
}
public Collection freshList_base() {
return main.list(concepts, conceptClass);
}
transient public IF1, List> sortTheList;
public List sortTheList(List l) {
return sortTheList != null ? sortTheList.get(l) : sortTheList_base(l);
}
final public List sortTheList_fallback(IF1, List> _f, List l) {
return _f != null ? _f.get(l) : sortTheList_base(l);
}
public List sortTheList_base(List l) {
return sortConceptsByID(l);
}
public A get() {
return getSelectedItem_typed(this);
}
}
static public class VarContext {
final public VarContext getParent() {
return parent();
}
public VarContext parent() {
return parent;
}
public VarContext parent;
public Map vars;
public VarContext() {
}
public VarContext(VarContext parent) {
this.parent = parent;
}
public Object get(String name) {
if (containsKey(vars, name))
return mapGet(vars, name);
if (parent != null)
return parent.get(name);
return null;
}
final public void put(String name, Object value) {
set(name, value);
}
public void set(String name, Object value) {
vars = putOrCreate(vars, name, value);
}
public void unset(String name) {
remove(vars, name);
}
public void printMe() {
pnl(vars);
print("parent", parent);
}
final public VarContext setExitFromScript(Object exitFromScript) {
return exitFromScript(exitFromScript);
}
public VarContext exitFromScript(Object exitFromScript) {
this.exitFromScript = exitFromScript;
return this;
}
final public Object getExitFromScript() {
return exitFromScript();
}
public Object exitFromScript() {
return exitFromScript;
}
public Object exitFromScript;
final public VarContext setReturnValue(Object returnValue) {
return returnValue(returnValue);
}
public VarContext returnValue(Object returnValue) {
this.returnValue = returnValue;
return this;
}
final public Object getReturnValue() {
return returnValue();
}
public Object returnValue() {
return returnValue;
}
public Object returnValue;
public boolean exiting() {
ping();
return exitFromScript != null;
}
}
static abstract public class F0 {
abstract public A get();
}
static public class G22LAScriptIDE implements Swingable {
final public G22LAScriptIDE setG22utils(G22Utils g22utils) {
return g22utils(g22utils);
}
public G22LAScriptIDE g22utils(G22Utils g22utils) {
this.g22utils = g22utils;
return this;
}
final public G22Utils getG22utils() {
return g22utils();
}
public G22Utils g22utils() {
return g22utils;
}
public G22Utils g22utils;
final public G22LAScriptIDE setNoScriptSelectedMsg(String noScriptSelectedMsg) {
return noScriptSelectedMsg(noScriptSelectedMsg);
}
public G22LAScriptIDE noScriptSelectedMsg(String noScriptSelectedMsg) {
this.noScriptSelectedMsg = noScriptSelectedMsg;
return this;
}
final public String getNoScriptSelectedMsg() {
return noScriptSelectedMsg();
}
public String noScriptSelectedMsg() {
return noScriptSelectedMsg;
}
public String noScriptSelectedMsg = "Please select or create a script to edit it";
public A script;
transient public SingleComponentPanel scp;
transient public JLeftArrowScriptIDE[] ides;
transient public JTabbedPane tabs;
transient public JButton btnSave, btnDiscardChanges, btnClearForAutoRun;
transient public CollapsibleLeftPanel collapsibleResultPanel;
transient public G22ScriptResultPanel resultPanel;
abstract public class Mode {
public G22ScriptMode modeEnum;
public String name;
final public boolean getEditable() {
return editable();
}
public boolean editable() {
return editable;
}
public boolean editable = false;
public Mode(G22ScriptMode modeEnum, String name, boolean editable) {
this.editable = editable;
this.name = name;
this.modeEnum = modeEnum;
}
public IVarWithNotify scriptVar_cache;
public IVarWithNotify scriptVar() {
if (scriptVar_cache == null)
scriptVar_cache = scriptVar_load();
return scriptVar_cache;
}
abstract public IVarWithNotify scriptVar_load();
public void addButtons(JPanel panel) {
}
public String toString() {
return name;
}
public String tabName() {
return scriptVar().has() ? name : "Not " + firstToLower(name);
}
}
public class ModeClearedForAutoRun extends Mode {
public ModeClearedForAutoRun() {
super(G22ScriptMode.autoRunnable, "Cleared for auto-run", false);
}
public IVarWithNotify scriptVar_load() {
var var = new VirtualVar(() -> script.codeForAutoRun(), null);
addWeakChangeListener(script.varClearedForAutoRun(), var);
return var;
}
public void addButtons(JPanel panel) {
panel.add(jbutton("Forget auto-run code", runnableThread(new Runnable() {
public void run() {
try {
forgetAutoRunCode();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "forgetAutoRunCode();";
}
})));
}
}
public class ModeSaved extends Mode {
public ModeSaved() {
super(G22ScriptMode.saved, "Saved", false);
}
public IVarWithNotify scriptVar_load() {
return getterVarOnly(script.varText());
}
public void addButtons(JPanel panel) {
panel.add(btnClearForAutoRun = jbutton("Clear for auto-run", runnableThread(new Runnable() {
public void run() {
try {
clearForAutoRun();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "clearForAutoRun();";
}
})));
panel.add(jbutton("Forget code", runnableThread(new Runnable() {
public void run() {
try {
forgetSaved();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "forgetSaved();";
}
})));
}
}
public class ModeEdit extends Mode {
public ModeEdit() {
super(G22ScriptMode.edit, "Edit", true);
}
public IVarWithNotify scriptVar_load() {
var var = new VirtualVar(() -> script.textForEditing(), text -> script.receiveEditingText(text));
addWeakChangeListener(script, var);
return var;
}
public void addButtons(JPanel panel) {
panel.add(btnSave = jbutton("Save", runnableThread(new Runnable() {
public void run() {
try {
saveEdit();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "saveEdit();";
}
})));
panel.add(btnDiscardChanges = jbutton("Discard changes", runnableThread(new Runnable() {
public void run() {
try {
discardEdit();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "discardEdit();";
}
})));
}
}
transient public ModeEdit modeEdit = new ModeEdit();
transient public ModeSaved modeSaved = new ModeSaved();
transient public ModeClearedForAutoRun modeClearedForAutoRun = new ModeClearedForAutoRun();
transient public List modes = ll(modeEdit, modeSaved, modeClearedForAutoRun);
public G22LAScriptIDE(G22Utils g22utils) {
this.g22utils = g22utils;
}
public transient JComponent visualize_cache;
public JComponent visualize() {
if (visualize_cache == null)
visualize_cache = visualize_load();
return visualize_cache;
}
public JComponent visualize_load() {
return markVisualizer(this, visualize_impl());
}
public JComponent visualize_impl() {
ides = new JLeftArrowScriptIDE[l(modes)];
if (scp == null)
scp = singleComponentPanel();
loadScript(script);
return scp;
}
public void setScript(A script) {
if (this.script != script)
if (this.script != null)
throw fail("Can't set script after initialisation");
else
loadScript(script);
}
public void loadScript(A script) {
this.script = script;
if (scp == null)
return;
if (script == null)
scp.set(jcenteredlabel(noScriptSelectedMsg()));
else {
tabs = jtabs();
resultPanel = new G22ScriptResultPanel();
collapsibleResultPanel = new CollapsibleLeftPanel(false, "Output", resultPanel.visualize(), tabs);
collapsibleResultPanel.sidePanelMargins = c -> withTopAndLeftMargin(c);
for (Pair __0 : iterateWithIndex(modes)) {
int i = pairA(__0);
Mode mode = pairB(__0);
var ide = ides[i] = g22utils.leftArrowIDE();
ide.withResultPanel(false);
ide.resultPanel = resultPanel;
ide.collapsibleResultPanel = collapsibleResultPanel;
ide.wrapSection = c -> wrapEditorSection(mode, c);
ide.newCompileResult = () -> script.newCompileResult();
ide.makeParser = () -> script.makeParser();
modifyIDE(ide);
var varScript = mode.scriptVar();
ide.lvScript(varWithNotifyToLiveValue(String.class, varScript));
addTab(tabs, str(mode));
mode.addButtons(ide.buttons());
ide.visualize();
ide.setEditable(mode.editable());
varScript.onChangeAndNow(text -> setTab(tabs, i, text == null ? jcenteredlabel("Empty") : wrapIDE(mode, ide)));
ide.popDownButton.onFillingMenu(menu -> addMenuItem(menu, "Show History", runnableThread(new Runnable() {
public void run() {
try {
showHistory();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "showHistory();";
}
})));
}
script.onChangeAndNow(new Runnable() {
public void run() {
try {
for (Pair __1 : iterateWithIndex(modes)) {
int i = pairA(__1);
Mode mode = pairB(__1);
setTabTitle(tabs, i, mode.tabName());
}
setEnabled(script.isEditing(), btnSave, btnDiscardChanges);
setEnabled(btnClearForAutoRun, script.isSavedDistinctFromAutoRunVersion());
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "for (Pair __1 : iterateWithIndex(modes))\r\n { int i = ...";
}
});
setMode(script.isEditing() ? modeEdit : modeSaved);
scp.set(collapsibleResultPanel);
}
}
transient public IF2 wrapEditorSection;
public JComponent wrapEditorSection(Mode mode, JComponent editorSection) {
return wrapEditorSection != null ? wrapEditorSection.get(mode, editorSection) : wrapEditorSection_base(mode, editorSection);
}
final public JComponent wrapEditorSection_fallback(IF2 _f, Mode mode, JComponent editorSection) {
return _f != null ? _f.get(mode, editorSection) : wrapEditorSection_base(mode, editorSection);
}
public JComponent wrapEditorSection_base(Mode mode, JComponent editorSection) {
if (mode == modeSaved)
return withTopMargin(northAndCenterWithMargin(withRightMargin(jline(jbutton("Edit script", () -> setMode(modeEdit)))), editorSection));
else
return editorSection;
}
transient public IF2 wrapIDE;
public JComponent wrapIDE(Mode mode, JLeftArrowScriptIDE ide) {
return wrapIDE != null ? wrapIDE.get(mode, ide) : wrapIDE_base(mode, ide);
}
final public JComponent wrapIDE_fallback(IF2