]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/AbstractVTKNodeMap.java
Use generics type variable for mapping db object.
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / common / AbstractVTKNodeMap.java
index d9b754b45e115bb0f7be78fc6c3f56c327abae37..953ef198b2d43cbbd18c7f7285596fffaf88935c 100644 (file)
@@ -48,12 +48,12 @@ import org.simantics.utils.ui.ExceptionUtils;
 
 import vtk.vtkProp;
 
-public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<E>, IMappingListener, RenderListener, NodeListener, UndoRedoSupport.ChangeListener{
+public abstract class AbstractVTKNodeMap<DBObject,E extends INode> implements VTKNodeMap<DBObject,E>, IMappingListener, RenderListener, NodeListener, UndoRedoSupport.ChangeListener{
 
        private static final boolean DEBUG = false;
        
        protected Session session;
-       protected IMapping<Object,E> mapping;
+       protected IMapping<DBObject,E> mapping;
        protected VtkView view;
        
        protected MapList<E, vtkProp> nodeToActor = new MapList<E, vtkProp>();
@@ -66,7 +66,7 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
        protected int redoOpCount = 0;
        protected boolean runUndo = false;
        protected boolean runRedo = false;
-       public AbstractVTKNodeMap(Session session, IMapping<Object,E> mapping, VtkView view, ParentNode<E> rootNode) {
+       public AbstractVTKNodeMap(Session session, IMapping<DBObject,E> mapping, VtkView view, ParentNode<E> rootNode) {
                this.session = session;
                this.mapping = mapping;
                this.view = view;
@@ -143,6 +143,10 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
 
        private boolean rangeModified = false;
        
+       public boolean isRangeModified() {
+        return rangeModified;
+    }
+       
        @Override
        public void onChanged() {
                try {
@@ -317,10 +321,11 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
        
        protected void reset(ReadGraph graph) throws MappingException {
                if (DEBUG) System.out.println("Reset");
+               
                synchronized (syncMutex) {
                        graphUpdates = true;
                        mapping.getRangeModified().clear();
-                       for (Object o : mapping.getDomain())
+                       for (DBObject o : mapping.getDomain())
                                mapping.domainModified(o);
                        mapping.updateRange(graph);
                        graphModified.clear();
@@ -337,7 +342,7 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
                } else {
                        synchronized (syncMutex) {
                                graphUpdates = true;
-                               for (Object domainObject : mapping.getDomainModified()) {
+                               for (DBObject domainObject : mapping.getDomainModified()) {
                                        E rangeObject = mapping.get(domainObject);
                                        if (rangeObject != null)
                                                graphModified.add(rangeObject);
@@ -428,6 +433,16 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
                return n + "@" + Integer.toHexString(n.hashCode());
        }
        
+       protected boolean filterChange(List<Pair<E,String>> list,E n) {
+           for (int i = list.size()-1; i >= 0; i--) {
+            if (list.get(i).first == n) {
+                list.remove(i);
+                return true;
+            }
+        }
+           return false;
+       }
+       
        @SuppressWarnings("unchecked")
        protected void updateCycle() {
                rem.clear();
@@ -437,18 +452,19 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
                
                
                synchronized (syncMutex) {
-                   // Check for overlapping additions and deletions, prevent deleting objects that are also added.
+                   // Check for overlapping additions and deletions, prevent deleting objects that are also added and vice versa.
                    Deque<E> stack = new ArrayDeque<E>();
                for (Pair<E, String> n : added) {
                    stack.add(n.first);
                }
                while (!stack.isEmpty()) {
                    E n = stack.pop();
-                   for (int i = removed.size()-1; i >= 0; i--) {
-                       if (removed.get(i).first == n) {
-                           removed.remove(i);
-                           break;
-                       }
+                   boolean conflict = filterChange(removed, n);
+                   if (conflict) {
+                       System.out.println("Prevent removing " + n);
+                       //filterChange(added, n)
+                       if (filterChange(added, n))
+                           System.out.println("Prevent adding " + n);
                    }
                    if (n instanceof ParentNode) {
                        ParentNode<INode> pn = (ParentNode<INode>)n;
@@ -649,7 +665,7 @@ public abstract class AbstractVTKNodeMap<E extends INode> implements VTKNodeMap<
                
        }
        
-       public IMapping<Object,E> getMapping() {
+       public IMapping<DBObject,E> getMapping() {
                return mapping;
        }