Here's a first crack at a summary of the "atoms" for diagram editing. Basically a hand-edited list of commands from the menu of the tool, arranged in left-to-right order. The interesting (weird) stuff is further down (lines, nodes, selection, phantom, etc). Don't be surprised if you need to ask for elaboration (I barely recognize some of this stuff) :-). All drawing command atoms were on the menu. Clearly, drawing a diagram through a drop-down menu is the worst possible UX, but the menu was good for reminding one of available commands, esp. the ones used most infrequently, a la emacs. Forcing ourselves to put *every* atomic command on the menu was a design cross-check, "did we find all of the atoms, are the atoms atomic enough?". The atoms were bound to keys, gestures and mouse actions via a startup dot-file. In emacs fashion this was implemented in CL, one could create scripts using atomic actions and bind those scripts to keys, gestures and mouse actions. At this point, after building many not-so-good diagram editors, we began to realize that we simply needed to draw free-form diagrams and remove any "semantics checking" from the editor - the editor didn't know anything about the base data structures (e.g. components, ports, flows) that we wanted to deal with in the end. The menu summarized, here, contains some recognizable shapes, but these were "scripts" (palettes of pre-constructed handy shapes) built up from atoms, read in from a dot-file file at startup. We used the tool to construct these shapes, then saved them into the dot-file). Any actual coordinates contained in the dot-file were "relative" to the origin of each of the diagram scripts. (I'll add to the confusion by posting a factbase of a sample component in another post). The editor produced a "fact base" (aka prolog-like assertions, aka design recovery) of points, lines, text, etc. The fact base would be passed through a series of prolog-like inferencing rules to parse and build up semantic information. (Again, see https://github.com/guitarvydas/vsh/tree/master/cl-vsh for the simplest variation on this theme that I've been able to come up with). Point and mark were renamed to cursor and mark. Nodes (iirc) are actual points on a shape (i.e. endpoints of lines). Controls were points that were used to control the shape of curves (the tool was also used to build state diagrams). Note that there are atomic commands for controlling rubber-banding, phantoms (the "ghost" images displayed when rubber-banding, moving, etc), selection, movement, hit-testing, grouping, etc. Since the diagram editor was not allowed to understand the notion of "objects", hit-testing was done at an atomic level - a node or a line. When you hovered the cursor (via keyboard or mouse) over a set of atomic objects, the editor would display a gray highlight over the "top", to-be-selected, atom (iirc, this idea comes from "The Humane Interface", J. Raskin). If you performed the "select" command, the "top" atom would become selected. In the - likely - case that many atoms intersected at one point on the screen (e.g. a node, an end-point of a line, an end-point of another line, etc), you could scroll through the atoms by using the roll-hits command(s), making each successive atom the "top" one (aka "to-be-selected"). You can see that there exists a plethora of "select" commands for the various cases of interest, e.g. select all atoms underneath the cursor, select only the "top" atom, select all atoms and their relatives (e.g. every line underneath the cursor along with every node intersecting with those lines, etc), select all atoms contained within the "group" underneath the cursor and so on. Movement was related to selection. If you wanted to move a "component" - drawn as four lines - you could select each node (endpoint) separately (very tedious) and then move the whole selection, or, you could select a node and all of its relatives, or, you could "group" the atoms making up the component and select the group, and so on. [Early versions of "undo" produced rather humourous results. E.G. a move of all of the atoms making up a component would be recorded as a separate move of each atom. Multiple undo's were required to restore the component to its original position - undo the move to the top-left node, undo the move to the top-right node, and so on.] [credit: much of the atomization work was performed by John Shuve.] I'd be glad to discuss and explain further. I'll just bs if I can't actually remember nor lookup in code. pt help-menu "Help" "VF Reference" "About Visual Frameworks..." new-window-menu "New Window" "Component Editor" "Text Editor" "Instance Tree" "Component Palette" "Application Variant" window-menu "Windows" "Next Window" "Previous Window" "Duplicate Window" new-window-menu "[window list]" menu-11 buffers-menu "Buffers" "Next in History" "Previous in History" "History" "[buffer list]" "Close" buffer-close "Other" other-buffer menu-return-buffer-list buffer-select build-menu "Build" "Compile" "Compile All" "Download..." resize-menu "Resize" "Expand W" "Shrink W" "Expand N" "Shrink N" "Expand E" "Shrink E" "Expand S" "Shrink S" set-resize-menu "Set Resizing" "Left..." "Top..." "Right..." "Bottom..." groups "Groups" "Group Selected" group-selected-objects "Ungroup Selected" ungroup-selected-objects resize-menu set-resize-menu text "Text" "Create Text" new-text-block "Create Hyperlink" new-hyperlink-icon "Create Code" new-code-icon "Edit In-Place" unimplemented "Edit In Recent Text Editor" edit-text-at-cursor-in-MRU-editor "Edit In New Text Editor" edit-text-at-cursor-in-new-editor "Associate as Comment" "Follow Link" "Follow Link In Recent Window" "Follow Link In This Window" "Follow Link In New Window" "Single Line" text-single-line "Multi-Line" text-multi-line text-size-menu text-font-menu text-style-menu text-justification-menu text-anchor-menu text-pad-menu text-fore-color-menu text-back-color-menu text-lock-menu text-pad-menu "Pad For Anchor" "Left..." text-pad-left "Top..." text-pad-top "Right..." text-pad-right "Bottom..." text-pad-bottom text-lock-menu "Lock Text" "Lock" text-lock "Unlock" text-unlock text-fore-color-menu "Text Color" "Black" text-fore-color-black "White" text-fore-color-white "% Red..." text-fore-color-p-red "% Green..." text-fore-color-p-green "% Blue..." text-fore-color-p-blue text-back-color-menu "Background Color" "Transparent" text-back-color-transparent "White" text-back-color-white "Black" text-back-color-black "% Red..." text-back-color-p-red "% Green..." text-back-color-p-green "% Blue..." text-back-color-p-blue text-size-menu "Size" "8pt" text-size-8pt "10pt" text-size-10pt "12pt" text-size-12pt "14pt" text-size-14pt "18pt" text-size-18pt "24pt" text-size-24pt "36pt" text-size-36pt "48pt" text-size-48pt "72pt" text-size-72pt "Other..." text-size-other text-font-menu "Font" "Helvetica" text-font-helvetica "Times" text-font-times "Courier" text-font-courier text-style-menu "Styles" "Bold" text-style-bold "Not Bold" text-style-not-bold "Italic" text-style-italic "Not Italic" text-style-not-italic text-justification-menu "Justification" "Left" text-justification-left "Center" text-justification-center "Right" text-justification-right text-anchor-menu "Anchor" "Center" text-anchor-center "W" text-anchor-w "NW" text-anchor-nw "N" text-anchor-n "NE" text-anchor-ne "E" text-anchor-e "SE" text-anchor-se "S" text-anchor-s "SW" text-anchor-sw "W Base" text-anchor-w-base "Center Base" text-anchor-center-base "E Base" text-anchor-e-base lines "Lines" "New Line Mark to Cursor" new-line-segment "Extend Line Mark to Cursor" extend-line-segment "Split" line-split "Merge" unimplemented "Merge Collinear Segements" "New Ellipse Mark To Cursor" new-ellipse line-width-menu line-pattern-menu line-shape-menu line-arrow-menu line-fore-color-menu line-back-color-menu line-fore-color-menu "Line Color" "Black" line-fore-color-black "White" line-fore-color-white "% Red..." line-fore-color-p-red "% Green..." line-fore-color-p-green "% Blue..." line-fore-color-p-blue line-back-color-menu "Fill Color" "Transparent" line-back-color-transparent "White" line-back-color-white "Black" line-back-color-black "% Red..." line-back-color-p-red "% Green..." line-back-color-p-green "% Blue..." line-back-color-p-blue line-width-menu "Width" "Hairline" line-width-hairline "1pt" line-width-1pt "2pt" line-width-2pt "3pt" line-width-3pt "4pt" line-width-4pt "6pt" line-width-6pt "8pt" line-width-8pt "10pt" line-width-10pt "Other..." line-width-other line-pattern-menu "Style" "Solid" line-pattern-solid "Dashed" line-pattern-dashed "Dotted" line-pattern-dotted "Mitered Joints" line-style-mitered-joints "Rounded Joints" line-style-rounded-joints line-shape-menu "Shape" "Straight" line-shape-straight "Curved" line-shape-curved "Rounded" line-shape-rounded "Line" line-shape-not-polygon "Polygon" line-shape-polygon line-arrow-menu "Arrows" "Start Arrow" line-arrow-initial "No Start Arrow" line-arrow-not-initial "End Arrow" line-arrow-final "No End Arrow" line-arrow-not-final nodes "Nodes and Control Points" "Add At Cursor" add-control-at-cursor "Delete Selected" delete-selected-nodes-and-controls "Add Dot To Selected" add-dot-to-selected-nodes "Delete Selected Dots" delete-dots-from-selected-nodes "Show at show-nodes-or-controls-at-cursor "Show in Region" show-nodes-or-controls-in-region "Show All" show-all-nodes-or-controls "Hide at Cursor" hide-nodes-or-controls-at-cursor "Hide in Region" hide-nodes-or-controls-in-region "Hide All" hide-all-nodes-or-controls state-shapes "State Diagram Shapes" "Simple State" state-create-simple-state-at-cursor "Container State" "Selector" "Entry Point" "Terminal" schematic-shapes "Schematic Diagram Shapes" "Input Port - Left" "Input Port - Right" "Output Port - Left" "Output Port - Right" "Named Net Source" "Input Pin - Left" "Input Pin - Right" "Output Pin - Left" "Output Pin - Right" "Standard Pinless Component" "Component Outline Shapes" "Input Pin - Left" "Input Pin - Right" "Output Pin - Left" "Output Pin - Right" "Standard Pinless Component" other-templates "Other Shapes" objects-menu "Objects" outline-shapes schematic-shapes state-shapes other-templates "Import Component..." "Export Component..." "Export Component Using Defaults" "Synchronize Components" "Reload From File" "Overwrite File" "Check Against File" "Reload Selection" "Reload All" properties-menu "Properties" "Set Name..." properties-set-name "Set Type..." properties-set-type global-properties-menu "Global Properties" "Set Name..." global-properties-set-name "Set Type..." global-properties-set-type move-menu "Move Selection" move-phantom-menu "By Mark To Cursor" move-selection-by-m2c "By Cursor To Mark" move-selection-by-c2m "To Phantom" move-selection-to-phantom "Page Up" "Page Down" "Page Left" "Page Right" "Grid Up" "Grid Down" "Grid Left" "Grid Right" "Up" "Down" "Left" "Right" move-selection-cursor-menu "Anchor To Cursor" "Origin" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-selection-mark-menu "Anchor To Mark" "Origin" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-selection-drawing-menu "Origin To Drawing" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-selection-viewport-menu "Origin To Viewport" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-phantom-menu "Move Phantom" "Reset Phantom" move-phantom-to-selection "By Mark To Cursor" move-phantom-by-m2c "By Cursor To Mark" move-phantom-by-c2m "Page Up" "Page Down" "Page Left" "Page Right" "Grid Up" "Grid Down" "Grid Left" "Grid Right" "Up" "Down" "Left" "Right" move-phantom-cursor-menu "Anchor To Cursor" "Origin" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-phantom-mark-menu "Anchor To Mark" "Origin" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-phantom-drawing-menu "Origin To Drawing" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" move-phantom-viewport-menu "Origin To Viewport" "Center" "NW" "N" "NE" "E" "SE" "S" "SW" "W" zoom-menu "Zoom" "Zoom In" zoom-in "Zoom Out" zoom-out "Zoom 1:1" zoom-one-to-one "Zoom All" zoom-all "Zoom to Region" zoom-region pan-menu "Pan" "Center on Cursor" pan-center-on-cursor "Page Up" pan-page-up "Page Down" pan-page-down "Page Left" pan-page-left "Page Right" pan-page-right "Up" pan-up "Down" pan-down "Left" pan-left "Right" pan-right pan-to-drawing-menu "Pan To Drawing" "Center" pan-to-center "NW" pan-to-nw "N" pan-to-n "NE" pan-to-ne "E" pan-to-e "SE" pan-to-se "S" pan-to-s "SW" pan-to-sw "W" pan-to-w pan-to-viewport-menu "Pan To Viewport" "Center" pan-to-center "NW" pan-to-nw "N" pan-to-n "NE" pan-to-ne "E" pan-to-e "SE" pan-to-se "S" pan-to-s "SW" pan-to-sw "W" pan-to-w selection-menu "Select" "Select All At Cursor" select-all-objects-at-cursor-and-maintain-connections "Select All At Cursor And Break" select-all-objects-at-cursor-and-ignore-connections "Select Current At Cursor" select-current-object-at-cursor-and-maintain-connections "Select Current At Cursor And Break" select-current-object-at-cursor-and-ignore-connections "Select In Region" select-objects-in-region "Select All" select-all "Deselect All At Cursor" deselect-all-objects-at-cursor-and-maintain-connections "Deselect All At Cursor And Break" deselect-all-objects-at-cursor-and-ignore-connections "Deselect Current At Cursor" deselect-current-object-at-cursor-and-maintain-connections "Deselect Current At Cursor And Break" deselect-current-object-at-cursor-and-ignore-connections "Deselect In Region" select-objects-in-region "Deselect All" deselect-all "Set Selection Origin At Cursor" set-selection-origin-at-cursor "Clear Selection Origin" clear-selection-origin "Push Selection" push-selection "Pop Selection" pop-selection "Roll Selection Forward" roll-selection-forward "Roll Selection Backward" roll-selection-backward "Whole Wire Selection" :selected nil "Intersecting Marquee" inclusive-marquee-select :retract-callback 'menu-inclusive-marquee-retract :selected t "Visible Selection" visible-selection-select :retract-callback 'menu-visible-selection-retract :selected t :popup-callback 'menu-indicate-wholewire-intersectingmarquee-visibleselection :interaction :multiple-selection cursor-menu "Cursor" "Set Mark At Cursor" set-mark-at-cursor "Set Cursor At Mark" set-cursor-at-mark "Exchange Cursor And Mark" exchange-cursor-and-mark "Roll Hits Forward" next-in-hit-stack "Roll Hits Backward" previous-in-hit-stack "Push Mark" push-mark "Pop Mark" pop-mark "Roll Mark Forward" roll-mark-forward "Roll Mark Backward" roll-mark-backward cursor-move-menu "Move Cursor" "Page Up" cursor-page-up "Page Down" cursor-page-down "Page Left" cursor-page-left "Page Right" cursor-page-right "Grid Up" cursor-up "Grid Down" cursor-down "Grid Left" cursor-left "Grid Right" cursor-right "Up" cursor-up "Down" cursor-down "Left" cursor-left "Right" cursor-right cursor-move-to-drawing-menu cursor-move-to-viewport-menu cursor-move-to-drawing-menu "Move To Drawing" "Center" move-cursor-to-drawing-center "NW" move-cursor-to-drawing-nw "N" move-cursor-to-drawing-n "NE" move-cursor-to-drawing-ne "E" move-cursor-to-drawing-e "SE" move-cursor-to-drawing-se "S" move-cursor-to-drawing-s "SW" move-cursor-to-drawing-sw "W" move-cursor-to-drawing-w cursor-move-to-viewport-menu "Move To Viewport" "Center" move-cursor-to-viewport-center "NW" move-cursor-to-viewport-nw "N" move-cursor-to-viewport-n "NE" move-cursor-to-viewport-ne "E" move-cursor-to-viewport-e "SE" move-cursor-to-viewport-se "S" move-cursor-to-viewport-s "SW" move-cursor-to-viewport-sw "W" move-cursor-to-viewport-w mark-move-menu "Move Mark" "Page mark-page-up "Page Down" mark-page-down "Page Left" mark-page-left "Page Right" mark-page-right "Grid Up" mark-up "Grid Down" mark-down "Grid Left" mark-left "Grid Right" mark-right "Up" mark-up "Down" mark-down "Left" mark-left "Right" mark-right mark-move-to-drawing-menu "Move To Drawing" "Center" move-mark-to-drawing-center "NW" move-mark-to-drawing-nw "N" move-mark-to-drawing-n "NE" move-mark-to-drawing-ne "E" move-mark-to-drawing-e "SE" move-mark-to-drawing-se "S" move-mark-to-drawing-s "SW" move-mark-to-drawing-sw "W" move-mark-to-drawing-w mark-move-to-viewport-menu "Move To Viewport" "Center" move-mark-to-viewport-center "NW" move-mark-to-viewport-nw "N" move-mark-to-viewport-n "NE" move-mark-to-viewport-ne "E" move-mark-to-viewport-e "SE" move-mark-to-viewport-se "S" move-mark-to-viewport-s "SW" move-mark-to-viewport-sw "W" move-mark-to-viewport-w show-layer-menu "Show Layers" "Base" "Pin Types" "[more layers]" active-layer-menu "Active Layer" "Base" "Pin Types" "[more layers]" view-sheet "View Sheet" :items-function 'menu-return-sheet-list :popup-callback 'menu-indicate-current-sheet-in-sheet-list sheet-list-select :retract-callback 'menu-sheet-list-retract :interaction :single-selection view-menu "View" :component view-sheet "New Sheet" create-new-sheet "Rename Current Sheet" edit-sheet-name "Destroy Current Sheet" destroy-current-sheet active-layer-menu show-layer-menu "New Layer" "Layer Properties" "Destroy Layer" "Instance Tree" "Rubber Band" rubber-band-select :retract-callback 'menu-rubber-band-retract "Marquee" marquee-select :retract-callback 'menu-marquee-retract "Active Mouse UI" active-mouse-select :retract-callback 'menu-active-mouse-retract :popup-callback 'menu-indicate-rubberband-marquee-activemouse replace-menu "Replace" "Text..." "Buffer..." "Buffer Deeply..." "All Buffers..." "Project..." search-menu "Search" "Incremental..." "Text..." "Buffer..." "Buffer Deeply..." "All Buffers..." "Project..." edit-menu "Edit" "Undo" edit-undo "Redo" edit-redo "Cut" edit-cut "Copy" edit-copy "Paste" edit-paste "Delete" edit-delete "Select All" select-all "Deselect All" deselect-all "Set Clipboard Origin At Cursor" set-clipboard-origin-at-cursor "Clear Clipboard Origin" clear-clipboard-origin "Schematic Mode" schematic-mode "State Machine Mode" state-machine-mode "Code Part Mode" code-part-mode "DWG Mode" drawing-mode "Base Mode" base-mode "Re-Paste Forward" "Re-Paste Backward" "Roll Clipboard Forward" "Roll Clipboard Backward" "Next Item" "Previous Item" search-menu replace-menu text-mru-menu "Recent Text Files" "[MRU file list]" workspace-mru-menu "Recent Workspace Files" "[MRU file list]" variant-mru-menu "Recent Variant Files" "[MRU file list]" project-mru-menu "Recent Project Files" "[MRU file list]" palette-mru-menu "Recent Palette Files" "[MRU file list]" graphics-mru-menu "Recent Graphic Files" "[MRU file list]" component-mru-menu "Recent Component Files" "[MRU file list]" open-item-menu-1 "Open Buffer" "Component Outline..." open-component-outline "Component Implementation..." open-component-implementation "Graphics Only..." open-graphics-only new-item-menu-1 "New Buffer" "Outline Only" new-component-outline "Schematic Diagram" "State Diagram" "Variant Socket" "Graphics Only" new-graphics-only file-menu "File" new-item-menu-1 open-item-menu-1 "Save Buffer" save-buffer "Save Buffer As ..." save-buffer-as "Import VF Template..." import-template "Import VF File..." "Print" print