blob: 3fcb431166aa4b50fb9703c380538b7fdeb1bf7f [file] [log] [blame]
package org.eclipse.ui.internal;
/*
* (c) Copyright IBM Corp. 2000, 2001, 2002.
* All Rights Reserved.
*/
import org.eclipse.jface.viewers.*;
import org.eclipse.ui.*;
/**
* Provides debug view selection management/notification for
* a debug view in a specific workbench page. This selection
* provider sheilds clients from a debug view openning and closing,
* and still provides selection notification/information even
* when the debug view is not the active part.
*/
public class PagePartSelectionTracker extends AbstractPartSelectionTracker implements IPartListener, ISelectionChangedListener {
/**
* The workbench page for which this is tracking selection.
*/
private IWorkbenchPage fPage;
/**
* The part in this tracker's page, or <code>null</code> if one is not open.
*/
private IWorkbenchPart fPart;
private ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
fireSelection(getPart(), event.getSelection());
}
};
private ISelectionChangedListener postSelectionListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
firePostSelection(getPart(), event.getSelection());
}
};
public PagePartSelectionTracker(IWorkbenchPage page, String partId) {
super(partId);
setPage(page);
page.addPartListener(this);
IViewPart part = page.findView(partId);
if (part != null) {
setPart(part, false);
}
}
/**
* Disposes this selection provider - removes all listeners
* currently registered.
*/
public void dispose() {
setPart(null, false);
setPage(null);
super.dispose();
}
/*
* @see IPartListener#partActivated(IWorkbenchPart)
*/
public void partActivated(IWorkbenchPart part) {
}
/*
* @see IPartListener#partBroughtToTop(IWorkbenchPart)
*/
public void partBroughtToTop(IWorkbenchPart part) {
}
/**
* @see IPartListener#partClosed(IWorkbenchPart)
*/
public void partClosed(IWorkbenchPart part) {
if (part.getSite().getId().equals(getPartId())) {
setPart(null, true);
}
}
/*
* @see IPartListener#partDeactivated(IWorkbenchPart)
*/
public void partDeactivated(IWorkbenchPart part) {
}
/**
* @see IPartListener#partOpened(IWorkbenchPart)
*/
public void partOpened(IWorkbenchPart part) {
if (part.getSite().getId().equals(getPartId())) {
setPart(part, true);
}
}
/**
* The selection has changed in the part being tracked.
* Forward it to the listeners.
*
* @see ISelectionChangedListener#selectionChanged
*/
public void selectionChanged(SelectionChangedEvent event) {
fireSelection(getPart(), event.getSelection());
}
/**
* Sets the page this selection provider works for
*
* @param page workbench page
*/
private void setPage(IWorkbenchPage page) {
fPage = page;
}
/**
* Returns the page this selection provider works for
*
* @return workbench page
*/
protected IWorkbenchPage getPage() {
return fPage;
}
/**
* Returns the part this is tracking,
* or <code>null</code> if it is not open
*
* @return part., or <code>null</code>
*/
protected IWorkbenchPart getPart() {
return fPart;
}
/*
* @see AbstractPartSelectionTracker#getSelection()
*/
public ISelection getSelection() {
IWorkbenchPart part = getPart();
if (part != null) {
ISelectionProvider sp = part.getSite().getSelectionProvider();
if (sp != null) {
return sp.getSelection();
}
}
return null;
}
/**
* @see AbstractDebugSelectionProvider#getSelectionProvider()
*/
protected ISelectionProvider getSelectionProvider() {
IWorkbenchPart part = getPart();
if (part != null) {
return part.getSite().getSelectionProvider();
}
return null;
}
/**
* Sets the part for this selection tracker.
*
* @param part the part
* @param notify whether to send notification that the selection has changed.
*/
private void setPart(IWorkbenchPart part, boolean notify) {
if (fPart != null) {
// remove myself as a listener from the existing part
ISelectionProvider sp = fPart.getSite().getSelectionProvider();
if (sp != null) {
sp.removeSelectionChangedListener(selectionListener);
if(sp instanceof StructuredViewer)
((StructuredViewer)sp).removePostSelectionChangedListener(postSelectionListener);
else
sp.removeSelectionChangedListener(postSelectionListener);
}
}
fPart = part;
ISelection sel = null;
if (part != null) {
ISelectionProvider sp = part.getSite().getSelectionProvider();
if (sp != null) {
sp.addSelectionChangedListener(selectionListener);
if(sp instanceof StructuredViewer)
((StructuredViewer)sp).addPostSelectionChangedListener(postSelectionListener);
else
sp.addSelectionChangedListener(postSelectionListener);
if (notify) {
// get the selection to send below
sel = sp.getSelection();
}
}
}
if (notify) {
fireSelection(part, sel);
firePostSelection(part, sel);
}
}
}