diff --git a/diylc/diylc-core/src/org/diylc/common/DefaultTransformer.java b/diylc/diylc-core/src/org/diylc/common/DefaultTransformer.java index 2fb771b6..ddd52da4 100644 --- a/diylc/diylc-core/src/org/diylc/common/DefaultTransformer.java +++ b/diylc/diylc-core/src/org/diylc/common/DefaultTransformer.java @@ -15,6 +15,11 @@ public class DefaultTransformer implements IComponentTransformer { public boolean canMirror(IDIYComponent component) { return false; } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } @Override public void rotate(IDIYComponent component, Point center, int direction) { diff --git a/diylc/diylc-core/src/org/diylc/common/IComponentTransformer.java b/diylc/diylc-core/src/org/diylc/common/IComponentTransformer.java index fc64ed6b..54ae59e2 100644 --- a/diylc/diylc-core/src/org/diylc/common/IComponentTransformer.java +++ b/diylc/diylc-core/src/org/diylc/common/IComponentTransformer.java @@ -15,6 +15,8 @@ public interface IComponentTransformer { boolean canRotate(IDIYComponent component); boolean canMirror(IDIYComponent component); + + boolean mirroringChangesCircuit(); void rotate(IDIYComponent component, Point center, int direction); diff --git a/diylc/diylc-core/src/org/diylc/common/SimpleComponentTransformer.java b/diylc/diylc-core/src/org/diylc/common/SimpleComponentTransformer.java index 55014b96..62b69277 100644 --- a/diylc/diylc-core/src/org/diylc/common/SimpleComponentTransformer.java +++ b/diylc/diylc-core/src/org/diylc/common/SimpleComponentTransformer.java @@ -16,6 +16,11 @@ public class SimpleComponentTransformer implements IComponentTransformer { public boolean canMirror(IDIYComponent component) { return true; } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } @Override public void rotate(IDIYComponent component, Point center, int direction) { diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 81a56064..43c2b71b 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -1185,6 +1185,7 @@ public class Presenter implements IPlugInPort { Point center = getCenterOf(components, snapToGrid); boolean canMirror = true; + boolean changesCircuit = false; for (IDIYComponent component : components) { ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom( @@ -1193,22 +1194,27 @@ public class Presenter implements IPlugInPort { canMirror = false; break; } + if (type.getTransformer() != null && type.getTransformer().mirroringChangesCircuit()) + changesCircuit = true; } if (!canMirror) if (view.showConfirmDialog("Selection contains components that cannot be mirrored. Do you want to exclude them?", "Mirror Selection", IView.YES_NO_OPTION, IView.QUESTION_MESSAGE) != IView.YES_OPTION) return; + + if (changesCircuit) + if (view.showConfirmDialog("Mirroring operation will change the circuit. Do you want to continue?", + "Mirror Selection", IView.YES_NO_OPTION, IView.QUESTION_MESSAGE) != IView.YES_OPTION) + return; for (IDIYComponent component : components) { ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom( (Class>) component.getClass()); - if (type.isStretchable() || component.getControlPointCount() == 1) { - drawingManager.invalidateComponent(component); - if (type.getTransformer() != null && type.getTransformer().canMirror(component)) { - type.getTransformer().mirror(component, center, direction); - } + drawingManager.invalidateComponent(component); + if (type.getTransformer() != null && type.getTransformer().canMirror(component)) { + type.getTransformer().mirror(component, center, direction); } } } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index c11dbefa..29166516 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/passive/PotentiometerPanel.java b/diylc/diylc-library/src/org/diylc/components/passive/PotentiometerPanel.java index ee3871a5..33bcd9c9 100644 --- a/diylc/diylc-library/src/org/diylc/components/passive/PotentiometerPanel.java +++ b/diylc/diylc-library/src/org/diylc/components/passive/PotentiometerPanel.java @@ -14,6 +14,7 @@ import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; +import org.diylc.components.transform.PotentiometerTransformer; import org.diylc.core.ComponentState; import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; @@ -28,7 +29,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Potentiometer (panel mount)", author = "Branislav Stojkovic", category = "Passive", creationMethod = CreationMethod.SINGLE_CLICK, instanceNamePrefix = "VR", - description = "Panel mount potentiometer with solder lugs", zOrder = IDIYComponent.COMPONENT, stretchable = false) + description = "Panel mount potentiometer with solder lugs", zOrder = IDIYComponent.COMPONENT, stretchable = false, + transformer = PotentiometerTransformer.class) public class PotentiometerPanel extends AbstractPotentiometer { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java index be11a591..7d62a91e 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java @@ -19,6 +19,7 @@ import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; import org.diylc.components.AbstractTransparentComponent; import org.diylc.components.misc.Label; +import org.diylc.components.transform.ICTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -34,7 +35,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "DIP IC", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "IC", description = "Dual-in-line package IC", stretchable = false, - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = ICTransformer.class) public class DIL_IC extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java index eb3e73f3..e496b06b 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java @@ -18,6 +18,7 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; import org.diylc.components.AbstractTransparentComponent; +import org.diylc.components.transform.TO92Transformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -33,7 +34,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Transistor (TO-92 package)", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "Q", description = "Transistor with small plastic or epoxy body", stretchable = false, - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO92Transformer.class) public class TransistorTO92 extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/transform/ICTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/ICTransformer.java new file mode 100644 index 00000000..e0430e0d --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/transform/ICTransformer.java @@ -0,0 +1,113 @@ +package org.diylc.components.transform; + +import java.awt.Point; +import java.awt.geom.AffineTransform; + +import org.diylc.common.IComponentTransformer; +import org.diylc.common.Orientation; +import org.diylc.components.semiconductors.DIL_IC; +import org.diylc.core.IDIYComponent; + +public class ICTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return component.getClass().equals(DIL_IC.class); + } + + @Override + public boolean canMirror(IDIYComponent component) { + return component.getClass().equals(DIL_IC.class); + } + + @Override + public boolean mirroringChangesCircuit() { + return true; + } + + @Override + public void rotate(IDIYComponent component, Point center, int direction) { + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.x, center.y); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point p = new Point(component.getControlPoint(index)); + rotate.transform(p, p); + component.setControlPoint(p, index); + } + + DIL_IC ic = (DIL_IC) component; + Orientation o = ic.getOrientation(); + int oValue = o.ordinal(); + oValue += direction; + if (oValue < 0) + oValue = Orientation.values().length - 1; + if (oValue >= Orientation.values().length) + oValue = 0; + o = Orientation.values()[oValue]; + ic.setOrientation(o); + } + + @Override + public void mirror(IDIYComponent component, Point center, int direction) { + DIL_IC ic = (DIL_IC) component; + + if (direction == IComponentTransformer.HORIZONTAL) { + int dx = 2 * (center.x - ic.getControlPoint(1).x); + int dy = 0; + Orientation o = ic.getOrientation(); + switch (o) { + case DEFAULT: + dx += ic.getControlPoint(0).x - ic.getControlPoint(ic.getControlPointCount() - 1).x; + break; + case _90: + o = Orientation._270; + dx -= 2 * (ic.getControlPoint(0).x - ic.getControlPoint(1).x); + dy -= ic.getControlPoint(0).y - ic.getControlPoint(ic.getControlPointCount() - 1).y; + break; + case _180: + dx += ic.getControlPoint(0).x - ic.getControlPoint(ic.getControlPointCount() - 1).x; + break; + case _270: + dx -= 2 * (ic.getControlPoint(0).x - ic.getControlPoint(1).x); + dy -= ic.getControlPoint(0).y - ic.getControlPoint(ic.getControlPointCount() - 1).y; + o = Orientation._90; + break; + } + + for (int i = 0; i < ic.getControlPointCount(); i++) { + Point p = ic.getControlPoint(i); + ic.setControlPoint(new Point(p.x + dx, p.y + dy), i); + } + + ic.setOrientation(o); + } else { + int dx = 0; + int dy = 2 * (center.y - ic.getControlPoint(1).y); + Orientation o = ic.getOrientation(); + switch (o) { + case DEFAULT: + dx -= ic.getControlPoint(0).x - ic.getControlPoint(ic.getControlPointCount() - 1).x; + dy -= 2 * (ic.getControlPoint(0).y - ic.getControlPoint(1).y); + o = Orientation._180; + break; + case _90: + dy += ic.getControlPoint(0).y - ic.getControlPoint(ic.getControlPointCount() - 1).y; + break; + case _180: + dx -= ic.getControlPoint(0).x - ic.getControlPoint(ic.getControlPointCount() - 1).x; + dy -= 2 * (ic.getControlPoint(0).y - ic.getControlPoint(1).y); + o = Orientation.DEFAULT; + break; + case _270: + dy += ic.getControlPoint(0).y - ic.getControlPoint(ic.getControlPointCount() - 1).y; + break; + } + + for (int i = 0; i < ic.getControlPointCount(); i++) { + Point p = ic.getControlPoint(i); + ic.setControlPoint(new Point(p.x + dx, p.y + dy), i); + } + + ic.setOrientation(o); + } + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/transform/PotentiometerTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/PotentiometerTransformer.java new file mode 100644 index 00000000..12999824 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/transform/PotentiometerTransformer.java @@ -0,0 +1,94 @@ +package org.diylc.components.transform; + +import java.awt.Point; +import java.awt.geom.AffineTransform; + +import org.diylc.common.IComponentTransformer; +import org.diylc.common.Orientation; +import org.diylc.components.passive.PotentiometerPanel; +import org.diylc.core.IDIYComponent; + +public class PotentiometerTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return component.getClass().equals(PotentiometerPanel.class); + } + + @Override + public boolean canMirror(IDIYComponent component) { + return component.getClass().equals(PotentiometerPanel.class); + } + + @Override + public boolean mirroringChangesCircuit() { + return true; + } + + @Override + public void rotate(IDIYComponent component, Point center, int direction) { + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.x, center.y); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point p = new Point(component.getControlPoint(index)); + rotate.transform(p, p); + component.setControlPoint(p, index); + } + + PotentiometerPanel potentiometer = (PotentiometerPanel) component; + Orientation o = potentiometer.getOrientation(); + int oValue = o.ordinal(); + oValue += direction; + if (oValue < 0) + oValue = Orientation.values().length - 1; + if (oValue >= Orientation.values().length) + oValue = 0; + o = Orientation.values()[oValue]; + potentiometer.setOrientation(o); + } + + @SuppressWarnings("incomplete-switch") + @Override + public void mirror(IDIYComponent component, Point center, int direction) { + PotentiometerPanel potentiometer = (PotentiometerPanel) component; + int dx = center.x - potentiometer.getControlPoint(1).x; + int dy = center.y - potentiometer.getControlPoint(1).y; + if (direction == IComponentTransformer.HORIZONTAL) { + Orientation o = potentiometer.getOrientation(); + switch (o) { + case _90: + o = Orientation._270; + break; + case _270: + o = Orientation._90; + } + + for (int i = 0; i < potentiometer.getControlPointCount(); i++) { + Point p = potentiometer.getControlPoint(i); + potentiometer + .setControlPoint( + new Point(p.x + 2 * dx, p.y + (potentiometer.getControlPoint(2).y - potentiometer.getControlPoint(0).y)), + i); + } + + potentiometer.setOrientation(o); + } else { + Orientation o = potentiometer.getOrientation(); + switch (o) { + case DEFAULT: + o = Orientation._180; + break; + case _180: + o = Orientation.DEFAULT; + } + + for (int i = 0; i < potentiometer.getControlPointCount(); i++) { + Point p = potentiometer.getControlPoint(i); + potentiometer + .setControlPoint(new Point(p.x + (potentiometer.getControlPoint(2).x - potentiometer.getControlPoint(0).x), + p.y + 2 * dy), i); + } + + potentiometer.setOrientation(o); + } + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/transform/TO92Transformer.java b/diylc/diylc-library/src/org/diylc/components/transform/TO92Transformer.java new file mode 100644 index 00000000..03b2b88b --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/transform/TO92Transformer.java @@ -0,0 +1,91 @@ +package org.diylc.components.transform; + +import java.awt.Point; +import java.awt.geom.AffineTransform; + +import org.diylc.common.IComponentTransformer; +import org.diylc.common.Orientation; +import org.diylc.components.semiconductors.TransistorTO92; +import org.diylc.core.IDIYComponent; + +public class TO92Transformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return component.getClass().equals(TransistorTO92.class); + } + + @Override + public boolean canMirror(IDIYComponent component) { + return component.getClass().equals(TransistorTO92.class); + } + + @Override + public boolean mirroringChangesCircuit() { + return true; + } + + @Override + public void rotate(IDIYComponent component, Point center, int direction) { + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.x, center.y); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point p = new Point(component.getControlPoint(index)); + rotate.transform(p, p); + component.setControlPoint(p, index); + } + + TransistorTO92 transistor = (TransistorTO92) component; + Orientation o = transistor.getOrientation(); + int oValue = o.ordinal(); + oValue += direction; + if (oValue < 0) + oValue = Orientation.values().length - 1; + if (oValue >= Orientation.values().length) + oValue = 0; + o = Orientation.values()[oValue]; + transistor.setOrientation(o); + } + + @SuppressWarnings("incomplete-switch") + @Override + public void mirror(IDIYComponent component, Point center, int direction) { + TransistorTO92 transistor = (TransistorTO92) component; + int dx = center.x - transistor.getControlPoint(1).x; + int dy = center.y - transistor.getControlPoint(1).y; + if (direction == IComponentTransformer.HORIZONTAL) { + Orientation o = transistor.getOrientation(); + switch (o) { + case DEFAULT: + o = Orientation._180; + break; + case _180: + o = Orientation.DEFAULT; + } + + for (int i = 0; i < transistor.getControlPointCount(); i++) { + Point p = transistor.getControlPoint(i); + transistor.setControlPoint( + new Point(p.x + 2 * dx, p.y + (transistor.getControlPoint(2).y - transistor.getControlPoint(0).y)), i); + } + + transistor.setOrientation(o); + } else { + Orientation o = transistor.getOrientation(); + switch (o) { + case _90: + o = Orientation._270; + break; + case _270: + o = Orientation._90; + } + + for (int i = 0; i < transistor.getControlPointCount(); i++) { + Point p = transistor.getControlPoint(i); + transistor.setControlPoint(new Point(p.x + (transistor.getControlPoint(2).x - transistor.getControlPoint(0).x), + p.y + 2 * dy), i); + } + + transistor.setOrientation(o); + } + } +} diff --git a/diylc/diylc-swing/DIYLCStarter.launch b/diylc/diylc-swing/DIYLCStarter.launch index f69b8ecc..6c49e423 100644 --- a/diylc/diylc-swing/DIYLCStarter.launch +++ b/diylc/diylc-swing/DIYLCStarter.launch @@ -8,7 +8,7 @@ - + diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index c11dbefa..29166516 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 8baa123e..07f54a5a 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java index 5dfec767..dab425d4 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java @@ -33,7 +33,6 @@ import org.diylc.common.EventType; import org.diylc.common.IComponentTransformer; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; -import org.diylc.common.ISelectionProcessor; import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; import org.diylc.core.Template; diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CommentDialog.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CommentDialog.java index 9cab229c..29df63a3 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CommentDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CommentDialog.java @@ -17,7 +17,6 @@ import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextArea; -import org.apache.log4j.Logger; import org.diylc.common.ITask; import org.diylc.core.IView; import org.diylc.plugins.cloud.model.CommentEntity; @@ -38,8 +37,6 @@ public class CommentDialog extends JDialog { private static final long serialVersionUID = 1L; - private static final Logger LOG = Logger.getLogger(CommentDialog.class); - private ProjectEntity project; private List comments;