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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g2d.image.impl;
\r
14 import java.awt.Shape;
\r
15 import java.awt.geom.Rectangle2D;
\r
16 import java.lang.ref.WeakReference;
\r
17 import java.util.EnumSet;
\r
19 import org.simantics.g2d.image.Image;
\r
20 import org.simantics.scenegraph.Node;
\r
21 import org.simantics.scenegraph.g2d.G2DParentNode;
\r
22 import org.simantics.utils.datastructures.ListenerList;
\r
25 * ImageProxy keeps strong reference to an original image, but weak reference
\r
26 * from original image to proxy image.
\r
28 * Listeners attached to ImageProxy relays events from the original image.
\r
30 * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
\r
32 public class ImageProxy implements Image {
\r
34 ListenerList<ImageListener> list = null;
\r
36 /** Strong reference to the original image */
\r
39 /** Listener for the original image */
\r
40 WeakImageListener sourceListener;
\r
42 public ImageProxy(Image original) {
\r
43 if (original==null) throw new IllegalArgumentException("null arg");
\r
44 this.source = original;
\r
47 protected void notifyChanged()
\r
49 ImageListener[] listeners;
\r
50 synchronized(this) {
\r
51 if (list==null) return;
\r
52 listeners = list.getListeners();
\r
54 for (ImageListener l : listeners)
\r
55 l.onContentChangedNotification(this);
\r
59 public synchronized void addImageListener(ImageListener listener) {
\r
60 if (list==null) list = new ListenerList<ImageListener>(ImageListener.class);
\r
61 if (sourceListener==null) {
\r
62 sourceListener = new WeakImageListener(this);
\r
63 source.addImageListener(sourceListener);
\r
69 public synchronized void removeImageListener(ImageListener listener) {
\r
70 if (list==null) return;
\r
71 list.remove(listener);
\r
72 if (list.isEmpty()) {
\r
73 source.removeImageListener(sourceListener);
\r
77 static class WeakImageListener implements ImageListener {
\r
78 WeakReference<ImageProxy> ref;
\r
79 public WeakImageListener(ImageProxy img)
\r
81 ref = new WeakReference<ImageProxy>(img);
\r
85 public void onContentChangedNotification(Image image) {
\r
86 ImageProxy i = ref.get();
\r
88 image.removeImageListener(this);
\r
96 public Rectangle2D getBounds() {
\r
97 return source.getBounds();
\r
101 public EnumSet<Feature> getFeatures() {
\r
102 return source.getFeatures();
\r
106 public Shape getOutline() {
\r
107 return source.getOutline();
\r
111 public Node init(G2DParentNode parent) {
\r
112 this.node = source.init(parent);
\r
116 public synchronized void setSource(Image newSource) {
\r
117 if (newSource==null) throw new IllegalArgumentException("null");
\r
118 if (source == newSource) return;
\r
119 Image oldSource = source;
\r
121 node.remove(); // FIXME
\r
125 source = newSource;
\r
127 if (sourceListener!=null) {
\r
128 oldSource.removeImageListener(sourceListener);
\r
129 newSource.addImageListener(sourceListener);
\r