mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-18 09:24: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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
@ -427,6 +441,20 @@ public class Circuit {
|
||||
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.
|
||||
* 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.shapes.Drawable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* A simple wire described by two points
|
||||
*
|
||||
@ -107,6 +109,23 @@ public class Wire implements Drawable, Moveable {
|
||||
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
|
||||
*/
|
||||
@ -118,23 +137,35 @@ public class Wire implements Drawable, Moveable {
|
||||
return Orientation.diagonal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
/**
|
||||
* Returns true if the given wire is included in the given collection.
|
||||
* To compare the wires it calls equalsContent.
|
||||
*
|
||||
* @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;
|
||||
return p2.equals(wire.p2);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = p1.hashCode();
|
||||
result = 31 * result + p2.hashCode();
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -558,7 +558,11 @@ public class CircuitComponent extends JComponent {
|
||||
else
|
||||
mouseMoveElement.activate(vp, pos);
|
||||
} 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;
|
||||
delta = null;
|
||||
deleteAction.setActive(true);
|
||||
rotateAction.setEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -623,6 +628,12 @@ public class CircuitComponent extends JComponent {
|
||||
}
|
||||
mouseNormal.activate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rotate() {
|
||||
element.rotate();
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
private final class MouseControllerMoveElement extends MouseController {
|
||||
@ -757,7 +768,6 @@ public class CircuitComponent extends JComponent {
|
||||
removeHighLighted();
|
||||
mouseMoveSelected.activate(corner1, corner2, getPosVector(e));
|
||||
} else {
|
||||
|
||||
corner2 = getPosVector(e);
|
||||
if ((e.getModifiersEx() & CTRL_DOWN_MASK) != 0) {
|
||||
Vector dif = corner2.sub(corner1);
|
||||
@ -860,6 +870,7 @@ public class CircuitComponent extends JComponent {
|
||||
private ArrayList<Moveable> elements;
|
||||
private Vector lastPos;
|
||||
private boolean wasMoved;
|
||||
private Wire remove;
|
||||
|
||||
private MouseControllerMoveSelected(Cursor cursor) {
|
||||
super(cursor);
|
||||
@ -870,6 +881,24 @@ public class CircuitComponent extends JComponent {
|
||||
lastPos = pos;
|
||||
wasMoved = false;
|
||||
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
|
||||
@ -894,8 +923,18 @@ public class CircuitComponent extends JComponent {
|
||||
void released(MouseEvent e) {
|
||||
if (wasMoved)
|
||||
circuit.elementsMoved();
|
||||
removeHighLighted();
|
||||
mouseNormal.activate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete() {
|
||||
if (remove!=null) {
|
||||
circuit.delete(remove);
|
||||
removeHighLighted();
|
||||
mouseNormal.activate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class MouseControllerInsertCopied extends MouseController {
|
||||
|
@ -68,13 +68,13 @@ public class WireConsistencyCheckerTest extends TestCase {
|
||||
|
||||
public static void checkContains(ArrayList<Wire> wires, Wire wire) {
|
||||
for (Wire w : wires)
|
||||
if (w.equals(wire))
|
||||
if (wire.equalsContent(wire))
|
||||
return;
|
||||
|
||||
wire = new Wire(wire.p2, wire.p1);
|
||||
|
||||
for (Wire w : wires)
|
||||
if (w.equals(wire))
|
||||
if (w.equalsContent(wire))
|
||||
return;
|
||||
|
||||
assertTrue(false);
|
||||
|
@ -51,14 +51,14 @@ public class WireMergerTest extends TestCase {
|
||||
wm.addTo(newWires);
|
||||
|
||||
assertEquals(6, newWires.size());
|
||||
assertTrue(newWires.contains(new Wire(new Vector(1, 3), new Vector(8, 3))));
|
||||
assertTrue(newWires.contains(new Wire(new Vector(1, 4), new Vector(5, 4))));
|
||||
assertTrue(newWires.contains(new Wire(new Vector(5, 5), new Vector(8, 5))));
|
||||
assertTrue(new Wire(new Vector(1, 3), new Vector(8, 3)).isIncludedIn(newWires));
|
||||
assertTrue(new Wire(new Vector(1, 4), new Vector(5, 4)).isIncludedIn(newWires));
|
||||
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(newWires.contains(new Wire(new Vector(5, 7), new Vector(8, 7))));
|
||||
assertTrue(new Wire(new Vector(1, 7), new Vector(4, 7)).isIncludedIn(newWires));
|
||||
assertTrue(new Wire(new Vector(5, 7), new Vector(8, 7)).isIncludedIn(newWires));
|
||||
}
|
||||
|
||||
public void testMerge2() {
|
||||
@ -70,6 +70,6 @@ public class WireMergerTest extends TestCase {
|
||||
ArrayList<Wire> newWires = new ArrayList<>();
|
||||
wm.addTo(newWires);
|
||||
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.ByteArrayOutputStream;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @author hneemann
|
||||
@ -13,23 +14,23 @@ public class ResourcesTest extends TestCase {
|
||||
= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
|
||||
"<resources>\n" +
|
||||
" <string name=\"menu_save\">Speichern</string>\n" +
|
||||
" <string name=\"menu_open\">Öffnen</string>\n" +
|
||||
" <string name=\"menu_open\">\u00D6ffnen</string>\n" +
|
||||
"</resources>";
|
||||
|
||||
public void testWrite() throws Exception {
|
||||
Resources res = new Resources();
|
||||
res.put("menu_open", "Öffnen");
|
||||
res.put("menu_open", "\u00D6ffnen");
|
||||
res.put("menu_save", "Speichern");
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
res.save(baos);
|
||||
assertEquals(example, baos.toString());
|
||||
assertTrue(Arrays.equals(example.getBytes("utf-8"), baos.toByteArray()));
|
||||
}
|
||||
|
||||
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"));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user