]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/Selection.java
Render elements using custom color filters
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / Selection.java
index c7aa7872da2a7e21d94f80ed4e411f4d91fa0c49..ebdbdfa74a714cf99eb424e14e44b5fa8423db4c 100644 (file)
@@ -16,14 +16,18 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;
 import org.simantics.g2d.diagram.DiagramHints;
 import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.element.ElementClass;
 import org.simantics.g2d.element.IElement;
+import org.simantics.g2d.element.handler.ElementLayers;
+import org.simantics.g2d.layers.ILayers;
 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.events.command.Commands;
@@ -62,7 +66,7 @@ public class Selection extends AbstractCanvasParticipant {
         if (e.command.equals( Commands.SELECT_ALL )) {
             IDiagram d = getHint( DiagramHints.KEY_DIAGRAM );
             if (d==null) return true;
-            addAll(0, d.getElements());
+            addAll(0, filterSelectionByLayers(d, d.getElements()));
             return true;
         }
         if (e.command.equals( Commands.INVERT_SELECTION )) {
@@ -71,12 +75,28 @@ public class Selection extends AbstractCanvasParticipant {
             Set<IElement> current = getSelection(0);
             Set<IElement> inverted = new HashSet<IElement>(d.getElements());
             inverted.removeAll(current);
-            setSelection(0, inverted);
+            setSelection(0, filterSelectionByLayers(d, inverted));
             return true;
         }
         return false;
     }
 
+    private static Collection<IElement> filterSelectionByLayers(IDiagram diagram, Collection<IElement> elements) {
+        ILayers layers = diagram.getHint(DiagramHints.KEY_LAYERS);
+        if (layers != null && !layers.getIgnoreFocusSettings()) {
+            List<IElement> filteredElements = new ArrayList<IElement>();
+            for (IElement element : elements) {
+                ElementClass ec = element.getElementClass();
+                ElementLayers el = ec.getAtMostOneItemOfClass(ElementLayers.class);
+                if (el == null || el.isFocusable(element, layers)) {
+                    filteredElements.add(element);
+                }
+            }
+            return filteredElements;
+        } else {
+            return elements;
+        }
+    }
 
     /**
      * Get selection