From 1268f83f5e44edc9389eefd4494fd64f259272d3 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Tue, 25 Dec 2018 23:47:44 +0100 Subject: [PATCH] Rotate commands now apply to "Label" and "PCB Text" components --- .../src/org/diylc/components/misc/Label.java | 5 +- .../org/diylc/components/misc/PCBText.java | 5 +- .../components/transform/TextTransformer.java | 84 ++++++++++++++++++ diylc/diylc-swing/library/main.jar | Bin 453049 -> 454684 bytes diylc/diylc-swing/update.xml | 6 +- 5 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/transform/TextTransformer.java diff --git a/diylc/diylc-library/src/org/diylc/components/misc/Label.java b/diylc/diylc-library/src/org/diylc/components/misc/Label.java index 5ab0f8f0..b7cecc42 100644 --- a/diylc/diylc-library/src/org/diylc/components/misc/Label.java +++ b/diylc/diylc-library/src/org/diylc/components/misc/Label.java @@ -27,11 +27,12 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.geom.Rectangle2D; - + import org.diylc.common.HorizontalAlignment; import org.diylc.common.Orientation; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractComponent; +import org.diylc.components.transform.TextTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -43,7 +44,7 @@ import org.diylc.core.annotations.EditableProperty; @ComponentDescriptor(name = "Label", author = "Branislav Stojkovic", category = "Misc", description = "User defined label", instanceNamePrefix = "L", zOrder = IDIYComponent.TEXT, flexibleZOrder = true, - stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW) + stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW, transformer = TextTransformer.class) public class Label extends AbstractComponent { public static String DEFAULT_TEXT = "Double click to edit text"; diff --git a/diylc/diylc-library/src/org/diylc/components/misc/PCBText.java b/diylc/diylc-library/src/org/diylc/components/misc/PCBText.java index 364efe48..6db690fb 100644 --- a/diylc/diylc-library/src/org/diylc/components/misc/PCBText.java +++ b/diylc/diylc-library/src/org/diylc/components/misc/PCBText.java @@ -28,11 +28,12 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; - + import org.diylc.common.HorizontalAlignment; import org.diylc.common.Orientation; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractComponent; +import org.diylc.components.transform.TextTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -44,7 +45,7 @@ import org.diylc.core.annotations.EditableProperty; @ComponentDescriptor(name = "PCB Text", author = "Branislav Stojkovic", category = "Misc", description = "Mirrored text for PCB artwork", instanceNamePrefix = "L", zOrder = IDIYComponent.TRACE, - flexibleZOrder = false, stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW) + flexibleZOrder = false, stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW, transformer = TextTransformer.class) public class PCBText extends AbstractComponent { public static String DEFAULT_TEXT = "Double click to edit text"; diff --git a/diylc/diylc-library/src/org/diylc/components/transform/TextTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/TextTransformer.java new file mode 100644 index 00000000..812325e1 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/transform/TextTransformer.java @@ -0,0 +1,84 @@ +/* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +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.misc.Label; +import org.diylc.components.misc.PCBText; +import org.diylc.core.IDIYComponent; + +public class TextTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return component.getClass().equals(Label.class) || component.getClass().equals(PCBText.class); + } + + @Override + public boolean canMirror(IDIYComponent component) { + return false; + } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } + + @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); + } + + if (component instanceof Label) { + Label snap = (Label) component; + Orientation o = snap.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]; + snap.setOrientation(o); + } else if (component instanceof PCBText) { + PCBText snap = (PCBText) component; + Orientation o = snap.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]; + snap.setOrientation(o); + } + } + + @Override + public void mirror(IDIYComponent component, Point center, int direction) { + throw new RuntimeException("Unexpected call to mirror() in LabelTransformer"); + } +} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 061800364a5b48befa396c51213acab16ec9a956..f7929d68145ef377e39e44640fdf87c69eb4960c 100644 GIT binary patch delta 17702 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 q{|%pduS4MvxbQiC1cPy(>HK9o$X IMPROVEMENT - Vastly improve performance of selection aree calculations, especially with bigger layouts + Faster click and popup menu response due to improved performance of selection area calculations, especially with bigger layouts IMPROVEMENT @@ -2050,6 +2050,10 @@ IMPROVEMENT Better error handing in V2 file importer + + IMPROVEMENT + Rotate commands now apply to "Label" and "PCB Text" components + BUG_FIX Clicking on a building block in the component tree sometimes makes the components go back to the top-left corner of the layout