mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-11 09:42:08 +10:00
changed control point api
This commit is contained in:
+25
-30
@@ -11,8 +11,6 @@ import java.awt.Shape;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.ControlPoint;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.utils.Constants;
|
||||
@@ -34,8 +32,8 @@ public abstract class AbstractLeadedDIYComponent<T> implements IDIYComponent<T>
|
||||
|
||||
protected Size width;
|
||||
protected Size height;
|
||||
protected Point point1 = new Point(0, 0);
|
||||
protected Point point2 = new Point((int) (Constants.GRID * 10), 0);
|
||||
protected Point[] points = new Point[] { new Point(0, 0),
|
||||
new Point((int) (Constants.GRID * 10), 0) };
|
||||
protected String name = "New Component";
|
||||
|
||||
protected AbstractLeadedDIYComponent() {
|
||||
@@ -76,25 +74,40 @@ public abstract class AbstractLeadedDIYComponent<T> implements IDIYComponent<T>
|
||||
*/
|
||||
protected abstract Color getBorderColor();
|
||||
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return points.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Point getControlPoint(int index) {
|
||||
return (Point) points[index].clone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setControlPoint(Point point, int index) {
|
||||
points[index].setLocation(point);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, Project project) {
|
||||
g2d.setColor(LEAD_COLOR);
|
||||
g2d.setStroke(new BasicStroke(1));
|
||||
double distance = point1.distance(point2);
|
||||
double distance = points[0].distance(points[1]);
|
||||
Shape shape = getComponentShape();
|
||||
Rectangle shapeRect = shape.getBounds();
|
||||
double leadLenght = (distance - shapeRect.width) / 2;
|
||||
Double theta;
|
||||
theta = Math.atan2(point2.y - point1.y, point2.x - point1.x);
|
||||
theta = Math.atan2(points[1].y - points[0].y, points[1].x - points[0].x);
|
||||
// Draw leads.
|
||||
g2d.drawLine(point1.x, point1.y, (int) (point1.x + leadLenght * Math.cos(theta)),
|
||||
(int) (point1.y + leadLenght * Math.sin(theta)));
|
||||
g2d.drawLine(point2.x, point2.y, (int) (point2.x - leadLenght * Math.cos(theta)),
|
||||
(int) (point2.y - leadLenght * Math.sin(theta)));
|
||||
g2d.drawLine(points[0].x, points[0].y, (int) (points[0].x + leadLenght * Math.cos(theta)),
|
||||
(int) (points[0].y + leadLenght * Math.sin(theta)));
|
||||
g2d.drawLine(points[1].x, points[1].y, (int) (points[1].x - leadLenght * Math.cos(theta)),
|
||||
(int) (points[1].y - leadLenght * Math.sin(theta)));
|
||||
// Transform graphics to draw the body in the right place and at the
|
||||
// right angle.
|
||||
g2d.translate((point1.x + point2.x - shapeRect.width) / 2,
|
||||
(point1.y + point2.y - shapeRect.height) / 2);
|
||||
g2d.translate((points[0].x + points[1].x - shapeRect.width) / 2,
|
||||
(points[0].y + points[1].y - shapeRect.height) / 2);
|
||||
g2d.rotate(theta, shapeRect.width / 2, shapeRect.height / 2);
|
||||
// Draw body.
|
||||
if (componentState != ComponentState.DRAGGING) {
|
||||
@@ -123,24 +136,6 @@ public abstract class AbstractLeadedDIYComponent<T> implements IDIYComponent<T>
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
|
||||
public Point getPoint1() {
|
||||
return point1;
|
||||
}
|
||||
|
||||
public void setPoint1(Point point1) {
|
||||
this.point1 = point1;
|
||||
}
|
||||
|
||||
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
|
||||
public Point getPoint2() {
|
||||
return point2;
|
||||
}
|
||||
|
||||
public void setPoint2(Point point2) {
|
||||
this.point2 = point2;
|
||||
}
|
||||
|
||||
@EditableProperty(defaultable = true)
|
||||
public Size getWidth() {
|
||||
return width;
|
||||
|
||||
+15
-12
@@ -9,9 +9,7 @@ import java.awt.geom.Rectangle2D;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.ControlPoint;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.utils.Constants;
|
||||
|
||||
@@ -48,18 +46,23 @@ public class DIL_IC implements IDIYComponent<String> {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
|
||||
public Point getPoint1() {
|
||||
return point1;
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
public void setPoint1(Point point1) {
|
||||
this.point1 = point1;
|
||||
|
||||
@Override
|
||||
public Point getControlPoint(int index) {
|
||||
return index == 0 ? point1 : point2;
|
||||
}
|
||||
|
||||
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
|
||||
public Point getPoint2() {
|
||||
return point2;
|
||||
|
||||
@Override
|
||||
public void setControlPoint(Point point, int index) {
|
||||
if (index == 0) {
|
||||
point1.setLocation(point);
|
||||
} else {
|
||||
point2.setLocation(point);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPoint2(Point point2) {
|
||||
|
||||
+13
-9
@@ -7,9 +7,7 @@ import java.awt.Point;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.ControlPoint;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Capacitance;
|
||||
import org.diylc.core.measures.CapacitanceUnit;
|
||||
@@ -19,7 +17,7 @@ import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Mock", author = "bancika", category = "Sample", instanceNamePrefix = "M", desciption = "test")
|
||||
public class MockDIYComponent implements IDIYComponent {
|
||||
public class MockDIYComponent implements IDIYComponent<Object> {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -31,8 +29,8 @@ public class MockDIYComponent implements IDIYComponent {
|
||||
private Point leftTopCorner = new Point(0, 0);
|
||||
private String name = "something";
|
||||
|
||||
public MockDIYComponent(String testField, Capacitance c, Resistance r, Size s,
|
||||
Color color, Point leftTopCorner) {
|
||||
public MockDIYComponent(String testField, Capacitance c, Resistance r, Size s, Color color,
|
||||
Point leftTopCorner) {
|
||||
super();
|
||||
this.testField = testField;
|
||||
this.c = c;
|
||||
@@ -55,13 +53,19 @@ public class MockDIYComponent implements IDIYComponent {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
|
||||
public Point getLeftTopCorner() {
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Point getControlPoint(int index) {
|
||||
return leftTopCorner;
|
||||
}
|
||||
|
||||
public void setLeftTopCorner(Point leftTopCorner) {
|
||||
this.leftTopCorner = leftTopCorner;
|
||||
@Override
|
||||
public void setControlPoint(Point point, int index) {
|
||||
leftTopCorner.setLocation(point);
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Test Field")
|
||||
|
||||
-120
@@ -1,120 +0,0 @@
|
||||
package org.diylc.common;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
|
||||
|
||||
/**
|
||||
* Entity bean that represents a control point. Has methods for reading/writing
|
||||
* {@link Point} value from/to a component.
|
||||
*
|
||||
* @author Branislav Stojkovic
|
||||
*/
|
||||
public class ControlPointWrapper {
|
||||
|
||||
private String name;
|
||||
private Point value;
|
||||
private Method setter;
|
||||
private Method getter;
|
||||
private boolean editable;
|
||||
private boolean sticky;
|
||||
private VisibilityPolicy visibilityPolicy;
|
||||
|
||||
public ControlPointWrapper(String name, Method getter, Method setter, boolean editable,
|
||||
boolean sticky, VisibilityPolicy visibilityPolicy) {
|
||||
super();
|
||||
this.name = name;
|
||||
this.getter = getter;
|
||||
this.setter = setter;
|
||||
this.editable = editable;
|
||||
this.sticky = sticky;
|
||||
this.visibilityPolicy = visibilityPolicy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads value from the specified component by invoking it's
|
||||
* <code>getter</code> method.
|
||||
*
|
||||
* @param component
|
||||
* @throws IllegalArgumentException
|
||||
* @throws IllegalAccessException
|
||||
* @throws InvocationTargetException
|
||||
*/
|
||||
public void readFrom(IDIYComponent component) throws IllegalArgumentException,
|
||||
IllegalAccessException, InvocationTargetException {
|
||||
value = (Point) getter.invoke(component);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the value into the specified component by invoking it's
|
||||
* <code>setter</code> method.
|
||||
*
|
||||
* @param component
|
||||
* @throws IllegalArgumentException
|
||||
* @throws IllegalAccessException
|
||||
* @throws InvocationTargetException
|
||||
*/
|
||||
public void writeTo(IDIYComponent component) throws IllegalArgumentException,
|
||||
IllegalAccessException, InvocationTargetException {
|
||||
setter.invoke(component, value);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public boolean isEditable() {
|
||||
return editable;
|
||||
}
|
||||
|
||||
public boolean isSticky() {
|
||||
return sticky;
|
||||
}
|
||||
|
||||
public Point getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(Point value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public VisibilityPolicy getVisibilityPolicy() {
|
||||
return visibilityPolicy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||
result = prime * result + ((value == null) ? 0 : value.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
ControlPointWrapper other = (ControlPointWrapper) obj;
|
||||
if (name == null) {
|
||||
if (other.name != null)
|
||||
return false;
|
||||
} else if (!name.equals(other.name))
|
||||
return false;
|
||||
if (value == null) {
|
||||
if (other.value != null)
|
||||
return false;
|
||||
} else if (!value.equals(other.value))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+7
-2
@@ -1,10 +1,10 @@
|
||||
package org.diylc.core;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Point;
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.ControlPoint;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
|
||||
/**
|
||||
@@ -16,7 +16,6 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
* <ul>
|
||||
* <li>Must have an empty constructor.</li>
|
||||
* <li>Class should be annotated with {@link ComponentDescriptor}.</li>
|
||||
* <li>Control point getters need to be annotated with {@link ControlPoint}.</li>
|
||||
* <li>Getters for properties editable by users should be annotated with
|
||||
* {@link EditableProperty}.</li>
|
||||
* <li>Component configuration should be stored int <code>public static</code>
|
||||
@@ -36,6 +35,12 @@ public interface IDIYComponent<T> extends Serializable {
|
||||
void setName(String name);
|
||||
|
||||
T getValue();
|
||||
|
||||
int getControlPointCount();
|
||||
|
||||
Point getControlPoint(int index);
|
||||
|
||||
void setControlPoint(Point point, int index);
|
||||
|
||||
/**
|
||||
* Draws the component onto the {@link Graphics2D}.
|
||||
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
package org.diylc.core.annotations;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
|
||||
/**
|
||||
* Annotation for control points. This annotation may be added fields of type
|
||||
* {@link Point} only when both getters and setters exist. Annotation is added
|
||||
* always on the getter and it must return {@link Point} values.
|
||||
*
|
||||
* @author Branislav Stojkovic
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface ControlPoint {
|
||||
|
||||
/**
|
||||
* Determines when should the control point be rendered on the screen.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
VisibilityPolicy visibilityPolicy() default VisibilityPolicy.ALWAYS;
|
||||
|
||||
/**
|
||||
* If true, application will allow the user to edit the control point.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
boolean editable() default true;
|
||||
|
||||
/**
|
||||
* If true, the control point may be joined with other components' control
|
||||
* points.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
boolean sticky() default true;
|
||||
}
|
||||
+1
-2
@@ -19,7 +19,6 @@ import javax.swing.SwingUtilities;
|
||||
|
||||
import org.diylc.common.BadPositionException;
|
||||
import org.diylc.common.ComponentType;
|
||||
import org.diylc.common.ControlPointWrapper;
|
||||
import org.diylc.common.EventType;
|
||||
import org.diylc.common.IPlugIn;
|
||||
import org.diylc.common.IPlugInPort;
|
||||
@@ -166,7 +165,7 @@ public class StatusBar extends JPanel implements IPlugIn {
|
||||
break;
|
||||
case AVAILABLE_CTRL_POINTS_CHANGED:
|
||||
componentsUnderCursor = new ArrayList<IDIYComponent<?>>(
|
||||
((Map<IDIYComponent<?>, ControlPointWrapper>) params[0]).keySet());
|
||||
((Map<IDIYComponent<?>, Integer>) params[0]).keySet());
|
||||
Collections.sort(componentsUnderCursor, ComparatorFactory.getInstance()
|
||||
.getComponentNameComparator());
|
||||
refreshStatusText();
|
||||
|
||||
+2
-49
@@ -1,6 +1,5 @@
|
||||
package org.diylc.presenter;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -8,10 +7,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.diylc.common.ControlPointWrapper;
|
||||
import org.diylc.common.PropertyWrapper;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.annotations.ControlPoint;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
|
||||
import com.rits.cloning.Cloner;
|
||||
@@ -28,7 +25,6 @@ public class ComponentProcessor {
|
||||
private static ComponentProcessor instance;
|
||||
|
||||
private Map<Class<?>, List<PropertyWrapper>> propertyCache;
|
||||
private Map<Class<?>, List<ControlPointWrapper>> controlPointCache;
|
||||
|
||||
private Cloner cloner;
|
||||
|
||||
@@ -43,7 +39,6 @@ public class ComponentProcessor {
|
||||
super();
|
||||
this.cloner = new Cloner();
|
||||
this.propertyCache = new HashMap<Class<?>, List<PropertyWrapper>>();
|
||||
this.controlPointCache = new HashMap<Class<?>, List<ControlPointWrapper>>();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,56 +81,14 @@ public class ComponentProcessor {
|
||||
return cloner.deepClone(properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads all control points from the specified component class. Note than
|
||||
* control points are cached, so it may happen that control points returned
|
||||
* already have their values populated. Always use
|
||||
* {@link ControlPointWrapper#readFrom(IDIYComponent)} to update their state
|
||||
* from an actual component.
|
||||
*
|
||||
* @param clazz
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<ControlPointWrapper> extractControlPoints(Class<? extends IDIYComponent> clazz) {
|
||||
if (controlPointCache.containsKey(clazz)) {
|
||||
return cloner.deepClone(controlPointCache.get(clazz));
|
||||
}
|
||||
List<ControlPointWrapper> controlPoints = new ArrayList<ControlPointWrapper>();
|
||||
for (Method method : clazz.getMethods()) {
|
||||
if (method.getName().startsWith("get")) {
|
||||
try {
|
||||
Method setter = clazz.getMethod("set" + method.getName().substring(3), method
|
||||
.getReturnType());
|
||||
if (method.isAnnotationPresent(ControlPoint.class)) {
|
||||
if (method.getReturnType().equals(Point.class)) {
|
||||
ControlPoint annotation = method.getAnnotation(ControlPoint.class);
|
||||
ControlPointWrapper controlPoint = new ControlPointWrapper(method
|
||||
.getName().substring(3), method, setter, annotation.editable(),
|
||||
annotation.sticky(), annotation.visibilityPolicy());
|
||||
controlPoints.add(controlPoint);
|
||||
} else {
|
||||
LOG.debug("Control point return type must be java.awt.Point.");
|
||||
}
|
||||
}
|
||||
} catch (NoSuchMethodException e) {
|
||||
LOG.debug("No matching setter found for \"" + method.getName()
|
||||
+ "\". Skipping...");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
controlPointCache.put(clazz, controlPoints);
|
||||
return cloner.deepClone(controlPoints);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns properties mutual for all the selected components.
|
||||
*
|
||||
* @param selectedComponents
|
||||
* @return
|
||||
*/
|
||||
public List<PropertyWrapper> getMutualSelectionProperties(List<IDIYComponent<?>> selectedComponents) {
|
||||
public List<PropertyWrapper> getMutualSelectionProperties(
|
||||
List<IDIYComponent<?>> selectedComponents) {
|
||||
if (selectedComponents.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
+43
-74
@@ -22,7 +22,6 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.Action;
|
||||
import javax.swing.Icon;
|
||||
@@ -33,7 +32,6 @@ import org.apache.log4j.Logger;
|
||||
import org.diylc.common.BadPositionException;
|
||||
import org.diylc.common.ComponentSelection;
|
||||
import org.diylc.common.ComponentType;
|
||||
import org.diylc.common.ControlPointWrapper;
|
||||
import org.diylc.common.DrawOption;
|
||||
import org.diylc.common.EventType;
|
||||
import org.diylc.common.IPlugIn;
|
||||
@@ -43,7 +41,6 @@ import org.diylc.core.ComponentLayer;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.gui.IView;
|
||||
import org.diylc.utils.Constants;
|
||||
@@ -79,7 +76,7 @@ public class Presenter implements IPlugInPort {
|
||||
private ComponentSelection selectedComponents;
|
||||
// List of components that have at least one of their control points
|
||||
// under the last recorded mouse position.
|
||||
private Map<IDIYComponent<?>, ControlPointWrapper> componentControlPointMap;
|
||||
private Map<IDIYComponent<?>, Integer> componentControlPointMap;
|
||||
|
||||
private Cloner cloner;
|
||||
|
||||
@@ -322,16 +319,13 @@ public class Presenter implements IPlugInPort {
|
||||
|
||||
// Draw control points
|
||||
if (drawOptions.contains(DrawOption.CONTROL_POINTS)) {
|
||||
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
|
||||
.extractControlPoints(component.getClass());
|
||||
for (ControlPointWrapper controlPoint : controlPoints) {
|
||||
for (int i = 0; i < component.getControlPointCount(); i++) {
|
||||
Point controlPoint = component.getControlPoint(i);
|
||||
try {
|
||||
controlPoint.readFrom(component);
|
||||
if (shouldShowControlPoint(controlPoint, component)) {
|
||||
if (shouldShowControlPointsFor(component)) {
|
||||
g2d.setColor(Constants.CONTROL_POINT_COLOR);
|
||||
g2d.setStroke(new BasicStroke(2));
|
||||
g2d.drawOval(controlPoint.getValue().x - 2,
|
||||
controlPoint.getValue().y - 2, 4, 4);
|
||||
g2d.drawOval(controlPoint.x - 2, controlPoint.y - 2, 4, 4);
|
||||
// g2d.fillOval(point.getValue().x - 2, point
|
||||
// .getValue().y - 2, 5, 5);
|
||||
}
|
||||
@@ -439,17 +433,15 @@ public class Presenter implements IPlugInPort {
|
||||
|
||||
@Override
|
||||
public void mouseMoved(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown) {
|
||||
Map<IDIYComponent<?>, ControlPointWrapper> components = new HashMap<IDIYComponent<?>, ControlPointWrapper>();
|
||||
Map<IDIYComponent<?>, Integer> components = new HashMap<IDIYComponent<?>, Integer>();
|
||||
Point scaledPoint = scalePoint(point);
|
||||
for (IDIYComponent<?> component : currentProject.getComponents()) {
|
||||
List<ControlPointWrapper> currentPoints = ComponentProcessor.getInstance()
|
||||
.extractControlPoints(component.getClass());
|
||||
for (ControlPointWrapper controlPoint : currentPoints) {
|
||||
if (shouldShowControlPoint(controlPoint, component)) {
|
||||
for (int i = 0; i < component.getControlPointCount(); i++) {
|
||||
Point controlPoint = component.getControlPoint(i);
|
||||
if (shouldShowControlPointsFor(component)) {
|
||||
try {
|
||||
controlPoint.readFrom(component);
|
||||
if (scaledPoint.distance(controlPoint.getValue()) < CONTROL_POINT_SENSITIVITY) {
|
||||
components.put(component, controlPoint);
|
||||
if (scaledPoint.distance(controlPoint) < CONTROL_POINT_SENSITIVITY) {
|
||||
components.put(component, i);
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -525,37 +517,21 @@ public class Presenter implements IPlugInPort {
|
||||
if (!componentControlPointMap.isEmpty()) {
|
||||
// We're dragging control point(s).
|
||||
IDIYComponent<?> firstComponent = componentControlPointMap.keySet().iterator().next();
|
||||
ControlPointWrapper controlPoint = componentControlPointMap.get(firstComponent);
|
||||
Point controlPoint = firstComponent.getControlPoint(componentControlPointMap
|
||||
.get(firstComponent));
|
||||
if (controlPoint == null) {
|
||||
LOG.warn("Control point not found in the map!");
|
||||
}
|
||||
// Re-read the value just in case.
|
||||
try {
|
||||
controlPoint.readFrom(firstComponent);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
int x = (int) (Math
|
||||
.round((controlPoint.getValue().x + scaledPoint.x - previousDragPoint.x)
|
||||
/ Constants.GRID) * Constants.GRID);
|
||||
int y = (int) (Math
|
||||
.round((controlPoint.getValue().y + scaledPoint.y - previousDragPoint.y)
|
||||
/ Constants.GRID) * Constants.GRID);
|
||||
int x = (int) (Math.round((controlPoint.x + scaledPoint.x - previousDragPoint.x)
|
||||
/ Constants.GRID) * Constants.GRID);
|
||||
int y = (int) (Math.round((controlPoint.y + scaledPoint.y - previousDragPoint.y)
|
||||
/ Constants.GRID) * Constants.GRID);
|
||||
previousDragPoint.setLocation(x, y);
|
||||
|
||||
for (Entry<IDIYComponent<?>, ControlPointWrapper> entry : componentControlPointMap
|
||||
.entrySet()) {
|
||||
try {
|
||||
controlPoint = entry.getValue();
|
||||
IDIYComponent<?> component = entry.getKey();
|
||||
controlPoint.readFrom(component);
|
||||
if (controlPoint.isEditable()) {
|
||||
controlPoint.getValue().setLocation(x, y);
|
||||
}
|
||||
controlPoint.writeTo(component);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
// Update all points.
|
||||
for (Map.Entry<IDIYComponent<?>, Integer> entry : componentControlPointMap.entrySet()) {
|
||||
Point p = new Point(x, y);
|
||||
entry.getKey().setControlPoint(p, entry.getValue());
|
||||
}
|
||||
// dragStartPoint = point;
|
||||
} else if (selectedComponents.isEmpty()) {
|
||||
@@ -616,26 +592,18 @@ public class Presenter implements IPlugInPort {
|
||||
int dy = (int) (Math.round((toPoint.y - fromPoint.y) / zoomLevel / Constants.GRID) * Constants.GRID);
|
||||
fromPoint.translate(dx, dy);
|
||||
for (IDIYComponent<?> component : selectedComponents) {
|
||||
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
|
||||
.extractControlPoints(component.getClass());
|
||||
for (ControlPointWrapper controlPoint : controlPoints) {
|
||||
try {
|
||||
controlPoint.readFrom(component);
|
||||
if (controlPoint.isEditable()) {
|
||||
translateControlPoint(controlPoint, dx, dy);
|
||||
}
|
||||
controlPoint.writeTo(component);
|
||||
} catch (Exception e) {
|
||||
LOG.error("Could not translate control points: " + e.getMessage());
|
||||
}
|
||||
for (int i = 0; i < component.getControlPointCount(); i++) {
|
||||
Point controlPoint = component.getControlPoint(i);
|
||||
translateControlPoint(controlPoint, dx, dy);
|
||||
component.setControlPoint(controlPoint, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void translateControlPoint(ControlPointWrapper controlPoint, int dx, int dy) {
|
||||
int x = controlPoint.getValue().x + dx;
|
||||
int y = controlPoint.getValue().y + dy;
|
||||
controlPoint.getValue().setLocation(x, y);
|
||||
private void translateControlPoint(Point controlPoint, int dx, int dy) {
|
||||
int x = controlPoint.x + dx;
|
||||
int y = controlPoint.y + dy;
|
||||
controlPoint.setLocation(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -727,19 +695,16 @@ public class Presenter implements IPlugInPort {
|
||||
// Add it to the project.
|
||||
currentProject.getComponents().add(component);
|
||||
|
||||
// Extract control points.
|
||||
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
|
||||
.extractControlPoints(componentClass);
|
||||
// Translate them to the desired location.
|
||||
if (point != null) {
|
||||
for (ControlPointWrapper controlPoint : controlPoints) {
|
||||
controlPoint.readFrom(component);
|
||||
int x = controlPoint.getValue().x + point.x;
|
||||
int y = controlPoint.getValue().y + point.y;
|
||||
for (int j = 0; j < component.getControlPointCount(); j++) {
|
||||
Point controlPoint = component.getControlPoint(j);
|
||||
int x = controlPoint.x + point.x;
|
||||
int y = controlPoint.y + point.y;
|
||||
x = (int) (Math.round(x / Constants.GRID) * Constants.GRID);
|
||||
y = (int) (Math.round(y / Constants.GRID) * Constants.GRID);
|
||||
controlPoint.getValue().setLocation(x, y);
|
||||
controlPoint.writeTo(component);
|
||||
controlPoint.setLocation(x, y);
|
||||
component.setControlPoint(controlPoint, j);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -814,9 +779,13 @@ public class Presenter implements IPlugInPort {
|
||||
(int) (point.y / zoomLevel));
|
||||
}
|
||||
|
||||
private boolean shouldShowControlPoint(ControlPointWrapper controlPoint, IDIYComponent<?> component) {
|
||||
return controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.ALWAYS)
|
||||
|| ((controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.WHEN_SELECTED)) && (getSelectedComponents()
|
||||
.contains(component)));
|
||||
private boolean shouldShowControlPointsFor(IDIYComponent<?> component) {
|
||||
return selectedComponents.contains(component);
|
||||
// return
|
||||
// controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.ALWAYS)
|
||||
// ||
|
||||
// ((controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.WHEN_SELECTED))
|
||||
// && (getSelectedComponents()
|
||||
// .contains(component)));
|
||||
}
|
||||
}
|
||||
|
||||
-10
@@ -5,10 +5,8 @@ import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.diylc.common.ControlPointWrapper;
|
||||
import org.diylc.common.PropertyWrapper;
|
||||
import org.diylc.components.MockDIYComponent;
|
||||
import org.diylc.presenter.ComponentProcessor;
|
||||
import org.junit.Test;
|
||||
|
||||
|
||||
@@ -21,12 +19,4 @@ public class ClassProcessorTest {
|
||||
assertNotNull(properties);
|
||||
assertEquals(4, properties.size());
|
||||
};
|
||||
|
||||
@Test
|
||||
public void testExtractControlPoints() {
|
||||
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
|
||||
.extractControlPoints(MockDIYComponent.class);
|
||||
assertNotNull(controlPoints);
|
||||
assertEquals(1, controlPoints.size());
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user