### Eclipse Workspace Patch 1.0 #P org.eclipse.compare Index: compare/org/eclipse/compare/internal/CompareEditor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java,v retrieving revision 1.29 diff -u -r1.29 CompareEditor.java --- compare/org/eclipse/compare/internal/CompareEditor.java 14 Nov 2005 20:30:16 -0000 1.29 +++ compare/org/eclipse/compare/internal/CompareEditor.java 2 Feb 2006 18:49:01 -0000 @@ -17,6 +17,7 @@ import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.*; import org.eclipse.jface.util.Assert; @@ -35,7 +36,7 @@ * A CompareEditor takes a ICompareEditorInput as input. * Most functionality is delegated to the ICompareEditorInput. */ -public class CompareEditor extends EditorPart implements IReusableEditor { +public class CompareEditor extends EditorPart implements IReusableEditor, ISaveableModelSource, ISaveableModel { /** * Internal property change listener for handling changes in the editor's input. @@ -257,6 +258,15 @@ */ public boolean isDirty() { IEditorInput input= getEditorInput(); + if (input instanceof ISaveableModelSource) { + ISaveableModelSource sms = (ISaveableModelSource) input; + ISaveableModel[] models = sms.getModels(); + for (int i = 0; i < models.length; i++) { + ISaveableModel model = models[i]; + if (model.isDirty()) + return true; + } + } if (input instanceof CompareEditorInput) return ((CompareEditorInput)input).isSaveNeeded(); return false; @@ -268,5 +278,50 @@ if (old_value == null || new_value == null || !old_value.equals(new_value)) firePropertyChange(PROP_DIRTY); } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveableModelSource#getModels() + */ + public ISaveableModel[] getModels() { + IEditorInput input= getEditorInput(); + if (input instanceof ISaveableModelSource) { + ISaveableModelSource source = (ISaveableModelSource) input; + return source.getModels(); + } + return new ISaveableModel[] { this }; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveableModelSource#getActiveModels() + */ + public ISaveableModel[] getActiveModels() { + IEditorInput input= getEditorInput(); + if (input instanceof ISaveableModelSource) { + ISaveableModelSource source = (ISaveableModelSource) input; + return source.getActiveModels(); + } + return new ISaveableModel[] { this }; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveableModel#getName() + */ + public String getName() { + return getPartName(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveableModel#getToolTipText() + */ + public String getToolTipText() { + return getTitleToolTip(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveableModel#getImageDescriptor() + */ + public ImageDescriptor getImageDescriptor() { + return ImageDescriptor.createFromImage(getTitleImage()); + } } Index: compare/org/eclipse/compare/CompareEditorInput.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java,v retrieving revision 1.56 diff -u -r1.56 CompareEditorInput.java --- compare/org/eclipse/compare/CompareEditorInput.java 11 Jan 2006 10:47:53 -0000 1.56 +++ compare/org/eclipse/compare/CompareEditorInput.java 2 Feb 2006 18:49:01 -0000 @@ -23,8 +23,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.*; -import org.eclipse.ui.IPersistableElement; -import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.*; import org.eclipse.jface.util.*; import org.eclipse.jface.util.Assert; @@ -88,6 +87,12 @@ * by passing a subclass of CompareConfiguration and by implementing the prepareInput method. * If a subclass cannot use the DiffTreeViewer which is installed by default in the * top left pane, method createDiffViewer can be overridden. + *

+ * If subclasses of this class implement {@link ISaveableModelSource}, the compare editor will + * pass these models through to the workbench. The editor will still show the dirty indicator + * if one of these underlying models is dirty. It is the reponsibility of subclasses that + * implement this interface to call {@link #setDirty(boolean)} when the dirty state of + * any of the models managed by the sublcass change dirty state. * * @see CompareUI * @see CompareEditorInput