diff --git a/src/main/java/de/neemann/digital/core/ObservableValue.java b/src/main/java/de/neemann/digital/core/ObservableValue.java index c0207dd49..ca8d960ab 100644 --- a/src/main/java/de/neemann/digital/core/ObservableValue.java +++ b/src/main/java/de/neemann/digital/core/ObservableValue.java @@ -51,7 +51,7 @@ public class ObservableValue extends Value { if (highZ) return "?"; else - return "0x" + Long.toHexString(value); + return "0x" + Long.toHexString(value).toUpperCase(); } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index f9e209fe4..cc64ae571 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -82,7 +82,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { @Override public void actionPerformed(ActionEvent e) { if (ClosingWindowListener.checkForSave(Main.this, Main.this)) { - JFileChooser fc = getjFileChooser(); + JFileChooser fc = getjFileChooser(filename); if (fc.showOpenDialog(Main.this) == JFileChooser.APPROVE_OPTION) { loadFile(fc.getSelectedFile()); } @@ -93,7 +93,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { ToolTipAction saveas = new ToolTipAction("Save As") { @Override public void actionPerformed(ActionEvent e) { - JFileChooser fc = getjFileChooser(); + JFileChooser fc = getjFileChooser(filename); if (fc.showSaveDialog(Main.this) == JFileChooser.APPROVE_OPTION) { saveFile(fc.getSelectedFile()); } @@ -260,7 +260,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { } } - private JFileChooser getjFileChooser() { + public static JFileChooser getjFileChooser(File filename) { JFileChooser fileChooser = new JFileChooser(filename == null ? null : filename.getParentFile()); fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Circuit", "dig")); return fileChooser; diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index 824ffd9a3..24c116481 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -209,8 +209,11 @@ public class CircuitComponent extends JComponent implements Observer { wire = new Wire(startPos, startPos); repaint(); } else { - wire = null; - repaint(); + if (wire != null) { + wire = null; + repaint(); + } else + editAttributes(e); } } @@ -249,16 +252,15 @@ public class CircuitComponent extends JComponent implements Observer { public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { if (partToInsert == null) { - Vector pos = getPosVector(e); insert = false; - for (VisualElement vp : circuit.getParts()) - if (vp.matches(pos)) { - partToInsert = vp; - partToInsert.setHighLight(true); - delta = partToInsert.getPos().sub(pos); - repaint(); - break; - } + Vector pos = getPosVector(e); + VisualElement vp = circuit.getElementAt(pos); + if (vp != null) { + partToInsert = vp; + partToInsert.setHighLight(true); + delta = partToInsert.getPos().sub(pos); + repaint(); + } } else { partToInsert.setPos(raster(partToInsert.getPos())); if (insert) @@ -269,19 +271,7 @@ public class CircuitComponent extends JComponent implements Observer { partToInsert = null; } } else { - Vector pos = getPosVector(e); - for (VisualElement vp : circuit.getParts()) - if (vp.matches(pos)) { - String name = vp.getElementName(); - ArrayList list = library.getElementType(name).getAttributeList(); - if (list.size() > 0) { - Point p = new Point(e.getX(), e.getY()); - SwingUtilities.convertPointToScreen(p, CircuitComponent.this); - new AttributeDialog(p, list, vp.getElementAttributes()).showDialog(); - circuit.modified(); - repaint(); - } - } + editAttributes(e); } } @@ -312,6 +302,23 @@ public class CircuitComponent extends JComponent implements Observer { } } + private boolean editAttributes(MouseEvent e) { + VisualElement vp = circuit.getElementAt(getPosVector(e)); + if (vp != null) { + String name = vp.getElementName(); + ArrayList list = library.getElementType(name).getAttributeList(); + if (list.size() > 0) { + Point p = new Point(e.getX(), e.getY()); + SwingUtilities.convertPointToScreen(p, CircuitComponent.this); + new AttributeDialog(p, list, vp.getElementAttributes()).showDialog(); + circuit.modified(); + repaint(); + return true; + } + } + return false; + } + private static enum State {COPY, MOVE} private class SelectMouseListener extends Mouse { @@ -414,15 +421,14 @@ public class CircuitComponent extends JComponent implements Observer { @Override public void mouseClicked(MouseEvent e) { - Vector pos = getPosVector(e); - for (VisualElement vp : circuit.getParts()) - if (vp.matches(pos)) { - Point p = new Point(e.getX(), e.getY()); - SwingUtilities.convertPointToScreen(p, CircuitComponent.this); - vp.clicked(CircuitComponent.this, p); - if (manualChangeObserver != null) - manualChangeObserver.hasChanged(); - } + VisualElement ve = circuit.getElementAt(getPosVector(e)); + if (ve != null) { + Point p = new Point(e.getX(), e.getY()); + SwingUtilities.convertPointToScreen(p, CircuitComponent.this); + ve.clicked(CircuitComponent.this, p); + if (manualChangeObserver != null) + manualChangeObserver.hasChanged(); + } } } } diff --git a/src/main/java/de/neemann/digital/gui/draw/elements/Circuit.java b/src/main/java/de/neemann/digital/gui/draw/elements/Circuit.java index 21bec653d..791cf6980 100644 --- a/src/main/java/de/neemann/digital/gui/draw/elements/Circuit.java +++ b/src/main/java/de/neemann/digital/gui/draw/elements/Circuit.java @@ -63,7 +63,7 @@ public class Circuit implements Drawable { modified(); } - public ArrayList getParts() { + public ArrayList getElements() { return visualElements; } @@ -121,6 +121,14 @@ public class Circuit implements Drawable { modified(); } + public VisualElement getElementAt(Vector pos) { + for (VisualElement element : visualElements) { + if (element.matches(pos)) + return element; + } + return null; + } + public void modified() { modified = true; } diff --git a/src/main/java/de/neemann/digital/gui/draw/elements/Wire.java b/src/main/java/de/neemann/digital/gui/draw/elements/Wire.java index 550660999..7d43983bd 100644 --- a/src/main/java/de/neemann/digital/gui/draw/elements/Wire.java +++ b/src/main/java/de/neemann/digital/gui/draw/elements/Wire.java @@ -10,6 +10,7 @@ import de.neemann.digital.gui.draw.shapes.Drawable; * @author hneemann */ public class Wire implements Drawable, Moveable { + private static final int MIN_LABEL_LEN = 50; public Vector p1; public Vector p2; private transient ObservableValue value; @@ -37,6 +38,11 @@ public class Wire implements Drawable, Moveable { graphic.drawLine(p1, p2, style); + if (value != null && p1.y == p2.y && Math.abs(p1.x - p2.x) > MIN_LABEL_LEN && value.getBits() > 1) { + Vector pos = p1.add(p2).div(2).add(0, -2); + graphic.drawText(pos, pos.add(1, 0), value.getValueString(), de.neemann.digital.gui.draw.graphics.Orientation.CENTERBOTTOM, Style.SHAPE_PIN); + } + if (p1Dot || p2Dot) { Vector r = new Vector(style.getThickness(), style.getThickness()); if (p1Dot) diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java index d9ed879ba..106021c8e 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java @@ -31,7 +31,7 @@ public class ModelDescription implements Iterable { public ModelDescription(Circuit circuit, ElementLibrary library) throws PinException { entries = new ArrayList<>(); netList = new NetList(circuit.getWires()); - for (VisualElement vp : circuit.getParts()) { + for (VisualElement vp : circuit.getElements()) { Pins pins = vp.getPins(); ElementTypeDescription elementType = library.getElementType(vp.getElementName()); Element element = elementType.createElement(vp.getElementAttributes()); diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java index 10ced242a..cfed94d97 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java @@ -56,7 +56,7 @@ public class InputShape implements Shape { ObservableValue value = ioState.getOutput(0); style = Style.getWireStyle(value); if (value.getBits() > 1) { - Vector textPos = new Vector(2 + SIZE, -2 - SIZE); + Vector textPos = new Vector(-2 - SIZE, -2 - SIZE); graphic.drawText(textPos, textPos.add(1, 0), value.getValueString(), Orientation.CENTERBOTTOM, Style.NORMAL); } }