blob: a6968f35221bd3c9106fae20da976d04c9f460e3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.ISaveablePart;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.internal.util.Util;
/**
* The abstract superclass for save actions that depend on the active editor.
*/
public abstract class BaseSaveAction extends ActiveEditorAction {
/*
* The view-related code below was added to track the view with focus
* in order to support save actions from a view (see bug 10234).
*/
/**
* List of parts (element type: <code>IWorkbenchPart</code>)
* against which this class has outstanding property listeners registered.
*/
private List partsWithListeners = new ArrayList(1);
private final IPropertyListener propListener = new IPropertyListener() {
public void propertyChanged(Object source, int propId) {
if (source == getActiveEditor()) {
if (propId == IEditorPart.PROP_DIRTY) {
updateState();
}
}
}
};
/**
* Creates a new action with the given text.
*
* @param text the string used as the text for the action,
* or <code>null</code> if there is no text
* @param window the workbench window this action is
* registered with.
*/
protected BaseSaveAction(String text, IWorkbenchWindow window) {
super(text, window);
}
/* (non-Javadoc)
* Method declared on ActiveEditorAction.
*/
protected void editorActivated(IEditorPart part) {
if (part != null) {
part.addPropertyListener(propListener);
partsWithListeners.add(part);
}
}
/* (non-Javadoc)
* Method declared on ActiveEditorAction.
*/
protected void editorDeactivated(IEditorPart part) {
if (part != null) {
part.removePropertyListener(propListener);
partsWithListeners.remove(part);
}
}
private IViewPart activeView;
private final IPropertyListener propListener2 = new IPropertyListener() {
public void propertyChanged(Object source, int propId) {
if (source == activeView) {
if (propId == IEditorPart.PROP_DIRTY) {
updateState();
}
}
}
};
/** the active saveable part is tracked in order to listen to its dirty events */
private ISaveablePart activeSaveablePart;
private final IPropertyListener propListener3 = new IPropertyListener() {
public void propertyChanged(Object source, int propId) {
if (source == activeSaveablePart) {
if (propId == IEditorPart.PROP_DIRTY) {
updateState();
}
}
}
};
/* (non-Javadoc)
* Method declared on PageEventAction.
*/
public void pageActivated(IWorkbenchPage page) {
super.pageActivated(page);
updateActiveView();
updateState();
}
/* (non-Javadoc)
* Method declared on PageEventAction.
*/
public void pageClosed(IWorkbenchPage page) {
super.pageClosed(page);
updateActiveView();
updateState();
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partActivated(IWorkbenchPart part) {
super.partActivated(part);
if (part instanceof IViewPart) {
updateActiveView();
updateState();
}
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partClosed(IWorkbenchPart part) {
super.partClosed(part);
if (part instanceof IViewPart) {
updateActiveView();
updateState();
}
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partDeactivated(IWorkbenchPart part) {
super.partDeactivated(part);
if (part instanceof IViewPart) {
updateActiveView();
updateState();
}
}
/**
* Update the active view based on the current
* active page.
*/
private void updateActiveView() {
if (getActivePage() == null) {
setActiveView(null);
} else {
setActiveView(getActivePage().getActivePart());
}
}
/**
*
*/
private void updateActiveSaveablePart() {
if (activeSaveablePart instanceof IWorkbenchPart) {
((IWorkbenchPart)activeSaveablePart).removePropertyListener(propListener3);
partsWithListeners.remove(activeSaveablePart);
}
activeSaveablePart = getSaveableView();
if (activeSaveablePart == activeView) {
// no need to listen to the same part twice
activeSaveablePart = null;
}
if (activeSaveablePart instanceof IWorkbenchPart) {
((IWorkbenchPart)activeSaveablePart).addPropertyListener(propListener3);
partsWithListeners.add(activeSaveablePart);
}
}
/**
* Set the active editor
*/
private void setActiveView(IWorkbenchPart part) {
if (activeView == part) {
return;
}
if (activeView != null) {
activeView.removePropertyListener(propListener2);
partsWithListeners.remove(activeView);
}
if (part instanceof IViewPart) {
activeView = (IViewPart) part;
} else {
activeView = null;
}
if (activeView != null) {
activeView.addPropertyListener(propListener2);
partsWithListeners.add(activeView);
}
updateActiveSaveablePart();
}
protected final ISaveablePart getSaveableView() {
if (activeView == null) {
return null;
}
return (ISaveablePart) Util.getAdapter(activeView, ISaveablePart.class);
}
/* (non-Javadoc)
* Method declared on PageEventAction.
*/
public void dispose() {
super.dispose();
for (Iterator it = partsWithListeners.iterator(); it.hasNext();) {
IWorkbenchPart part = (IWorkbenchPart) it.next();
part.removePropertyListener(propListener);
part.removePropertyListener(propListener2);
part.removePropertyListener(propListener3);
}
partsWithListeners.clear();
}
}