--- /dev/null
+package era.mi.gui;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Device;
+
+import era.mi.logic.types.ColorDefinition;
+import era.mi.logic.types.ColorDefinition.BuiltInColor;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+
+//TODO replace with a proper ColorManager
+public class ColorHelper
+{
+ public static void executeWithDifferentForeground(GeneralGC gc, ColorDefinition col, Runnable exec)
+ {
+ executeWithDifferentColor(gc.getDevice(), col, gc::getForeground, gc::setForeground, exec);
+ }
+
+ public static void executeWithDifferentBackground(GeneralGC gc, ColorDefinition col, Runnable exec)
+ {
+ executeWithDifferentColor(gc.getDevice(), col, gc::getBackground, gc::setBackground, exec);
+ }
+
+ private static void executeWithDifferentColor(Device device, ColorDefinition col, Supplier<Color> getColor, Consumer<Color> setColor,
+ Runnable exec)
+ {
+ Color oldColor = getColor.get();
+ boolean isNoSystemColor = col.builtInColor == null;
+ Color newColor;
+ if (isNoSystemColor)
+ newColor = new Color(device, col.r, col.g, col.b);
+ else
+ newColor = device.getSystemColor(ColorHelper.toSWTColorConstant(col.builtInColor));
+ setColor.accept(newColor);
+
+ exec.run();
+
+ setColor.accept(oldColor);
+ if (isNoSystemColor)
+ newColor.dispose();
+ }
+
+ public static int toSWTColorConstant(BuiltInColor col)
+ {
+ switch (col)
+ {
+ case COLOR_BLACK:
+ return SWT.COLOR_BLACK;
+ case COLOR_BLUE:
+ return SWT.COLOR_BLUE;
+ case COLOR_CYAN:
+ return SWT.COLOR_CYAN;
+ case COLOR_DARK_BLUE:
+ return SWT.COLOR_DARK_BLUE;
+ case COLOR_DARK_CYAN:
+ return SWT.COLOR_DARK_CYAN;
+ case COLOR_DARK_GRAY:
+ return SWT.COLOR_DARK_GRAY;
+ case COLOR_DARK_GREEN:
+ return SWT.COLOR_DARK_GREEN;
+ case COLOR_DARK_MAGENTA:
+ return SWT.COLOR_DARK_MAGENTA;
+ case COLOR_DARK_RED:
+ return SWT.COLOR_DARK_RED;
+ case COLOR_DARK_YELLOW:
+ return SWT.COLOR_DARK_YELLOW;
+ case COLOR_GRAY:
+ return SWT.COLOR_GRAY;
+ case COLOR_GREEN:
+ return SWT.COLOR_GREEN;
+ case COLOR_MAGENTA:
+ return SWT.COLOR_MAGENTA;
+ case COLOR_RED:
+ return SWT.COLOR_RED;
+ case COLOR_WHITE:
+ return SWT.COLOR_WHITE;
+ case COLOR_YELLOW:
+ return SWT.COLOR_YELLOW;
+ default:
+ throw new IllegalArgumentException("Unknown enum constant: " + col);
+ }
+ }
+
+ private ColorHelper()
+ {
+ throw new UnsupportedOperationException("No instances of ColorHelper");
+ }
+}
\ No newline at end of file
c.removePinRemovedListener(pinRemovedListener);
redrawThreadsafe();
});
- model.addWireAddedListener(c -> redrawThreadsafe());
- model.addWireRemovedListener(c -> redrawThreadsafe());
+ model.addWireAddedListener(w ->
+ {
+ w.addWireChangedListener(redrawConsumer);
+ redrawThreadsafe();
+ });
+ model.addWireRemovedListener(w ->
+ {
+ w.removeWireChangedListener(redrawConsumer);
+ redrawThreadsafe();
+ });
addZoomedRenderer(gc ->
{
public void removePinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .remove(listener);}
public void removePinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .remove(listener);}
- private void callComponentChangedListeners( ) {componentChangedListeners.forEach(l -> l.accept(this));}
- private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));}
- private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));}
- private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));}
- // @formatter:on
+ protected void callComponentChangedListeners( ) {componentChangedListeners.forEach(l -> l.accept(this));}
+ private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));}
+ private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));}
+ private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));}
+ // @form atter:on
/**
* Render this component to the given gc.
package era.mi.gui.model.wires;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+import era.mi.gui.ColorHelper;
import era.mi.gui.model.ViewModel;
-import era.mi.logic.types.Bit;
-import era.mi.logic.wires.Wire;
+import era.mi.logic.types.BitVectorFormatter;
+import era.mi.logic.wires.Wire.ReadEnd;
import net.haspamelodica.swt.helper.gcs.GeneralGC;
import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
private Pin pin2;
private double[] path;
- private Wire wire;
+ private final List<Consumer<? super GUIWire>> wireChangedListeners;
+
+ private ReadEnd end;
public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
{
this.pin1 = pin1;
this.pin2 = pin2;
+ wireChangedListeners = new ArrayList<>();
+
pin1.addPinMovedListener(p -> pin1Moved());
pin2.addPinMovedListener(p -> pin2Moved());
pin1Moved();
public void render(GeneralGC gc)
{
- Color oldFG = gc.getForeground();
- gc.setForeground(gc.getDevice().getSystemColor(getSWTColorConstantForWire(wire)));
- gc.drawPolyline(path);
- gc.setForeground(oldFG);
+ ColorHelper.executeWithDifferentForeground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.drawPolyline(path));
}
- public void setLogicModelWire(Wire wire)
+ public void setLogicModelBinding(ReadEnd end)
{
- this.wire = wire;
+ this.end = end;
+ end.addObserver((i, o) -> callWireChangedListeners());
}
- public static int getSWTColorConstantForWire(Wire wire)
- {
- if (wire != null && wire.length == 1)
- return getSWTColorConstantForBit(wire.getValue());
- else
- return SWT.COLOR_BLACK;
- }
+ // @formatter:off
+ public void addWireChangedListener (Consumer<? super GUIWire> listener) {wireChangedListeners.add (listener);}
+
+ public void removeWireChangedListener(Consumer<? super GUIWire> listener) {wireChangedListeners.remove(listener);}
+
+ private void callWireChangedListeners() {wireChangedListeners.forEach(l -> l.accept(this));}
+ // @formatter:on
- public static int getSWTColorConstantForBit(Bit bit)
- {
- switch (bit)
- {
- case ONE:
- return SWT.COLOR_GREEN;
- case ZERO:
- return SWT.COLOR_BLUE;
- case Z:
- return SWT.COLOR_BLACK;
- case U:
- case X:
- return SWT.COLOR_RED;
- default:
- throw new IllegalArgumentException("Unknown enum constant: " + bit);
- }
- }
}
\ No newline at end of file
package era.mi.gui.model.wires;
-import org.eclipse.swt.graphics.Color;
-
+import era.mi.gui.ColorHelper;
import era.mi.gui.model.ViewModel;
import era.mi.gui.model.components.GUIComponent;
-import era.mi.logic.wires.Wire;
+import era.mi.logic.types.BitVectorFormatter;
+import era.mi.logic.wires.Wire.ReadEnd;
import net.haspamelodica.swt.helper.gcs.GeneralGC;
import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
public class WireCrossPoint extends GUIComponent
{
- private Wire wire;
+ private ReadEnd end;
public WireCrossPoint(ViewModel model)
{
@Override
public void render(GeneralGC gc, Rectangle visibleRegion)
{
- Color oldBG = gc.getBackground();
- gc.setBackground(gc.getDevice().getSystemColor(GUIWire.getSWTColorConstantForWire(wire)));
- gc.fillOval(-1, -1, 2, 2);
- gc.setBackground(oldBG);
+ ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.fillOval(-1, -1, 2, 2));
}
- public void setLogicModelWire(Wire wire)
+ public void setLogicModelBinding(ReadEnd end)
{
- this.wire = wire;
+ this.end = end;
+ end.addObserver((i, o) -> callComponentChangedListeners());
}
}
\ No newline at end of file