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