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.jface.viewers.ISelection;
013: import org.eclipse.ui.INullSelectionListener;
014: import org.eclipse.ui.IPageListener;
015: import org.eclipse.ui.IWorkbenchPage;
016: import org.eclipse.ui.IWorkbenchPart;
017: import org.eclipse.ui.IWorkbenchWindow;
018:
019: /**
020: * Provides part selection tracking for a part with a specific id
021: * in all pages of a specific workbench window. This tracker shields
022: * clients from a part opening and closing, and still provides selection
023: * notification/information even when the part is not active.
024: */
025: public class WindowPartSelectionTracker extends
026: AbstractPartSelectionTracker implements IPageListener {
027: /**
028: * The window this selection tracker is working in
029: */
030: private IWorkbenchWindow fWindow;
031:
032: /**
033: * Part selection listener.
034: */
035: private final INullSelectionListener selListener = new INullSelectionListener() {
036: public void selectionChanged(IWorkbenchPart part,
037: ISelection selection) {
038: fireSelection(part, selection);
039: }
040: };
041:
042: /**
043: * Part post selection listener
044: */
045: private final INullSelectionListener postSelListener = new INullSelectionListener() {
046: public void selectionChanged(IWorkbenchPart part,
047: ISelection selection) {
048: firePostSelection(part, selection);
049: }
050: };
051:
052: /**
053: * Constructs a new selection tracker for the given window and part id.
054: *
055: * @param window workbench window
056: * @param partId part identifier
057: */
058: public WindowPartSelectionTracker(IWorkbenchWindow window,
059: String partId) {
060: super (partId);
061: setWindow(window);
062: window.addPageListener(this );
063: IWorkbenchPage[] pages = window.getPages();
064: for (int i = 0; i < pages.length; i++) {
065: pageOpened(pages[i]);
066: }
067: }
068:
069: /*
070: * @see IPageListener#pageActivated(IWorkbenchPage)
071: */
072: public void pageActivated(IWorkbenchPage page) {
073: }
074:
075: /*
076: * @see IPageListener#pageClosed(IWorkbenchPage)
077: */
078: public void pageClosed(IWorkbenchPage page) {
079: page.removeSelectionListener(getPartId(), selListener);
080: page.removePostSelectionListener(getPartId(), postSelListener);
081: }
082:
083: /*
084: * @see IPageListener#pageOpened(IWorkbenchPage)
085: */
086: public void pageOpened(IWorkbenchPage page) {
087: page.addSelectionListener(getPartId(), selListener);
088: page.addPostSelectionListener(getPartId(), postSelListener);
089: }
090:
091: /**
092: * Sets the window this tracker is working in.
093: *
094: * @param window workbench window
095: */
096: private void setWindow(IWorkbenchWindow window) {
097: fWindow = window;
098: }
099:
100: /**
101: * Returns the window this tracker is working in.
102: *
103: * @return workbench window
104: */
105: protected IWorkbenchWindow getWindow() {
106: return fWindow;
107: }
108:
109: /**
110: * @see AbstractPartSelectionTracker#dispose()
111: */
112: public void dispose() {
113: super .dispose();
114: fWindow = null;
115: }
116:
117: /*
118: * @see AbstractPartSelectionTracker#getSelection()
119: */
120: public ISelection getSelection() {
121: IWorkbenchPage page = getWindow().getActivePage();
122: if (page != null) {
123: return page.getSelection(getPartId());
124: }
125: return null;
126: }
127: }
|