import java.util.ArrayList;
import java.util.Collections;
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;
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;
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);
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()
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);
}
{
gc.drawRectangle(getBounds());
}
+
+ @Override
+ public SubmodelComponentParams calculateParams()
+ {
+ 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