[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