!7 sclass GeneralDefinitions extends DynModule { transient S term; transient JPanel stack; transient OptionalInputPanel inputPanel; transient S listName = generalDefinitions_listName(); JComponent visualize() { inputPanel = new OptionalInputPanel(this); stack = dynamicVStack2(); ret northCenterAndSouth( inputPanel.panel, jfullcenter(jscroll_trackWidth(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); Pair p = generalDefinitions_add(word, def); infoBox(p.b); if (p.a) 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; replaceAllComponents(stack, ll(fontSize(17, jCenteredMultiLineLabel(makeText(term = inputPanel.input()))))); } 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" + prependIfNempty("Possibly related:\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; } }