abstract sclass DynQuickSearch extends DynCalculatedList { transient S query; transient new RestartableCountdown autoHide; transient S moduleDescForSearch; transient O[] quickSearchParams; start { calculateWhenHidden = true; ownResource(vmBus_onMessage('topInput, voidfunc(S s) { doSearch(s) })); ownResource(vmBus_onMessage('topInputChanged, voidfunc(S s) { if (neq(s, query)) doSearch(s) })); ownResource(vmBus_onMessage('hideQuickSearchModules, rEnter dm_hideModule); } void doSearch(S s) enter { if (dm_osLoading() || dm_dontQuickSearch(s)) ret; query = s; O qsm = dm_quickSearchManager(); if (qsm != null && !dm_isMe(qsm)) { results = calc(); dm_call(qsm, 'setResultsForModule, dm_moduleID(), moduleDescForSearch, query, results, quickSearchParams); } else { super.update(); if (nempty(query) && nempty(results)) { dm_placeModuleUnderAIBar(this, query); dm_autoHide(autoHide); } else dm_hideModule(); } } final L calc() { if (empty(query)) ret emptyList(); ret calc_impl(); } abstract LS calc_impl(); void enhanceFrame(Container f) { super.enhanceFrame(f); setClosable(f, false); internalFramePopupMenuItem(f, "Delete", rThread { dm_deleteModuleInBackground(module()) }); } // API void selectFirstEntry() { selectRow(list, 0); } }