SimpleRectangularSubmodelComponent now supports pin names
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / SimpleRectangularSubmodelComponent.java
index f537eec..558df24 100644 (file)
@@ -2,25 +2,26 @@ package net.mograsim.logic.ui.model.components;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.ui.model.ViewModelModifiable;
-import net.mograsim.logic.ui.model.components.ComponentParams.InnerComponentParams;
-import net.mograsim.logic.ui.model.components.ComponentParams.InnerPinParams;
-import net.mograsim.logic.ui.model.components.ComponentParams.InnerWireParams;
-import net.mograsim.logic.ui.model.wires.GUIWire;
 import net.mograsim.logic.ui.model.wires.Pin;
 
 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
 {
+       public static String kLabel = "label", kInCount = "input_count", kOutCount = "output_count", kLogicWidth = "logic_width";
+
        private static final double width = 35;
        private static final double pinDistance = 10;
-       private static final double fontHeight = 5;
+       private static final double pinNameMargin = .5;
+       private static final double labelFontHeight = 5;
+       private static final double pinNameFontHeight = 3.5;
 
        private final String label;
        protected final int logicWidth;
@@ -49,8 +50,9 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent
                this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
        }
 
-       protected void setInputCount(int inputCount)
+       protected void setInputPins(String... pinNames)
        {
+               int inputCount = pinNames.length;
                int oldInputCount = inputSupermodelPins.size();
                double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
                setSize(width, height);
@@ -58,34 +60,55 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent
                        while (inputSupermodelPins.size() > inputCount)
                        {
                                inputSubmodelPins.remove(inputCount);
-                               removePin(inputSupermodelPins.remove(inputCount));
+                               removeSubmodelInterface(inputSupermodelPins.remove(inputCount));
                        }
                else if (oldInputCount < inputCount)
                        for (int i = oldInputCount; i < inputCount; i++)
                        {
-                               Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
+                               Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, 0, pinDistance / 2 + i * pinDistance);
                                inputSubmodelPins.add(submodelPin);
                                inputSupermodelPins.add(getSupermodelPin(submodelPin));
                        }
+               for (int i = 0; i < Math.min(oldInputCount, inputCount); i++)
+               {
+                       if (!inputSubmodelPins.get(i).name.equals(pinNames[i]))
+                       {
+                               removeSubmodelInterface(inputSupermodelPins.get(i));
+                               Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, 0, pinDistance / 2 + i * pinDistance);
+                               inputSubmodelPins.set(i, submodelPin);
+                               inputSupermodelPins.set(i, getSupermodelPin(submodelPin));
+                       }
+               }
        }
 
-       protected void setOutputCount(int outputCount)
+       protected void setOutputPins(String... pinNames)
        {
+               int outputCount = pinNames.length;
                int oldOutputCount = outputSupermodelPins.size();
                setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
                if (oldOutputCount > outputCount)
                        while (outputSupermodelPins.size() > outputCount)
                        {
                                outputSubmodelPins.remove(outputCount);
-                               removePin(outputSupermodelPins.get(outputCount));
+                               removeSubmodelInterface(outputSupermodelPins.get(outputCount));
                        }
                else if (oldOutputCount < outputCount)
                        for (int i = oldOutputCount; i < outputCount; i++)
                        {
-                               Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
+                               Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, width, pinDistance / 2 + i * pinDistance);
                                outputSubmodelPins.add(submodelPin);
                                outputSupermodelPins.add(getSupermodelPin(submodelPin));
                        }
+               for (int i = 0; i < Math.min(oldOutputCount, outputCount); i++)
+               {
+                       if (!outputSubmodelPins.get(i).name.equals(pinNames[i]))
+                       {
+                               removeSubmodelInterface(outputSupermodelPins.get(i));
+                               Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, width, pinDistance / 2 + i * pinDistance);
+                               outputSubmodelPins.set(i, submodelPin);
+                               outputSupermodelPins.set(i, getSupermodelPin(submodelPin));
+                       }
+               }
        }
 
        public List<Pin> getInputPins()
@@ -115,10 +138,23 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent
                double posY = getBounds().y;
 
                Font oldFont = gc.getFont();
-               Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
-               gc.setFont(labelFont);
+               gc.setFont(new Font(oldFont.getName(), labelFontHeight, oldFont.getStyle()));
                Point textExtent = gc.textExtent(label);
                gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
+               gc.setFont(new Font(oldFont.getName(), pinNameFontHeight, oldFont.getStyle()));
+               for (int i = 0; i < inputSupermodelPins.size(); i++)
+               {
+                       String pinName = inputSupermodelPins.get(i).name;
+                       textExtent = gc.textExtent(pinName);
+                       gc.drawText(pinName, posX + pinNameMargin, posY + i * pinDistance + (pinDistance - textExtent.y) / 2, true);
+               }
+               for (int i = 0; i < outputSupermodelPins.size(); i++)
+               {
+                       String pinName = outputSupermodelPins.get(i).name;
+                       textExtent = gc.textExtent(pinName);
+                       gc.drawText(pinName, posX + width - textExtent.x - pinNameMargin, posY + i * pinDistance + (pinDistance - textExtent.y) / 2,
+                                       true);
+               }
                gc.setFont(oldFont);
        }
 
@@ -128,55 +164,17 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent
                gc.drawRectangle(getBounds());
        }
 
-       public ComponentParams calculateParams()
+       @Override
+       public SubmodelComponentParams calculateParams()
        {
-               ComponentParams params = new ComponentParams();
-               params.displayName = label;
-               params.inputCount = inputSupermodelPins.size();
-               params.outputCount = outputSubmodelPins.size();
-               params.logicWidth = logicWidth;
-               params.innerScale = getSubmodelScale();
-
-               List<GUIComponent> compList = submodelModifiable.getComponents();
-               Iterator<GUIComponent> componentIt = compList.iterator();
-               componentIt.next(); // Skip inner SubmodelInterface
-               InnerComponentParams[] comps = new InnerComponentParams[compList.size() - 1];
-               int i = 0;
-               while (componentIt.hasNext())
-               {
-                       GUIComponent component = componentIt.next();
-                       InnerComponentParams inner = new InnerComponentParams();
-                       comps[i] = inner;
-                       inner.logicWidth = component.getPins().get(0).logicWidth; // This could be done a little more elegantly
-                       Rectangle bounds = component.getBounds();
-                       inner.pos = new Point(bounds.x, bounds.y);
-                       if (component instanceof GUICustomComponent)
-                               inner.type = "file:" + ((GUICustomComponent) component).getPath();
-                       else
-                               inner.type = "class:" + component.getClass().getCanonicalName();
-                       i++;
-               }
-               params.subComps = comps;
-
-               List<GUIWire> wireList = submodelModifiable.getWires();
-               InnerWireParams wires[] = new InnerWireParams[wireList.size()];
-               i = 0;
-               for (GUIWire wire : wireList)
-               {
-                       InnerWireParams inner = new InnerWireParams();
-                       wires[i] = inner;
-                       InnerPinParams pin1Params = new InnerPinParams(), pin2Params = new InnerPinParams();
-
-                       pin1Params.pinIndex = wire.getPin1().component.getPins().indexOf(wire.getPin1());
-                       pin1Params.compId = compList.indexOf(wire.getPin1().component);
-                       pin2Params.pinIndex = wire.getPin2().component.getPins().indexOf(wire.getPin2());
-                       pin2Params.compId = compList.indexOf(wire.getPin2().component);
-                       inner.pin1 = pin1Params;
-                       inner.pin2 = pin2Params;
-                       inner.path = wire.getPath();
-                       i++;
-               }
-               params.innerWires = wires;
-               return params;
+               SubmodelComponentParams ret = super.calculateParams();
+               ret.type = SimpleRectangularSubmodelComponent.class.getSimpleName();
+               Map<String, Object> m = new TreeMap<>();
+               m.put(kLabel, label);
+               m.put(kInCount, inputSupermodelPins.size());
+               m.put(kOutCount, outputSupermodelPins.size());
+               m.put(kLogicWidth, logicWidth);
+               ret.specialized = m;
+               return ret;
        }
 }
\ No newline at end of file