!7 sclass GeneralDefinitions extends DynModule { transient S term; transient JPanel stack; transient OptionalInputPanel inputPanel; transient S listName = "General definitions (long list)"; JComponent visualize() { inputPanel = new OptionalInputPanel(this); stack = dynamicVStack2(); ret northCenterAndSouth( inputPanel.panel, stack, withMargin(jcenteredbuttons("Add definition...", r { fS t = term; final JTextField tfWord = jtextfield(t), tfDefinition = jtextfield(); showFormTitled("Add Definition", "Word/Phrase:", tfWord, "Definition:", tfDefinition, r { S word = gtt(tfWord), def = gtt(tfDefinition); if (nempty(word) && nempty(def)) { addToMechMap(listName, litmap(word, def)); infoBox("Definition added: " + word + " = " + def); updateMe(); } }); requestFocus(tfDefinition); }, "All definitions", r { showText("All definitions", ai_renderDefinitions( values(mechMultiMapPairsCI(listName)), values(mechMultiMapPairsCI("Unauthorized Appends | " + listName)))) }))); } void update { if (stack == null) ret; S s = inputPanel.input(); term = s; S text = makeText(s); replaceAllComponents(stack, ll(fontSize(17, jCenteredMultiLineLabel(text)))); } S makeText(fS query) { if (empty(query)) ret ""; MultiMap> map = mechMultiMapPairsCI(listName); L> answers = map.get(query); MultiMap> map2 = mechMultiMapPairsCI("Unauthorized Appends | " + listName); L> answers2 = map2.get(query); S text = trim(ai_renderDefinitions(answers, answers2) + "\n" + lines(concatLists( scoredSearch(query, map(func(Pair p) { ai_renderDefinition(p.a, p.b, false) }, listMinusSet(values(map), answers))), scoredSearch(query, map(func(Pair p) { ai_renderDefinition(p.a, p.b, true) }, listMinusSet(values(map2), answers2)))))); ret empty(text) ? "No definitions found for " + quote(query) : text; } }