]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateNode3.java
Added new interface for user filters
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / model / UpdateNode3.java
1 package org.simantics.interop.update.model;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashSet;
6 import java.util.Set;
7
8 import org.simantics.db.Resource;
9 import org.simantics.db.exception.DatabaseException;
10 import org.simantics.interop.test.GraphChanges;
11
12 public class UpdateNode3 {
13         
14         UpdateNode un1;
15         UpdateNode un2;
16         UpdateNode un3;
17         
18         private Collection<UpdateNode3> children = new ArrayList<UpdateNode3>();
19         
20         
21         public Collection<UpdateNode3> getChildren() {
22                 return children;
23         }
24         
25         public UpdateNode getUn1() {
26                 return un1;
27         }
28         
29         public UpdateNode getUn2() {
30                 return un2;
31         }
32         
33         public UpdateNode getUn3() {
34                 return un3;
35         }
36         
37         public UpdateNode3(UpdateNode un1, UpdateNode un2, UpdateNode un3) {
38                 this.un1 = un1;
39                 this.un2 = un2;
40                 this.un3 = un3;
41         }
42         
43         public boolean isVisible() {
44             if (un1 != null)
45                 return un1.isVisible();
46             if (un2 != null)
47             return un2.isVisible();
48             if (un3 != null)
49             return un3.isVisible();
50             return false;
51         }
52         
53         public void setVisible(boolean visible) {
54             if (un1 != null)
55             un1.setVisible(visible);
56         if (un2 != null)
57             un2.setVisible(visible);
58         if (un3 != null)
59             un3.setVisible(visible);
60         }
61         
62         
63         public static UpdateNode3 getCombinedTree(ModelUpdate update) throws DatabaseException {
64                 UpdateTree updateTree1 = update.getUpdateTree();
65                 UpdateTree updateTree2 = update.getUpdateTree2();
66                 UpdateTree updateTree3 = update.getUpdateTree3();
67                 
68                 UpdateNode3 n3 = new UpdateNode3(updateTree1.getRootNode(), updateTree2.getRootNode(), updateTree3.getRootNode());
69                 
70                 populate(n3, update.getChanges(), update.getChanges2(), update.getChanges3());
71                 return n3;
72         }
73         
74         private static void populate(UpdateNode3 un, GraphChanges gc1, GraphChanges gc2, GraphChanges gc3) {
75                 Set<UpdateNode> p1 = new HashSet<>();
76                 Set<UpdateNode> p2 = new HashSet<>();
77                 Set<UpdateNode> p3 = new HashSet<>();
78                 
79                 if (un.getUn1() != null) {
80                         for (UpdateNode n1 : un.getUn1().getChildren())  {
81                                 p1.add(n1);
82                                 UpdateNode n2 = null;
83                                 if (un.getUn2() != null)
84                                         n2 = getMathcing(n1, un.getUn2().getChildren(), gc1);
85                                 UpdateNode n3 = null;
86                                 if (un.getUn3() != null) {
87                                         n3 = getMathcing(n1, un.getUn3().getChildren(), gc2);
88                                         if (n3 == null && n2 != null)
89                                                 n3 = getMathcing(n2, un.getUn3().getChildren(), gc3);
90                                 }
91                                 UpdateNode3 cn = new UpdateNode3(n1, n2, n3);
92                                 un.children.add(cn);
93                                 populate(cn, gc1, gc2, gc3);
94                                 
95                                 if (n2 != null)
96                                         p2.add(n2);
97                                 if (n3 != null)
98                                         p3.add(n3);
99                         }
100                 }
101                 if (un.getUn2() != null) {
102                         for (UpdateNode n2 : un.getUn2().getChildren())  {
103                                 if (p2.contains(n2))
104                                         continue;
105                                 p2.add(n2);
106                                 
107                                 UpdateNode n3 = null;
108                                 if (un.getUn3() != null) {
109                                         n3 = getMathcing(n2, un.getUn3().getChildren(), gc3);
110                                 }
111                                 UpdateNode3 cn = new UpdateNode3(null, n2, n3);
112                                 un.children.add(cn);
113                                 populate(cn, gc1, gc2, gc3);
114                                 
115                                 if (n3 != null)
116                                         p3.add(n3);
117                         }
118                 }
119                 if (un.getUn3() != null) {
120                         for (UpdateNode n3 : un.getUn3().getChildren())  {
121                                 if (p3.contains(n3))
122                                         continue;
123                                 p3.add(n3);
124                                 UpdateNode3 cn = new UpdateNode3(null, null, n3);
125                                 un.children.add(cn);
126                                 populate(cn, gc1, gc2, gc3);
127                         }
128                 }
129         }
130         
131         private static UpdateNode getMathcing(UpdateNode n , Collection<UpdateNode> coll, GraphChanges gc) {
132                 if (n.getResource() == null) {
133                         if (coll.size() != 1)
134                                 return null;
135                         UpdateNode n2 = coll.iterator().next();
136                         if (n2.getClass() != n.getClass())
137                                 return null;
138                         return n2;
139                 }
140                 Resource o = gc.getComparable().getLeft(n.getResource());
141                 if (o == null)
142                         o = gc.getComparable().getRight(n.getResource());
143                 if (o == null)
144                         o = n.getResource();
145                 for (UpdateNode c : coll) {
146                         if (o.equals(c.getResource()))
147                                 return c;
148                 }
149                 return null;
150         }
151 }