Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java')
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java771
1 files changed, 771 insertions, 0 deletions
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java
new file mode 100644
index 000000000..f3fbc5261
--- /dev/null
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java
@@ -0,0 +1,771 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 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.compare.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.CompareEditorInput;
+import org.eclipse.compare.IPropertyChangeNotifier;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IFindReplaceTarget;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IReusableEditor;
+import org.eclipse.ui.ISaveablesLifecycleListener;
+import org.eclipse.ui.ISaveablesSource;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartConstants;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.Saveable;
+import org.eclipse.ui.SaveablesLifecycleEvent;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.part.IShowInSource;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.services.IServiceLocator;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * A CompareEditor takes a ICompareEditorInput as input.
+ * Most functionality is delegated to the ICompareEditorInput.
+ */
+public class CompareEditor extends EditorPart implements IReusableEditor, ISaveablesSource, IPropertyChangeListener, ISaveablesLifecycleListener {
+
+ public final static String CONFIRM_SAVE_PROPERTY= "org.eclipse.compare.internal.CONFIRM_SAVE_PROPERTY"; //$NON-NLS-1$
+
+ private static final int UNINITIALIZED = 0;
+ private static final int INITIALIZING = 1;
+ private static final int NO_DIFF = 2;
+ private static final int CANCELED = 3;
+ private static final int INITIALIZED = 4;
+ private static final int ERROR = 5;
+ private static final int STILL_INITIALIZING = 6;
+ private static final int CREATING_CONTROL = 7;
+ private static final int DONE = 8;
+
+ private IActionBars fActionBars;
+
+ private PageBook fPageBook;
+
+ /** the SWT control from the compare editor input*/
+ private Control fControl;
+ /** the outline page */
+ private CompareOutlinePage fOutlinePage;
+
+ private CompareSaveable fSaveable;
+
+ private Control initializingPage;
+ private Control emptyPage;
+
+ private int state = UNINITIALIZED;
+ private HashSet knownSaveables;
+
+ private final EditorCompareContainer fContainer = new EditorCompareContainer();
+
+ private class EditorCompareContainer extends CompareContainer {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.ICompareContainer#registerContextMenu(org.eclipse.jface.action.MenuManager, org.eclipse.jface.viewers.ISelectionProvider)
+ */
+ public void registerContextMenu(MenuManager menu, ISelectionProvider provider) {
+ if (getSite() instanceof IEditorSite) {
+ IEditorSite es = (IEditorSite) getSite();
+ es.registerContextMenu(menu, provider, true);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.ICompareContainer#setStatusMessage(java.lang.String)
+ */
+ public void setStatusMessage(String message) {
+ if (fActionBars != null) {
+ IStatusLineManager slm= fActionBars.getStatusLineManager();
+ if (slm != null) {
+ slm.setMessage(message);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.ICompareContainer#getServiceLocator()
+ */
+ public IServiceLocator getServiceLocator() {
+ return getSite();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.internal.CompareContainer#createWorkerJob()
+ */
+ protected WorkerJob createWorkerJob() {
+ WorkerJob workerJob = new WorkerJob(getWorkerJobName()) {
+ public boolean belongsTo(Object family) {
+ if (family == CompareEditor.this)
+ return true;
+ return super.belongsTo(family);
+ }
+ };
+ return workerJob;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.internal.CompareContainer#getWorkerJobName()
+ */
+ protected String getWorkerJobName() {
+ return NLS.bind(CompareMessages.CompareEditor_2, getTitle());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.internal.CompareContainer#getWorkbenchPart()
+ */
+ public IWorkbenchPart getWorkbenchPart() {
+ return CompareEditor.this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.internal.CompareContainer#getActionBars()
+ */
+ public IActionBars getActionBars() {
+ return CompareEditor.this.getActionBars();
+ }
+ }
+
+ /**
+ * No-argument constructor required for extension points.
+ */
+ public CompareEditor() {
+ // empty default implementation
+ }
+
+ /* (non-Javadoc)
+ * Method declared on IAdaptable
+ */
+ public Object getAdapter(Class key) {
+
+ if (key.equals(IContentOutlinePage.class)) {
+ Object object= getCompareConfiguration().getProperty(CompareConfiguration.USE_OUTLINE_VIEW);
+ if (object instanceof Boolean && ((Boolean)object).booleanValue()) {
+ if (fOutlinePage != null) {
+ if (fOutlinePage.getControl() != null && fOutlinePage.getControl().isDisposed()) {
+ fOutlinePage = null;
+ } else {
+ return fOutlinePage;
+ }
+ }
+ fOutlinePage= new CompareOutlinePage(this);
+ return fOutlinePage;
+ }
+ }
+
+ if (key == IShowInSource.class
+ || key == OutlineViewerCreator.class
+ || key == IFindReplaceTarget.class) {
+ Object input = getEditorInput();
+ if (input != null) {
+ return Utilities.getAdapter(input, key);
+ }
+ }
+
+ if (key == IEditorInput.class) {
+ return getEditorInput().getAdapter(IEditorInput.class);
+ }
+
+ if (key == ITextEditorExtension3.class) {
+ return getEditorInput().getAdapter(ITextEditorExtension3.class);
+ }
+
+ return super.getAdapter(key);
+ }
+
+ /*
+ * Helper method used by ComapreEditorConfiguration to get at the compare configuration of the editor
+ */
+ /* package */ CompareConfiguration getCompareConfiguration() {
+ IEditorInput input= getEditorInput();
+ if (input instanceof CompareEditorInput)
+ return ((CompareEditorInput)input).getCompareConfiguration();
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
+ */
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+
+ if (!(input instanceof CompareEditorInput))
+ throw new PartInitException(Utilities.getString("CompareEditor.invalidInput")); //$NON-NLS-1$
+
+ setSite(site);
+ setInput(input);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
+ */
+ public void setInput(IEditorInput input) {
+ if (!(input instanceof CompareEditorInput)) {
+ IStatus s= new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.OK, Utilities.getString("CompareEditor.invalidInput"), null); //$NON-NLS-1$
+ String title= Utilities.getString("CompareEditor.error.setinput.title"); //$NON-NLS-1$
+ String msg= Utilities.getString("CompareEditor.error.setinput.message"); //$NON-NLS-1$
+ ErrorDialog.openError(getSite().getShell(), title, msg, s);
+ return;
+ }
+ doSetInput(input);
+ // Need to refresh the contributor (see #67888)
+ refreshActionBarsContributor();
+ }
+
+ public void refreshActionBarsContributor() {
+ IEditorSite editorSite= getEditorSite();
+ if (editorSite != null) {
+ IEditorActionBarContributor actionBarContributor= editorSite.getActionBarContributor();
+ if (actionBarContributor != null) {
+ actionBarContributor.setActiveEditor(null);
+ actionBarContributor.setActiveEditor(this);
+ }
+ }
+ }
+
+ private void doSetInput(IEditorInput input) {
+ IEditorInput oldInput= getEditorInput();
+ disconnectFromInput(oldInput);
+ Point oldSize = null;
+ boolean hadPreviousInput = oldInput != null;
+ if (hadPreviousInput) {
+ // Cancel any jobs associated with the old input
+ Job.getJobManager().cancel(this);
+ if (fControl != null && !fControl.isDisposed()) {
+ oldSize= fControl.getSize();
+ if (emptyPage == null)
+ emptyPage = new Composite(fPageBook, SWT.NONE);
+ fPageBook.showPage(emptyPage);
+ fControl.dispose();
+ fControl = null;
+ }
+ }
+
+ super.setInput(input);
+
+ if (fOutlinePage != null)
+ fOutlinePage.reset();
+
+ final CompareEditorInput cei= (CompareEditorInput) input;
+ cei.setContainer(fContainer);
+ setTitleImage(cei.getTitleImage());
+ setPartName(cei.getTitle());
+ setTitleToolTip(cei.getToolTipText());
+
+ if (input instanceof IPropertyChangeNotifier)
+ ((IPropertyChangeNotifier)input).addPropertyChangeListener(this);
+
+ setState(cei.getCompareResult() == null ? INITIALIZING : INITIALIZED);
+ if (fPageBook != null)
+ createCompareControl();
+ if (fControl != null && oldSize != null)
+ fControl.setSize(oldSize);
+
+ boolean hasResult = cei.getCompareResult() != null;
+ if (!hasResult) {
+ initializeInBackground(cei, hadPreviousInput);
+ }
+
+ firePropertyChange(IWorkbenchPartConstants.PROP_INPUT);
+
+ // We only need to notify of new Saveables if we are changing inputs
+ if (hadPreviousInput && hasResult) {
+ registerSaveable();
+ }
+ }
+
+ private void registerSaveable() {
+ ISaveablesLifecycleListener lifecycleListener= (ISaveablesLifecycleListener) getSite().getService(ISaveablesLifecycleListener.class);
+ lifecycleListener.handleLifecycleEvent(
+ new SaveablesLifecycleEvent(this, SaveablesLifecycleEvent.POST_OPEN, internalGetSaveables(true), false));
+ }
+
+ private void disconnectFromInput(IEditorInput oldInput) {
+ if (oldInput != null) {
+
+ if (oldInput instanceof IPropertyChangeNotifier)
+ ((IPropertyChangeNotifier)oldInput).removePropertyChangeListener(this);
+
+ // Let the workbench know that the old input's saveables are no longer needed
+ if (knownSaveables != null && !knownSaveables.isEmpty()) {
+ ISaveablesLifecycleListener lifecycleListener= (ISaveablesLifecycleListener) getSite().getService(ISaveablesLifecycleListener.class);
+ lifecycleListener.handleLifecycleEvent(
+ new SaveablesLifecycleEvent(this, SaveablesLifecycleEvent.POST_CLOSE, (Saveable[]) knownSaveables.toArray(new Saveable[knownSaveables.size()]), false));
+ knownSaveables.clear();
+ }
+ }
+ }
+
+ protected void initializeInBackground(final CompareEditorInput cei, final boolean hadPreviousInput) {
+ // Need to cancel any running jobs associated with the oldInput
+ Job job = new Job(NLS.bind(CompareMessages.CompareEditor_0, cei.getTitle())) {
+ protected IStatus run(final IProgressMonitor monitor) {
+ final int[] newState = new int[] { ERROR };
+ try {
+ IStatus status = CompareUIPlugin.getDefault().prepareInput(cei, monitor);
+ if (status.isOK()) {
+ // We need to update the saveables list
+ newState[0] = INITIALIZED;
+ return Status.OK_STATUS;
+ }
+ if (status.getCode() == CompareUIPlugin.NO_DIFFERENCE) {
+ newState[0] = NO_DIFF;
+ return Status.OK_STATUS;
+ }
+ newState[0] = ERROR;
+ return status;
+ } catch (OperationCanceledException e) {
+ newState[0] = CANCELED;
+ return Status.CANCEL_STATUS;
+ } finally {
+ if (monitor.isCanceled())
+ newState[0] = CANCELED;
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ if (fPageBook.isDisposed())
+ return;
+ // we need to register the saveable if we had a previous input or if
+ // there are knownSaveables (which means that the workbench called
+ // getSaveables and got an empty list
+ if (hadPreviousInput || (knownSaveables != null && !isAllSaveablesKnown())) {
+ registerSaveable();
+ }
+ setState(newState[0]);
+ createCompareControl();
+ }
+ });
+ monitor.done();
+ }
+ }
+ public boolean belongsTo(Object family) {
+ if (family == CompareEditor.this || family == cei)
+ return true;
+ return cei.belongsTo(family);
+ }
+ };
+ job.setUser(true);
+ Utilities.schedule(job, getSite());
+ }
+
+ /*
+ * Helper method used to find an action bars using the Utilities#findActionsBars(Control)
+ */
+ public IActionBars getActionBars() {
+ return fActionBars;
+ }
+
+ /*
+ * Set the action bars so the Utilities class can access it.
+ */
+ /* package */ void setActionBars(IActionBars actionBars) {
+ fActionBars= actionBars;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createPartControl(Composite parent) {
+ parent.setData(this);
+ fPageBook = new PageBook(parent, SWT.NONE);
+ createCompareControl();
+ IContextService service = (IContextService)getSite().getService(IContextService.class);
+ if (service != null) {
+ service.activateContext("org.eclipse.compare.compareEditorScope"); //$NON-NLS-1$
+ service.activateContext("org.eclipse.ui.textEditorScope"); //$NON-NLS-1$
+ }
+ }
+
+ private void createCompareControl() {
+ if (fPageBook.isDisposed())
+ return;
+ IEditorInput input= getEditorInput();
+ if (input instanceof CompareEditorInput) {
+ CompareEditorInput ci = (CompareEditorInput) input;
+ if (ci.getCompareResult() == null) {
+ if (getState() == INITIALIZING) {
+ getSite().setSelectionProvider(new CompareEditorSelectionProvider());
+ setPageLater();
+ } else if (getState() == STILL_INITIALIZING) {
+ if (initializingPage == null) {
+ initializingPage = getInitializingMessagePane(fPageBook);
+ }
+ fPageBook.showPage(initializingPage);
+ } else if (getState() == CANCELED) {
+ // Close the editor when we are canceled
+ closeEditor();
+ } else if (getState() == NO_DIFF) {
+ // Prompt and close the editor as well
+ setState(DONE);
+ closeEditor();
+ CompareUIPlugin.getDefault().handleNoDifference();
+ } else if (getState() == ERROR) {
+ // If an error occurred, close the editor
+ // (the message would be displayed by the progress view)
+ closeEditor();
+ }
+ } else if (fControl == null && getState() != CREATING_CONTROL) {
+ if (getState() == CANCELED) {
+ // Close the editor when we are canceled, even when compare
+ // result has been already prepared
+ closeEditor();
+ return;
+ }
+ // Set the state in case this method gets called again
+ setState(CREATING_CONTROL);
+ if (getSite().getSelectionProvider() == null)
+ getSite().setSelectionProvider(new CompareEditorSelectionProvider());
+ try {
+ fControl = ci.createContents(fPageBook);
+ } catch (SWTException e) {
+ // closed while creating
+ if (e.code == SWT.ERROR_WIDGET_DISPOSED) {
+ setState(CANCELED);
+ return;
+ }
+ }
+ fPageBook.showPage(fControl);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(fControl, ICompareContextIds.COMPARE_EDITOR);
+ if (isActive()) {
+ setFocus();
+ }
+ setState(INITIALIZED);
+ }
+ }
+ }
+
+ private boolean isActive() {
+ return getSite().getPage().getActivePart() == this;
+ }
+
+ private void setPageLater() {
+ Display.getCurrent().timerExec(1000, new Runnable() {
+ public void run() {
+ synchronized(CompareEditor.this) {
+ if (getState() == INITIALIZING) {
+ setState(STILL_INITIALIZING);
+ createCompareControl();
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+ */
+ public void dispose() {
+ IEditorInput input= getEditorInput();
+ if (input instanceof IPropertyChangeNotifier)
+ ((IPropertyChangeNotifier)input).removePropertyChangeListener(this);
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+ */
+ public void setFocus() {
+ IEditorInput input= getEditorInput();
+ if (input instanceof CompareEditorInput)
+ if (!((CompareEditorInput)input).setFocus2())
+ fPageBook.setFocus();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
+ */
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * Always throws an AssertionFailedException.
+ * @see org.eclipse.ui.part.EditorPart#doSaveAs()
+ */
+ public void doSaveAs() {
+ Assert.isTrue(false); // Save As not supported for CompareEditor
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void doSave(IProgressMonitor progressMonitor) {
+
+ final IEditorInput input= getEditorInput();
+
+ WorkspaceModifyOperation operation= new WorkspaceModifyOperation() {
+ public void execute(IProgressMonitor pm) throws CoreException {
+ if (input instanceof CompareEditorInput)
+ ((CompareEditorInput)input).saveChanges(pm);
+ }
+ };
+
+ Shell shell= getSite().getShell();
+
+ try {
+
+ operation.run(progressMonitor);
+
+ firePropertyChange(PROP_DIRTY);
+
+ } catch (InterruptedException x) {
+ // NeedWork
+ } catch (OperationCanceledException x) {
+ // NeedWork
+ } catch (InvocationTargetException x) {
+ String title= Utilities.getString("CompareEditor.saveError.title"); //$NON-NLS-1$
+ String reason= x.getTargetException().getMessage();
+ MessageDialog.openError(shell, title, Utilities.getFormattedString("CompareEditor.cantSaveError", reason)); //$NON-NLS-1$
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#isDirty()
+ */
+ public boolean isDirty() {
+ IEditorInput input= getEditorInput();
+ if (input instanceof CompareEditorInput)
+ return ((CompareEditorInput)input).isDirty();
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(CompareEditorInput.DIRTY_STATE)) {
+ Object old_value= event.getOldValue();
+ Object new_value= event.getNewValue();
+ if (old_value == null || new_value == null || !old_value.equals(new_value))
+ firePropertyChange(PROP_DIRTY);
+ } else if (event.getProperty().equals(CompareEditorInput.PROP_TITLE)) {
+ setPartName(((CompareEditorInput)getEditorInput()).getTitle());
+ setTitleToolTip(((CompareEditorInput)getEditorInput()).getToolTipText());
+ } else if (event.getProperty().equals(CompareEditorInput.PROP_TITLE_IMAGE)) {
+ setTitleImage(((CompareEditorInput)getEditorInput()).getTitleImage());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablesSource#getModels()
+ */
+ public Saveable[] getSaveables() {
+ return internalGetSaveables(knownSaveables == null);
+ }
+
+ private Saveable[] internalGetSaveables(boolean init) {
+ IEditorInput input= getEditorInput();
+ Saveable[] sourceSaveables = getSaveables(input);
+ if (init || knownSaveables == null) {
+ recordSaveables(sourceSaveables);
+ } else {
+ for (int i = 0; i < sourceSaveables.length; i++) {
+ Saveable saveable = sourceSaveables[i];
+ if (!knownSaveables.contains(saveable)) {
+ CompareUIPlugin.logErrorMessage(NLS.bind("Saveable {0} was not added using a saveables lifecycle event.", saveable.getName())); //$NON-NLS-1$
+ knownSaveables.add(saveable);
+ }
+ }
+ if (sourceSaveables.length != knownSaveables.size()) {
+ CompareUIPlugin.logErrorMessage("Saveables were removed without an appropriate event"); //$NON-NLS-1$
+ knownSaveables.clear();
+ recordSaveables(sourceSaveables);
+ }
+ }
+ return sourceSaveables;
+ }
+
+ private boolean isAllSaveablesKnown() {
+ IEditorInput input= getEditorInput();
+ Saveable[] sourceSaveables = getSaveables(input);
+ if (knownSaveables == null) {
+ return sourceSaveables.length == 0;
+ }
+ if (sourceSaveables.length != knownSaveables.size()) {
+ return false;
+ }
+ for (int i = 0; i < sourceSaveables.length; i++) {
+ Saveable saveable = sourceSaveables[i];
+ if (!knownSaveables.contains(saveable)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void recordSaveables(Saveable[] sourceSaveables) {
+ if (knownSaveables == null)
+ knownSaveables = new HashSet();
+ for (int i = 0; i < sourceSaveables.length; i++) {
+ Saveable saveable = sourceSaveables[i];
+ knownSaveables.add(saveable);
+ }
+ }
+
+ private Saveable[] getSaveables(IEditorInput input) {
+ if (input instanceof ISaveablesSource) {
+ ISaveablesSource source= (ISaveablesSource) input;
+ return source.getSaveables();
+ }
+ return new Saveable[] { getSaveable() };
+ }
+
+ private Saveable getSaveable() {
+ if (fSaveable == null) {
+ fSaveable= new CompareSaveable();
+ }
+ return fSaveable;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablesSource#getActiveModels()
+ */
+ public Saveable[] getActiveSaveables() {
+ IEditorInput input= getEditorInput();
+ if (input instanceof ISaveablesSource) {
+ ISaveablesSource source= (ISaveablesSource) input;
+ return source.getActiveSaveables();
+ }
+ return new Saveable[] { getSaveable() };
+ }
+
+ private class CompareSaveable extends Saveable {
+
+ public String getName() {
+ return CompareEditor.this.getPartName();
+ }
+
+ public String getToolTipText() {
+ return CompareEditor.this.getTitleToolTip();
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return ImageDescriptor.createFromImage(CompareEditor.this.getTitleImage());
+ }
+
+ public void doSave(IProgressMonitor monitor) throws CoreException {
+ CompareEditor.this.doSave(monitor);
+ }
+
+ public boolean isDirty() {
+ return CompareEditor.this.isDirty();
+ }
+
+ public boolean equals(Object object) {
+ return object == this;
+ }
+
+ public int hashCode() {
+ return CompareEditor.this.hashCode();
+ }
+ }
+
+ private Composite getInitializingMessagePane(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setBackground(getBackgroundColor(parent));
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ composite.setLayout(layout);
+
+ createDescriptionLabel(composite, CompareMessages.CompareEditor_1);
+ return composite;
+ }
+
+ private Color getBackgroundColor(Composite parent) {
+ return parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+ }
+
+ private Label createDescriptionLabel(Composite parent, String text) {
+ Label description = new Label(parent, SWT.WRAP);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ description.setLayoutData(data);
+ description.setText(text);
+ description.setBackground(getBackgroundColor(parent));
+ return description;
+ }
+
+ private void closeEditor() {
+ getSite().getPage().closeEditor(CompareEditor.this, false);
+ }
+
+ private synchronized void setState(int state) {
+ this.state = state;
+ }
+
+ private int getState() {
+ return state;
+ }
+
+ public void handleLifecycleEvent(SaveablesLifecycleEvent event) {
+ ISaveablesLifecycleListener lifecycleListener= (ISaveablesLifecycleListener) getSite().getService(ISaveablesLifecycleListener.class);
+ if (event.getEventType() == SaveablesLifecycleEvent.POST_CLOSE) {
+ // We may get a post close for a saveable that is not known to the workbench.
+ // Only pass on the event for known saveables
+ if (knownSaveables == null || knownSaveables.isEmpty())
+ return;
+ java.util.List result = new ArrayList();
+ Saveable[] all = event.getSaveables();
+ for (int i = 0; i < all.length; i++) {
+ Saveable saveable = all[i];
+ if (knownSaveables.contains(saveable))
+ result.add(saveable);
+ knownSaveables.remove(saveable);
+ }
+ if (result.isEmpty())
+ return;
+ event = new SaveablesLifecycleEvent(this,
+ SaveablesLifecycleEvent.POST_CLOSE,
+ (Saveable[]) result.toArray(new Saveable[result.size()]),
+ false);
+ } else if (event.getEventType() == SaveablesLifecycleEvent.POST_OPEN) {
+ recordSaveables(event.getSaveables());
+ }
+ lifecycleListener.handleLifecycleEvent(event);
+ }
+
+}
+

Back to the top