]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/layers/SimpleLayers.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / layers / SimpleLayers.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.layers;\r
13 \r
14 import java.util.Collections;\r
15 import java.util.Comparator;\r
16 import java.util.Set;\r
17 import java.util.TreeSet;\r
18 import java.util.concurrent.CopyOnWriteArrayList;\r
19 \r
20 /**\r
21  * @author Antti Villberg\r
22  */\r
23 public class SimpleLayers implements ILayersEditor {\r
24 \r
25     private static final Comparator<ILayer> LAYER_COMPARATOR = new Comparator<ILayer>() {\r
26         @Override\r
27         public int compare(ILayer o1, ILayer o2) {\r
28             return o1.getName().compareTo(o2.getName());\r
29         }\r
30     };\r
31 \r
32     private Set<ILayer>                                 all                      = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
33     private volatile Set<ILayer>                        allSnapshot;\r
34 \r
35     private Set<ILayer>                                 visible                  = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
36     private volatile Set<ILayer>                        visibleSnapshot;\r
37 \r
38     private CopyOnWriteArrayList<ILayersEditorListener> listeners                = new CopyOnWriteArrayList<ILayersEditorListener>();\r
39 \r
40     private boolean                                     ignoreFocusSettings      = false;\r
41 \r
42     private boolean                                     ignoreVisibilitySettings = false;\r
43 \r
44     public SimpleLayers() {\r
45     }\r
46 \r
47     public SimpleLayers(String... content) {\r
48         for (String s : content) {\r
49             ILayer layer = new SimpleLayer(s);\r
50             all.add(layer);\r
51             visible.add(layer);\r
52         }\r
53         allSnapshot = null;\r
54         visibleSnapshot = null;\r
55     }\r
56 \r
57     @Override\r
58     public Set<ILayer> getLayers() {\r
59         // Double-checked locking idiom: http://en.wikipedia.org/wiki/Double-checked_locking\r
60         // Works with acquire/release semantics for volatile\r
61         // Broken under Java 1.4 and earlier semantics for volatile\r
62         if (allSnapshot == null) {\r
63             synchronized (this) {\r
64                 if (allSnapshot == null) {\r
65                     TreeSet<ILayer> ss = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
66                     ss.addAll(all);\r
67                     allSnapshot = Collections.unmodifiableSet(ss);\r
68                 }\r
69             }\r
70         }\r
71         return allSnapshot;\r
72     }\r
73 \r
74     @Override\r
75     public Set<ILayer> getVisibleLayers() {\r
76         // Double-checked locking idiom: http://en.wikipedia.org/wiki/Double-checked_locking\r
77         // Works with acquire/release semantics for volatile\r
78         // Broken under Java 1.4 and earlier semantics for volatile\r
79         if (visibleSnapshot == null) {\r
80             synchronized (this) {\r
81                 if (visibleSnapshot == null) {\r
82                     TreeSet<ILayer> ss = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
83                     ss.addAll(visible);\r
84                     visibleSnapshot = Collections.unmodifiableSet(ss);\r
85                 }\r
86             }\r
87         }\r
88         return visibleSnapshot;\r
89     }\r
90 \r
91     @Override\r
92     public boolean isActive(ILayer layer) {\r
93         synchronized (this) {\r
94             return visible.contains(layer);\r
95         }\r
96     }\r
97 \r
98     @Override\r
99     public void deactivate(ILayer layer) {\r
100         boolean deactivated = false;\r
101         synchronized (this) {\r
102             deactivated = visible.remove(layer);\r
103         }\r
104         if (deactivated) {\r
105             synchronized (this) {\r
106                 visibleSnapshot = null;\r
107             }\r
108             for (ILayersEditorListener listener : listeners) {\r
109                 listener.layerDeactivated(layer);\r
110             }\r
111         }\r
112     }\r
113 \r
114     @Override\r
115     public void activate(ILayer layer) {\r
116         boolean activated = false;\r
117         synchronized (this) {\r
118             activated = visible.add(layer);\r
119         }\r
120         if (activated) {\r
121             synchronized (this) {\r
122                 visibleSnapshot = null;\r
123             }\r
124             for (ILayersEditorListener listener : listeners) {\r
125                 listener.layerActivated(layer);\r
126             }\r
127         }\r
128     }\r
129 \r
130     @Override\r
131     public void addLayer(ILayer layer) {\r
132         boolean added = false;\r
133         synchronized (this) {\r
134             added = all.add(layer);\r
135         }\r
136         if (added) {\r
137             synchronized (this) {\r
138                 allSnapshot = null;\r
139             }\r
140             for (ILayersEditorListener listener : listeners) {\r
141                 listener.layerAdded(layer);\r
142             }\r
143         }\r
144     }\r
145 \r
146     @Override\r
147     public void removeLayer(ILayer layer) {\r
148         boolean removed = false;\r
149         synchronized (this) {\r
150             removed = all.remove(layer);\r
151             visible.remove(layer);\r
152         }\r
153         if (removed) {\r
154             synchronized (this) {\r
155                 allSnapshot = null;\r
156                 visibleSnapshot = null;\r
157             }\r
158             for (ILayersEditorListener listener : listeners) {\r
159                 listener.layerRemoved(layer);\r
160             }\r
161         }\r
162     }\r
163 \r
164     @Override\r
165     public void addListener(ILayersEditorListener listener) {\r
166         listeners.add(listener);\r
167     }\r
168 \r
169     @Override\r
170     public void removeListener(ILayersEditorListener listener) {\r
171         listeners.remove(listener);\r
172     }\r
173 \r
174     @Override\r
175     public boolean getIgnoreFocusSettings() {\r
176         return ignoreFocusSettings;\r
177     }\r
178 \r
179     @Override\r
180     public void setIgnoreFocusSettings(boolean value) {\r
181         boolean changed = ignoreFocusSettings != value;\r
182         ignoreFocusSettings = value;\r
183         if (changed) {\r
184             for (ILayersEditorListener listener : listeners) {\r
185                 listener.ignoreFocusChanged(value);\r
186             }\r
187         }\r
188     }\r
189 \r
190     @Override\r
191     public boolean getIgnoreVisibilitySettings() {\r
192         return ignoreVisibilitySettings;\r
193     }\r
194 \r
195     @Override\r
196     public void setIgnoreVisibilitySettings(boolean value) {\r
197         boolean changed = ignoreVisibilitySettings != value;\r
198         ignoreVisibilitySettings = value;\r
199         if (changed) {\r
200             for (ILayersEditorListener listener : listeners) {\r
201                 listener.ignoreVisibilityChanged(value);\r
202             }\r
203         }\r
204     }\r
205 \r
206 }\r