Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / Editor.java
index 36dcbc7..90baafb 100644 (file)
@@ -1,25 +1,32 @@
 package net.mograsim.logic.model.editor;
 
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
 import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
 
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.mograsim.logic.model.am2900.Am2900Loader;
 import net.mograsim.logic.model.editor.handles.ComponentHandle;
 import net.mograsim.logic.model.editor.handles.Handle;
 import net.mograsim.logic.model.editor.handles.HandleManager;
 import net.mograsim.logic.model.editor.handles.PinHandle;
 import net.mograsim.logic.model.editor.states.StateManager;
-import net.mograsim.logic.model.model.ViewModelModifiable;
-import net.mograsim.logic.model.model.components.GUIComponent;
-import net.mograsim.logic.model.model.wires.GUIWire;
+import net.mograsim.logic.model.editor.ui.DialogManager;
+import net.mograsim.logic.model.editor.ui.EditorGUI;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.model.wires.ModelWire;
 import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent;
-import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
+import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
+import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler;
+import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
+import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer;
 
 public final class Editor
 {
@@ -27,30 +34,29 @@ public final class Editor
        final Set<ComponentInfo> copyBuffer = new HashSet<>();
        public final DeserializedSubmodelComponent toBeEdited;
        public final HandleManager handleManager;
-       final static Map<GUIComponent, String> identifierPerComponent = new HashMap<>();
        public final EditorGUI gui;
        public final StateManager stateManager;
        private final SaveLoadManager saveManager;
-       Snapping snapping = Snapping.ABSOLUTE;
+       private Snapping snapping = Snapping.ABSOLUTE;
        private double snapX = 5, snapY = 5;
        public final DialogManager dialogManager;
+       public final EditorUserInput userInput;
 
        public Editor(DeserializedSubmodelComponent toBeEdited)
        {
                this.toBeEdited = toBeEdited;
                handleManager = new HandleManager(this);
                gui = new EditorGUI(this);
+               userInput = new EditorUserInput(this);
                stateManager = new StateManager(this);
                handleManager.init();
                saveManager = new SaveLoadManager(this);
                dialogManager = new DialogManager(gui.shell);
 
-               toBeEdited.submodel.addComponentRemovedListener(c -> identifierPerComponent.remove(c));
-               
                gui.open();
        }
-       
-       public ViewModelModifiable getSubmodel()
+
+       public LogicModelModifiable getSubmodel()
        {
                return toBeEdited.getSubmodelModifiable();
        }
@@ -60,8 +66,8 @@ public final class Editor
                return selection;
        }
 
-       //TODO: Remove this error prone method: Relative offset may change between multiple moves,
-       //because Handles have different ways of responding to reqMove(...), causing strange behaviour
+       // TODO: Remove this error prone method: Relative offset may change between multiple moves,
+       // because Handles have different ways of responding to reqMove(...), causing strange behaviour
        @Deprecated
        public void moveSelection(double x, double y)
        {
@@ -77,7 +83,7 @@ public final class Editor
                        c.reqMove(newX, newY);
                }
        }
-       
+
        public void moveHandles(double x, double y, Map<Handle, Point> handleOffsetMap)
        {
                Point snapped = new Point(x, y);
@@ -106,7 +112,7 @@ public final class Editor
                for (Handle h : selection)
                {
                        Optional<ComponentInfo> cInfo = h.reqCopy(refPoint);
-                       if(cInfo.isPresent())
+                       if (cInfo.isPresent())
                                copyBuffer.add(cInfo.get());
                }
        }
@@ -116,38 +122,53 @@ public final class Editor
                selection.clear();
                for (ComponentInfo info : copyBuffer)
                {
-                       GUIComponent comp = addComponent(info.identifier, info.params);
+                       ModelComponent comp = addComponent(info.identifier, info.params);
                        ComponentHandle h = handleManager.getHandle(comp);
                        h.reqMove(info.relX, info.relY);
                        selection.add(h);
                }
                moveSelection(x, y);
        }
-       
+
        public void save()
        {
                saveManager.save();
        }
 
-       public void addComponent(double x, double y)
+       public void saveAs()
        {
-               GUIComponent c = addComponent(gui.getAddListSelected(), new JsonObject());
-               selection.clear();
-               selection.add(handleManager.getHandle(c));
-               moveSelection(x, y);
+               saveManager.openSaveAsDialog();
        }
-       
-       private GUIComponent addComponent(String identifier, JsonElement params)
+
+       public void addComponent(double x, double y)
        {
-               GUIComponent comp = IndirectGUIComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier,
-                               params);
-               identifierPerComponent.put(comp, identifier);
-               return comp;
+               boolean successful = false;
+               JsonElement params = JsonNull.INSTANCE;
+               outer: while (!successful)
+               {
+                       String selected = gui.getAddListSelected();
+                       try
+                       {
+                               ModelComponent c = addComponent(selected, params);
+                               selection.clear();
+                               selection.add(handleManager.getHandle(c));
+                               moveSelection(x, y);
+                               successful = true;
+                       }
+                       catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException
+                                       | NullPointerException e)
+                       {
+                               String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:");
+                               if (result == null)
+                                       break outer;
+                               params = new JsonParser().parse(result);
+                       }
+               }
        }
-       
-       public static String getIdentifier(GUIComponent c)
+
+       private ModelComponent addComponent(String identifier, JsonElement params)
        {
-               return identifierPerComponent.get(c);
+               return IndirectModelComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params);
        }
 
        public void duplicate()
@@ -164,8 +185,10 @@ public final class Editor
                case OFF:
                        break;
                case ABSOLUTE:
-                       newP.x -= newP.x % snapX;
-                       newP.y -= newP.y % snapY;
+                       newP.x = (int) (newP.x / snapX + .5) * snapX;
+                       newP.y = (int) (newP.y / snapY + .5) * snapY;
+                       break;
+               default:
                        break;
                }
        }
@@ -175,7 +198,7 @@ public final class Editor
                public final double relX, relY;
                public final String identifier;
                public final JsonElement params;
-               
+
                public ComponentInfo(double relX, double relY, String identifier, JsonElement params)
                {
                        this.relX = relX;
@@ -185,31 +208,46 @@ public final class Editor
                }
        }
 
-       public Point getCanvasMousePosition()
+       @SuppressWarnings("unused")
+       public void addWire(PinHandle a, PinHandle b)
+       {
+               new ModelWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]);
+       }
+
+       public static enum Snapping
        {
-               //TODO
-               org.eclipse.swt.graphics.Point canvasLoc = gui.logicCanvas.getLocation(),
-                               mouseLoc = gui.display.getCursorLocation(), shellLoc = gui.shell.getLocation();
-               return new Point(mouseLoc.x - shellLoc.x - canvasLoc.x, mouseLoc.y - shellLoc.y - canvasLoc.y);
+               OFF, ABSOLUTE;
+
+               @Override
+               public String toString()
+               {
+                       return super.toString().toLowerCase();
+               }
        }
 
-       public Point getWorldMousePosition()
+       public static void main(String[] args)
        {
-               return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition());
+               Am2900Loader.setup();
+               openNewEditor();
+//             SaveLoadManager.openLoadDialog();
        }
 
-       public void addWire(PinHandle a, PinHandle b)
+       public static void openNewEditor()
        {
-               new GUIWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]);
+               DeserializedSubmodelComponent toBeEdited = new DeserializedSubmodelComponent(new LogicModelModifiable(), null, null, null);
+               toBeEdited.setOutlineRenderer(new DefaultOutlineRenderer(toBeEdited));
+               toBeEdited.setSymbolRenderer(new DefaultSymbolRenderer(toBeEdited));
+               toBeEdited.setHighLevelStateHandler(new DefaultHighLevelStateHandler());
+               new Editor(toBeEdited);
        }
 
-       public static enum Snapping
+       public Snapping getSnapping()
        {
-               OFF, ABSOLUTE;
+               return snapping;
        }
-       
-       public static void main(String[] args)
+
+       public void setSnapping(Snapping snapping)
        {
-               SaveLoadManager.openLoadDialog();
+               this.snapping = snapping;
        }
 }