abstract sclass DynQuickSearch extends DynCalculatedList { transient S query; transient new RestartableCountdown autoHide; 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) { temp enter(); if (dm_osLoading()) ret; query = s; 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); } // API void selectFirstEntry() { selectRow(list, 0); } }