001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 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 java.util.ArrayList;
013: import java.util.Iterator;
014: import java.util.List;
015:
016: import org.eclipse.ui.IEditorPart;
017: import org.eclipse.ui.IEditorReference;
018: import org.eclipse.ui.IPropertyListener;
019: import org.eclipse.ui.IWorkbenchPage;
020: import org.eclipse.ui.IWorkbenchPart;
021: import org.eclipse.ui.IWorkbenchWindow;
022:
023: /**
024: * Closes all editors except ones with unsaved changes.
025: */
026: public class CloseAllSavedAction extends PageEventAction implements
027: IPropertyListener {
028:
029: /**
030: * List of parts (element type: <code>IWorkbenchPart</code>)
031: * against which this class has outstanding property listeners registered.
032: */
033: private List partsWithListeners = new ArrayList(1);
034:
035: /**
036: * Create an instance of this class.
037: * @param window the window
038: */
039: public CloseAllSavedAction(IWorkbenchWindow window) {
040: super (WorkbenchMessages.CloseAllSavedAction_text, window);
041: setToolTipText(WorkbenchMessages.CloseAllSavedAction_toolTip);
042: // @issue Should create a ID in IWorkbenchActionConstants when it becames API?
043: setId("closeAllSaved"); //$NON-NLS-1$
044: updateState();
045: window.getWorkbench().getHelpSystem().setHelp(this ,
046: IWorkbenchHelpContextIds.CLOSE_ALL_SAVED_ACTION);
047: setActionDefinitionId("org.eclipse.ui.file.closeAllSaved"); //$NON-NLS-1$
048: }
049:
050: /* (non-Javadoc)
051: * Method declared on PageEventAction.
052: */
053: public void pageActivated(IWorkbenchPage page) {
054: super .pageActivated(page);
055: updateState();
056: }
057:
058: /* (non-Javadoc)
059: * Method declared on PageEventAction.
060: */
061: public void pageClosed(IWorkbenchPage page) {
062: super .pageClosed(page);
063: updateState();
064: }
065:
066: /* (non-Javadoc)
067: * Method declared on PartEventAction.
068: */
069: public void partClosed(IWorkbenchPart part) {
070: super .partClosed(part);
071: if (part instanceof IEditorPart) {
072: part.removePropertyListener(this );
073: partsWithListeners.remove(part);
074: updateState();
075: }
076: }
077:
078: /* (non-Javadoc)
079: * Method declared on PartEventAction.
080: */
081: public void partOpened(IWorkbenchPart part) {
082: super .partOpened(part);
083: if (part instanceof IEditorPart) {
084: part.addPropertyListener(this );
085: partsWithListeners.add(part);
086: updateState();
087: }
088: }
089:
090: /* (non-Javadoc)
091: * Method declared on IPropertyListener.
092: */
093: public void propertyChanged(Object source, int propID) {
094: if (source instanceof IEditorPart) {
095: if (propID == IEditorPart.PROP_DIRTY) {
096: updateState();
097: }
098: }
099: }
100:
101: /* (non-Javadoc)
102: * Method declared on Action.
103: */
104: public void run() {
105: if (getWorkbenchWindow() == null) {
106: // action has been dispose
107: return;
108: }
109: IWorkbenchPage page = getActivePage();
110: if (page != null) {
111: ((WorkbenchPage) page).closeAllSavedEditors();
112: }
113: }
114:
115: /**
116: * Enable the action if there at least one editor open.
117: */
118: private void updateState() {
119: IWorkbenchPage page = getActivePage();
120: if (page == null) {
121: setEnabled(false);
122: return;
123: }
124: IEditorReference editors[] = page.getEditorReferences();
125: for (int i = 0; i < editors.length; i++) {
126: if (!editors[i].isDirty()) {
127: setEnabled(true);
128: return;
129: }
130: }
131: setEnabled(false);
132: }
133:
134: /* (non-Javadoc)
135: * Method declared on PageEventAction.
136: */
137: public void dispose() {
138: super .dispose();
139: for (Iterator it = partsWithListeners.iterator(); it.hasNext();) {
140: IWorkbenchPart part = (IWorkbenchPart) it.next();
141: part.removePropertyListener(this);
142: }
143: partsWithListeners.clear();
144: }
145:
146: }
|