[udig-devel] ellipsetool patch
Piebe de Vries
piebe.de.vries at geodan.nl
Mon Jan 7 02:29:33 PST 2008
Hi,
I thought that somebody might be interested in the attached patch (for
RC12). It changes the ellipseTool such that the first click is the
centre of the ellipse (instead of a non existing corner). Resulting in
a, for many users, more intuitive interface.
Furthermore when the shift key is pushed then a circle is drawn instead
of an ellipse (or a square instead of a rectangle). Warning: with this
last part of the code is platform specific (Windows) and the shift key
is only detected at the start of drawing the geometry. If anybody has a
suggestion to improve this...
greetings,
Piebe
--
--------------------------- ----------------------------
Piebe de Vries piebe.de.vries at geodan.nl
Geodan IT b.v. Tel: +31 (0)73 - 6925 151
President Kennedylaan 1 Fax: +31 (0)73 - 5711 333
1079 MB Amsterdam (NL) http://www.geodan.nl
--------------------------- ----------------------------
-------------- next part --------------
Index: src/net/refractions/udig/tools/edit/behaviour/ShapeCreationBehaviour.java
===================================================================
--- src/net/refractions/udig/tools/edit/behaviour/ShapeCreationBehaviour.java (revision 27805)
+++ src/net/refractions/udig/tools/edit/behaviour/ShapeCreationBehaviour.java (working copy)
@@ -44,19 +44,19 @@
import com.vividsolutions.jts.geom.MultiLineString;
/**
- * <p>Requirements:
- * <ul>
+ * <p>Requirements:
+ * <ul>
* <li>Mouse Dragged</li>
* <li>CurrentState == NONE</li>
* <li>Mouse button 1 down</li>
- * </ul>
- * </p>
- * <p>Action:
- * <ul>
+ * </ul>
+ * </p>
+ * <p>Action:
+ * <ul>
* <li>draws a shape as the mouse is dragged</li>
* <li>creates a feature on the current layer when mouse is released</li>
- * </ul>
- * </p>
+ * </ul>
+ * </p>
* @author jones
* @since 1.1.0
*/
@@ -69,7 +69,8 @@
* @since 1.1.0
*/
public static abstract class ShapeFactory {
- /**
+ protected boolean middleAsOrigin = false;
+ /**
* Creates a GeneralPath with the top left corner at 0,0 and
* a total width and height as indicated
*
@@ -79,11 +80,18 @@
* a total width and height as indicated
*/
public abstract GeneralPath create(int width, int height);
+ public boolean useMiddleAsOrigin() {
+ return middleAsOrigin;
+ }
+ public void setMiddleAsOrigin(boolean middleAsOrigin) {
+ this.middleAsOrigin = middleAsOrigin;
+ }
}
private ShapeFactory factory;
private GeneralPath path;
private DrawShapeCommand drawCommand;
+
/**
* @param factory
@@ -101,7 +109,7 @@
return !e.modifiersDown() && legalState && e.buttons==MapMouseEvent.BUTTON1 && eventType==EventType.DRAGGED;
}
-
+
public UndoableMapCommand getCommand( EditToolHandler handler, MapMouseEvent e,
EventType eventType ) {
if( path==null ){
@@ -110,11 +118,34 @@
handler.lock(this);
}
MouseTracker tracker=handler.getMouseTracker();
- int translationX=Math.min(tracker.getDragStarted().getX(), e.x);
- int translationY=Math.min(tracker.getDragStarted().getY(), e.y);
+ int translationX;
+ int translationY;
+ if (factory.useMiddleAsOrigin())
+ {
+ translationX=tracker.getDragStarted().getX();
+ translationY=tracker.getDragStarted().getY();
+ }
+ else
+ {
+ translationX=Math.min(tracker.getDragStarted().getX(), e.x);
+ translationY=Math.min(tracker.getDragStarted().getY(), e.y);
+ }
int scaleX=Math.abs(tracker.getDragStarted().getX()-e.x);
int scaleY=Math.abs(tracker.getDragStarted().getY()-e.y);
+ //force square/circle if shift is activated
+ if (org.eclipse.swt.internal.win32.OS.GetKeyState(org.eclipse.swt.internal.win32.OS.VK_SHIFT) != 0) //TODO: This is windows specific, how to do this cross-platform?
+ {
+ if (scaleX > scaleY)
+ {
+ scaleY = scaleX;
+ }
+ else
+ {
+ scaleX = scaleY;
+ }
+ }
+
AffineTransform transform=AffineTransform.getTranslateInstance(translationX, translationY);
transform.scale(scaleX, scaleY);
Shape transformedShape = path.createTransformedShape(transform);
Index: src/net/refractions/udig/tools/edit/impl/EllipseTool.java
===================================================================
--- src/net/refractions/udig/tools/edit/impl/EllipseTool.java (revision 27805)
+++ src/net/refractions/udig/tools/edit/impl/EllipseTool.java (working copy)
@@ -29,15 +29,15 @@
public class EllipseTool extends RectangleTool {
@Override
protected ShapeFactory getShapeFactory() {
- return new ShapeCreationBehaviour.ShapeFactory(){
-
+ ShapeFactory ret = new ShapeCreationBehaviour.ShapeFactory() {
@Override
public GeneralPath create(int width, int height) {
GeneralPath path=new GeneralPath();
- path.append(new Ellipse2D.Float(0,0,width, height), false);
+ path.append(new Ellipse2D.Float(-width, -height,2*width, 2*height), false);
return path;
}
-
};
+ ret.setMiddleAsOrigin(true);
+ return ret;
}
}
More information about the udig-devel
mailing list