!7 concept Drawing { S globalID = aGlobalID(); S name; S calStructure; } static new CirclesAndLines cal; static Canvas canvas; p { db(); substance(); swing { canvas = cal.show(800, 600); new CirclesRelater(canvas, cal); updateDrawingsMenu(); addToWindow(canvas, withMargin(jcenteredline( jbutton("New Circle...", f newCircle), jbutton("Save drawing", f saveDrawing), jbutton("PUBLISH drawing to server", f publish))); } } svoid newCircle { final JTextField text = jtextfield(); showFormTitled("New Circle", "Text", text, r-thread { cal.circle_autoVis(getTextTrim(text), random(0.2, 0.8), random(0.2, 0.8)); canvas.update(); }); } static Drawing saveDrawing() { S s = structure(cal); Drawing d = cnew(Drawing, calStructure := s); infoBox("Drawing saved. ID: " + d.id + ", " + lUtf8(quote(s)) + " bytes"); updateDrawingsMenu(); ret d; } svoid newDrawing { setCAL(new CirclesAndLines); } svoid updateDrawingsMenu { L params = ll("New drawing", f newDrawing); for (final Drawing d) addAll(params, "Load drawing " + d.id + " (made " + renderDate(d.created) + ")", r { loadDrawing(d) }); addMenu(canvas, "Drawings", toObjectArray(params)); } svoid setCAL(CirclesAndLines cal) { main.cal = cal; Canvas c = canvas; canvas = cal.makeCanvas(); awtReplaceComponent(c, canvas); } svoid loadDrawing(Drawing d) { setCAL((CirclesAndLines) unstructure(d.calStructure)); } svoid publish { fS globalID = aGlobalID(); final JTextField tfName = jtextfield(); showFormTitled("Publish drawing to server?", "Global ID" := globalID, "Name" := tfName, r-thread { loading { Drawing d = saveDrawing(); S name = getTextTrim(tfName); cset(d, +globalID, +name); S fullName = "Drawing " + globalID + " " + renderDate(now()) + " - " + or2(name, "Untitled"); S url = uploadToImageServer(canvas.getImage(), fullName); infoBox("Uploaded to server! " + url); createSuperHighSnippet(structure(d), fullName, 56 /*SN_AI_DRAWING*/); }}); }