!7 sclass ServerModuleSearch extends DynCalculatedList { transient S query; transient new RestartableCountdown autoHide; void start { calculateWhenHidden = true; } JComponent visualize() { JComponent c = super.visualize(); onDoubleClickOrEnter(list, voidfunc(fS s) { thread { dm_addDynamicModuleDialog2(beforeSpace(s), true); dm_hideModule(); } }); ret c; } void update { S s = unnullTrim(dm_getInterestingString()); if (neq(s, query)) { query = s; super.update(); if (nempty(query) && nempty(results)) { dm_placeModuleUnderAIBar(this, query); dm_autoHide(autoHide); } else dm_hideModule(); } } L calc() { if (empty(query)) ret emptyList(); // L L snippets = reversed(dm_dynModulesOnServer()); ret scoredSearch_eachTerm(dm_getInterestingString(), map(snippets, func(fO snippet) -> S { fsI(getLong(snippet, 'snippetID)) + " - " + _get(snippet, 'title) })); } }