### Eclipse Workspace Patch 1.0 #P org.eclipse.team.ui Index: src/org/eclipse/team/ui/synchronize/SaveableCompareEditorInput.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/SaveableCompareEditorInput.java,v retrieving revision 1.16 diff -u -r1.16 SaveableCompareEditorInput.java --- src/org/eclipse/team/ui/synchronize/SaveableCompareEditorInput.java 17 Jul 2008 11:50:02 -0000 1.16 +++ src/org/eclipse/team/ui/synchronize/SaveableCompareEditorInput.java 20 Nov 2008 16:03:45 -0000 @@ -10,34 +10,24 @@ *******************************************************************************/ package org.eclipse.team.ui.synchronize; -import java.lang.reflect.InvocationTargetException; - import org.eclipse.compare.*; import org.eclipse.compare.structuremergeviewer.*; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.*; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.*; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.viewers.*; -import org.eclipse.osgi.util.NLS; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; -import org.eclipse.team.internal.ui.*; -import org.eclipse.team.internal.ui.history.CompareFileRevisionEditorInput; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.internal.ui.synchronize.LocalResourceSaveableComparison; -import org.eclipse.team.internal.ui.synchronize.LocalResourceTypedElement; -import org.eclipse.team.internal.ui.synchronize.EditableSharedDocumentAdapter.ISharedDocumentAdapterListener; import org.eclipse.team.ui.mapping.SaveableComparison; import org.eclipse.ui.*; -import org.eclipse.ui.actions.*; -import org.eclipse.ui.keys.IBindingService; import org.eclipse.ui.services.IDisposable; /** @@ -51,101 +41,12 @@ *

* @since 3.3 */ -public abstract class SaveableCompareEditorInput extends CompareEditorInput implements ISaveablesSource { +public abstract class SaveableCompareEditorInput extends AbstractSaveableCompareEditorInput { - private ICompareInputChangeListener compareInputChangeListener; - private final IWorkbenchPage page; - private final ListenerList inputChangeListeners = new ListenerList(ListenerList.IDENTITY); private Saveable saveable; private IPropertyListener propertyListener; /** - * Return a typed element that represents a local file. If the element - * returned from this method is used as the left contributor of the compare - * input for a {@link SaveableCompareEditorInput}, then the file will - * be properly saved when the compare editor input or viewers are saved. - * @param file the file - * @return a typed element that represents a local file. - */ - public static ITypedElement createFileElement(IFile file) { - return new LocalResourceTypedElement(file); - } - - private static ITypedElement getFileElement(ICompareInput input, - CompareEditorInput editorInput) { - if (input.getLeft() instanceof LocalResourceTypedElement) { - return (LocalResourceTypedElement) input.getLeft(); - } - if (editorInput instanceof CompareFileRevisionEditorInput) { - return ((CompareFileRevisionEditorInput) editorInput).getLocalElement(); - } - return null; - } - - private class InternalResourceSaveableComparison extends LocalResourceSaveableComparison implements ISharedDocumentAdapterListener { - private LocalResourceTypedElement lrte; - private boolean connected = false; - public InternalResourceSaveableComparison( - ICompareInput input, CompareEditorInput editorInput) { - super(input, editorInput, SaveableCompareEditorInput.getFileElement(input, editorInput)); - ITypedElement element = SaveableCompareEditorInput.getFileElement(input, editorInput); - if (element instanceof LocalResourceTypedElement) { - lrte = (LocalResourceTypedElement) element; - if (lrte.isConnected()) { - registerSaveable(true); - } else { - lrte.setSharedDocumentListener(this); - } - } - } - protected void fireInputChange() { - SaveableCompareEditorInput.this.fireInputChange(); - } - public void dispose() { - super.dispose(); - if (lrte != null) - lrte.setSharedDocumentListener(null); - } - public void handleDocumentConnected() { - if (connected) - return; - connected = true; - registerSaveable(false); - if (lrte != null) - lrte.setSharedDocumentListener(null); - } - - private void registerSaveable(boolean init) { - ICompareContainer container = getContainer(); - IWorkbenchPart part = container.getWorkbenchPart(); - if (part != null) { - ISaveablesLifecycleListener lifecycleListener= getSaveablesLifecycleListener(part); - // Remove this saveable from the lifecycle listener - if (!init) - lifecycleListener.handleLifecycleEvent( - new SaveablesLifecycleEvent(part, SaveablesLifecycleEvent.POST_CLOSE, new Saveable[] { this }, false)); - // Now fix the hashing so it uses the connected document - initializeHashing(); - // Finally, add this saveable back to the listener - lifecycleListener.handleLifecycleEvent( - new SaveablesLifecycleEvent(part, SaveablesLifecycleEvent.POST_OPEN, new Saveable[] { this }, false)); - } - } - public void handleDocumentDeleted() { - // Ignore - } - public void handleDocumentDisconnected() { - // Ignore - } - public void handleDocumentFlushed() { - // Ignore - } - public void handleDocumentSaved() { - // Ignore - } - } - - /** * Creates a LocalResourceCompareEditorInput which is initialized with the given * compare configuration. * The compare configuration is passed to subsequently created viewers. @@ -154,8 +55,7 @@ * @param page the workbench page that will contain the editor */ public SaveableCompareEditorInput(CompareConfiguration configuration, IWorkbenchPage page) { - super(configuration); - this.page = page; + super(configuration, page); } /* (non-Javadoc) @@ -163,23 +63,6 @@ */ protected void contentsCreated() { super.contentsCreated(); - compareInputChangeListener = new ICompareInputChangeListener() { - public void compareInputChanged(ICompareInput source) { - if (source == getCompareResult()) { - boolean closed = false; - if (source.getKind() == Differencer.NO_CHANGE) { - closed = closeEditor(true); - } - if (!closed) { - // The editor was closed either because the compare input still has changes - // or because the editor input is dirty. In either case, fire the changes - // to the registered listeners - propogateInputChange(); - } - } - } - }; - getCompareInput().addCompareInputChangeListener(compareInputChangeListener); if (getSaveable() instanceof SaveableComparison) { SaveableComparison scm = (SaveableComparison) saveable; @@ -195,23 +78,11 @@ setDirty(saveable.isDirty()); } - private ISaveablesLifecycleListener getSaveablesLifecycleListener( - IWorkbenchPart part) { - ISaveablesLifecycleListener listener = (ISaveablesLifecycleListener)Utils.getAdapter(part, ISaveablesLifecycleListener.class); - if (listener == null) - listener = (ISaveablesLifecycleListener) part.getSite().getService(ISaveablesLifecycleListener.class); - return listener; - } - /* (non-Javadoc) * @see org.eclipse.compare.CompareEditorInput#handleDispose() */ protected void handleDispose() { super.handleDispose(); - ICompareInput compareInput = getCompareInput(); - if (compareInput != null) - compareInput.removeCompareInputChangeListener(compareInputChangeListener); - compareInputChangeListener = null; if (saveable instanceof SaveableComparison) { SaveableComparison scm = (SaveableComparison) saveable; scm.removePropertyListener(propertyListener); @@ -227,99 +98,6 @@ } /** - * Prepare the compare input of this editor input. This method is not intended to be overridden of - * extended by subclasses (but is not final for backwards compatibility reasons). - * The implementation of this method in this class - * delegates the creation of the compare input to the {@link #prepareCompareInput(IProgressMonitor)} - * method which subclasses must implement. - * @see org.eclipse.compare.CompareEditorInput#prepareInput(org.eclipse.core.runtime.IProgressMonitor) - */ - protected Object prepareInput(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { - final ICompareInput input = prepareCompareInput(monitor); - if (input != null) - setTitle(NLS.bind(TeamUIMessages.SyncInfoCompareInput_title, new String[] { input.getName()})); - return input; - } - - /** - * Method called from {@link #prepareInput(IProgressMonitor)} to obtain the input. - * It's purpose is to ensure that the input is an instance of {@link ICompareInput}. - * @param monitor a progress monitor - * @return the compare input - * @throws InvocationTargetException - * @throws InterruptedException - */ - protected abstract ICompareInput prepareCompareInput(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException; - - /** - * Return the compare input of this editor input. - * @return the compare input of this editor input - */ - protected final ICompareInput getCompareInput() { - return (ICompareInput)getCompareResult(); - } - - /** - * Callback from the resource saveable that is invoked when the resource is - * saved so that this input can fire a change event for its input. Subclasses - * only need this method if the left side of their compare input is - * an element returned from {@link #createFileElement(IFile)}. - */ - protected abstract void fireInputChange(); - - /** - * Close the editor if it is not dirty. If it is still dirty, let the - * content merge viewer handle the compare input change. - * @param checkForUnsavedChanges whether to check for unsaved changes - * @return true if the editor was closed (note that the - * close may be asynchronous) - */ - protected boolean closeEditor(boolean checkForUnsavedChanges) { - if (isSaveNeeded() && checkForUnsavedChanges) { - return false; - } else { - Runnable runnable = new Runnable() { - public void run() { - IEditorPart part = getPage().findEditor(SaveableCompareEditorInput.this); - getPage().closeEditor(part, false); - } - }; - if (Display.getCurrent() != null) { - runnable.run(); - } else { - Display display = getPage().getWorkbenchWindow().getShell().getDisplay(); - display.asyncExec(runnable); - } - return true; - } - } - - private IWorkbenchPage getPage() { - if (page == null) - return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - return page; - } - - /* package */ void propogateInputChange() { - if (!inputChangeListeners.isEmpty()) { - Object[] allListeners = inputChangeListeners.getListeners(); - for (int i = 0; i < allListeners.length; i++) { - final ICompareInputChangeListener listener = (ICompareInputChangeListener)allListeners[i]; - SafeRunner.run(new ISafeRunnable() { - public void run() throws Exception { - listener.compareInputChanged((ICompareInput)SaveableCompareEditorInput.this.getCompareResult()); - } - public void handleException(Throwable exception) { - // Logged by the safe runner - } - }); - } - } - } - - /** * Get the saveable that provides the save behavior for this compare editor input. * The {@link #createSaveable()} is called to create the saveable if it does not yet exist. * This method cannot be called until after the input is prepared (i.e. until after @@ -342,7 +120,7 @@ protected Saveable createSaveable() { Object compareResult = getCompareResult(); Assert.isNotNull(compareResult, "This method cannot be called until after prepareInput is called"); //$NON-NLS-1$ - return new InternalResourceSaveableComparison((ICompareInput)compareResult, this); + return new InternalResourceSaveableComparison((ICompareInput)compareResult, this, getFileElement(getCompareInput().getLeft(), this)); } /* (non-Javadoc) @@ -355,37 +133,6 @@ } /* (non-Javadoc) - * @see org.eclipse.ui.ISaveablesSource#getSaveables() - */ - public Saveable[] getSaveables() { - return getActiveSaveables(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.CompareEditorInput#addCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) - */ - public void addCompareInputChangeListener(ICompareInput input, - ICompareInputChangeListener listener) { - if (input == getCompareResult()) { - inputChangeListeners.add(listener); - } else { - super.addCompareInputChangeListener(input, listener); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.CompareEditorInput#removeCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) - */ - public void removeCompareInputChangeListener(ICompareInput input, - ICompareInputChangeListener listener) { - if (input == getCompareResult()) { - inputChangeListeners.remove(listener); - } else { - super.removeCompareInputChangeListener(input, listener); - } - } - - /* (non-Javadoc) * @see org.eclipse.compare.CompareEditorInput#getAdapter(java.lang.Class) */ public Object getAdapter(Class adapter) { @@ -398,28 +145,6 @@ return super.getAdapter(adapter); } - /* - * (non-Javadoc) - * @see org.eclipse.compare.CompareEditorInput#getTitleImage() - */ - public Image getTitleImage() { - ImageRegistry reg = TeamUIPlugin.getPlugin().getImageRegistry(); - Image image = reg.get(ITeamUIImages.IMG_SYNC_VIEW); - if (image == null) { - image = getImageDescriptor().createImage(); - reg.put(ITeamUIImages.IMG_SYNC_VIEW, image); - } - return image; - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.IEditorInput#getImageDescriptor() - */ - public ImageDescriptor getImageDescriptor() { - return TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_SYNC_VIEW); - } - /* (non-Javadoc) * @see org.eclipse.compare.CompareEditorInput#findContentViewer(org.eclipse.jface.viewers.Viewer, org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.swt.widgets.Composite) */ @@ -443,13 +168,6 @@ return newViewer; } - /* (non-Javadoc) - * @see org.eclipse.compare.CompareEditorInput#canRunAsJob() - */ - public boolean canRunAsJob() { - return true; - } - public boolean isDirty() { if (saveable != null) return saveable.isDirty(); @@ -460,60 +178,14 @@ final ISelectionProvider selectionProvider) { super.registerContextMenu(menu, selectionProvider); final Saveable saveable = getSaveable(); + final ITypedElement element = getFileElement(getCompareInput().getLeft(), this); if (saveable instanceof LocalResourceSaveableComparison) { menu.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { - handleMenuAboutToShow(manager, saveable, selectionProvider); + handleMenuAboutToShow(manager, saveable, element, selectionProvider); } }); } } - - /* package */ void handleMenuAboutToShow (IMenuManager manager, Saveable saveable, ISelectionProvider provider) { - if (provider instanceof ITextViewer) { - ITextViewer v = (ITextViewer) provider; - IDocument d = v.getDocument(); - IDocument other = (IDocument)Utils.getAdapter(saveable, IDocument.class); - if (d == other) { - ITypedElement element = getFileElement(getCompareInput(), this); - if (element instanceof IResourceProvider) { - IResourceProvider rp = (IResourceProvider) element; - IResource resource = rp.getResource(); - StructuredSelection selection = new StructuredSelection(resource); - IWorkbenchPart workbenchPart = getContainer().getWorkbenchPart(); - if (workbenchPart != null) { - IWorkbenchSite ws = workbenchPart.getSite(); - - MenuManager submenu1 = - new MenuManager(getShowInMenuLabel()); - IContributionItem showInMenu = ContributionItemFactory.VIEWS_SHOW_IN.create(ws.getWorkbenchWindow()); - submenu1.add(showInMenu); - manager.insertAfter("file", submenu1); //$NON-NLS-1$ - MenuManager submenu2 = - new MenuManager(TeamUIMessages.OpenWithActionGroup_0); - submenu2.add(new OpenWithMenu(ws.getPage(), resource)); - manager.insertAfter("file", submenu2); //$NON-NLS-1$ - - OpenFileAction openFileAction = new OpenFileAction(ws.getPage()); - openFileAction.selectionChanged(selection); - manager.insertAfter("file", openFileAction); //$NON-NLS-1$ - } - } - } - } - } - - private String getShowInMenuLabel() { - String keyBinding= null; - - IBindingService bindingService= (IBindingService)PlatformUI.getWorkbench().getAdapter(IBindingService.class); - if (bindingService != null) - keyBinding= bindingService.getBestActiveBindingFormattedFor("org.eclipse.ui.navigate.showInQuickMenu"); //$NON-NLS-1$ - - if (keyBinding == null) - keyBinding= ""; //$NON-NLS-1$ - - return NLS.bind(TeamUIMessages.SaveableCompareEditorInput_0, keyBinding); - } } Index: plugin.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.team.ui/plugin.properties,v retrieving revision 1.75 diff -u -r1.75 plugin.properties --- plugin.properties 3 Jun 2008 13:35:37 -0000 1.75 +++ plugin.properties 20 Nov 2008 16:03:44 -0000 @@ -74,5 +74,7 @@ CompareLocalHistory.tooltip= Compare the Selected Resource with Local History ReplaceLocalHistory.label= &Local History... ReplaceLocalHistory.tooltip= Replace the Selected Resource with Local History +CompareWithEachOtherAction.label= &Each Other +CompareWithEachOtherAction.tooltip= Compare the Selected Resources ignoresTransferName= Team Ignored Resources Transfer Index: plugin.xml =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.team.ui/plugin.xml,v retrieving revision 1.196 diff -u -r1.196 plugin.xml --- plugin.xml 17 Apr 2008 15:31:56 -0000 1.196 +++ plugin.xml 20 Nov 2008 16:03:45 -0000 @@ -154,6 +154,15 @@ enablesFor="1" overrideActionId="replaceFromHistory" tooltip="%ReplaceLocalHistory.tooltip"/> + + true if the editor was closed (note that the + * close may be asynchronous) + */ + protected boolean closeEditor(boolean checkForUnsavedChanges) { + if (isSaveNeeded() && checkForUnsavedChanges) { + return false; + } else { + Runnable runnable = new Runnable() { + public void run() { + IEditorPart part = getPage().findEditor(AbstractSaveableCompareEditorInput.this); + getPage().closeEditor(part, false); + } + }; + if (Display.getCurrent() != null) { + runnable.run(); + } else { + Display display = getPage().getWorkbenchWindow().getShell().getDisplay(); + display.asyncExec(runnable); + } + return true; + } + } + + /** + * Method called from {@link #prepareInput(IProgressMonitor)} to obtain the input. + * It's purpose is to ensure that the input is an instance of {@link ICompareInput}. + * @param monitor a progress monitor + * @return the compare input + * @throws InvocationTargetException + * @throws InterruptedException + */ + protected abstract ICompareInput prepareCompareInput(IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException; + + /* package */ IWorkbenchPage getPage() { + if (page == null) + return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + return page; + } + + /** + * Return the compare input of this editor input. + * @return the compare input of this editor input + */ + protected final ICompareInput getCompareInput() { + return (ICompareInput)getCompareResult(); + } + + /** + * Callback from the resource saveable that is invoked when the resource is + * saved so that this input can fire a change event for its input. Subclasses + * only need this method if the left side of their compare input is + * an element returned from {@link SaveableCompareEditorInput#createFileElement(IFile)}. + */ + protected abstract void fireInputChange(); + + /* (non-Javadoc) + * @see org.eclipse.compare.CompareEditorInput#addCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) + */ + public void addCompareInputChangeListener(ICompareInput input, + ICompareInputChangeListener listener) { + if (input == getCompareResult()) { + inputChangeListeners.add(listener); + } else { + super.addCompareInputChangeListener(input, listener); + } + } + + /* (non-Javadoc) + * @see org.eclipse.compare.CompareEditorInput#removeCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) + */ + public void removeCompareInputChangeListener(ICompareInput input, + ICompareInputChangeListener listener) { + if (input == getCompareResult()) { + inputChangeListeners.remove(listener); + } else { + super.removeCompareInputChangeListener(input, listener); + } + } + + /* package */ void propogateInputChange() { + if (!inputChangeListeners.isEmpty()) { + Object[] allListeners = inputChangeListeners.getListeners(); + final ICompareInput compareResult = (ICompareInput) getCompareResult(); + for (int i = 0; i < allListeners.length; i++) { + final ICompareInputChangeListener listener = (ICompareInputChangeListener)allListeners[i]; + SafeRunner.run(new ISafeRunnable() { + public void run() throws Exception { + listener.compareInputChanged(compareResult); + } + public void handleException(Throwable exception) { + // Logged by the safe runner + } + }); + } + } + } + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveablesSource#getActiveSaveables() + */ + public abstract Saveable[] getActiveSaveables(); + + /* (non-Javadoc) + * @see org.eclipse.ui.ISaveablesSource#getSaveables() + */ + public Saveable[] getSaveables() { + return getActiveSaveables(); + } + + /* + * (non-Javadoc) + * @see org.eclipse.compare.CompareEditorInput#getTitleImage() + */ + public Image getTitleImage() { + ImageRegistry reg = TeamUIPlugin.getPlugin().getImageRegistry(); + Image image = reg.get(ITeamUIImages.IMG_SYNC_VIEW); + if (image == null) { + image = getImageDescriptor().createImage(); + reg.put(ITeamUIImages.IMG_SYNC_VIEW, image); + } + return image; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.IEditorInput#getImageDescriptor() + */ + public ImageDescriptor getImageDescriptor() { + return TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_SYNC_VIEW); + } + + /* (non-Javadoc) + * @see org.eclipse.compare.CompareEditorInput#canRunAsJob() + */ + public boolean canRunAsJob() { + return true; + } + + /* package */ void handleMenuAboutToShow(IMenuManager manager, Saveable saveable, ITypedElement element, + ISelectionProvider provider) { + if (provider instanceof ITextViewer) { + ITextViewer v = (ITextViewer) provider; + IDocument d = v.getDocument(); + IDocument other = (IDocument)Utils.getAdapter(saveable, IDocument.class); + if (d == other) { + if (element instanceof IResourceProvider) { + IResourceProvider rp = (IResourceProvider) element; + IResource resource = rp.getResource(); + StructuredSelection selection = new StructuredSelection(resource); + IWorkbenchPart workbenchPart = getContainer().getWorkbenchPart(); + if (workbenchPart != null) { + IWorkbenchSite ws = workbenchPart.getSite(); + MenuManager submenu1 = + new MenuManager(getShowInMenuLabel()); + IContributionItem showInMenu = ContributionItemFactory.VIEWS_SHOW_IN.create(ws.getWorkbenchWindow()); + submenu1.add(showInMenu); + manager.insertAfter("file", submenu1); //$NON-NLS-1$ + MenuManager submenu2 = + new MenuManager(TeamUIMessages.OpenWithActionGroup_0); + submenu2.add(new OpenWithMenu(ws.getPage(), resource)); + manager.insertAfter("file", submenu2); //$NON-NLS-1$ + + OpenFileAction openFileAction = new OpenFileAction(ws.getPage()); + openFileAction.selectionChanged(selection); + manager.insertAfter("file", openFileAction); //$NON-NLS-1$ + } + } + } + } + } + + /* package */ String getShowInMenuLabel() { + String keyBinding= null; + + IBindingService bindingService= (IBindingService)PlatformUI.getWorkbench().getAdapter(IBindingService.class); + if (bindingService != null) + keyBinding= bindingService.getBestActiveBindingFormattedFor("org.eclipse.ui.navigate.showInQuickMenu"); //$NON-NLS-1$ + + if (keyBinding == null) + keyBinding= ""; //$NON-NLS-1$ + + return NLS.bind(TeamUIMessages.SaveableCompareEditorInput_0, keyBinding); + } +}