X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fprofile%2FStyleBase.java;h=e1d8b1fbf7e67e043c8af93202f03d95747d9216;hp=ee203616da950f31d0fa1f1abbfae793de988f2d;hb=ab9fcfe016ef75da40eb00a46d4a54b50e534511;hpb=e8269f6cba002c702c25d80db5399b5b50b97ab9 diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/StyleBase.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/StyleBase.java index ee203616d..e1d8b1fbf 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/StyleBase.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/StyleBase.java @@ -11,12 +11,7 @@ *******************************************************************************/ package org.simantics.diagram.profile; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; @@ -44,10 +39,8 @@ import org.simantics.scenegraph.profile.Style; import org.simantics.scenegraph.profile.common.ObserverGroupListener; import org.simantics.scenegraph.profile.common.ObserverGroupValueListener; import org.simantics.scenegraph.profile.impl.DebugPolicy; -import org.simantics.scl.runtime.tuple.Tuple; -import org.simantics.scl.runtime.tuple.Tuple2; +import org.simantics.scl.runtime.tuple.Tuple3; import org.simantics.utils.datastructures.Pair; -import org.simantics.utils.threads.AWTThread; /** * For most style implementations it should be enough to override the following @@ -73,14 +66,48 @@ import org.simantics.utils.threads.AWTThread; */ public abstract class StyleBase implements Style { - protected final Map values = new ConcurrentHashMap(); + private Object identity; -// private Map listeners = new ConcurrentHashMap(); + public StyleBase(Object identity) { + this.identity = identity; + } - private Map, ObserverGroupListener> listeners = new HashMap, ObserverGroupListener>(); - + public StyleBase() { + this.identity = getClass(); + } - private final List removals = new ArrayList(); + protected T getIdentity() { + return (T)identity; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((identity == null) ? 0 : identity.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + StyleBase other = (StyleBase) obj; + if (identity == null) { + if (other.identity != null) + return false; + } else if (!identity.equals(other.identity)) + return false; + return true; + } + + protected Resource getResource() { + return getIdentity(); + } /** * For caching this simple base request that is done in every @@ -176,9 +203,9 @@ public abstract class StyleBase implements Style { */ public void styleResultChanged(Observer observer, Resource runtimeDiagram, Resource object, Result result) { if (result == null) - values.remove(new Tuple2(runtimeDiagram, object)); + StyleBaseData.getInstance().removeValue(new Tuple3(this, runtimeDiagram, object)); else - values.put(new Tuple2(runtimeDiagram, object), result); + StyleBaseData.getInstance().putValue(new Tuple3(this, runtimeDiagram, object), result); observer.update(); } @@ -284,9 +311,7 @@ public abstract class StyleBase implements Style { if (DebugPolicy.DEBUG_PROFILE_STYLE_GROUP_TRACKING) System.out.println(style + ": removed from group " + group + ": " + item); - synchronized (style.removals) { - style.removals.add(item); - } + StyleBaseData.getInstance().removeItem(style, item); // TODO: do something here to dispose of ObserverGroupValueListeners? super.remove(item); @@ -298,7 +323,7 @@ public abstract class StyleBase implements Style { * @see org.simantics.diagram.profile.Style#activate(org.simantics.db.RequestProcessor, org.simantics.db.Resource, org.simantics.db.layer0.variable.Variable, org.simantics.diagram.profile.Group, org.simantics.diagram.profile.Observer) */ @Override - public final void activate(RequestProcessor backend, final Resource runtimeDiagram, final Resource entry, final Group group, final EvaluationContext observer) { + public final void activate(RequestProcessor backend, final Resource runtimeDiagram, final Resource entry, final Group group, final EvaluationContext observer) throws DatabaseException { ObserverGroupListener listener = getListener(runtimeDiagram, group); @@ -309,7 +334,7 @@ public abstract class StyleBase implements Style { listener = new GroupListener(backend.getSession(), runtimeDiagram, entry, this, group, observer); - listeners.put(Pair.make(runtimeDiagram, group), listener); + StyleBaseData.getInstance().putListener(new Tuple3(this, runtimeDiagram, group), listener); group.trackItems(backend, runtimeDiagram, listener); @@ -391,7 +416,7 @@ public abstract class StyleBase implements Style { listener.removeEntry(entry); if (!listener.hasEntries()) { listener.dispose(); - listeners.remove(Pair.make(runtimeDiagram, group)); + StyleBaseData.getInstance().removeListener(new Tuple3(this, runtimeDiagram, group)); } // This was too eager when multiple groups were tracked! @@ -426,19 +451,13 @@ public abstract class StyleBase implements Style { if (DebugPolicy.DEBUG_PROFILE_STYLE_APPLICATION) System.out.println(StyleBase.this + ": applying style for items: " + listener.getItems()); - if (!removals.isEmpty()) { - Resource[] removed; - synchronized (removals) { - removed = removals.toArray(Resource.NONE); - removals.clear(); - } - for (Resource item : removed) { - cleanupStyleForItem(evaluationContext, map, item); - } - } + + StyleBaseData data = StyleBaseData.getInstance(); + + data.applyRemovals(evaluationContext, this); for (Object item : listener.getItems()) { - Result value = values.get(new Tuple2(evaluationContext.getResource(), item)); + Result value = data.getValue(new Tuple3(this, evaluationContext.getResource(), item)); applyStyleForItem(evaluationContext, map, item, value); } @@ -481,7 +500,7 @@ public abstract class StyleBase implements Style { } private ObserverGroupListener getListener(Resource runtime, Group group) { - return listeners.get(Pair.make(runtime, group)); + return StyleBaseData.getInstance().getListener(new Tuple3(this, runtime, group)); } }