ctrl to unstuck components

This commit is contained in:
bancika
2011-01-20 20:33:42 +00:00
parent e0fd55c374
commit 2309e80edc
7 changed files with 85 additions and 52 deletions
@@ -20,6 +20,7 @@ import java.util.Set;
import org.diylc.common.ComponentSelection;
import org.diylc.common.DrawOption;
import org.diylc.common.EventType;
import org.diylc.common.GridType;
import org.diylc.common.IComponentFiler;
import org.diylc.core.ComponentState;
@@ -29,6 +30,7 @@ import org.diylc.core.VisibilityPolicy;
import org.diylc.utils.Constants;
import com.diyfever.gui.miscutils.ConfigurationManager;
import com.diyfever.gui.simplemq.MessageDispatcher;
/**
* Utility that deals with painting {@link Project} on the {@link Graphics2D}
@@ -36,10 +38,12 @@ import com.diyfever.gui.miscutils.ConfigurationManager;
*
* @author Branislav Stojkovic
*/
public class ProjectPainter {
public class DrawingManager {
public static int CONTROL_POINT_SIZE = 7;
public static final int CONTROL_POINT_SIZE = 7;
public static final String ANTIALIASING_KEY = "anti-aliasing";
public static final String ZOOM_KEY = "zoom";
public static boolean DEBUG_COMPONENT_AREAS = false;
public static Color GRID_COLOR = new Color(240, 240, 240);
@@ -54,8 +58,14 @@ public class ProjectPainter {
private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);
public ProjectPainter() {
private double zoomLevel = 1d;// ConfigurationManager.getInstance().readDouble(ZOOM_KEY,
// 1d);
private MessageDispatcher<EventType> messageDispatcher;
public DrawingManager(MessageDispatcher<EventType> messageDispatcher) {
super();
this.messageDispatcher = messageDispatcher;
componentAreaMap = new HashMap<IDIYComponent<?>, Area>();
lastDrawnStateMap = new HashMap<IDIYComponent<?>, ComponentState>();
}
@@ -63,7 +73,7 @@ public class ProjectPainter {
public void drawProject(Graphics2D g2d, Project project, Set<DrawOption> drawOptions,
IComponentFiler filter, Rectangle selectionRect, ComponentSelection selectedComponents,
Set<IDIYComponent<?>> groupedComponents, List<Point> controlPointSlot,
IDIYComponent<?> componentSlot, boolean dragInProgress, double zoomLevel) {
IDIYComponent<?> componentSlot, boolean dragInProgress) {
if (project == null) {
return;
}
@@ -247,6 +257,16 @@ public class ProjectPainter {
}
}
public double getZoomLevel() {
return zoomLevel;
}
public void setZoomLevel(double zoomLevel) {
this.zoomLevel = zoomLevel;
fireZoomChanged();
// ConfigurationManager.getInstance().writeValue(ZOOM_KEY, zoomLevel);
}
public void invalidateComponent(IDIYComponent<?> component) {
componentAreaMap.remove(component);
lastDrawnStateMap.remove(component);
@@ -290,4 +310,9 @@ public class ProjectPainter {
}
return new Dimension((int) width, (int) height);
}
public void fireZoomChanged() {
messageDispatcher.dispatchMessage(EventType.ZOOM_CHANGED, zoomLevel);
messageDispatcher.dispatchMessage(EventType.REPAINT);
}
}
@@ -60,11 +60,9 @@ public class Presenter implements IPlugInPort {
public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 0, 1);
public static final String DEFAULTS_KEY_PREFIX = "default.";
public static final String METRIC_KEY = "metric";
public static final String ZOOM_KEY = "zoom";
public static final int ICON_SIZE = 32;
private double zoomLevel = ConfigurationManager.getInstance().readDouble(ZOOM_KEY, 1d);
private Project currentProject;
private Map<String, List<ComponentType>> componentTypes;
// Maps component class names to ComponentType objects.
@@ -78,7 +76,7 @@ public class Presenter implements IPlugInPort {
// Utilities
private Cloner cloner;
private ProjectPainter projectPainter;
private DrawingManager drawingManager;
private ProjectFileManager projectFileManager;
private Rectangle selectionRect;
@@ -113,7 +111,7 @@ public class Presenter implements IPlugInPort {
selectedComponents = new ComponentSelection();
currentProject = new Project();
cloner = new Cloner();
projectPainter = new ProjectPainter();
drawingManager = new DrawingManager(messageDispatcher);
projectFileManager = new ProjectFileManager(messageDispatcher);
// lockedLayers = EnumSet.noneOf(ComponentLayer.class);
@@ -142,19 +140,16 @@ public class Presenter implements IPlugInPort {
@Override
public double getZoomLevel() {
return zoomLevel;
return drawingManager.getZoomLevel();
}
@Override
public void setZoomLevel(double zoomLevel) {
LOG.info(String.format("setZoomLevel(%s)", zoomLevel));
if (this.zoomLevel == zoomLevel) {
if (drawingManager.getZoomLevel() == zoomLevel) {
return;
}
this.zoomLevel = zoomLevel;
ConfigurationManager.getInstance().writeValue(ZOOM_KEY, zoomLevel);
messageDispatcher.dispatchMessage(EventType.ZOOM_CHANGED, zoomLevel);
messageDispatcher.dispatchMessage(EventType.REPAINT);
drawingManager.setZoomLevel(zoomLevel);
}
@Override
@@ -163,7 +158,7 @@ public class Presenter implements IPlugInPort {
if (componentTypeSlot == null) {
// Scale point to remove zoom factor.
Point2D scaledPoint = scalePoint(point);
if (projectPainter.isCursorOverArea(scaledPoint)) {
if (drawingManager.isCursorOverArea(scaledPoint)) {
return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
}
if (controlPointMap != null && !controlPointMap.isEmpty()) {
@@ -175,7 +170,8 @@ public class Presenter implements IPlugInPort {
@Override
public Dimension getCanvasDimensions(boolean useZoom) {
return projectPainter.getCanvasDimensions(currentProject, zoomLevel, useZoom);
return drawingManager.getCanvasDimensions(currentProject, drawingManager.getZoomLevel(),
useZoom);
}
@Override
@@ -302,9 +298,9 @@ public class Presenter implements IPlugInPort {
} else {
componentSlotToDraw = componentSlot;
}
projectPainter.drawProject(g2d, currentProject, drawOptions, filter, selectionRect,
drawingManager.drawProject(g2d, currentProject, drawOptions, filter, selectionRect,
selectedComponents, groupedComponents, Arrays.asList(controlPointSlot,
potentialControlPoint), componentSlotToDraw, dragInProgress, zoomLevel);
potentialControlPoint), componentSlotToDraw, dragInProgress);
}
@Override
@@ -334,7 +330,7 @@ public class Presenter implements IPlugInPort {
* @return
*/
private List<IDIYComponent<?>> findComponentsAt(Point point) {
return projectPainter.findComponentsAt(point, currentProject);
return drawingManager.findComponentsAt(point, currentProject);
}
@Override
@@ -495,7 +491,7 @@ public class Presenter implements IPlugInPort {
if (selectedComponents.contains(component) && componentType.isStretchable()
&& findAllGroupedComponents(component).size() == 1) {
try {
if (scaledPoint.distance(controlPoint) < ProjectPainter.CONTROL_POINT_SIZE) {
if (scaledPoint.distance(controlPoint) < DrawingManager.CONTROL_POINT_SIZE) {
Set<Integer> indices = new HashSet<Integer>();
if (componentType.isStretchable()) {
indices.add(pointIndex);
@@ -553,7 +549,7 @@ public class Presenter implements IPlugInPort {
}
@Override
public void dragStarted(Point point) {
public void dragStarted(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown) {
LOG.debug(String.format("dragStarted(%s)", point));
dragInProgress = true;
preDragProject = cloner.deepClone(currentProject);
@@ -607,7 +603,9 @@ public class Presenter implements IPlugInPort {
}
}
// Expand control points to include all stuck components.
includeStuckComponents(controlPointMap);
if (!ctrlDown) {
includeStuckComponents(controlPointMap);
}
}
}
@@ -643,7 +641,7 @@ public class Presenter implements IPlugInPort {
Point secondPoint = entry.getKey().getControlPoint(j);
// If they are close enough we can consider them
// matched.
if (firstPoint.distance(secondPoint) < ProjectPainter.CONTROL_POINT_SIZE) {
if (firstPoint.distance(secondPoint) < DrawingManager.CONTROL_POINT_SIZE) {
componentMatches = true;
break;
}
@@ -724,7 +722,7 @@ public class Presenter implements IPlugInPort {
// Update all points.
for (Map.Entry<IDIYComponent<?>, Set<Integer>> entry : controlPointMap.entrySet()) {
IDIYComponent<?> c = entry.getKey();
projectPainter.invalidateComponent(c);
drawingManager.invalidateComponent(c);
for (Integer index : entry.getValue()) {
Point p = new Point(c.getControlPoint(index));
p.translate(dx, dy);
@@ -786,7 +784,7 @@ public class Presenter implements IPlugInPort {
}
selectedComponents.clear();
for (IDIYComponent<?> component : currentProject.getComponents()) {
Area area = projectPainter.getComponentArea(component);
Area area = drawingManager.getComponentArea(component);
if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) {
selectedComponents.addAll(findAllGroupedComponents(component));
}
@@ -844,7 +842,7 @@ public class Presenter implements IPlugInPort {
ungroupComponents(selectedComponents);
// Remove from area map.
for (IDIYComponent<?> component : selectedComponents) {
projectPainter.invalidateComponent(component);
drawingManager.invalidateComponent(component);
}
currentProject.getComponents().removeAll(selectedComponents);
this.selectedComponents.clear();
@@ -978,7 +976,7 @@ public class Presenter implements IPlugInPort {
boolean metric = ConfigurationManager.getInstance().readBoolean(METRIC_KEY, true);
Area area = new Area();
for (IDIYComponent<?> component : selectedComponents) {
Area componentArea = projectPainter.getComponentArea(component);
Area componentArea = drawingManager.getComponentArea(component);
if (componentArea != null) {
area.add(componentArea);
}
@@ -1097,7 +1095,7 @@ public class Presenter implements IPlugInPort {
Project oldProject = cloner.deepClone(currentProject);
try {
for (IDIYComponent<?> component : selectedComponents) {
projectPainter.invalidateComponent(component);
drawingManager.invalidateComponent(component);
for (PropertyWrapper property : properties) {
property.writeTo(component);
}
@@ -1155,8 +1153,7 @@ public class Presenter implements IPlugInPort {
.deepClone(currentProject), "Edit Project");
projectFileManager.notifyFileChange();
}
messageDispatcher.dispatchMessage(EventType.REPAINT);
messageDispatcher.dispatchMessage(EventType.ZOOM_CHANGED, zoomLevel);
drawingManager.fireZoomChanged();
}
}
@@ -1202,7 +1199,7 @@ public class Presenter implements IPlugInPort {
* @return
*/
private Point scalePoint(Point point) {
return point == null ? null : new Point((int) (point.x / zoomLevel),
(int) (point.y / zoomLevel));
return point == null ? null : new Point((int) (point.x / drawingManager.getZoomLevel()),
(int) (point.y / drawingManager.getZoomLevel()));
}
}