/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-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.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.help.WorkbenchHelp;

/**
 * Global action that saves all targets in the
 * workbench that implement ISaveTarget interface.
 * The action keeps track of opened save targets
 * and their 'save' state. If none of the currently
 * opened targets needs saving, it will disable.
 * This action is somewhat different from all
 * other global actions in that it works on
 * multiple targets at the same time i.e. it
 * does not disconnect from the target when it
 * becomes deactivated.
 */
public class SaveAllAction extends PageEventAction
	implements IPropertyListener
{
	/**
	 * List of parts (element type: <code>IWorkbenchPart</code>)
	 * against which this class has outstanding property listeners registered.
	 */
	private List partsWithListeners = new ArrayList(1);

/**
 * The default constructor.
 */
public SaveAllAction(IWorkbenchWindow window) {
	super(WorkbenchMessages.getString("SaveAll.text"), window); //$NON-NLS-1$
	setToolTipText(WorkbenchMessages.getString("SaveAll.toolTip")); //$NON-NLS-1$
	setId("saveAll"); //$NON-NLS-1$
	setEnabled(false);
	WorkbenchHelp.setHelp(this, IHelpContextIds.SAVE_ALL_ACTION);
	setImageDescriptor(
		WorkbenchImages.getImageDescriptor(
			IWorkbenchGraphicConstants.IMG_ETOOL_SAVEALL_EDIT));
	setDisabledImageDescriptor(
		WorkbenchImages.getImageDescriptor(
			IWorkbenchGraphicConstants.IMG_ETOOL_SAVEALL_EDIT_DISABLED));
	setActionDefinitionId("org.eclipse.ui.file.saveAll"); //$NON-NLS-1$
}
/* (non-Javadoc)
 * Method declared on PageEventAction.
 */
public void pageActivated(IWorkbenchPage page) {
	super.pageActivated(page);
	updateState();
}
/* (non-Javadoc)
 * Method declared on PageEventAction.
 */
public void pageClosed(IWorkbenchPage page) {
	super.pageClosed(page);
	updateState();
}
/* (non-Javadoc)
 * Method declared on PartEventAction.
 */
public void partClosed(IWorkbenchPart part) {
	super.partClosed(part);
	if (part instanceof IEditorPart) {
		part.removePropertyListener(this);
		partsWithListeners.remove(part);
		updateState();	
	}
}
/* (non-Javadoc)
 * Method declared on PartEventAction.
 */
public void partOpened(IWorkbenchPart part) {
	super.partOpened(part);
	if (part instanceof IEditorPart) {
		part.addPropertyListener(this);
		partsWithListeners.add(part);
		updateState();	
	}
}
/* (non-Javadoc)
 * Method declared on IPropertyListener.
 */
public void propertyChanged(Object source, int propID) {
	if (source instanceof IEditorPart) {
		if (propID == IEditorPart.PROP_DIRTY) {
			updateState();
		}
	}
}
/* (non-Javadoc)
 * Method declared on Action.
 */
public void run() {
	if (getWorkbenchWindow() == null) {
		// action has been disposed
		return;
	}
	IWorkbenchPage page = getActivePage();
	if (page != null) {
		page.saveAllEditors(false);
	}
}
/**
 * Updates availability depending on number of
 * targets that need saving.
 */
protected void updateState() {
	IWorkbenchPage page = getActivePage();
	setEnabled(page != null && page.getDirtyEditors().length > 0);
}
/* (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(this);
	}
	partsWithListeners.clear();
}
}
