]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/PipelineComponent.java
Clear removed objects from mapping cache
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / PipelineComponent.java
index 26a3239700657c78aa7085c14332dc1ecac7ac61..36c6dde1b77e0667b50b1f7a6be4cb7f4f395c6f 100644 (file)
@@ -88,7 +88,10 @@ public abstract class PipelineComponent extends GeometryNode {
        public void setNext(PipelineComponent comp) {
                if (next == comp)
                        return;
+               if (comp == null)
+            this.next._removeRef(this);
                this.next = comp;
+               this.syncnext = false;
                syncNext();
                firePropertyChanged(Plant3D.URIs.HasNext);
                if (comp != null)
@@ -106,8 +109,11 @@ public abstract class PipelineComponent extends GeometryNode {
        public void setPrevious(PipelineComponent comp) {
                if (previous == comp)
                        return;
+               if (comp == null)
+                   this.previous._removeRef(this);
                this.previous = comp;
-               
+               this.syncprev = false;
+               syncPrevious();
                firePropertyChanged(Plant3D.URIs.HasPrevious);
                if (comp != null)
                        comp.sync();
@@ -124,7 +130,10 @@ public abstract class PipelineComponent extends GeometryNode {
        public void setBranch0(PipelineComponent comp) {
                if (branch0 == comp)
                        return;
+               if (comp == null)
+            this.branch0._removeRef(this);
                this.branch0 = comp;
+               this.syncbr0 = false;
                syncBranch0();
                firePropertyChanged(Plant3D.URIs.HasBranch0);
                if (comp != null)
@@ -132,8 +141,29 @@ public abstract class PipelineComponent extends GeometryNode {
 //             System.out.println(this + " next " + comp);
        }
 
+       @GetPropertyValue(name="Previous",tabId="Debug",value=Plant3D.URIs.HasPrevious)
+    public String getPreviousDebug() {
+        if (previous == null)
+            return null;
+        return previous.getName();
+    }
+    
+    @GetPropertyValue(name="Next",tabId="Debug",value=Plant3D.URIs.HasNext)
+    public String getNextDebug() {
+        if (next == null)
+            return null;
+        return next.getName();
+    }
+    
+       @GetPropertyValue(name="Branch0",tabId="Debug",value=Plant3D.URIs.HasBranch0)
+    public String getBR0Debug() {
+        if (branch0 == null)
+            return null;
+        return branch0.getName();
+    }
 
        
+       
        private PipeControlPoint getBranchPoint() {
                PipeControlPoint branchPoint;
                if (getControlPoint().getSubPoint().size() > 0) {
@@ -182,28 +212,56 @@ public abstract class PipelineComponent extends GeometryNode {
                return true;
        }
        
+       // When link to a component is removed, also link to the other direction must be removed at the same time, or
+       // Control point structure is left into illegal state.
+       private void _removeRef(PipelineComponent comp) {
+           if (next == comp) {
+               next = null;
+               syncnext = false;
+            syncNext();
+           } else if (previous == comp) {
+               previous = null;
+               syncprev = false;
+            syncPrevious();
+           } else if (branch0 == comp) {
+               branch0 = null;
+               syncbr0 = false;
+               syncBranch0();
+           }
+       }
+       
+       boolean syncnext = false;
+    private void syncNext() {
+        if (syncnext)
+            return;
+        syncnext = _syncNext();
+    }
        
        
-       private boolean syncNext() {
-               
-               if (getControlPoint() != null) {
+       private boolean _syncNext() {
+           PipeControlPoint pcp = getControlPoint();
+               if (pcp != null) {
+                   
                        if (next != null ) {
-                               if (next.getControlPoint() != null && next.getPipeRun() != null) {
+                               if (next.getControlPoint() != null) {
                                        
                                        // TODO, relying that the other direction is connected.
                                        boolean nxt = next.getPrevious() == this;
                                        boolean br0 = next.getBranch0() == this;
                                        if (nxt){
-                                               return _connectNext(getControlPoint(), next.getControlPoint()); 
+                                               return _connectNext(pcp, next.getControlPoint());       
                                        } else if (br0) {
-                                               return _connectNext(getControlPoint(), next.getBranchPoint());
+                                               return _connectNext(pcp, next.getBranchPoint());
+                                       } else {
+                                           return false;
                                        }
                                } else {
                                        return false;
                                }
                                
-                       } else if (getControlPoint().getPrevious() != null) {
-                               getControlPoint().setNext(null);
+                       } else if (pcp.getNext() != null) {
+                           pcp.setNext(null);
+                           return true;
                        }
                } else {
                        return false;
@@ -211,26 +269,36 @@ public abstract class PipelineComponent extends GeometryNode {
                return true;
        }
        
-       private boolean syncPrevious() {
-
-               if (getControlPoint() != null) {
+       boolean syncprev = false;
+    private void syncPrevious() {
+        if (syncprev)
+            return;
+        syncprev = _syncPrevious();
+    }
+       
+       private boolean _syncPrevious() {
+           PipeControlPoint pcp = getControlPoint();
+               if (pcp != null) {
                        if (previous != null ) {
-                               if (previous.getControlPoint() != null && previous.getPipeRun() != null) {
+                               if (previous.getControlPoint() != null) {
                                        
                                        // TODO, relying that the other direction is connected.
                                        boolean prev = previous.getNext() == this;
                                        boolean br0 = previous.getBranch0() == this;
                                        if (prev){
-                                               return _connectPrev(getControlPoint(), previous.getControlPoint());     
+                                               return _connectPrev(pcp, previous.getControlPoint());   
                                        } else if (br0) {
-                                               return _connectPrev(getControlPoint(), previous.getBranchPoint());
+                                               return _connectPrev(pcp, previous.getBranchPoint());
+                                       } else {
+                                           return false;
                                        }
                                } else {
                                        return false;
                                }
                                
-                       } else if (getControlPoint().getPrevious() != null) {
-                               getControlPoint().setPrevious(null);
+                       } else if (pcp.getPrevious() != null) {
+                           pcp.setPrevious(null);
+                           return true;
                        }
                } else {
                        return false;
@@ -238,14 +306,21 @@ public abstract class PipelineComponent extends GeometryNode {
                return true;
        }
        
-       private boolean syncBranch0() {
+       boolean syncbr0 = false;
+       private void syncBranch0() {
+           if (syncbr0)
+               return;
+           syncbr0 = _syncBranch0();
+       }
+       
+       private boolean _syncBranch0() {
                if (getControlPoint() != null) {
                        if (getControlPoint().isDualInline()) {
                                branch0 = null;
                                return false;
                        }
                        if (branch0 != null) {
-                               if (branch0.getControlPoint() != null  && branch0.getPipeRun() != null) {
+                               if (branch0.getControlPoint() != null) {
                                        PipeControlPoint branchPoint = getBranchPoint();
                                        PipeControlPoint pcp = branch0.getControlPoint();
                                        // TODO, relying that the other direction is connected.
@@ -255,7 +330,10 @@ public abstract class PipelineComponent extends GeometryNode {
                                                _connectNext(branchPoint, pcp);
                                        } else if (prev){
                                                _connectPrev(branchPoint, pcp); 
+                                       } else {
+                                           return false;
                                        }
+                                       
                                } else {
                                        return false;
                                }
@@ -263,6 +341,7 @@ public abstract class PipelineComponent extends GeometryNode {
                        } else if (getControlPoint().getSubPoint().size() > 0) { // TODO : this may cause problems? (Removes branch point, before branch has been set?)
                                getControlPoint().getSubPoint().get(0).remove();
                                getControlPoint().children.clear();
+                               return true;
                        }
                } else {
                        return false;