static int dm_placeModuleUnderAIBar_expiry = 4000; svoid dm_placeModuleUnderAIBar_v2(O moduleOrID, fS query) { fO module = dm_getModule(moduleOrID); fS moduleID = dm_moduleID(moduleOrID); dm_showModule_noFocus(module); swing { JTextComponent aiBar = cast getCreatorOpt('tfTopInput); Rect mr = dm_getBounds(module); if (aiBar == null || mr == null) ret; Rectangle r = getBounds(aiBar); QuickSearchPlacement p = optCastAndQuickImport(QuickSearchPlacement, dm_generalMap_get('modulesUnderAIBar)); // new query? if (p != null && !eq(p.query, query)) p = null; // too old? if (p != null && elapsedMS(p.lastAdded) > dm_placeModuleUnderAIBar_expiry) p = null; // already contained? do nothing if (p != null && contains(p.modules, moduleID)) ret; if (p == null) p = new QuickSearchPlacement; p.query = query; // place below int y = p.height; p.height += mr.h; p.modules.add(moduleID); if (p.firstAdded == 0) p.firstAdded = now(); p.lastAdded = now(); //print("dm_place: " + p + " / " + y); dm_setBounds(module, r.x, y, r.width, mr.h); dm_generalMap_put('modulesUnderAIBar, p); } }