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 static x30_pkg.x30_util.DynamicObject;
import java.text.*;
import java.text.NumberFormat;
import java.util.TimeZone;
import java.awt.geom.*;
import java.awt.datatransfer.StringSelection;
import javax.swing.Icon;
class main {
static class JCalculatedComponent extends SingleComponentPanel implements ChangeTriggerable {
final public JCalculatedComponent setMakeComponent(IF0 makeComponent){ return makeComponent(makeComponent); }
public JCalculatedComponent makeComponent(IF0 makeComponent) { this.makeComponent = makeComponent; return this; } final public IF0 getMakeComponent(){ return makeComponent(); }
public IF0 makeComponent() { return makeComponent; }
IF0 makeComponent;
JCalculatedComponent(IF0 makeComponent) {
this.makeComponent = makeComponent;}
transient ReliableSingleThread rstMakeComponent = new ReliableSingleThread(() -> {
setComponent(makeComponent == null ? null : makeComponent.get());
});
{
bindToComponent(this, () -> {
/*if (!hasComponent())*/ rstMakeComponent.trigger();
}, null);
}
public void change() {
rstMakeComponent.trigger();
}
void reactToChangesIn(IHasChangeListeners source) {
bindHasChangeListenersToComponent(this, source, () -> change());
}
}
static void setComponent(SingleComponentPanel scp, Component c) {
setSCPComponent(scp, c);
}
static void setComponent(SingleComponentPanel scp, IF0 c) {
if (scp != null)
setComponent(scp, callF(c));
}
static A bindToComponent(
A component, Runnable onShow, Runnable onUnShow) {
{ swing(() -> {
final Var < Boolean > flag = new Var<>(false);
component.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent event) {
if (flag.get()) print("Warning: bindToComponent logic failure");
flag.set(true);
pcallF(onShow);
}
public void ancestorRemoved(AncestorEvent event) {
if (!flag.get()) print("Warning: bindToComponent logic failure");
flag.set(false);
pcallF(onUnShow);
}
public void ancestorMoved(AncestorEvent event) {
}
});
if (component.isShowing()) { // Hopefully this matches the AncestorListener logic
flag.set(true);
pcallF(onShow);
}
}); }
return component;
}
static A bindToComponent(A component, Runnable onShow) {
return bindToComponent(component, onShow, null);
}
// passing a value from onShow to onUnShow
static A bindToComponent(A component,
IF0 onShow, IVF1 onUnShow) {
Var b = new Var();
return bindToComponent(component,
() -> b.set(onShow.get()),
() -> { try { onUnShow.get(b.get()); } finally { b.set(null); } });
}
static A bindHasChangeListenersToComponent(A component, IHasChangeListeners hcl, Runnable listener) {
if (hcl != null)
bindToComponent(component,
() -> hcl.onChangeAndNow(listener),
() -> hcl.removeChangeListener(listener));
return component;
}
static void change() {
//mainConcepts.allChanged();
// safe version for now cause function is sometimes included unnecessarily (e.g. by EGDiff)
callOpt(getOptMC("mainConcepts"), "allChanged");
}
static void setSCPComponent(SingleComponentPanel scp, Component c) {
if (scp != null) scp.setComponent(c);
}
static Map> callF_cache = newDangerousWeakHashMap();
static A callF(F0 f) {
return f == null ? null : f.get();
}
static B callF(F1 f, A a) {
return f == null ? null : f.get(a);
}
static A callF(IF0 f) {
return f == null ? null : f.get();
}
static B callF(IF1 f, A a) {
return f == null ? null : f.get(a);
}
static B callF(A a, IF1 f) {
return f == null ? null : f.get(a);
}
static void callF(VF1 f, A a) {
if (f != null) f.get(a);
}
static void callF(A a, IVF1 f) {
if (f != null) f.get(a);
}
static void callF(IVF1 f, A a) {
if (f != null) f.get(a);
}
static Object callF(Runnable r) { { if (r != null) r.run(); } return null; }
static Object callF(Object f, Object... args) {
return safeCallF(f, args);
}
static Object safeCallF(Object f, Object... args) {
if (f instanceof Runnable) {
((Runnable) f).run();
return null;
}
if (f == null) return null;
Class c = f.getClass();
ArrayList methods;
synchronized(callF_cache) {
methods = callF_cache.get(c);
if (methods == null)
methods = callF_makeCache(c);
}
int n = l(methods);
if (n == 0) {
if (f instanceof String)
throw fail("Legacy call: " + f);
throw fail("No get method in " + getClassName(c));
}
if (n == 1) return invokeMethod(methods.get(0), f, args);
for (int i = 0; i < n; i++) {
Method m = methods.get(i);
if (call_checkArgs(m, args, false))
return invokeMethod(m, f, args);
}
throw fail("No matching get method in " + getClassName(c));
}
// used internally
static ArrayList callF_makeCache(Class c) {
ArrayList l = new ArrayList();
Class _c = c;
do {
for (Method m : _c.getDeclaredMethods())
if (m.getName().equals("get")) {
makeAccessible(m);
l.add(m);
}
if (!l.isEmpty()) break;
_c = _c.getSuperclass();
} while (_c != null);
callF_cache.put(c, l);
return l;
}
static Object swing(Object f) {
return swingAndWait(f);
}
static void swing(Runnable f) {
swingAndWait(f);
}
static A swing(F0 f) {
return (A) swingAndWait(f);
}
static A swing(IF0 f) {
return (A) swingAndWait(f);
}
static volatile StringBuffer local_log = new StringBuffer(); // not redirected
static boolean printAlsoToSystemOut = true;
static volatile Appendable print_log = local_log; // might be redirected, e.g. to main bot
// in bytes - will cut to half that
static volatile int print_log_max = 1024*1024;
static volatile int local_log_max = 100*1024;
static boolean print_silent = false; // total mute if set
static Object print_byThread_lock = new Object();
static volatile ThreadLocal