Warning : session_start(): open(/var/lib/php/sessions/sess_rc8mpre301ne7027cpo7jc6hia, 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 java.time.Duration;
import java.lang.invoke.VarHandle;
import java.lang.invoke.MethodHandles;
import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;
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.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.border.*;
import javax.swing.undo.UndoManager;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.DataFlavor;
import java.awt.geom.*;
import java.text.NumberFormat;
import javax.imageio.metadata.*;
import javax.imageio.stream.*;
import java.text.SimpleDateFormat;
import java.nio.charset.Charset;
import java.util.TimeZone;
import java.awt.datatransfer.UnsupportedFlavorException;
import javax.swing.Icon;
public class main {
static public class G22MasksPanel extends G22CRUDAndDetailPanel {
public G22MasksPanel() {
}
public SimpleCRUD_v2 makeCRUD() {
var crud = new SimpleCRUD_v2<>(g22utils.concepts(), G22MaskConcept.class);
return crud;
}
public JComponent makeDetailView(G22MaskConcept mask) {
return g22utils.stdImageSurface(mask.maskImage);
}
public G22MasksPanel g22utils(G22Utils g22utils) {
super.g22utils(g22utils);
return this;
}
}
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 setShowDuplicateButton(boolean showDuplicateButton) {
return showDuplicateButton(showDuplicateButton);
}
public SimpleCRUD_v2 showDuplicateButton(boolean showDuplicateButton) {
this.showDuplicateButton = showDuplicateButton;
return this;
}
final public boolean getShowDuplicateButton() {
return showDuplicateButton();
}
public boolean showDuplicateButton() {
return showDuplicateButton;
}
public boolean showDuplicateButton = 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 || !showDuplicateButton ? 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);
}
transient public IF1 createDuplicate;
public A createDuplicate(A c) {
return createDuplicate != null ? createDuplicate.get(c) : createDuplicate_base(c);
}
final public A createDuplicate_fallback(IF1 _f, A c) {
return _f != null ? _f.get(c) : createDuplicate_base(c);
}
public A createDuplicate_base(A c) {
A clone = (A) unlisted(_getClass(c));
ccopyFieldsExcept(c, clone, dontDuplicateFields);
return clone;
}
public void duplicateConcept(A oldConcept) {
EditWindow ew = new EditWindow();
if (oldConcept == null)
ew.item = unlisted(conceptClass);
else
ew.item = createDuplicate(oldConcept);
csetAll(ew.item, filters);
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, Collection.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) {
visualize();
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);
}
}
static public class G22MaskConcept extends ConceptWithChangeListeners {
public IBinaryImage maskImage;
}
abstract static public class G22CRUDAndDetailPanel extends Concept {
static final public String _fieldOrder = "selected collapsiblePanel g22utils crud scpDetail handleSelectionVar";
public Ref selected = new Ref();
public CollapsibleNorthPanel collapsiblePanel = new CollapsibleNorthPanel(true);
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;
public SimpleCRUD_v2 crud;
transient public SingleComponentPanel scpDetail;
abstract public SimpleCRUD_v2 makeCRUD();
transient public RSTVar handleSelectionVar = new RSTVar<>(__1 -> handleSelection_impl(__1));
public JComponent makeDetailView(A a) {
return jTodo();
}
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();
selectAfterUpdate(selected.get());
var crudVis = crud.visualize();
crudVisualized();
handleSelectionVar.forceUpdate();
crud.onSelectionChanged(() -> {
var selected = crud.selected();
this.selected.set(selected);
handleSelectionVar.set(selected);
});
collapsiblePanel.init(crud.entityName() + " List", jCenteredSection(crud.entityNamePlural(), crudVis), scpDetail);
collapsiblePanel.onChange(() -> change());
return collapsiblePanel.visualize();
}
public void handleSelection_impl(A selected) {
if (selected == null)
scpDetail.set(emptyDetailView());
else {
var view = makeDetailView(selected);
var lvTitle = liveValue_hasChangeListeners(selected, () -> detailTitle(selected));
scpDetail.set(jCenteredRaisedBoldLiveValueSection(lvTitle, view));
}
}
transient public IF1 detailTitle;
public String detailTitle(A item) {
return detailTitle != null ? detailTitle.get(item) : detailTitle_base(item);
}
final public String detailTitle_fallback(IF1 _f, A item) {
return _f != null ? _f.get(item) : detailTitle_base(item);
}
public String detailTitle_base(A item) {
return crud.entityName() + " " + item.id + ": " + item;
}
public JComponent emptyDetailView() {
return jGazelleLogo();
}
public void crudVisualized() {
}
public void addCountToEnclosingTab(boolean b) {
crud.addCountToEnclosingTab(b);
}
public void updateCount() {
crud.update();
}
final public void setSelected(A A) {
edit(A);
}
public void edit(A A) {
crud().setSelected(A);
}
public void selectAfterUpdate(A A) {
crud.selectAfterUpdate(A);
}
public SimpleCRUD_v2 crud() {
visualize();
return crud;
}
}
static public class G22Utils_Base {
transient public Set> onProjectFileChanged;
public G22Utils_Base onProjectFileChanged(IVF1 f) {
onProjectFileChanged = createOrAddToSyncLinkedHashSet(onProjectFileChanged, f);
return this;
}
public G22Utils_Base removeProjectFileChangedListener(IVF1 f) {
main.remove(onProjectFileChanged, f);
return this;
}
public void projectFileChanged(File file) {
if (onProjectFileChanged != null)
for (var listener : onProjectFileChanged) pcallF_typed(listener, file);
}
}
static public class G22Utils extends G22Utils_Base implements AutoCloseable, TransientObject {
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();
public FileWatchService fileWatcher;
public boolean projectFileListenerInitiated = false;
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 ILASClassLoader lasClassLoader() {
return masterStuff == null ? null : masterStuff.lasClassLoader();
}
public ImageSurface stdImageSurface_noToolTip() {
return stdImageSurface_noToolTip(imageSurface());
}
public ImageSurface stdImageSurface_noToolTip(ImageSurface is) {
imageSurface_pixelated(is);
is.setAutoZoomToDisplay(true).repaintInThread(false);
is.defaultImageDir = () -> dbDir();
is.specialPurposed = true;
return is;
}
public ImageSurface stdImageSurface() {
return stdImageSurface(imageSurface());
}
public ImageSurface stdImageSurface(ImageSurface is) {
stdImageSurface_noToolTip(is);
new ImageSurface_PositionToolTip(is);
return is;
}
public List stdImageSurfaces(Collection images) {
return map(__49 -> stdImageSurface(__49), toBufferedImages(images));
}
public ImageSurface stdImageSurface(MakesBufferedImage img) {
return stdImageSurface(toBufferedImage(img));
}
public ImageSurface stdImageSurface(BufferedImage img) {
var is = stdImageSurface();
is.setImage(img);
return is;
}
public ImageSurface stdImageSurface(File file) {
var is = stdImageSurface();
is.setImage(file);
return is;
}
public ImageSurface stdImageSurface(G22GalleryImage img) {
return stdImageSurface(img == null ? null : img.path);
}
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.classNameResolver(classNameResolver());
parser.lasClassLoader(lasClassLoader());
settingUpParser(parser);
parser.addClassAlias("Freq", "Frequency");
parser.addClassAlias("MRUAndAllTimeTop", "MRUAndAllTimeTop_optimized");
return parser;
}
public Object leftArrow(String script) {
return leftArrowParse(script).get();
}
public GazelleV_LeftArrowScript.Script leftArrowParse(String script) {
return leftArrowParser().parse(script);
}
public Object leftArrowWithVars(String script, Object... vars) {
var parser = leftArrowParser();
for (int i = 0; i < l(vars); i += 2) parser.addVar((String) vars[i], or(_getClass(vars[i + 1]), Object.class), true);
var parsed = parser.parse(script);
FlexibleVarContext varContext = new FlexibleVarContext();
for (int i = 0; i < l(vars); i += 2) varContext.set((String) vars[i], vars[i + 1]);
return parsed.get(varContext);
}
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 masterStuff.databasesMotherDir();
}
public File dirOfProjectNamed(String name) {
assertNempty(name);
return newFile(databasesMotherDir(), name);
}
public AutoCloseable enter() {
return module == null ? null : module.enter();
}
public String defaultDBName() {
return "Default";
}
public File lastOpenedDBsFile() {
return newFile(databasesMotherDir(), "Last Opened");
}
public File recentlyOpenedDBsFile() {
return newFile(databasesMotherDir(), "Recently 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() {
return loadRecentProjectsFile(lastOpenedDBsFile());
}
public List dbNamesRecentlyOpened() {
return loadRecentProjectsFile(recentlyOpenedDBsFile());
}
public void addToRecentDBNames(String dbName, boolean hidden) {
List list = dbNamesRecentlyOpened();
List list2 = cloneList(list);
removeAll(list2, dbName, "*" + dbName);
list2.add(0, hidden ? "*" + dbName : dbName);
truncateList(list2, 100);
if (!eq(list, list2))
saveTextFile(recentlyOpenedDBsFile(), lines(list2));
}
public List loadRecentProjectsFile(File file) {
List dbNames = new ArrayList();
for (String name : tlft(loadTextFile(file))) {
String name2 = dropPrefix("*", name);
if (fileExists(newFile(databasesMotherDir(), name2)))
dbNames.add(name);
}
if (empty(dbNames))
dbNames.add(defaultDBName());
return dbNames;
}
public void setOpenDBs(Collection extends IG22LoadedDB> dbs) {
List dbNames = new ArrayList();
for (var db : dbs) {
var dbDir = conceptsDir(db.concepts());
if (sameFile(databasesMotherDir(), dirOfFile(dbDir)))
dbNames.add((db.hidden() ? "*" : "") + 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);
crud.dontDuplicateFields = litset("runOnProjectOpen", "runOrder", "runCount", "lastResultByMode");
}
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), "Import note", c.importNote, "Run on project open", c.renderRunOnProjectOpenStatus());
}
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(__50 -> linesOfCode_javaTok(__50), 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(__51 -> getLabel(__51), 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);
}
final public File projectDir() {
return dbDir();
}
public File dbDir() {
return conceptsDir(concepts);
}
final public File projectFile(String name) {
return fileInDbDir(name);
}
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 String name() {
return name;
}
public File dir() {
return dir;
}
public boolean loaded() {
return loadedDB() != null;
}
public IG22LoadedDB loadedDB_cache;
public IG22LoadedDB loadedDB() {
if (loadedDB_cache == null)
loadedDB_cache = loadedDB_load();
return loadedDB_cache;
}
public IG22LoadedDB loadedDB_load() {
return masterStuff.getLoadedDBForConceptDir(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 IterableIterator peekAllProjectsConcepts() {
var classFinder = masterStuff.makeClassFinder();
return mapI_pcall(gazelleDBs(), db -> {
var cc = newConceptsWithClassFinder(db.conceptsFile(), classFinder);
cc.loadFromDisk();
return cc;
});
}
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();
{
cleanUp(fileWatcher);
fileWatcher = null;
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public G22Variable findProjectVar(String name) {
return conceptWhereCI(concepts, G22Variable.class, "name", name);
}
public Collection projectVarNames() {
return collect("name", list(concepts, G22Variable.class));
}
public Object getProjectVar(String name) {
G22Variable var = findProjectVar(name);
return var == null ? null : var.value();
}
public Object getProjectVarOrCallScript(String name, long scriptID) {
{
var __2 = getProjectVar(name);
if (__2 != null)
return __2;
}
return callScript(scriptID);
}
public Object getProjectVarSetByScript(String name, long scriptID) {
{
var __3 = getProjectVar(name);
if (__3 != null)
return __3;
}
callScript(scriptID);
return getProjectVar(name);
}
public Object getProjectVarFromAnyProject(String name) {
for (var project : masterStuff().openProjects()) {
var __4 = project.g22utils().getProjectVar(name);
if (__4 != null)
return __4;
}
return null;
}
final public List getVarFromAnyProject(String name) {
return getProjectVarFromAllProjects(name);
}
public List getProjectVarFromAllProjects(String name) {
return nonNulls(masterStuff().openProjects(), project -> project.g22utils().getProjectVar(name));
}
public G22Variable projectVarConcept(String name) {
return optimizedUniqCI(concepts, G22Variable.class, "name", name);
}
public Object waitForProjectVar(String name) {
return waitForProjectVar(infinity(), name);
}
public Object waitForProjectVar(double timeoutSeconds, String name) {
G22Variable var = projectVarConcept(name);
return waitForCalculatedValueUsingChangeListener(timeoutSeconds, () -> var.value(), var);
}
public void setBigProjectVar(boolean persistent, String name, Object value) {
if (persistent)
setBigProjectVar(name, value);
else
setTransientProjectVar(name, value);
}
public G22Variable setProjectVar(boolean persistent, String name, Object value) {
G22Variable var = projectVarConcept(name);
if (!persistent)
var.persistent(persistent);
var.value(value);
if (persistent)
var.persistent(persistent);
return var;
}
public void unloadProjectVar(String name) {
var var = findProjectVar(name);
{
if (var != null)
var.unload();
}
}
public void setBigProjectVar(String name, Object value) {
setPersistentProjectVar(name, value);
G22Variable var = projectVarConcept(name);
var.makeBig();
}
public Object getCachedProjectVar(String name) {
var var = findProjectVar(name);
return var == null ? null : var.cachedValue();
}
public boolean isBigProjectVar(String name) {
var v = findProjectVar(name);
return v != null && v.big();
}
public void setPersistentProjectVar(String name, Object value) {
setProjectVar(true, name, value);
}
public G22Variable setTransientProjectVar(String name, Object value) {
return setProjectVar(false, name, value);
}
public void setAutoClosingProjectVar(String name, Object value) {
setTransientProjectVar(name, value).autoClose(true);
}
public void deleteProjectVar(String name) {
deleteConcept(findProjectVar(name));
}
public Object getOrCreateProjectVar(String name, IF0 maker) {
return getOrCreateProjectVar(projectVarConcept(name), maker);
}
public Object getOrCreatePersistentProjectVar(String name, IF0 maker) {
var var = projectVarConcept(name);
Object value = getOrCreateProjectVar(var, maker);
var.persistent(true);
return value;
}
public Object getOrCreateProjectVar(G22Variable var, IF0 maker) {
if (!var.has()) {
Object value = maker.get();
if (value != null)
var.setValueIfNull(value);
}
return var.get();
}
public IVarWithNotify liveProjectVar(String name) {
return liveProjectVar(name, null);
}
public IVarWithNotify liveProjectVar(String name, Object defaultValue) {
G22Variable var = projectVarConcept(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 = projectVarConcept(name);
var.persistent(false);
var.setValueIfNull(defaultValue);
return var.varValue();
}
public void replaceCloseableProjectVar(String name, IF0 extends AutoCloseable> calc) {
Object value = getProjectVar(name);
if (value instanceof AutoCloseable) {
main.close((AutoCloseable) value);
deleteProjectVar(name);
}
setTransientProjectVar(name, calc == null ? null : calc.get());
}
public void projectVarChanged(String name) {
var var = findProjectVar(name);
{
if (var != null)
var.changeInsideOfValue();
}
}
public Collection projectVarChanged(Object value) {
var vars = conceptsWhere(concepts, G22Variable.class, "value", value);
for (var var : vars) var.change();
return vars;
}
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 __5 = 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(__5);
}
});
}
public Object host() {
AutoCloseable __6 = enter();
try {
return dm_os();
} finally {
_close(__6);
}
}
public A timeFunction(String name, IF0 f) {
return functionTimings.get(name, f);
}
public boolean isConceptsDir(File dir) {
return isSameFile(conceptsDir(concepts), dir);
}
synchronized public FileWatchService fileWatcher() {
{
if (fileWatcher == null)
fileWatcher = new FileWatchService();
return fileWatcher;
}
}
synchronized public G22Utils onProjectFileChanged(IVF1 listener) {
super.onProjectFileChanged(listener);
if (!projectFileListenerInitiated) {
projectFileListenerInitiated = true;
fileWatcher().addRecursiveListener(dbDir(), __7 -> projectFileChanged(__7));
}
return this;
}
public G22ProjectInfo projectInfo_cache;
public G22ProjectInfo projectInfo() {
if (projectInfo_cache == null)
projectInfo_cache = projectInfo_load();
return projectInfo_cache;
}
public G22ProjectInfo projectInfo_load() {
return optimizedUniq(concepts, G22ProjectInfo.class);
}
public RunnablesReferenceQueue runnablesReferenceQueue() {
return masterStuff.runnablesReferenceQueue();
}
public EphemeralObjectIDs ephemeralObjectIDs() {
return masterStuff.ephemeralObjectIDs();
}
public Object eph(long id) {
return ephemeralObjectIDs().get(id);
}
public void openInBrowser(String url) {
if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE))
main.openInBrowser(url);
else {
String cmd;
if (projectInfo().useFirefox() && isOnPATH("firefox"))
cmd = "firefox";
else {
cmd = chromeCmd();
if (isRoot())
cmd += " -no-sandbox";
}
cmd += " " + platformQuote(url);
nohup(cmd);
}
}
public String compilationDate() {
return or2(compilationDateFromClassPath(this), "unknown");
}
public String projectID() {
return projectInfo().projectID();
}
public IG22LoadedDB getLoadedDB() {
return masterStuff.getLoadedDB(concepts);
}
public ConceptsComboBox galleryImagesComboBox() {
return swing(() -> new ConceptsComboBox(concepts, G22GalleryImage.class));
}
public IBackgroundProcess tempAddBackgroundProcess(String name) {
return backgroundProcessesUI == null ? null : backgroundProcessesUI.tempAdd(name);
}
public IF1 classFinder() {
return masterStuff.makeClassFinder();
}
public Object restructure(Object o) {
return unstructure(structure(o), false, concepts.classFinder);
}
public G22ProjectActions project() {
return projectActions();
}
public boolean openPathInProject(String path) {
return projectActions().openPathInProject(path);
}
final public boolean showUIURL(String url) {
return openUIURL(url);
}
public boolean openUIURL(String url) {
return projectActions().openUIURL(url);
}
public BufferedImage loadProjectImage(String fileName) {
return loadImage2(projectFile(fileName));
}
public IG22LoadedDB openDB(String name) {
return openDB(name, false);
}
public IG22LoadedDB openDB(String name, boolean hidden) {
return masterStuff().openDB(name, hidden);
}
public G22Utils getProject(String name) {
return openDB(name, true).g22utils();
}
public G22JavaObjectVisualizer visualizeObject(Object o) {
return new G22JavaObjectVisualizer(this, o);
}
transient public IF0 makeVariablesPanel;
public G22VariablesPanel makeVariablesPanel() {
return makeVariablesPanel != null ? makeVariablesPanel.get() : makeVariablesPanel_base();
}
final public G22VariablesPanel makeVariablesPanel_fallback(IF0 _f) {
return _f != null ? _f.get() : makeVariablesPanel_base();
}
public G22VariablesPanel makeVariablesPanel_base() {
return new G22VariablesPanel().g22utils(this);
}
transient public IF0 jGazelleLogo;
public JComponent jGazelleLogo() {
return jGazelleLogo != null ? jGazelleLogo.get() : jGazelleLogo_base();
}
final public JComponent jGazelleLogo_fallback(IF0 _f) {
return _f != null ? _f.get() : jGazelleLogo_base();
}
public JComponent jGazelleLogo_base() {
return main.jGazelleLogo();
}
public boolean devMode() {
return masterStuff().devMode();
}
public List list(Class type) {
return list(type, concepts());
}
public List list(Class type, Concepts cc) {
return main.list(cc, type);
}
public List list(Concepts concepts, Class type) {
return main.list(type, concepts);
}
public G22GalleryImage galleryImageForMD5(String md5) {
return firstThat(list(concepts, G22GalleryImage.class), img -> cic(fileName(img.path), md5));
}
public JComponent wrapImageSurface(ImageSurface is) {
return is == null ? null : jscroll_centered_borderless(is);
}
public JComponent wrap(Object o) {
var c = main.wrap(o);
if (c instanceof ImageSurface)
return wrapImageSurface((ImageSurface) c);
return c;
}
transient public IF0 byUser;
public String byUser() {
return byUser != null ? byUser.get() : byUser_base();
}
final public String byUser_fallback(IF0 _f) {
return _f != null ? _f.get() : byUser_base();
}
public String byUser_base() {
return "";
}
final public Collection extends IG22LoadedDB> openProjects() {
return getLoadedDBs();
}
public Collection extends IG22LoadedDB> getLoadedDBs() {
return masterStuff().openProjects();
}
public List listInOpenProjects(Class type) {
return concatMap(openProjects(), db -> db.g22utils().list(type));
}
transient public PicturesByMD5 picturesByMD5_cache;
public PicturesByMD5 picturesByMD5() {
if (picturesByMD5_cache == null)
picturesByMD5_cache = picturesByMD5_load();
return picturesByMD5_cache;
}
public PicturesByMD5 picturesByMD5_load() {
return new PicturesByMD5(projectFile("Images")).extension(".qoi");
}
}
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);
}
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 ConceptWithChangeListeners {
public transient FieldVar varPath_cache;
public FieldVar varPath() {
if (varPath_cache == null)
varPath_cache = varPath_load();
return varPath_cache;
}
public FieldVar varPath_load() {
return new FieldVar(this, "path", () -> path(), path -> path(path));
}
final public G22GalleryImage setPath(File path) {
return path(path);
}
public G22GalleryImage path(File path) {
if (!eq(this.path, path)) {
this.path = path;
change();
}
return this;
}
final public File getPath() {
return path();
}
public File path() {
return path;
}
public File path;
public String toString() {
return fileName(path);
}
public boolean imageExists() {
return fileExists(path);
}
final public BufferedImage image() {
return load();
}
final public BufferedImage getImage() {
return load();
}
public BufferedImage load() {
return loadImage2(path);
}
public File imageFile() {
return path;
}
}
static public class G22ProjectInfo extends Concept {
static final public String _fieldOrder = "projectID projectDir historicalProjectDirs useFirefox";
final public String getProjectID() {
return projectID();
}
public String projectID() {
return projectID;
}
public String projectID = aGlobalID();
public File projectDir;
public List historicalProjectDirs = new ArrayList();
final public boolean getUseFirefox() {
return useFirefox();
}
public boolean useFirefox() {
return useFirefox;
}
public boolean useFirefox = false;
public void addHistoricalProjectDir(File dir) {
if (syncSetAdd(historicalProjectDirs, dir))
change();
}
}
public interface G22ProjectActions {
public void openObjectInProject(long id);
public boolean openPathInProject(String path);
public void editProjectStory();
public void editScripts();
public void editScript(G22LeftArrowScript script);
public boolean openUIURL(String url);
public IVarWithNotify varShowCasedScript();
public G22DatabasesPanel databasesPanel();
}
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(File file) {
setImage(file);
}
public ImageSurface(MakesBufferedImage image) {
this(image != null ? image.getBufferedImage() : dummyImage());
}
public ImageSurface(BufferedImage image) {
setImage(image);
clearSurface = false;
bindToComponent(this, () -> performAutoZoom(), null);
onResize(this, () -> performAutoZoom());
onEnclosingScrollPaneResize(this, () -> performAutoZoom());
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(jMenuItemStayCheckedOnClick("Zoom to window", () -> autoZoomToDisplay, () -> setAutoZoomToDisplay(true)));
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);
}
transient public IVF3 drawBackground;
public void drawBackground(int w, int h, Graphics2D g) {
if (drawBackground != null)
drawBackground.get(w, h, g);
else
drawBackground_base(w, h, g);
}
final public void drawBackground_fallback(IVF3 _f, int w, int h, Graphics2D g) {
if (_f != null)
_f.get(w, h, g);
else
drawBackground_base(w, h, g);
}
public void drawBackground_base(int w, int h, Graphics2D g) {
g.setColor(or(getBackground(), Color.white));
g.fillRect(0, 0, w, h);
}
public void render(int w, int h, Graphics2D g) {
if (verbose)
_print("render");
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, interpolationMode);
drawBackground(w, h, g);
BufferedImage image = or(imageToDraw, this.image);
if (!hasImage())
drawBackground(w, h, g);
else {
boolean alpha = !noAlpha && hasTransparency(image);
if (alpha)
drawBackground(w, h, g);
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(cloneGraphics(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(File file) {
setFile(file);
setImage(loadImage2(file));
}
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();
});
}
private 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();
}
final public void pixelate(boolean b) {
setPixelated(b);
}
public void setPixelated(boolean b) {
assertTrue(b);
imageSurface_pixelated(this);
}
final public ImageSurface autoZoomToDisplay(boolean b) {
return setAutoZoomToDisplay(b);
}
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);
}
});
}
final public void clearTools() {
removeAllTools();
}
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 void standardZoom() {
setZoom(1.0);
}
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 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 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);
}
final public Component get() {
return getComponent();
}
public Component getComponent() {
return swing(() -> getComponentCount() == 0 ? null : getComponent(0));
}
public boolean isEmpty() {
return getComponent() == null;
}
public boolean hasComponent() {
return getComponent() != null;
}
}
static public class Rect implements WidthAndHeight, 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;
}
final public Rectangle getRectangle() {
return new Rectangle(x, y, w, h);
}
public String toString() {
return x + "," + y + " / " + w + "," + h;
}
final public int x1() {
return x;
}
final public int y1() {
return y;
}
final public int x2() {
return x + w;
}
final public int y2() {
return y + h;
}
final public boolean contains(Pt p) {
return contains(p.x, p.y);
}
final public boolean contains(int _x, int _y) {
return _x >= x && _y >= y && _x < x + w && _y < y + h;
}
final public boolean contains(Rectangle r) {
return rectContains(this, r);
}
final public boolean empty() {
return w <= 0 || h <= 0;
}
final public int getWidth() {
return w;
}
final public int getHeight() {
return h;
}
final public int area() {
return w * h;
}
final public int x() {
return x;
}
final public int y() {
return y;
}
public WidthAndHeight widthAndHeight() {
return main.widthAndHeight(w, 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(__52 -> renderValue(__52), itemToMap_inner2(a)));
}
transient public IF1 renderValue;
public Object renderValue(Object o) {
return renderValue != null ? renderValue.get(o) : renderValue_base(o);
}
final public Object renderValue_fallback(IF1 _f, Object o) {
return _f != null ? _f.get(o) : renderValue_base(o);
}
public Object renderValue_base(Object o) {
return renderForTable_noStruct(o);
}
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 onSelectionChangedAndWhenShowing(Runnable r) {
bindToComponent(table(), r);
onSelectionChanged(r);
}
public void onSelectionChangedAndNow(Runnable r) {
if (r == null)
return;
onSelectionChanged(r);
r.run();
}
public JConceptsTable updateInterval(double seconds) {
return updateInterval(toMS_int(seconds));
}
}
static abstract public class F0 {
abstract public A get();
}
static abstract public class IterableIterator implements Iterator , Iterable {
public Iterator iterator() {
return this;
}
public void remove() {
unsupportedOperation();
}
}
static public interface MakesBufferedImage extends WidthAndHeight {
public BufferedImage getBufferedImage();
public default void drawAt(Graphics2D g, int x, int y) {
g.drawImage(getBufferedImage(), x, y, null);
}
default public int getWidth() {
return getBufferedImage().getWidth();
}
default public int getHeight() {
return getBufferedImage().getHeight();
}
}
static public class G22AutoStarter extends MetaWithChangeListeners implements AutoCloseable, IFieldsToList {
public G22Utils g22utils;
public G22AutoStarter() {
}
public G22AutoStarter(G22Utils g22utils) {
this.g22utils = g22utils;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + g22utils + ")";
}
public Object[] _fieldsToList() {
return new Object[] { g22utils };
}
public transient FieldVar varEnabled_cache;
public FieldVar varEnabled() {
if (varEnabled_cache == null)
varEnabled_cache = varEnabled_load();
return varEnabled_cache;
}
public FieldVar varEnabled_load() {
return new FieldVar(this, "enabled", () -> enabled(), enabled -> enabled(enabled));
}
final public G22AutoStarter setEnabled(boolean enabled) {
return enabled(enabled);
}
public G22AutoStarter enabled(boolean enabled) {
if (!eq(this.enabled, enabled)) {
this.enabled = enabled;
change();
}
return this;
}
final public boolean getEnabled() {
return enabled();
}
public boolean enabled() {
return enabled;
}
volatile public boolean enabled = true;
public transient FieldVar varInitialDelay_cache;
public FieldVar varInitialDelay() {
if (varInitialDelay_cache == null)
varInitialDelay_cache = varInitialDelay_load();
return varInitialDelay_cache;
}
public FieldVar varInitialDelay_load() {
return new FieldVar(this, "initialDelay", () -> initialDelay(), initialDelay -> initialDelay(initialDelay));
}
final public G22AutoStarter setInitialDelay(int initialDelay) {
return initialDelay(initialDelay);
}
public G22AutoStarter initialDelay(int initialDelay) {
if (!eq(this.initialDelay, initialDelay)) {
this.initialDelay = initialDelay;
change();
}
return this;
}
final public int getInitialDelay() {
return initialDelay();
}
public int initialDelay() {
return initialDelay;
}
volatile public int initialDelay = 3;
public transient FieldVar varNScriptsRun_cache;
public FieldVar varNScriptsRun() {
if (varNScriptsRun_cache == null)
varNScriptsRun_cache = varNScriptsRun_load();
return varNScriptsRun_cache;
}
public FieldVar varNScriptsRun_load() {
return new FieldVar(this, "nScriptsRun", () -> nScriptsRun(), nScriptsRun -> nScriptsRun(nScriptsRun));
}
final public G22AutoStarter setNScriptsRun(int nScriptsRun) {
return nScriptsRun(nScriptsRun);
}
public G22AutoStarter nScriptsRun(int nScriptsRun) {
if (!eq(this.nScriptsRun, nScriptsRun)) {
this.nScriptsRun = nScriptsRun;
change();
}
return this;
}
final public int getNScriptsRun() {
return nScriptsRun();
}
public int nScriptsRun() {
return nScriptsRun;
}
volatile public int nScriptsRun;
public transient FieldVar varCurrentScript_cache;
public FieldVar varCurrentScript() {
if (varCurrentScript_cache == null)
varCurrentScript_cache = varCurrentScript_load();
return varCurrentScript_cache;
}
public FieldVar varCurrentScript_load() {
return new FieldVar(this, "currentScript", () -> currentScript(), currentScript -> currentScript(currentScript));
}
final public G22AutoStarter setCurrentScript(AutoStartScript currentScript) {
return currentScript(currentScript);
}
public G22AutoStarter currentScript(AutoStartScript currentScript) {
if (!eq(this.currentScript, currentScript)) {
this.currentScript = currentScript;
change();
}
return this;
}
final public AutoStartScript getCurrentScript() {
return currentScript();
}
public AutoStartScript currentScript() {
return currentScript;
}
volatile public AutoStartScript currentScript;
transient public Set onDone;
public G22AutoStarter onDone(Runnable r) {
onDone = createOrAddToSyncLinkedHashSet(onDone, r);
return this;
}
public G22AutoStarter removeDoneListener(Runnable r) {
main.remove(onDone, r);
return this;
}
public void fireDone() {
if (onDone != null)
for (var listener : onDone) pcallF_typed(listener);
}
public Flag started = new Flag();
public Flag waited = new Flag();
public Flag ctrlPressed = new Flag();
public List scripts = syncL();
public AutoCloseable ctrlListener;
public ReliableSingleThread rst = rst(() -> _run());
public class AutoStartScript extends RunResultWithTimestamps implements IFieldsToList {
public G22LeftArrowScript script;
public AutoStartScript() {
}
public AutoStartScript(G22LeftArrowScript script) {
this.script = script;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + script + ")";
}
public Object[] _fieldsToList() {
return new Object[] { script };
}
public void run() {
try {
LASCompileResult cr = script.compileForAutoRun();
if (cr == null)
cr = script.compileSaved();
var _cr_2 = cr;
run(() -> {
G22AutoStarter.this.change();
if (_cr_2 == null)
throw fail("Script is not saved: " + script);
var parsed = _cr_2.parsedScriptMandatory();
return parsed.get();
});
} catch (Exception __e) {
throw rethrow(__e);
}
}
}
public void init() {
if (ctrlListener != null)
return;
scripts.clear();
var scripts = conceptsWhere(g22utils.concepts, G22LeftArrowScript.class, "runOnProjectOpen", true);
var sorted = sortByCalculatedFieldAlphaNumIC(scripts, s -> s.runOrder);
for (var script : sorted) this.scripts.add(new AutoStartScript(script));
change();
ctrlListener = tempAddGlobalCtrlKeyListener(b -> {
if (b) {
ctrlPressed.raise();
cancel();
}
});
}
public void start() {
print("G22AutoStarter: Start");
if (enabled)
rst.get();
}
public void _run() {
if (!enabled)
return;
AutoCloseable __1 = g22utils.backgroundProcessesUI.tempAdd("Auto-Start Scripts");
try {
if (started.raise())
change();
if (!waited.get()) {
print("G22AutoStarter: Sleeping");
while (initialDelay > 0) {
sleepSeconds(1);
initialDelay(initialDelay - 1);
}
waited.raise();
change();
print("G22AutoStarter: Slept");
}
while (enabled && !done()) {
var script = scripts.get(nScriptsRun);
currentScript(script);
change();
script.run();
nScriptsRun(nScriptsRun + 1);
currentScript(null);
change();
}
fireDone();
change();
close();
} finally {
_close(__1);
}
}
public boolean done() {
return nScriptsRun >= l(scripts);
}
public boolean waitedAndDone() {
return waited.get() && done();
}
public void cancel() {
setEnabled(false);
}
public boolean canResume() {
return !done() && !enabled;
}
public void resume() {
if (done()) {
infoBox("Nothing to resume - auto-start is done");
return;
}
if (enabled) {
infoBox("Already running");
return;
}
infoBox("Resuming auto-start");
setEnabled(true);
rst.get();
}
public String status() {
return !enabled ? ctrlPressed.get() ? "Cancelled due to ctrl key" : "Cancelled" : done() ? "Done" : waited.get() ? "Started" : started.get() ? "Pre-start wait (" + formatDouble1(initialDelay) + "s)" : "Not started";
}
public String stats() {
return status() + ". " + scriptsRunStats();
}
public String scriptsRunStats() {
return "Scripts run: " + nScriptsRun() + "/" + l(scripts);
}
public String currentScriptStats() {
var s = currentScript;
if (s == null)
return "";
return "Running: " + s.script;
}
public void close() {
try {
if (ctrlListener != null) {
{
cleanUp(ctrlListener);
ctrlListener = null;
}
change();
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public void waitUntilDone() {
waitForVarPredicate(varNScriptsRun(), () -> done());
}
public boolean ctrlEnabled() {
return ctrlListener != null;
}
public boolean cancelled() {
return !enabled;
}
}
static public class JLeftArrowScriptIDE extends MetaWithChangeListeners implements Swingable {
final public JLeftArrowScriptIDE setLvScript(IVarWithNotify lvScript) {
return lvScript(lvScript);
}
public JLeftArrowScriptIDE lvScript(IVarWithNotify lvScript) {
this.lvScript = lvScript;
return this;
}
final public IVarWithNotify getLvScript() {
return lvScript();
}
public IVarWithNotify lvScript() {
return lvScript;
}
public IVarWithNotify lvScript = stringLiveValue();
final public JLeftArrowScriptIDE setSectionTitle(String sectionTitle) {
return sectionTitle(sectionTitle);
}
public JLeftArrowScriptIDE sectionTitle(String sectionTitle) {
this.sectionTitle = sectionTitle;
return this;
}
final public String getSectionTitle() {
return sectionTitle();
}
public String sectionTitle() {
return sectionTitle;
}
public String sectionTitle = "Left arrow script";
final public JLeftArrowScriptIDE setWithResultPanel(boolean withResultPanel) {
return withResultPanel(withResultPanel);
}
public JLeftArrowScriptIDE withResultPanel(boolean withResultPanel) {
this.withResultPanel = withResultPanel;
return this;
}
final public boolean getWithResultPanel() {
return withResultPanel();
}
public boolean withResultPanel() {
return withResultPanel;
}
public boolean withResultPanel = true;
final public JLeftArrowScriptIDE setCompileDelay(double compileDelay) {
return compileDelay(compileDelay);
}
public JLeftArrowScriptIDE compileDelay(double compileDelay) {
this.compileDelay = compileDelay;
return this;
}
final public double getCompileDelay() {
return compileDelay();
}
public double compileDelay() {
return compileDelay;
}
public double compileDelay = 0.1;
static public String helpText = "Gazelle 22 \"Left Arrow Script\"\r\n------------------------------\r\n\r\n\"Left arrow script\" is one of Gazelle 22's two scripting languages. It is the powerful one of the two. It can do anything Java can do except for defining classes or lambdas.\r\n\r\n-Usually, you write one command per line\r\n-Each command contains at most one action and at most one assignment\r\n-The language is case-sensitive\r\n-You can add comments like in Java with /* */ or //\r\n-You can write multiple commands in one line by separating them with a semicolon\r\n-Arguments to functions are separated by spaces\r\n-You can use integer and string literals like in Java\r\n-You can use true, false and null\r\n\r\nIt's called \"left arrow script\" because the left arrow (variable assignment) is its only actual operator (not counting ; and {}).\r\n\r\n\r\nOperations\r\n----------\r\n\r\nYou can call any global function defined in Gazelle. Example:\r\n\r\n infoBox \"hello\" // show a popup with the text \"hello\"\r\n \r\nYou can assign the result of a function call to a variable:\r\n\r\n time <- tsNow // get current time as a Timestamp object\r\n infoBox time // show as popup\r\n \r\nNote that this script requires 2 lines because only one operation is allowed per command.\r\n \r\nVariables can be overwritten and don't have to be declared.\r\n\r\n\r\nCreating objects\r\n----------------\r\n\r\nYou can create an instance of any Java class and call methods on the object:\r\n\r\n list <- new ArrayList\r\n list add \"hello\"\r\n list add \"world\"\r\n infoBox list // shows [hello, world]\r\n \r\n(Currently you can also say \"list <- ArrayList\", but this is ambiguous and may be removed in a future version.)\r\n \r\nYou can pass parameters to the constructor:\r\n\r\n pair <- new Pair \"hello\" \"world\"\r\n infoBox pair // shows \r\n \r\n\r\nJava operators (+, * etc)\r\n-------------------------\r\n \r\nJava operators can't be used directly but we have functions that do the same thing (if we don't, we'll add them):\r\n\r\n x <- plus 1 2\r\n infoBox x\r\n\r\n\r\nFunction definitions\r\n--------------------\r\n\r\nYou can define functions in your script, with arguments. The function can return a value (which is the result of the last command in the function).\r\n\r\n def doubleMe x { mul x 2 }\r\n\r\n x <- doubleMe 5\r\n infoBox x // shows 10\r\n";
public transient FieldVar varCompileResult_cache;
public FieldVar varCompileResult() {
if (varCompileResult_cache == null)
varCompileResult_cache = varCompileResult_load();
return varCompileResult_cache;
}
public FieldVar varCompileResult_load() {
return new FieldVar(this, "compileResult", () -> compileResult(), compileResult -> compileResult(compileResult));
}
final public JLeftArrowScriptIDE setCompileResult(LASCompileResult compileResult) {
return compileResult(compileResult);
}
public JLeftArrowScriptIDE compileResult(LASCompileResult compileResult) {
if (!eq(this.compileResult, compileResult)) {
this.compileResult = compileResult;
change();
}
return this;
}
final public LASCompileResult getCompileResult() {
return compileResult();
}
public LASCompileResult compileResult() {
return compileResult;
}
transient public LASCompileResult compileResult;
transient public RSyntaxTextAreaWithSearch taScript;
transient public RSTADummyParser dummyParser = new RSTADummyParser();
transient public Q compileQ = new Q();
final public JPanel getButtons() {
return buttons();
}
public JPanel buttons() {
return buttons;
}
transient public JPanel buttons = jline();
transient public JButton btnRun;
transient public CollapsibleLeftPanel collapsibleResultPanel;
transient public G22ScriptResultPanel resultPanel;
transient public JPopDownButton popDownButton;
transient public LeftArrowCompletionProvider completionProvider;
final public JLeftArrowScriptIDE setG22utils(G22Utils g22utils) {
return g22utils(g22utils);
}
public JLeftArrowScriptIDE 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 JLeftArrowScriptIDE setScriptTimeout(double scriptTimeout) {
return scriptTimeout(scriptTimeout);
}
public JLeftArrowScriptIDE scriptTimeout(double scriptTimeout) {
this.scriptTimeout = scriptTimeout;
return this;
}
final public double getScriptTimeout() {
return scriptTimeout();
}
public double scriptTimeout() {
return scriptTimeout;
}
public double scriptTimeout = 10.0;
final public JLeftArrowScriptIDE setShowTitle(boolean showTitle) {
return showTitle(showTitle);
}
public JLeftArrowScriptIDE showTitle(boolean showTitle) {
this.showTitle = showTitle;
return this;
}
final public boolean getShowTitle() {
return showTitle();
}
public boolean showTitle() {
return showTitle;
}
transient public boolean showTitle = true;
transient public IF0 makeParser;
public GazelleV_LeftArrowScriptParser makeParser() {
return makeParser != null ? makeParser.get() : makeParser_base();
}
final public GazelleV_LeftArrowScriptParser makeParser_fallback(IF0 _f) {
return _f != null ? _f.get() : makeParser_base();
}
public GazelleV_LeftArrowScriptParser makeParser_base() {
return g22utils.leftArrowParser();
}
public class LeftArrowCompletionProvider extends DefaultCompletionProvider {
@Override
public List getCompletionsImpl(JTextComponent comp) {
try {
String text = getText(comp);
GazelleV_LeftArrowScriptParser parser = makeParser2();
LeftArrowScriptAutoCompleter completer = new LeftArrowScriptAutoCompleter(g22utils, parser);
enableScaffolding(completer);
completer.seek(text, getCaretPosition(comp));
return map(completer.searcher().withScores(), completion -> {
BasicCompletion c = new BasicCompletion(this, completion.get());
c.setRelevance((int) completion.score());
return c;
});
} catch (Throwable e) {
printStackTrace(e);
return ll();
}
}
}
public JComponent wrapStatusLabel(JComponent lbl) {
onLeftClick(lbl, () -> {
LineAndColumn lineAndCol = compileResult == null ? null : compileResult.errorLineAndCol();
if (lineAndCol != null) {
moveCaretToLineAndCol(textArea(), lineAndCol);
focus(textArea());
}
});
popDownButton = swing(() -> new JPopDownButton("Help"));
popDownButton.onFillingMenu(menu -> addMenuItems(menu, "Show Scripting Help", runnableThread(new Runnable() {
public void run() {
try {
showTextWordWrapped("Gazelle 'Left arrow script' Help", helpText);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "showTextWordWrapped(\"Gazelle 'Left arrow script' Help\", helpText)";
}
}), "Show Global Class Names", runnableThread(new Runnable() {
public void run() {
try {
showGlobalClassNames();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "showGlobalClassNames();";
}
}), "Convert to Java", runnableThread(new Runnable() {
public void run() {
try {
convertToJava();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "convertToJava();";
}
})));
return centerAndEastWithMargin(jBorderlessHigherScrollPane(lbl), jfullcenter(buttons));
}
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() {
return swing(() -> {
taScript = g22utils.newSyntaxTextArea(__2 -> wrapStatusLabel(__2));
bindTextComponentToVarWithNotify_noInitialUndo(textArea(), lvScript);
dummyParser.install(textArea());
addKeyListener(textArea(), functionKeyListener(5, runnableThread(new Runnable() {
public void run() {
try {
runScript();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "runScript();";
}
})));
addKeyListener(textArea(), ctrlLetterKeyListener('b', runnableThread(new Runnable() {
public void run() {
try {
goToDefinition();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "goToDefinition();";
}
})));
awtCalcEvery(textArea(), compileDelay, () -> compileQ.add(new Runnable() {
public void run() {
try {
compile();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "compile();";
}
}));
installCompletionProvider(completionProvider = new LeftArrowCompletionProvider(), textArea());
JComponent vis = taScript.visualize();
if (showTitle)
vis = jCenteredSection(sectionTitle, vis);
vis = wrapSection(vis);
addAll(buttons, btnRun = toolTip("Run script (F5)", jbutton("Run", runnableThread(new Runnable() {
public void run() {
try {
runScript();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "runScript();";
}
}))), popDownButton);
if (withResultPanel) {
resultPanel = new G22ScriptResultPanel();
collapsibleResultPanel = new CollapsibleLeftPanel(false, "Output", resultPanel.visualize(), vis);
collapsibleResultPanel.sidePanelMargins = c -> withTopAndLeftMargin(c);
return collapsibleResultPanel.visualize();
} else
return vis;
});
}
transient public IF1 wrapSection;
public JComponent wrapSection(JComponent c) {
return wrapSection != null ? wrapSection.get(c) : wrapSection_base(c);
}
final public JComponent wrapSection_fallback(IF1 _f, JComponent c) {
return _f != null ? _f.get(c) : wrapSection_base(c);
}
public JComponent wrapSection_base(JComponent c) {
return c;
}
public RSyntaxTextArea textArea() {
if (taScript == null)
visualize();
return taScript.textArea();
}
public void setText(String text) {
main.setText(textArea(), text);
}
public boolean visible() {
return isShowing(textArea());
}
public void compile() {
var script = lvScript.get();
var result = compileResult;
if (result == null || !eq(result.script, script)) {
result = newCompileResult();
result.script = script;
result.makeParser = () -> makeParser();
result.compile();
compileResult(result);
showStatus(str(compileResult));
updateRunButtonState();
List errors = new ArrayList();
if (result.compileError != null) {
LineAndColumn lineAndCol = result.errorLineAndCol();
if (lineAndCol != null)
errors.add(new RSTADummyParser.Error().msg(result.errorToString()).start(lineAndCol).end(new LineAndColumn(lineAndCol.line + 1, 1)));
}
dummyParser.setErrors(result.script, errors, textArea());
}
}
public void updateRunButtonState() {
setEnabled(btnRun, runButtonShouldBeEnabled());
}
transient public IF0 runButtonShouldBeEnabled;
public boolean runButtonShouldBeEnabled() {
return runButtonShouldBeEnabled != null ? runButtonShouldBeEnabled.get() : runButtonShouldBeEnabled_base();
}
final public boolean runButtonShouldBeEnabled_fallback(IF0 _f) {
return _f != null ? _f.get() : runButtonShouldBeEnabled_base();
}
public boolean runButtonShouldBeEnabled_base() {
return compileResult != null && compileResult.runnable();
}
public LASCompileResult freshCompileResult() {
runInQAndWait(compileQ, new Runnable() {
public void run() {
try {
compile();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "compile();";
}
});
return compileResult;
}
public GazelleV_LeftArrowScript.Script parsedScript() {
return freshCompileResult().parsedScript;
}
transient public Runnable runScript;
public void runScript() {
if (runScript != null)
runScript.run();
else
runScript_base();
}
final public void runScript_fallback(Runnable _f) {
if (_f != null)
_f.run();
else
runScript_base();
}
public void runScript_base() {
var result = freshCompileResult();
if (result.parsedScript != null) {
var value = runResultWithTimestamps(() -> callCompiledObjectWithTimeout(result.parsedScript));
showScriptResult(value);
}
}
public void showScriptResult(OKOrError result) {
if (result instanceof RunResultWithTimestamps) {
if (resultPanel != null)
resultPanel.logView.setText(str(((RunResultWithTimestamps) result).printOutput()));
}
if (result.isOK()) {
setStatus(shorten(g22utils.stringify(result.get())));
var objVisualizer = new G22JavaObjectVisualizer(g22utils, result.get());
if (result instanceof RunResultWithTimestamps) {
var duration = ((RunResultWithTimestamps) result).duration();
print("duration", duration);
if (duration != null) {
long nanos = ((RunResultWithTimestamps) result).duration().toNanos();
printVars("nanos", nanos, "objVisualizer", objVisualizer);
objVisualizer.nanos(nanos);
}
}
if (collapsibleResultPanel != null)
objVisualizer.withTypeAndTime(false);
{
if (resultPanel != null)
resultPanel.scpResult.set(objVisualizer);
}
if (collapsibleResultPanel != null)
collapsibleResultPanel.sidePanelName("Output" + appendBracketed(objVisualizer.objectInfos()));
} else {
setStatus(exceptionToStringShorter_dontDropOuterExceptions(result.error()));
{
if (resultPanel != null)
resultPanel.scpResult.set(jErrorView(result.getError()));
}
}
{
if (collapsibleResultPanel != null)
collapsibleResultPanel.expand();
}
}
final public void showStatus(String status) {
setStatus(status);
}
public void setStatus(String status) {
{
if (taScript != null)
taScript.setStatus(" " + unnull(status));
}
}
public void showRuntimeError(Throwable e) {
showStatus(exceptionToStringShorter(e));
}
transient public IF0 makeVarContextForExecution;
public VarContext makeVarContextForExecution() {
return makeVarContextForExecution != null ? makeVarContextForExecution.get() : makeVarContextForExecution_base();
}
final public VarContext makeVarContextForExecution_fallback(IF0 _f) {
return _f != null ? _f.get() : makeVarContextForExecution_base();
}
public VarContext makeVarContextForExecution_base() {
return new FlexibleVarContext();
}
public Object callCompiledObjectWithTimeout(GazelleV_LeftArrowScript.Script script) {
return callCompiledObjectWithTimeout(scriptTimeout, script);
}
public Object callCompiledObjectWithTimeout(double timeoutSeconds, GazelleV_LeftArrowScript.Script script) {
return callCompiledObjectWithTimeout(timeoutSeconds, script, makeVarContextForExecution());
}
public Object callCompiledObjectWithTimeout(GazelleV_LeftArrowScript.Script script, VarContext ctx) {
return callCompiledObjectWithTimeout(scriptTimeout, script, ctx);
}
public Object callCompiledObjectWithTimeout(double timeoutSeconds, GazelleV_LeftArrowScript.Script script, VarContext ctx) {
return g22utils.evalRegisteredCode(timeoutSeconds, str(script), () -> script.get(ctx));
}
public GazelleV_LeftArrowScriptParser makeParser2() {
var parser = makeParser();
print("Function containers: " + parser.functionContainers);
return parser;
}
public void showGlobalClassNames() {
showText("Global Class Names", pnlToString(toCIMap(makeParser().globalClassNames())));
}
public void setEditable(boolean b) {
main.setEditable(textArea(), b);
}
transient public IF0 newCompileResult;
public LASCompileResult newCompileResult() {
return newCompileResult != null ? newCompileResult.get() : newCompileResult_base();
}
final public LASCompileResult newCompileResult_fallback(IF0 _f) {
return _f != null ? _f.get() : newCompileResult_base();
}
public LASCompileResult newCompileResult_base() {
return new LASCompileResult();
}
public void convertToJava() {
try {
ConvertLASToJava converter = new ConvertLASToJava();
enableScaffolding(converter);
showText("Java conversion - " + sectionTitle(), strOrNull(converter.get(parsedScript(), true)));
} catch (Throwable __e) {
infoBox(__e);
}
}
public void goToDefinition() {
String text;
int iChar;
Pair __1 = textAndCaretPosition(textArea());
text = __1.a;
iChar = __1.b;
List tok = lasTok(text);
int iTok = charToTokenIndex_left(tok, iChar);
String token = lastIdentifier(subList(tok, iTok - 2, iTok + 1));
printVars("goToDefinition", "iTok", iTok, "token", quote(token));
if (token != null) {
String name = lookupStandardFunctionOrClassNameIC(token);
if (name != null) {
String snippetID = sfOrSCSnippet(token);
if (snippetID != null) {
infoBox("Opening " + quote(name));
g22utils.openInBrowser(snippetURL(snippetID));
return;
}
}
flatInfoBox("No information found for " + token);
}
}
}
static public int concepts_internStringsLongerThan = 10;
static public ThreadLocal concepts_unlisted = new ThreadLocal();
static public boolean concepts_unlistedByDefault = true;
public interface IConceptIndex {
public void update(Concept c);
public void remove(Concept c);
}
public interface IFieldIndex {
public Collection getAll(Val val);
public List allValues();
public MultiSet allValues_multiSet();
public IterableIterator objectIterator();
}
static public class ConceptsChange {
}
static public class ConceptCreate extends ConceptsChange implements IFieldsToList {
public Concept c;
public ConceptCreate() {
}
public ConceptCreate(Concept c) {
this.c = c;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + c + ")";
}
public boolean equals(Object o) {
if (!(o instanceof ConceptCreate))
return false;
ConceptCreate __3 = (ConceptCreate) o;
return eq(c, __3.c);
}
public int hashCode() {
int h = -1751266972;
h = boostHashCombine(h, _hashCode(c));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { c };
}
}
static public class ConceptChange extends ConceptsChange implements IFieldsToList {
public Concept c;
public ConceptChange() {
}
public ConceptChange(Concept c) {
this.c = c;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + c + ")";
}
public boolean equals(Object o) {
if (!(o instanceof ConceptChange))
return false;
ConceptChange __4 = (ConceptChange) o;
return eq(c, __4.c);
}
public int hashCode() {
int h = -1760609256;
h = boostHashCombine(h, _hashCode(c));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { c };
}
}
static public class ConceptDelete extends ConceptsChange implements IFieldsToList {
static final public String _fieldOrder = "id c";
public long id;
public Concept c;
public ConceptDelete() {
}
public ConceptDelete(long id, Concept c) {
this.c = c;
this.id = id;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + id + ", " + c + ")";
}
public boolean equals(Object o) {
if (!(o instanceof ConceptDelete))
return false;
ConceptDelete __5 = (ConceptDelete) o;
return id == __5.id && eq(c, __5.c);
}
public int hashCode() {
int h = -1734431213;
h = boostHashCombine(h, _hashCode(id));
h = boostHashCombine(h, _hashCode(c));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { id, c };
}
}
static public class FullChange extends ConceptsChange implements IFieldsToList {
public FullChange() {
}
public String toString() {
return shortClassName_dropNumberPrefix(this);
}
public boolean equals(Object o) {
return o instanceof FullChange;
}
public int hashCode() {
int h = 733452095;
return h;
}
public Object[] _fieldsToList() {
return null;
}
}
static public class Concepts implements AutoCloseable {
public SortedMap concepts = synchroTreeMap();
final public long getIdCounter() {
return idCounter();
}
public long idCounter() {
return idCounter;
}
public long idCounter;
transient public HashMap perClassData;
transient public Map miscMap;
transient public String programID;
transient public File conceptsFile;
transient public Concepts parent;
transient volatile public long changes, changesWritten, lastChange;
transient volatile public java.util.Timer autoSaver;
transient volatile public boolean dontSave = false;
transient volatile public boolean savingConcepts, noXFullGrab;
transient public boolean vmBusSend = true;
transient public boolean initialSave = false;
transient public int autoSaveInterval = -1000;
transient public boolean useGZIP = true, quietSave;
transient public ReentrantLock lock = new ReentrantLock(true);
transient public ReentrantLock saverLock = new ReentrantLock(true);
transient public long lastSaveTook = -1, lastSaveWas, loadTook, uncompressedSize;
transient public float maxAutoSavePercentage = 10;
transient public List conceptIndices;
transient public Map, Map> fieldIndices;
transient public Map, Map> ciFieldIndices;
transient public List preSave;
transient public Object classFinder = _defaultClassFinder();
transient public List onAllChanged = synchroList();
transient public Set onChange = new HashSet();
transient public Object saveWrapper;
final public Concepts setModifyOnCreate(boolean modifyOnCreate) {
return modifyOnCreate(modifyOnCreate);
}
public Concepts modifyOnCreate(boolean modifyOnCreate) {
this.modifyOnCreate = modifyOnCreate;
return this;
}
final public boolean getModifyOnCreate() {
return modifyOnCreate();
}
public boolean modifyOnCreate() {
return modifyOnCreate;
}
transient public boolean modifyOnCreate = false;
transient public boolean modifyOnBackRef = false;
transient public boolean useFileLock = true;
final public Concepts setGrabThroughSocket(boolean grabThroughSocket) {
return grabThroughSocket(grabThroughSocket);
}
public Concepts grabThroughSocket(boolean grabThroughSocket) {
this.grabThroughSocket = grabThroughSocket;
return this;
}
final public boolean getGrabThroughSocket() {
return grabThroughSocket();
}
public boolean grabThroughSocket() {
return grabThroughSocket;
}
transient public boolean grabThroughSocket = true;
transient public FileBasedLock fileLock;
transient public boolean storeBaseClassesInStructure = false;
transient public boolean useBackRefsForSearches = false;
transient public boolean defunct = false;
transient public int newBackupEveryXMinutes = 60;
final public Concepts setCloseConceptsOnExit(boolean closeConceptsOnExit) {
return closeConceptsOnExit(closeConceptsOnExit);
}
public Concepts closeConceptsOnExit(boolean closeConceptsOnExit) {
this.closeConceptsOnExit = closeConceptsOnExit;
return this;
}
final public boolean getCloseConceptsOnExit() {
return closeConceptsOnExit();
}
public boolean closeConceptsOnExit() {
return closeConceptsOnExit;
}
transient public boolean closeConceptsOnExit = false;
public Concepts() {
}
public Concepts(String programID) {
this.programID = programID;
}
public Concepts(File conceptsFile) {
this.conceptsFile = conceptsFile;
}
synchronized public long internalID() {
do {
++idCounter;
} while (hasConcept(idCounter));
return idCounter;
}
synchronized public HashMap perClassData() {
if (perClassData == null)
perClassData = new HashMap();
return perClassData;
}
public void initProgramID() {
if (programID == null)
programID = getDBProgramID();
}
public Concepts load(String structure) {
return load(structure, false);
}
public Concepts load(String structure, boolean allDynamic) {
clearConcepts();
Map map = unstructureMap(structure, allDynamic, classFinder);
concepts.putAll(map);
assignConceptsToUs();
calcIdCounter();
return this;
}
public Concepts load() {
initProgramID();
Object dbGrabber = miscMapGet("dbGrabber");
if (dbGrabber != null && !isFalse(callF(dbGrabber)))
return this;
try {
if (grabThroughSocket && tryToGrab())
return this;
} catch (Throwable e) {
if (!exceptionMessageContains(e, "no xfullgrab"))
printShortException(e);
print("xfullgrab failed - loading DB of " + programID + " from disk");
}
return loadFromDisk();
}
public Concepts loadFromDisk() {
if (nempty(concepts))
clearConcepts();
long time = now();
Map _concepts = (Map) (unstructureGZFile(conceptsFile(), toIF1(classFinder)));
putAll(concepts, _concepts);
assignConceptsToUs();
loadTook = now() - time;
done("Loaded " + n2(l(concepts), "concept"), time);
calcIdCounter();
return this;
}
public Concepts loadConcepts() {
return load();
}
public boolean tryToGrab() {
if (sameSnippetID(programID, getDBProgramID()))
return false;
RemoteDB db = connectToDBOpt(programID);
try {
if (db != null) {
loadGrab(db.fullgrab());
return true;
}
return false;
} finally {
_close(db);
}
}
public Concepts loadGrab(String grab) {
clearConcepts();
DynamicObject_loading.set(true);
try {
Map map = (Map) unstructure(grab, false, classFinder);
concepts.putAll(map);
assignConceptsToUs();
for (long l : map.keySet()) idCounter = max(idCounter, l);
} finally {
DynamicObject_loading.set(null);
}
return this;
}
public void assignConceptsToUs() {
for (Pair p : mapToPairs((Map) (Map) concepts)) if (!(p.b instanceof Concept)) {
print("DROPPING non-existant concept " + p.a + ": " + dynShortName(p.b));
concepts.remove(p.a);
}
for (Concept c : values(concepts)) c._concepts = this;
for (Concept c : values(concepts)) c._doneLoading2();
}
public String progID() {
return programID == null ? getDBProgramID() : programID;
}
public Concept getConcept(String id) {
return empty(id) ? null : getConcept(parseLong(id));
}
public Concept getConcept(long id) {
return (Concept) concepts.get((long) id);
}
public Concept getConcept(RC ref) {
return ref == null ? null : getConcept(ref.longID());
}
public boolean hasConcept(long id) {
return concepts.containsKey((long) id);
}
public void deleteConcept(long id) {
Concept c = getConcept(id);
if (c == null)
print("Concept " + id + " not found");
else
c.delete();
}
public void calcIdCounter() {
Long lastID = lastKey(concepts);
idCounter = lastID == null ? 1 : lastID + 1;
}
public File conceptsDir() {
return dirOfFile(conceptsFile());
}
public Concepts conceptsFile(File conceptsFile) {
this.conceptsFile = conceptsFile;
return this;
}
public File conceptsFile() {
if (conceptsFile != null)
return conceptsFile;
return getProgramFile(programID, useGZIP ? "concepts.structure.gz" : "concepts.structure");
}
public File lockFile() {
return newFile(conceptsDir(), "concepts.lock");
}
public FileBasedLock fileLock() {
if (fileLock == null)
fileLock = new FileBasedLock(lockFile());
return fileLock;
}
public void saveConceptsIfDirty() {
saveConcepts();
}
public void save() {
saveConcepts();
}
public void saveConcepts() {
vmBus_send("saveConceptsCalled", Concepts.this);
if (dontSave)
return;
initProgramID();
saverLock.lock();
savingConcepts = true;
long start = now(), time;
try {
String s = null;
long _changes = changes;
if (_changes == changesWritten)
return;
File f = conceptsFile();
lock.lock();
long fullTime = now();
try {
if (useGZIP) {
vmBus_send("callingSaveWrapper", Concepts.this, saveWrapper);
callRunnableWithWrapper(saveWrapper, new Runnable() {
public void run() {
try {
vmBus_send("callingPreSave", Concepts.this, preSave);
callFAll(preSave);
vmBus_send("writingFile", Concepts.this, f);
uncompressedSize = saveGZStructureToFile(f, cloneMap(concepts), makeStructureData());
vmBus_send("gzFileSaved", Concepts.this, f, uncompressedSize);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "vmBus_send callingPreSave(Concepts.this, preSave);\r\n callFAll(preS...";
}
});
newFile(conceptsDir(), "concepts.structure").delete();
} else
s = fullStructure();
} finally {
lock.unlock();
}
changesWritten = _changes;
if (!useGZIP) {
time = now() - start;
if (!quietSave)
print("Saving " + toM(l(s)) + "M chars (" + time + " ms)");
start = now();
saveTextFile(f, javaTokWordWrap(s));
newFile(conceptsDir(), "concepts.structure.gz").delete();
}
File conceptsFile = conceptsFile();
File backupFile = newFile(conceptsDir(), "backups/" + fileName(conceptsFile) + ".backup" + ymd() + "-" + formatInt(hours(), 2) + (newBackupEveryXMinutes >= 60 ? "" : formatInt(roundDownTo_rev(minutes(), newBackupEveryXMinutes), 2)));
copyFile(f, backupFile);
time = now() - start;
if (!quietSave)
print("Saved " + toK(f.length()) + " K, " + n(concepts, "concepts") + " (" + time + " ms)");
lastSaveWas = fullTime;
lastSaveTook = now() - fullTime;
} finally {
savingConcepts = false;
saverLock.unlock();
}
}
public void _autoSaveConcepts() {
if (autoSaveInterval < 0 && maxAutoSavePercentage != 0) {
long pivotTime = Math.round(lastSaveWas + lastSaveTook * 100.0 / maxAutoSavePercentage);
if (now() < pivotTime) {
return;
}
}
try {
saveConcepts();
} catch (Throwable e) {
print("Concept save failed, will try again");
printStackTrace(e);
}
}
public String fullStructure() {
return structure(cloneMap(concepts), makeStructureData());
}
transient public IF0 makeStructureData;
public structure_Data makeStructureData() {
return makeStructureData != null ? makeStructureData.get() : makeStructureData_base();
}
final public structure_Data makeStructureData_fallback(IF0 _f) {
return _f != null ? _f.get() : makeStructureData_base();
}
public structure_Data makeStructureData_base() {
return finishStructureData(new structure_Data());
}
public structure_Data finishStructureData(structure_Data data) {
if (storeBaseClassesInStructure)
data.storeBaseClasses = true;
return data;
}
public void clearConcepts() {
for (Concept c : allConcepts()) c.delete();
}
public void fireLegacyChangeEvent() {
synchronized (this) {
++changes;
lastChange = sysNow();
}
if (vmBusSend)
vmBus_send("conceptsChanged", this);
pcallFAll(onAllChanged);
}
synchronized public void autoSaveConcepts() {
if (autoSaver == null) {
if (isTransient())
throw fail("Can't persist transient database");
autoSaver = doEvery_daemon("Concepts Saver for " + conceptsDir(), abs(autoSaveInterval), new Runnable() {
public void run() {
try {
_autoSaveConcepts();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "_autoSaveConcepts()";
}
});
}
}
public void close() {
cleanMeUp();
}
public void cleanMeUp() {
try {
if (closeConceptsOnExit)
closeAllOpt(allConcepts());
defunct = true;
boolean shouldSave = autoSaver != null;
if (autoSaver != null) {
autoSaver.cancel();
autoSaver = null;
}
while (savingConcepts) sleepInCleanUp(10);
if (shouldSave)
saveConceptsIfDirty();
} catch (Throwable __e) {
printStackTrace(__e);
}
{
cleanUp(fileLock);
fileLock = null;
}
}
public Map getIDsAndNames() {
Map map = new HashMap();
Map cloned = cloneMap(concepts);
for (long id : keys(cloned)) map.put(id, cloned.get(id).className);
return map;
}
public void deleteConcepts(List l) {
ping();
if (l != null)
for (Object o : cloneList(l)) if (o instanceof Long) {
Concept c = concepts.get(o);
if (c != null)
c.delete();
} else if (o instanceof Concept)
((Concept) o).delete();
else
warn("Can't delete " + getClassName(o));
}
public A conceptOfType(Class type) {
IConceptCounter counter = conceptCounterForClass(type);
if (counter != null)
return (A) first(counter.allConcepts());
return firstOfType(allConcepts(), type);
}
public List conceptsOfType(Class type) {
List l = conceptsOfType_noParent(type);
if (parent == null)
return l;
return concatLists_conservative(l, parent.conceptsOfType(type));
}
public List conceptsOfType_noParent(Class type) {
ping();
IConceptCounter counter = conceptCounterForClass(type);
if (counter != null)
return (List ) cloneList(counter.allConcepts());
return filterByType(allConcepts(), type);
}
public List listConcepts(Class type) {
return conceptsOfType(type);
}
public List list(Class type) {
return conceptsOfType(type);
}
public List list_noParent(Class type) {
return conceptsOfType_noParent(type);
}
public List list(String type) {
return conceptsOfType(type);
}
public List conceptsOfType(String type) {
return filterByDynamicType(allConcepts(), "main$" + type);
}
public boolean hasConceptOfType(Class extends Concept> type) {
return hasType(allConcepts(), type);
}
public void persistConcepts() {
loadConcepts();
autoSaveConcepts();
}
public void conceptPersistence() {
persistConcepts();
}
public Concepts persist() {
persistConcepts();
return this;
}
public void persist(Integer interval) {
if (interval != null)
autoSaveInterval = interval;
persist();
}
public