!7 abstract !include #1016674 // Module List module LoadedModuleSearch > ModuleList { 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); } visualize { JComponent c = super.visualize(); onDoubleClickOrEnter(list, r dm_hideQuickSearchModules); ret c; } void doSearch(S s) enter { if (dm_osLoading() || dm_dontQuickSearch(s)) ret; query = s; super.update(); if (nempty(query) && nempty(results)) { if (dm_placeModuleUnderAIBar(this, query)) { dm_showYesToAcceptPopupWithParams(list, imageID := #1101462, height := 247/2, mover := voidfunc(Component c, Component popup) { JList list = cast c; Rect r = boundsInParent(c, dm_desktopPane()); Rect item = jlist_itemBounds(list, 0); setLocation(popup, item.x1()-popup.getWidth(), item.y+r.y); }); } dm_autoHide(autoHide); } else dm_hideModule(); } L modulesToList() { if (empty(query)) ret emptyList(); L modules = super.modulesToList(); L results = scoredSearch_eachTerm(dm_getInterestingString(), map(modules, func(fO m) -> S { "[" + dm_moduleID(m) + "] " + pcallF(func -> S { dm_moduleName(m) }) + " / " + shortClassName(m) + " / " + getProgramID(m) })); ret map(results, func(S s) -> O { dm_getModule(leadingSquareBracketStuff(s)) }); } void selectFirstEntry() { selectRow(list, 0); } void enhanceFrame(Container f) { super.enhanceFrame(f); setClosable(f, false); } }