!7 concept Drawing { S globalID = aGlobalID(); S name; S calStructure; } static new CirclesAndLines cal; static Canvas canvas; static Drawing drawing; sbool autoVis; p { useDBOf(#1007609); db(); substance(); swing { fixCAL(); canvas = cal.show(1000, 600); updateDrawingsMenu(); addToWindow(canvas, withMargin(jcenteredline( jbutton("New drawing", f newDrawing), jbutton("New circle...", f newCircle), jbutton("Save drawing", f saveDrawing), jbutton("PUBLISH drawing to server", f publish))); //addToWindow(canvas, withMargin(jcenteredlabel("Create connections by dragging between circles with right mouse button"))); addDrawingsList(); centerFrame(canvas); //hideConsole(); } } svoid newCircle { final JTextField text = jtextfield(); showFormTitled("New Circle", "Text", text, r-thread { loading { S theText = getTextTrim(text); double x = random(0.2, 0.8), y = random(0.2, 0.8); if (autoVis) cal.circle_autoVis(theText, x, y); else cal.circle(theText, x, y); canvas.update(); }}); } static Drawing saveDrawing() { ret saveDrawing(drawing != null ? drawing.name : ""); } static Drawing saveDrawing(S name) { if (empty(name)) { final JTextField tfName = jtextfield(name); showFormTitled("Name drawing", "Name", tfName, r { saveDrawing(or2(getTextTrim(tfName), "Untitled")); }); null; } S s = structure(cal); if (drawing == null) drawing = cnew(Drawing); setDrawing(drawing); cset(drawing, calStructure := s, +name); updateDrawingsMenu(); ret drawing; } svoid newDrawing { setCAL(new CirclesAndLines); setDrawing(null); } svoid updateDrawingsMenu { L params = ll("New drawing", f newDrawing); for (final Drawing d : reversed(list(Drawing))) addAll(params, "Load " + (nempty(d.name) ? quote(d.name) : str(d.id)) + " (made " + renderDate(d.created) + ")", r { loadDrawing(d) }); addMenu(canvas, "Drawings", toObjectArray(params)); } sS drawingName(Drawing d) { ret d == null ? "" : "[" + d.id + "] " + (nempty(d.name) ? quote(d.name) + " " : ""); } static L makeDrawingsList() { new L l; for (final Drawing d : reversed(list(Drawing))) l.add(drawingName(d) /*+ " (" + renderDate(d.created) + ")"*/); ret l; } static Drawing drawingFromList(S s) { ret getConcept(Drawing, parseFirstLong(s)); } svoid addDrawingsList { final JList list = jlist(); O load = voidfunc(S s) { loadDrawing(drawingFromList(s)) }; onDoubleClick(list, load); listPopupMenuItem(list, "Rename...", voidfunc(S s) { final Drawing d = drawingFromList(s); final JTextField tf = jtextfield(d.name); showFormTitled("Rename Drawing", "Old name", jlabel(d.name), "New name", tf, r { cset(d, name := getTextTrim(tf)); setDrawing(d); }); }); listPopupMenuItem(list, "Show structure", voidfunc(S s) { final Drawing d = drawingFromList(s); showWrappedText("Structure of drawing", d.calStructure); }); addToWindowSplitRight_aggressive(canvas, list, 0.7f); awtCalcOnConceptsChange(list, r { fillListWithStrings(list, makeDrawingsList()) }); } svoid fixCAL() { cal.imageForUserMadeNodes = whiteImage(10, 10); } svoid setCAL(CirclesAndLines cal) { main.cal = cal; fixCAL(); Canvas c = canvas; canvas = cal.makeCanvas(); awtReplaceComponent(c, canvas); //new CirclesRelater(canvas, cal); } svoid setDrawing(Drawing d) { drawing = d; setFrameTitle(canvas, drawingName(d) + " - " + programName()); } svoid loadDrawing(Drawing d) { setDrawing(d); CirclesAndLines cal = cast unstructure(d.calStructure); //cal_setAutoVis(cal); setCAL(cal); } svoid publish { final Drawing d = saveDrawing(); if (d == null) ret; thread { loading { S fullName = "Drawing " + d.globalID + " " + renderDate(now()) + " - " + or2(d.name, "Untitled"); S url = uploadToImageServer(canvas.getImage(), fullName); infoBox("Image uploaded to server! " + url); S id = createSuperHighSnippet(structure(d), fullName, 56 /*SN_AI_DRAWING*/, null, null); infoBox("Drawing uploaded. " + fsI(id)); }} }