!7 concept RewriteExample { S in, out; } cmodule RewriteDatabase { transient CRUD rewriteExamplesCRUD; transient SingleComponentPanel scpSuggestions; transient ReliableSingleThread rstMakeSuggestions = dm_rst(me(), r makeSuggestions); start { rewriteExamplesCRUD = CRUD(RewriteExample); } visualize { JComponent c = jtabs("Rewrite Examples", centerAndSouthWithMargin( rewriteExamplesCRUD.visualize(), jCenteredSection("Suggestions", jMinHeight(100, scpSuggestions = singleComponentPanel())))); onTableSelectionChanged(rewriteExamplesCRUD.table(), rstMakeSuggestions); onConceptChangeByClass RewriteExample(rstMakeSuggestions); ret c; } void makeSuggestions { RewriteExample e = rewriteExamplesCRUD.selected(), ret if null; new L buttons; S transferred = transferCurlyBracketPhrases(e.out, e.in); if (neq(transferred, e.in)) buttons.add(jbutton("Change LHS to: " + transferred, r { cset(e, in := transferred) })); Set sharedPhrases = sharedCurlyBracketPhrases(e.in, e.out); if (nempty(sharedPhrases)) { S var = firstUnusedCountingDollarVar(e.in); for (S phrase : sharedPhrases) buttons.add(jbutton("Replace " + curly(phrase) + " with " + var, r { cset(e, in := jreplaceIC_literal(e.in, curly(phrase), var)) })); } setComponent(scpSuggestions, scrollableStackWithSpacing(buttons)); } }