001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal;
011:
012: import org.eclipse.core.runtime.ListenerList;
013: import org.eclipse.core.runtime.Platform;
014: import org.eclipse.jface.util.SafeRunnable;
015: import org.eclipse.jface.viewers.ISelection;
016: import org.eclipse.ui.INullSelectionListener;
017: import org.eclipse.ui.ISelectionListener;
018: import org.eclipse.ui.IWorkbenchPart;
019:
020: /**
021: * Provides per-part selection tracking for the selection service.
022: */
023: public abstract class AbstractPartSelectionTracker {
024: /**
025: * List of selection listeners for this tracker
026: */
027: private ListenerList fListeners = new ListenerList();
028:
029: /**
030: * List of post selection listeners for this tracker
031: */
032: private ListenerList postListeners = new ListenerList();
033:
034: /**
035: * The id of the part this tracls
036: */
037: private String fPartId;
038:
039: /**
040: * Constructs a part selection tracker for the part with the given id.
041: *
042: * @param id part identifier
043: */
044: public AbstractPartSelectionTracker(String partId) {
045: setPartId(partId);
046: }
047:
048: /**
049: * Adds a selection listener to this tracker
050: *
051: * @param listener the listener to add
052: */
053: public void addSelectionListener(ISelectionListener listener) {
054: fListeners.add(listener);
055: }
056:
057: /**
058: * Adds a post selection listener to this tracker
059: *
060: * @param listener the listener to add
061: */
062: public void addPostSelectionListener(ISelectionListener listener) {
063: postListeners.add(listener);
064: }
065:
066: /**
067: * Returns the selection from the part being tracked,
068: * or <code>null</code> if the part is closed or has no selection.
069: */
070: public abstract ISelection getSelection();
071:
072: /**
073: * Removes a selection listener from this tracker.
074: *
075: * @param listener the listener to remove
076: */
077: public void removeSelectionListener(ISelectionListener listener) {
078: fListeners.remove(listener);
079: }
080:
081: /**
082: * Removes a post selection listener from this tracker.
083: *
084: * @param listener the listener to remove
085: */
086: public void removePostSelectionListener(ISelectionListener listener) {
087: postListeners.remove(listener);
088: }
089:
090: /**
091: * Disposes this selection tracker. This removes all listeners currently registered.
092: */
093: public void dispose() {
094: synchronized (fListeners) {
095: Object[] listeners = fListeners.getListeners();
096: for (int i = 0; i < listeners.length; i++) {
097: fListeners.remove(listeners[i]);
098: postListeners.remove(listeners[i]);
099: }
100: }
101: }
102:
103: /**
104: * Fires a selection event to the listeners.
105: *
106: * @param part the part or <code>null</code> if no active part
107: * @param sel the selection or <code>null</code> if no active selection
108: * @param listeners the list of listeners to notify
109: */
110: protected void fireSelection(final IWorkbenchPart part,
111: final ISelection sel) {
112: Object[] array = fListeners.getListeners();
113: for (int i = 0; i < array.length; i++) {
114: final ISelectionListener l = (ISelectionListener) array[i];
115: if ((part != null && sel != null)
116: || l instanceof INullSelectionListener) {
117: Platform.run(new SafeRunnable() {
118: public void run() {
119: l.selectionChanged(part, sel);
120: }
121: });
122: }
123: }
124: }
125:
126: /**
127: * Fires a post selection event to the listeners.
128: *
129: * @param part the part or <code>null</code> if no active part
130: * @param sel the selection or <code>null</code> if no active selection
131: * @param listeners the list of listeners to notify
132: */
133: protected void firePostSelection(final IWorkbenchPart part,
134: final ISelection sel) {
135: Object[] array = postListeners.getListeners();
136: for (int i = 0; i < array.length; i++) {
137: final ISelectionListener l = (ISelectionListener) array[i];
138: if ((part != null && sel != null)
139: || l instanceof INullSelectionListener) {
140: Platform.run(new SafeRunnable() {
141: public void run() {
142: l.selectionChanged(part, sel);
143: }
144: });
145: }
146: }
147: }
148:
149: /**
150: * Sets the id of the part that this tracks.
151: *
152: * @param id view identifier
153: */
154: private void setPartId(String partId) {
155: fPartId = partId;
156: }
157:
158: /**
159: * Returns the id of the part that this tracks.
160: *
161: * @return part identifier
162: */
163: protected String getPartId() {
164: return fPartId;
165: }
166:
167: }
|