1 package org.simantics.diagram.profile;
3 import java.util.ArrayList;
4 import java.util.HashMap;
7 import java.util.concurrent.ConcurrentHashMap;
9 import org.simantics.db.Resource;
10 import org.simantics.scenegraph.profile.DataNodeMap;
11 import org.simantics.scenegraph.profile.EvaluationContext;
12 import org.simantics.scenegraph.profile.Style;
13 import org.simantics.scenegraph.profile.common.ObserverGroupListener;
14 import org.simantics.scl.runtime.tuple.Tuple;
15 import org.simantics.scl.runtime.tuple.Tuple3;
17 public class StyleBaseData {
19 protected final Map<Tuple, Object> values = new ConcurrentHashMap<>();
21 private Map<Tuple3, ObserverGroupListener> listeners = new HashMap<>();
23 private final Map<Style, List<Resource>> removals = new HashMap<>();
25 private StyleBaseData() {
29 private static StyleBaseData INSTANCE;
31 public static StyleBaseData getInstance() {
32 if(INSTANCE == null) {
33 INSTANCE = new StyleBaseData();
38 public void removeValue(Tuple t) {
42 public void putValue(Tuple t, Object o) {
46 public <T> T getValue(Tuple t) {
47 return (T)values.get(t);
50 public synchronized void removeItem(Style s, Resource r) {
51 List<Resource> l = removals.get(s);
53 l = new ArrayList<>();
59 public void putListener(Tuple3 key, ObserverGroupListener listener) {
60 listeners.put(key, listener);
63 public void removeListener(Tuple3 key) {
64 listeners.remove(key);
67 public ObserverGroupListener getListener(Tuple3 key) {
68 return listeners.get(key);
71 public synchronized void applyRemovals(EvaluationContext evaluationContext, StyleBase s) {
73 List<Resource> rs = removals.remove(s);
74 if(rs == null) return;
76 DataNodeMap map = evaluationContext.getConstant(ProfileKeys.NODE_MAP);
78 for (Resource item : rs) {
79 s.cleanupStyleForItem(evaluationContext, map, item);