--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.g2d.layers;\r
+\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.Set;\r
+import java.util.TreeSet;\r
+import java.util.concurrent.CopyOnWriteArrayList;\r
+\r
+/**\r
+ * @author Antti Villberg\r
+ */\r
+public class SimpleLayers implements ILayersEditor {\r
+\r
+ private static final Comparator<ILayer> LAYER_COMPARATOR = new Comparator<ILayer>() {\r
+ @Override\r
+ public int compare(ILayer o1, ILayer o2) {\r
+ return o1.getName().compareTo(o2.getName());\r
+ }\r
+ };\r
+\r
+ private Set<ILayer> all = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
+ private volatile Set<ILayer> allSnapshot;\r
+\r
+ private Set<ILayer> visible = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
+ private volatile Set<ILayer> visibleSnapshot;\r
+\r
+ private CopyOnWriteArrayList<ILayersEditorListener> listeners = new CopyOnWriteArrayList<ILayersEditorListener>();\r
+\r
+ private boolean ignoreFocusSettings = false;\r
+\r
+ private boolean ignoreVisibilitySettings = false;\r
+\r
+ public SimpleLayers() {\r
+ }\r
+\r
+ public SimpleLayers(String... content) {\r
+ for (String s : content) {\r
+ ILayer layer = new SimpleLayer(s);\r
+ all.add(layer);\r
+ visible.add(layer);\r
+ }\r
+ allSnapshot = null;\r
+ visibleSnapshot = null;\r
+ }\r
+\r
+ @Override\r
+ public Set<ILayer> getLayers() {\r
+ // Double-checked locking idiom: http://en.wikipedia.org/wiki/Double-checked_locking\r
+ // Works with acquire/release semantics for volatile\r
+ // Broken under Java 1.4 and earlier semantics for volatile\r
+ if (allSnapshot == null) {\r
+ synchronized (this) {\r
+ if (allSnapshot == null) {\r
+ TreeSet<ILayer> ss = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
+ ss.addAll(all);\r
+ allSnapshot = Collections.unmodifiableSet(ss);\r
+ }\r
+ }\r
+ }\r
+ return allSnapshot;\r
+ }\r
+\r
+ @Override\r
+ public Set<ILayer> getVisibleLayers() {\r
+ // Double-checked locking idiom: http://en.wikipedia.org/wiki/Double-checked_locking\r
+ // Works with acquire/release semantics for volatile\r
+ // Broken under Java 1.4 and earlier semantics for volatile\r
+ if (visibleSnapshot == null) {\r
+ synchronized (this) {\r
+ if (visibleSnapshot == null) {\r
+ TreeSet<ILayer> ss = new TreeSet<ILayer>(LAYER_COMPARATOR);\r
+ ss.addAll(visible);\r
+ visibleSnapshot = Collections.unmodifiableSet(ss);\r
+ }\r
+ }\r
+ }\r
+ return visibleSnapshot;\r
+ }\r
+\r
+ @Override\r
+ public boolean isActive(ILayer layer) {\r
+ synchronized (this) {\r
+ return visible.contains(layer);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void deactivate(ILayer layer) {\r
+ boolean deactivated = false;\r
+ synchronized (this) {\r
+ deactivated = visible.remove(layer);\r
+ }\r
+ if (deactivated) {\r
+ synchronized (this) {\r
+ visibleSnapshot = null;\r
+ }\r
+ for (ILayersEditorListener listener : listeners) {\r
+ listener.layerDeactivated(layer);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void activate(ILayer layer) {\r
+ boolean activated = false;\r
+ synchronized (this) {\r
+ activated = visible.add(layer);\r
+ }\r
+ if (activated) {\r
+ synchronized (this) {\r
+ visibleSnapshot = null;\r
+ }\r
+ for (ILayersEditorListener listener : listeners) {\r
+ listener.layerActivated(layer);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void addLayer(ILayer layer) {\r
+ boolean added = false;\r
+ synchronized (this) {\r
+ added = all.add(layer);\r
+ }\r
+ if (added) {\r
+ synchronized (this) {\r
+ allSnapshot = null;\r
+ }\r
+ for (ILayersEditorListener listener : listeners) {\r
+ listener.layerAdded(layer);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void removeLayer(ILayer layer) {\r
+ boolean removed = false;\r
+ synchronized (this) {\r
+ removed = all.remove(layer);\r
+ visible.remove(layer);\r
+ }\r
+ if (removed) {\r
+ synchronized (this) {\r
+ allSnapshot = null;\r
+ visibleSnapshot = null;\r
+ }\r
+ for (ILayersEditorListener listener : listeners) {\r
+ listener.layerRemoved(layer);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void addListener(ILayersEditorListener listener) {\r
+ listeners.add(listener);\r
+ }\r
+\r
+ @Override\r
+ public void removeListener(ILayersEditorListener listener) {\r
+ listeners.remove(listener);\r
+ }\r
+\r
+ @Override\r
+ public boolean getIgnoreFocusSettings() {\r
+ return ignoreFocusSettings;\r
+ }\r
+\r
+ @Override\r
+ public void setIgnoreFocusSettings(boolean value) {\r
+ boolean changed = ignoreFocusSettings != value;\r
+ ignoreFocusSettings = value;\r
+ if (changed) {\r
+ for (ILayersEditorListener listener : listeners) {\r
+ listener.ignoreFocusChanged(value);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public boolean getIgnoreVisibilitySettings() {\r
+ return ignoreVisibilitySettings;\r
+ }\r
+\r
+ @Override\r
+ public void setIgnoreVisibilitySettings(boolean value) {\r
+ boolean changed = ignoreVisibilitySettings != value;\r
+ ignoreVisibilitySettings = value;\r
+ if (changed) {\r
+ for (ILayersEditorListener listener : listeners) {\r
+ listener.ignoreVisibilityChanged(value);\r
+ }\r
+ }\r
+ }\r
+\r
+}\r