import java.util.Map;
import java.util.Set;
import java.util.Stack;
+import java.util.function.Consumer;
import org.simantics.db.ReadGraph;
import org.simantics.db.Session;
import org.simantics.objmap.exceptions.MappingException;
import org.simantics.objmap.graph.IMapping;
import org.simantics.objmap.graph.IMappingListener;
-import org.simantics.utils.datastructures.Callback;
import org.simantics.utils.datastructures.MapList;
import org.simantics.utils.datastructures.MapSet;
import org.simantics.utils.datastructures.Pair;
@SuppressWarnings("unchecked")
@Override
public Collection<vtkProp> getRenderObjects(INode node) {
- return nodeToActor.getValues((E)node);
+ return nodeToActor.getValues((E) node);
}
protected <T extends vtkProp> void map(E node, Collection<T> props) {
protected void removeMap(E node) {
Collection<vtkProp> coll = nodeToActor.getValuesUnsafe(node);
- for (vtkProp p : coll) {
- actorToNode.remove(p);
+ if (coll.size() > 0) {
+ view.lock();
+ for (vtkProp p : coll) {
+ actorToNode.remove(p);
+ if (p.GetVTKId() != 0) {
+ view.getRenderer().RemoveActor(p);
+ p.Delete();
+ }
+ }
+ view.unlock();
}
nodeToActor.remove(node);
}
- @SuppressWarnings("unchecked")
@Override
public ParentNode<E> getRootNode() {
return (ParentNode<E>)rootNode;
}
- @SuppressWarnings("unchecked")
@Override
public void updateRenderObjectsFor(E node) {
List<vtkProp> toDelete = new ArrayList<vtkProp>();
view.lock();
- for (vtkProp prop : nodeToActor.getValues((E)node)) {
+ for (vtkProp prop : nodeToActor.getValues(node)) {
if (prop.GetVTKId() != 0) {
view.getRenderer().RemoveActor(prop);
//prop.Delete();
actorToNode.remove(prop);
}
view.unlock();
- nodeToActor.remove((E)node);
- Collection<vtkProp> coll = getActors((E)node);
+ nodeToActor.remove(node);
+ Collection<vtkProp> coll = getActors(node);
if (coll != null) {
for (vtkProp prop : coll) {
- nodeToActor.add((E)node,prop);
- actorToNode.put(prop, (E)node);
+ nodeToActor.add(node,prop);
+ actorToNode.put(prop, node);
toDelete.remove(prop);
}
}
repaint();
}
- @SuppressWarnings("unchecked")
private void receiveUpdate(E node, String id, boolean db) {
if (DEBUG) System.out.println("receiveUpdate " + debugString(node) + " " + id + " " + db);
synchronized (syncMutex) {
commit(graph);
}
- }, new Callback<DatabaseException>() {
+ }, new Consumer<DatabaseException>() {
@Override
- public void run(DatabaseException parameter) {
+ public void accept(DatabaseException parameter) {
if (parameter != null)
ExceptionUtils.logAndShowError("Cannot commit editor changes", parameter);
}
if (DEBUG)System.out.println("domainModified");
session.asyncRequest(new ReadRequest() {
- @SuppressWarnings("unchecked")
@Override
public void run(ReadGraph graph) throws DatabaseException {
update(graph);
if (runUndo && useFullSyncWithUndo) {
reset(graph);
} else {
- synchronized (syncMutex) {
+ synchronized (syncMutex) {
graphUpdates = true;
for (DBObject domainObject : mapping.getDomainModified()) {
@SuppressWarnings("unchecked")
syncDeletes();
clearDeletes();
graphUpdates = false;
- }
+ }
}
if (mapping.isRangeModified() && !runUndo && !runRedo)
* This code here synchronizes removed and added objects to collect deletable objects. (a deletable object is one which is removed but not added).
*
*/
+ @SuppressWarnings("unused")
protected void syncDeletes() {
deleteUC.clear();
for (Pair<E, String> n : removed) {
/**
* Clears deletable objects from mapping cache.
*/
+ @SuppressWarnings("unused")
protected void clearDeletes() {
if (DEBUG && delete.size() > 0) System.out.println("Delete");
for (E n : delete) {
E n = stack.pop();
boolean conflict = filterChange(removed, n);
if (conflict) {
- System.out.println("Prevent removing " + n);
+ if (DEBUG) System.out.println("Prevent removing " + n);
//filterChange(added, n)
if (filterChange(added, n))
- System.out.println("Prevent adding " + n);
+ if (DEBUG) System.out.println("Prevent adding " + n);
}
if (n instanceof ParentNode) {
ParentNode<INode> pn = (ParentNode<INode>)n;
}
}
}
-
+ // Do not process updates for removed nodes.
+ for (Pair<E, String> r : removed) {
+ updated.removeValues(r.first);
+ }
rem.addAll(removed);
add.addAll(added);
for (E e : updated.getKeys()) {
}
-
for (Pair<E, String> n : rem) {
stopListening(n.first);
removeActor(n.first);
+ n.first.remove();
}
- for (Pair<E, String> n : add) {
- addActor(n.first);
- listen(n.first);
- }
+ for (Pair<E, String> n : add) {
+ addActor(n.first);
+ listen(n.first);
+ }
for (E e : mod.getKeys()) {
Set<String> ids = mod.getValues(e);
}
}
-// synchronized (syncMutex) {
-// rem.addAll(removed);
-// add.addAll(added);
-// //mod.addAll(updated);
-// for (E e : updated.getKeys()) {
-// for (String s : updated.getValues(e))
-// mod.add(e, s);
-// }
-//
-// removed.clear();
-// added.clear();
-// updated.clear();
-// }
-
for (E e : mod.getKeys()) {
Set<String> ids = mod.getValues(e);
updateActor(e,ids);
}
-
-
+
for (Pair<E, String> n : rem) {
for (NodeListener l : nodeListeners)
l.nodeRemoved(null, n.first, n.second);
//FIXME : 1. sometimes removed structural models cause ObjMap to add their children again.
// removing the listener here prevents corruption of visual model, but better fix is needed.
- // 2. detach causes nodeRemoved event, which then causes other critical events to be missed. Took out th
+ // 2. detach causes nodeRemoved event, which then causes other critical events to be missed. Took out call:
//stopListening(child);
}