!7 static int perPage = 8; static L guessPrograms = ll(#1008696); static SingleComponentPanel scp; static int startIndex; static new L guessModules; static ReliableSingleThread relearnThread = new(f relearn); static JComboBox cbMode; concept Sentence { S text; new SS data; } p-substance { unswing { db(); indexConceptField(Sentence, "text"); L sentences = toLinesFullTrim(loadSnippet(#1008606)); sentences = notStartingWith("\"", sentences); time { makeUniqueConcepts(Sentence, "text", sentences); } for (S id : guessPrograms) pcall { guessModules.add(runDependent(id)); } } showFrame(centerAndSouth(scp = new SingleComponentPanel, withTopMargin(20, jcenteredline( textActionButton("Mark as...", f mark), jbutton("Prev", r { makePanel(max(startIndex-perPage, 0)) }), jbutton("Next", f nextPage), jbutton("Random", r { makePanel(random(countConcepts(Sentence))/perPage*perPage) }), jbutton("All OK", r { clickButtons(findButtons(scp, "OK")); nextPage(); }), jbutton("Re-learn", r { relearnThread.trigger() }))))); setFrameSize(scp, 1000, 700); centerFrame(scp); makePanel(0); } svoid makePanel(int startIndex) { main.startIndex = startIndex; makePanel(); } svoid makePanel() { JPanel panel = gridLayoutPanel_trackWidth_evenlySpacedCols(2); panel.add(jlabel("Sentence")); panel.add(jline(cbMode = jcombobox_copySelection(cbMode, "Subject", "Verb"))); //onChange(cbMode, f makePanel); for (final Sentence s : takeFirst(perPage, dropFirst(startIndex, list(Sentence)))) { final JTextField tfText = jtextfield_caretLeft(s.text); tfText.setCaret(new DefaultCaret { @Override public void setSelectionVisible(boolean visible) { super.setSelectionVisible(true); } }); panel.add(tfText); final JTextField tf = jtextfield_caretLeft(dataMapToString(s.data)); final JTextField tfGuess = jtextfield_caretLeft(dataMapToString(makeGuess(s.text))); final new Var reviseBtn, okBtn; okBtn.set(jbutton("OK", r { pcall-messagebox { cset(s, data := dataMapFromString(getTextTrim(tf))); disableTextField(tf); replaceComponent(okBtn!, reviseBtn!); relearnThread.trigger(); } })); reviseBtn.set(jbutton("Revise", r { cset(s, data := new HashMap); enableTextField(tf); replaceComponent(reviseBtn!, okBtn!); })); bool hasData = nempty(s.data); if (hasData) disableTextField(tf); panel.add(vstack( centerAndEast(withLabel("Saved:", tf), hasData ? reviseBtn! : okBtn!), centerAndEast(withLabel("Guess:", tfGuess), jbutton("OK")), )); /*onCaret(tfText, r { if ((verbMode() ? s.verb : s.action) == null) { S a; IntRange r = textComponentSelection(tfText); if (verbMode()) a = ai_makeVerbAction(s.text, ll(r)); else a = ai_makeSubjectAction(s.text, r); if (a != null) tf.setText(a); } });*/ } scp.setComponent(jscroll(panel)); } svoid relearn { for (O guessModule : guessModules) pcall { callMain(guessModule); } swing { makePanel(); } } svoid nextPage { if (startIndex+perPage < countConcepts(Sentence)) makePanel(startIndex+perPage); } sbool verbMode() { ret cbMode.getSelectedIndex() > 0; } static S dataMapToString(SS data) { ret join(". ", mapMapToList(data, func(S a, S b) { a + "=" + b })); } static SS dataMapFromString(S input) { new SS data; for (S s : trimAll(splitByJavaToken(input, "."))) { L tok = javaTok(s); if (eq(get(tok, 3), "=")) data.put(tok.get(1), join(subList(tok, 5))); } ret data; } static SS makeGuess(S sentence) { new SS data; for (O guessModule : guessModules) pcall(guessModule, "callGuesser", get(guessModule, "best"), sentence, data); ret data; } svoid mark(JTextComponent c) { final IntRange r = textComponentSelection(c); fS selection = c.getSelectedText(); fS text = c.getText(); final JTextField tf = jtextfield("verb etc"); showFormTitled("Mark sentence part", "Text", selection + " (" + r.start + "/" + r.length() + ")", "Mark as", tf, func { pcall-infobox { S as = getTextTrim(tf); assertIsIdentifier(as); Sentence s = findConcept(Sentence, +text); s.data.set(as, ai_renderAction(text, r)); s.change(); relearnThread.trigger(); null; } false; }); }