static int awtOnConceptChanges_defaultDelay = 500; static new ThreadLocal awtOnConceptChanges_concepts; static void awtOnConceptChanges(Component component, O runnable) { awtOnConceptChanges(componentToJComponent(component), runnable, true); } static void awtOnConceptChanges(JComponent component, final O runnable, bool runOnFirstTime) { awtOnConceptChanges(component, awtOnConceptChanges_defaultDelay, 0, runnable, runOnFirstTime); } static void awtOnConceptChanges(JComponent component, int delay, final O runnable) { awtOnConceptChanges(component, delay, delay, runnable); } static void awtOnConceptChanges(JComponent component, int delay, int firstDelay, O runnable) { awtOnConceptChanges(component, delay, firstDelay, runnable, true); } sbool awtOnConceptChanges_debug; static void awtOnConceptChanges(JComponent component, int delay, int firstDelay, final O runnable, final bool runOnFirstTime) { final Concepts concepts = or(awtOnConceptChanges_concepts!, db_mainConcepts()); installTimer(component, delay, firstDelay, new Runnable { long c = runOnFirstTime ? -1 : concepts.changes; bool skip; public void run() { long _c = concepts.changes; if (awtOnConceptChanges_debug) print("awtOnConceptChanges: " + _c + " / " + c); if (skip) skip = false; else if (_c != c) { c = _c; call(runnable); skip = true; } } }); }