001: /*
002: * uDig - User Friendly Desktop Internet GIS client
003: * http://udig.refractions.net
004: * (C) 2004, Refractions Research Inc.
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: */
017: package net.refractions.udig.project.ui.internal;
018:
019: import java.util.Collections;
020: import java.util.Map;
021: import java.util.Set;
022: import java.util.WeakHashMap;
023: import java.util.concurrent.CopyOnWriteArraySet;
024:
025: import net.refractions.udig.project.ILayer;
026: import net.refractions.udig.project.internal.Layer;
027: import net.refractions.udig.project.internal.ProjectPackage;
028:
029: import org.eclipse.emf.common.notify.Adapter;
030: import org.eclipse.emf.common.notify.Notification;
031: import org.eclipse.emf.common.notify.impl.AdapterImpl;
032: import org.eclipse.jface.resource.ImageDescriptor;
033: import org.eclipse.jface.viewers.IDecoration;
034: import org.eclipse.jface.viewers.ILabelProviderListener;
035: import org.eclipse.jface.viewers.ILightweightLabelDecorator;
036: import org.eclipse.jface.viewers.LabelProviderChangedEvent;
037:
038: /**
039: * Communicate Layer state to the user.
040: * <p>
041: * Note we may need to squirl away the clock number in the layer blackboard to keep it spinning
042: * smoothly.
043: * </p>
044: *
045: * @author jgarnett
046: * @since 0.6.0
047: */
048: public class LayerStatusDecorator implements ILightweightLabelDecorator {
049:
050: private final Map<ILayer, Integer> currentlyDisplayedStatus = Collections
051: .synchronizedMap(new WeakHashMap<ILayer, Integer>());
052: private final Set<ILabelProviderListener> listeners = new CopyOnWriteArraySet<ILabelProviderListener>();
053: private Adapter hack = new AdapterImpl() {
054: public void notifyChanged(Notification msg) {
055: if (msg.getNotifier() instanceof Layer) {
056: final Layer layer = (Layer) msg.getNotifier();
057: if (hack == null) {
058: layer.eAdapters().remove(this );
059: return;
060: }
061: if (msg.getFeatureID(Layer.class) != ProjectPackage.LAYER__STATUS)
062: return;
063: Integer integer = currentlyDisplayedStatus.get(layer);
064: if (integer != null
065: && msg.getNewIntValue() == integer.intValue())
066: return;
067: refresh(layer);
068: }
069: }
070: };
071:
072: void refresh(Layer layer) {
073: if (listeners.isEmpty())
074: return;
075: LabelProviderChangedEvent event = new LabelProviderChangedEvent(
076: this , layer);
077: for (ILabelProviderListener listener : listeners) {
078: listener.labelProviderChanged(event);
079: }
080: }
081:
082: /**
083: * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object,
084: * org.eclipse.jface.viewers.IDecoration)
085: */
086: @SuppressWarnings("unchecked")
087: public synchronized void decorate(Object element,
088: IDecoration decoration) {
089: Layer layer = (Layer) element; // should be safe, extention point does the instanceof
090:
091: // check
092: ImageDescriptor ovr = statusIcon(layer);
093: if (ovr != null)
094: decoration.addOverlay(ovr, IDecoration.BOTTOM_LEFT);
095:
096: // decoration.addOverlay( Images.getDescriptor( ImageConstants.SELECT_UDR ),
097: // IDecoration.UNDERLAY );
098:
099: if (!layer.eAdapters().contains(hack))
100: layer.eAdapters().add(hack);
101: }
102:
103: private ImageDescriptor statusIcon(Layer layer) {
104: currentlyDisplayedStatus.put(layer, layer.getStatus());
105: switch (layer.getStatus()) {
106: case ILayer.WARNING:
107: return Images.getDescriptor(ImageConstants.WARN_OVR);
108:
109: case ILayer.ERROR:
110: return Images.getDescriptor(ImageConstants.ERROR_OVR);
111:
112: case ILayer.MISSING:
113: return Images.getDescriptor(ImageConstants.HUH_OVR);
114:
115: case ILayer.UNCONFIGURED:
116: return Images
117: .getDescriptor(ImageConstants.UNCONFIGURED_OVR);
118:
119: case ILayer.WAIT:
120: return Images.getDescriptor(ImageConstants.WAIT_OVR);
121:
122: case ILayer.WORKING:
123: return Images.getDescriptor(ImageConstants.CLOCK0_OVR);
124: /*
125: * { int clock = 0; if( layer.getProperties().contains("clock")){ clock =
126: * layer.getProperties().getInteger( "clock" ); } clock++; if ( clock > 7 ) clock = 0;
127: * layer.getProperties().putInteger( "clock", clock ); switch( clock ){ case 0: return
128: * Images.getDescriptor( ImageConstants.CLOCK0_OVR ); case 1: return Images.getDescriptor(
129: * ImageConstants.CLOCK1_OVR ); case 2: return Images.getDescriptor(
130: * ImageConstants.CLOCK2_OVR ); case 3: return Images.getDescriptor(
131: * ImageConstants.CLOCK3_OVR ); case 4: return Images.getDescriptor(
132: * ImageConstants.CLOCK4_OVR ); case 5: return Images.getDescriptor(
133: * ImageConstants.CLOCK5_OVR ); case 6: return Images.getDescriptor(
134: * ImageConstants.CLOCK6_OVR ); case 7: return Images.getDescriptor(
135: * ImageConstants.CLOCK7_OVR ); default: return Images.getDescriptor(
136: * ImageConstants.WAIT_OVR ); } }
137: */
138: case ILayer.DONE:
139: default:
140: return null; // we are done - not status needed
141: }
142: }
143:
144: /**
145: * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
146: */
147: public void addListener(ILabelProviderListener listener) {
148: listeners.add(listener);
149: }
150:
151: /**
152: * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
153: */
154: public void dispose() {
155: // should clean up after hack
156: listeners.clear();
157: // set hack to null so it will clean itself up if called again.
158: hack = null;
159: }
160:
161: /**
162: * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
163: * java.lang.String)
164: */
165: public boolean isLabelProperty(Object element, String property) {
166: // System.out.println( "layer status update sees: " + property );
167: return true; // "status".equals( property );
168: }
169:
170: /**
171: * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
172: */
173: public void removeListener(ILabelProviderListener listener) {
174: listeners.remove(listener);
175: }
176:
177: }
|