]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java
Customisable selection padding on diagrams
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / ElementPainter.java
index d69ef69c69fadec257a3e07e2fc31a600cd5ed15..ba575c630ffb1aff08024fe8e482d2f5423c8116 100644 (file)
@@ -91,6 +91,7 @@ import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
 import org.simantics.scenegraph.g2d.nodes.UnboundedNode;
 import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;
 import org.simantics.scenegraph.utils.ColorUtil;
+import org.simantics.scenegraph.utils.GeometryUtils;
 import org.simantics.scenegraph.utils.NodeUtil;
 import org.simantics.utils.datastructures.collections.CollectionUtils;
 import org.simantics.utils.datastructures.hints.HintListenerAdapter;
@@ -558,6 +559,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             if (holder == null) {
                 holder = parentNode.addNode(ElementUtils.generateNodeId(e), ConnectionNode.class);
                 holder.setKey(e.getHint(ElementHints.KEY_OBJECT));
+                holder.setTypeClass(e.getHint(ElementHints.KEY_TYPE_CLASS));
                 holder.setTransferableProvider(new ElementTransferableProvider(getContext(), e));
                 e.setHint(sgKey, holder);
                 holder.setZIndex(parentNode.getNodeCount() + 1);
@@ -569,6 +571,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             if (holder == null) {
                 holder = parentNode.addNode(ElementUtils.generateNodeId(e), SingleElementNode.class);
                 holder.setKey(e.getHint(ElementHints.KEY_OBJECT));
+                holder.setTypeClass(e.getHint(ElementHints.KEY_TYPE_CLASS));
                 holder.setTransferableProvider(new ElementTransferableProvider(getContext(), e));
                 e.setHint(sgKey, holder);
                 holder.setZIndex(parentNode.getNodeCount() + 1);
@@ -1012,8 +1015,12 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         Shape shape = ElementUtils.getElementShapeOrBounds(e);
         Rectangle2D bounds = shape.getBounds2D();
         //System.out.println("selection bounds: "+bounds);
-        final double margin = 1;
-        bounds.setFrame(bounds.getMinX() - margin, bounds.getMinY() - margin, bounds.getWidth() + 2*margin, bounds.getHeight() + 2*margin);
+        
+        Point2D scale = GeometryUtils.getScale2D(selectionTransform);
+        final double marginX = Math.abs(scale.getX()) > 1e-10 ? 1 / scale.getX() : 1;
+        final double marginY = Math.abs(scale.getY()) > 1e-10 ? 1 / scale.getY() : 1;
+        
+        bounds.setFrame(bounds.getMinX() - marginX, bounds.getMinY() - marginY, bounds.getWidth() + 2*marginX, bounds.getHeight() + 2*marginY);
 
         List<SelectionSpecification> ss = e.getElementClass().getItemsByClass(SelectionSpecification.class);
         if (!ss.isEmpty()) {
@@ -1083,6 +1090,9 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         } else {
             SelectionNode s = selectionNode.getOrCreateNode(getNodeId("shape", e), SelectionNode.class);
             s.init(selectionTransform, bounds, color);
+            Double paddingFactor = diagram.getHint(DiagramHints.SELECTION_PADDING_SCALE_FACTOR);
+            if (paddingFactor != null)
+                s.setPaddingFactor(paddingFactor);
         }
     }