mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-18 01:14:42 -04:00
Merge branch 'master' of bitbucket.org:hneemann/digital
This commit is contained in:
commit
ee5dc13559
@ -343,6 +343,20 @@ public class Circuit {
|
|||||||
modified();
|
modified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a single wire
|
||||||
|
*
|
||||||
|
* @param wireToDelete the wire to delete
|
||||||
|
*/
|
||||||
|
public void delete(Wire wireToDelete) {
|
||||||
|
if (wires.remove(wireToDelete)) {
|
||||||
|
WireConsistencyChecker checker = new WireConsistencyChecker(wires);
|
||||||
|
wires = checker.check();
|
||||||
|
dotsPresent = false;
|
||||||
|
modified();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the element at the given position
|
* Returns the element at the given position
|
||||||
@ -427,6 +441,20 @@ public class Circuit {
|
|||||||
return wires;
|
return wires;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the matching wire
|
||||||
|
*
|
||||||
|
* @param pos the position
|
||||||
|
* @return the matching wire or null
|
||||||
|
*/
|
||||||
|
public Wire getWireAt(Vector pos, int radius) {
|
||||||
|
for (Wire w : wires)
|
||||||
|
if (w.contains(pos, radius))
|
||||||
|
return w;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes the references to the ObservableValues representing the elements or wire state.
|
* Deletes the references to the ObservableValues representing the elements or wire state.
|
||||||
* So this circuit is detached from a generated model.
|
* So this circuit is detached from a generated model.
|
||||||
|
@ -6,6 +6,8 @@ import de.neemann.digital.draw.graphics.Style;
|
|||||||
import de.neemann.digital.draw.graphics.Vector;
|
import de.neemann.digital.draw.graphics.Vector;
|
||||||
import de.neemann.digital.draw.shapes.Drawable;
|
import de.neemann.digital.draw.shapes.Drawable;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple wire described by two points
|
* A simple wire described by two points
|
||||||
*
|
*
|
||||||
@ -107,6 +109,23 @@ public class Wire implements Drawable, Moveable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if the given wire is matched by the given position.
|
||||||
|
* Returns true if distance to wire is smaller then the given radius.
|
||||||
|
*
|
||||||
|
* @param v the position
|
||||||
|
* @param radius the matching radius
|
||||||
|
* @return true if matching
|
||||||
|
*/
|
||||||
|
public boolean contains(Vector v, int radius) {
|
||||||
|
if (p1.x == p2.x && Math.abs(p1.x - v.x) <= radius)
|
||||||
|
return (p1.y < v.y && v.y < p2.y) || (p2.y < v.y && v.y < p1.y);
|
||||||
|
else if (p1.y == p2.y && Math.abs(p1.y - v.y) < radius)
|
||||||
|
return (p1.x < v.x && v.x < p2.x) || (p2.x < v.x && v.x < p1.x);
|
||||||
|
else
|
||||||
|
return false; // ToDo: should also work for diagonal wires
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the orientation of the wire
|
* @return the orientation of the wire
|
||||||
*/
|
*/
|
||||||
@ -118,23 +137,35 @@ public class Wire implements Drawable, Moveable {
|
|||||||
return Orientation.diagonal;
|
return Orientation.diagonal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public boolean equals(Object o) {
|
* Returns true if the given wire is included in the given collection.
|
||||||
if (this == o) return true;
|
* To compare the wires it calls equalsContent.
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
*
|
||||||
|
* @param col the collection of wires
|
||||||
|
* @return true if wire is included
|
||||||
|
* @see Wire#equalsContent(Wire)
|
||||||
|
*/
|
||||||
|
public boolean isIncludedIn(Collection<Wire> col) {
|
||||||
|
for (Wire w : col)
|
||||||
|
if (equalsContent(w))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Wire wire = (Wire) o;
|
/**
|
||||||
|
* Returns true if wires are equal.
|
||||||
|
* It is not possible to overwrite Object.equals() because some algorithms
|
||||||
|
* (eg. highlighting) are depending on an object based equals!
|
||||||
|
*
|
||||||
|
* @param wire the other wire
|
||||||
|
* @return true if both wires are equal
|
||||||
|
*/
|
||||||
|
public boolean equalsContent(Wire wire) {
|
||||||
|
if (this == wire) return true;
|
||||||
|
if (wire == null) return false;
|
||||||
|
|
||||||
if (!p1.equals(wire.p1)) return false;
|
if (!p1.equals(wire.p1)) return false;
|
||||||
return p2.equals(wire.p2);
|
return p2.equals(wire.p2);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = p1.hashCode();
|
|
||||||
result = 31 * result + p2.hashCode();
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -558,7 +558,11 @@ public class CircuitComponent extends JComponent {
|
|||||||
else
|
else
|
||||||
mouseMoveElement.activate(vp, pos);
|
mouseMoveElement.activate(vp, pos);
|
||||||
} else {
|
} else {
|
||||||
mouseWire.activate(pos);
|
Wire w = circuit.getWireAt(pos, SIZE2);
|
||||||
|
if (w == null)
|
||||||
|
mouseWire.activate(pos);
|
||||||
|
else
|
||||||
|
mouseMoveSelected.activate(w, pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -592,6 +596,7 @@ public class CircuitComponent extends JComponent {
|
|||||||
this.element = element;
|
this.element = element;
|
||||||
delta = null;
|
delta = null;
|
||||||
deleteAction.setActive(true);
|
deleteAction.setActive(true);
|
||||||
|
rotateAction.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -623,6 +628,12 @@ public class CircuitComponent extends JComponent {
|
|||||||
}
|
}
|
||||||
mouseNormal.activate();
|
mouseNormal.activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rotate() {
|
||||||
|
element.rotate();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class MouseControllerMoveElement extends MouseController {
|
private final class MouseControllerMoveElement extends MouseController {
|
||||||
@ -757,7 +768,6 @@ public class CircuitComponent extends JComponent {
|
|||||||
removeHighLighted();
|
removeHighLighted();
|
||||||
mouseMoveSelected.activate(corner1, corner2, getPosVector(e));
|
mouseMoveSelected.activate(corner1, corner2, getPosVector(e));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
corner2 = getPosVector(e);
|
corner2 = getPosVector(e);
|
||||||
if ((e.getModifiersEx() & CTRL_DOWN_MASK) != 0) {
|
if ((e.getModifiersEx() & CTRL_DOWN_MASK) != 0) {
|
||||||
Vector dif = corner2.sub(corner1);
|
Vector dif = corner2.sub(corner1);
|
||||||
@ -860,6 +870,7 @@ public class CircuitComponent extends JComponent {
|
|||||||
private ArrayList<Moveable> elements;
|
private ArrayList<Moveable> elements;
|
||||||
private Vector lastPos;
|
private Vector lastPos;
|
||||||
private boolean wasMoved;
|
private boolean wasMoved;
|
||||||
|
private Wire remove;
|
||||||
|
|
||||||
private MouseControllerMoveSelected(Cursor cursor) {
|
private MouseControllerMoveSelected(Cursor cursor) {
|
||||||
super(cursor);
|
super(cursor);
|
||||||
@ -870,6 +881,24 @@ public class CircuitComponent extends JComponent {
|
|||||||
lastPos = pos;
|
lastPos = pos;
|
||||||
wasMoved = false;
|
wasMoved = false;
|
||||||
elements = circuit.getElementsToMove(Vector.min(corner1, corner2), Vector.max(corner1, corner2));
|
elements = circuit.getElementsToMove(Vector.min(corner1, corner2), Vector.max(corner1, corner2));
|
||||||
|
remove=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void activate(Wire w, Vector pos) {
|
||||||
|
super.activate();
|
||||||
|
lastPos = pos;
|
||||||
|
wasMoved = false;
|
||||||
|
elements = new ArrayList<>();
|
||||||
|
elements.add(w.getMovableP1());
|
||||||
|
elements.add(w.getMovableP2());
|
||||||
|
deleteAction.setEnabled(true);
|
||||||
|
addHighLighted(w);
|
||||||
|
remove=w;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void moved(MouseEvent e) {
|
||||||
|
lastPos = getPosVector(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -894,8 +923,18 @@ public class CircuitComponent extends JComponent {
|
|||||||
void released(MouseEvent e) {
|
void released(MouseEvent e) {
|
||||||
if (wasMoved)
|
if (wasMoved)
|
||||||
circuit.elementsMoved();
|
circuit.elementsMoved();
|
||||||
|
removeHighLighted();
|
||||||
mouseNormal.activate();
|
mouseNormal.activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete() {
|
||||||
|
if (remove!=null) {
|
||||||
|
circuit.delete(remove);
|
||||||
|
removeHighLighted();
|
||||||
|
mouseNormal.activate();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class MouseControllerInsertCopied extends MouseController {
|
private final class MouseControllerInsertCopied extends MouseController {
|
||||||
|
@ -68,13 +68,13 @@ public class WireConsistencyCheckerTest extends TestCase {
|
|||||||
|
|
||||||
public static void checkContains(ArrayList<Wire> wires, Wire wire) {
|
public static void checkContains(ArrayList<Wire> wires, Wire wire) {
|
||||||
for (Wire w : wires)
|
for (Wire w : wires)
|
||||||
if (w.equals(wire))
|
if (wire.equalsContent(wire))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wire = new Wire(wire.p2, wire.p1);
|
wire = new Wire(wire.p2, wire.p1);
|
||||||
|
|
||||||
for (Wire w : wires)
|
for (Wire w : wires)
|
||||||
if (w.equals(wire))
|
if (w.equalsContent(wire))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
assertTrue(false);
|
assertTrue(false);
|
||||||
|
@ -51,14 +51,14 @@ public class WireMergerTest extends TestCase {
|
|||||||
wm.addTo(newWires);
|
wm.addTo(newWires);
|
||||||
|
|
||||||
assertEquals(6, newWires.size());
|
assertEquals(6, newWires.size());
|
||||||
assertTrue(newWires.contains(new Wire(new Vector(1, 3), new Vector(8, 3))));
|
assertTrue(new Wire(new Vector(1, 3), new Vector(8, 3)).isIncludedIn(newWires));
|
||||||
assertTrue(newWires.contains(new Wire(new Vector(1, 4), new Vector(5, 4))));
|
assertTrue(new Wire(new Vector(1, 4), new Vector(5, 4)).isIncludedIn(newWires));
|
||||||
assertTrue(newWires.contains(new Wire(new Vector(5, 5), new Vector(8, 5))));
|
assertTrue(new Wire(new Vector(5, 5), new Vector(8, 5)).isIncludedIn(newWires));
|
||||||
|
|
||||||
assertTrue(newWires.contains(new Wire(new Vector(1, 6), new Vector(8, 6))));
|
assertTrue(new Wire(new Vector(1, 6), new Vector(8, 6)).isIncludedIn(newWires));
|
||||||
|
|
||||||
assertTrue(newWires.contains(new Wire(new Vector(1, 7), new Vector(4, 7))));
|
assertTrue(new Wire(new Vector(1, 7), new Vector(4, 7)).isIncludedIn(newWires));
|
||||||
assertTrue(newWires.contains(new Wire(new Vector(5, 7), new Vector(8, 7))));
|
assertTrue(new Wire(new Vector(5, 7), new Vector(8, 7)).isIncludedIn(newWires));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testMerge2() {
|
public void testMerge2() {
|
||||||
@ -70,6 +70,6 @@ public class WireMergerTest extends TestCase {
|
|||||||
ArrayList<Wire> newWires = new ArrayList<>();
|
ArrayList<Wire> newWires = new ArrayList<>();
|
||||||
wm.addTo(newWires);
|
wm.addTo(newWires);
|
||||||
assertEquals(1, newWires.size());
|
assertEquals(1, newWires.size());
|
||||||
assertEquals(new Wire(new Vector(1, 3), new Vector(8, 3)), newWires.get(0));
|
assertTrue(new Wire(new Vector(1, 3), new Vector(8, 3)).equalsContent(newWires.get(0)));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,6 +4,7 @@ import junit.framework.TestCase;
|
|||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
@ -13,23 +14,23 @@ public class ResourcesTest extends TestCase {
|
|||||||
= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
|
= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
|
||||||
"<resources>\n" +
|
"<resources>\n" +
|
||||||
" <string name=\"menu_save\">Speichern</string>\n" +
|
" <string name=\"menu_save\">Speichern</string>\n" +
|
||||||
" <string name=\"menu_open\">Öffnen</string>\n" +
|
" <string name=\"menu_open\">\u00D6ffnen</string>\n" +
|
||||||
"</resources>";
|
"</resources>";
|
||||||
|
|
||||||
public void testWrite() throws Exception {
|
public void testWrite() throws Exception {
|
||||||
Resources res = new Resources();
|
Resources res = new Resources();
|
||||||
res.put("menu_open", "Öffnen");
|
res.put("menu_open", "\u00D6ffnen");
|
||||||
res.put("menu_save", "Speichern");
|
res.put("menu_save", "Speichern");
|
||||||
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
res.save(baos);
|
res.save(baos);
|
||||||
assertEquals(example, baos.toString());
|
assertTrue(Arrays.equals(example.getBytes("utf-8"), baos.toByteArray()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRead() throws Exception {
|
public void testRead() throws Exception {
|
||||||
Resources res = new Resources(new ByteArrayInputStream(example.getBytes()));
|
Resources res = new Resources(new ByteArrayInputStream(example.getBytes("utf-8")));
|
||||||
|
|
||||||
assertEquals("Öffnen", res.get("menu_open"));
|
assertEquals("\u00D6ffnen", res.get("menu_open"));
|
||||||
assertEquals("Speichern", res.get("menu_save"));
|
assertEquals("Speichern", res.get("menu_save"));
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user