diff options
author | Conrad Groth | 2016-08-06 09:06:05 +0000 |
---|---|---|
committer | Sergey Prigogin | 2016-10-02 19:53:05 +0000 |
commit | d12c403fa89f023f6e29425649bab0780712002c (patch) | |
tree | f735432de0c6a79d799dc68461cdf463bb349b0c | |
parent | 64fa7e494663df59669e29209f632b51756fc170 (diff) | |
download | eclipse.platform.team-d12c403fa89f023f6e29425649bab0780712002c.tar.gz eclipse.platform.team-d12c403fa89f023f6e29425649bab0780712002c.tar.xz eclipse.platform.team-d12c403fa89f023f6e29425649bab0780712002c.zip |
Bug 213780 - Compare With direction should be configurable
add a preference to swap the left and right side of the merge viewer.
This fix just swaps the left and right input for display. The model
values for left and right are not changed.
Change-Id: I4aa47e2e0389a0f1e8745e89b964296eb0b67678
Signed-off-by: Conrad Groth <info@conrad-groth.de>
17 files changed, 670 insertions, 450 deletions
diff --git a/bundles/org.eclipse.compare/META-INF/MANIFEST.MF b/bundles/org.eclipse.compare/META-INF/MANIFEST.MF index 823e37d40..b5b0c15f9 100644 --- a/bundles/org.eclipse.compare/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.compare/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.compare; singleton:=true -Bundle-Version: 3.6.0.qualifier +Bundle-Version: 3.7.0.qualifier Bundle-Activator: org.eclipse.compare.internal.CompareUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java index aba9779de..6066657bb 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2015 IBM Corporation and others. + * Copyright (c) 2000, 2016 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 @@ -8,6 +8,7 @@ * Contributors: * IBM Corporation - initial API and implementation * Alex Blewitt <alex.blewitt@gmail.com> - replace new Boolean with Boolean.valueOf - https://bugs.eclipse.org/470344 + * Conrad Groth - Bug 213780 - Compare With direction should be configurable *******************************************************************************/ package org.eclipse.compare; @@ -42,7 +43,7 @@ import org.eclipse.swt.graphics.Image; * A <code>CompareConfiguration</code> object * controls various UI aspects of compare/merge viewers like * title labels and images, or whether a side of a merge viewer is editable. - * In addition to these fixed properties <code>ICompareConfiguration</code> provides + * In addition to these fixed properties <code>CompareConfiguration</code> provides * API for an open ended set of properties. Different viewers which share the same * configuration can communicate via this mechanism. E.g. if a compare editor * has a button for controlling whether compare viewers ignore white space, @@ -71,38 +72,46 @@ public class CompareConfiguration { * @since 3.0 */ public static final String USE_OUTLINE_VIEW= "USE_OUTLINE_VIEW"; //$NON-NLS-1$ - - private static ImageDescriptor[] fgImages= new ImageDescriptor[16]; - private static boolean fLeftIsLocal= true; - - static { - if (fLeftIsLocal) { - fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_inadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outadd_ov.gif"); //$NON-NLS-1$ + /** + * Name of the mirrored property, i.e. if left input is shown on the right side and vice versa. + * @since 3.7 + */ + public static final String MIRRORED = "MIRRORED"; //$NON-NLS-1$ - fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_indel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outdel_ov.gif"); //$NON-NLS-1$ + private static ImageDescriptor[] fgImages= new ImageDescriptor[32]; - fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_inchg_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_outchg_ov.gif"); //$NON-NLS-1$ - } else { - fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/inadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/outadd_ov.gif"); //$NON-NLS-1$ + static { + // Not swapped (a.k.a. left is local) + fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ + fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_inadd_ov.gif"); //$NON-NLS-1$ + fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/indel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/outdel_ov.gif"); //$NON-NLS-1$ + fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ + fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_indel_ov.gif"); //$NON-NLS-1$ + fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outdel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/inchg_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/outchg_ov.gif"); //$NON-NLS-1$ - } + fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_inchg_ov.gif"); //$NON-NLS-1$ + fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_outchg_ov.gif"); //$NON-NLS-1$ fgImages[Differencer.CONFLICTING + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/confadd_ov.gif"); //$NON-NLS-1$ fgImages[Differencer.CONFLICTING + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/confdel_ov.gif"); //$NON-NLS-1$ fgImages[Differencer.CONFLICTING + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/confchg_ov.gif"); //$NON-NLS-1$ + + // Mirrored (a.k.a. right is local) + fgImages[16 + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/inadd_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/outadd_ov.gif"); //$NON-NLS-1$ + + fgImages[16 + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/indel_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/outdel_ov.gif"); //$NON-NLS-1$ + + fgImages[16 + Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/inchg_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/outchg_ov.gif"); //$NON-NLS-1$ + + fgImages[16 + Differencer.CONFLICTING + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/confadd_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.CONFLICTING + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/confdel_ov.gif"); //$NON-NLS-1$ + fgImages[16 + Differencer.CONFLICTING + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/confchg_ov.gif"); //$NON-NLS-1$ } private IPreferenceStore fPreferenceStore; @@ -251,25 +260,25 @@ public class CompareConfiguration { * suitable default labels, and no images. * The given preference store is used to connect this configuration * with the Compare preference page properties <code>ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE</code>, - * and <code>CompareConfiguration.IGNORE_WHITESPACE</code>. + * <code>CompareConfiguration.IGNORE_WHITESPACE</code> and {@link #MIRRORED} * * @param prefStore the preference store which this configuration holds onto. * @since 2.0 */ public CompareConfiguration(IPreferenceStore prefStore) { - - setProperty("LEFT_IS_LOCAL", Boolean.valueOf(fLeftIsLocal)); //$NON-NLS-1$ - fPreferenceStore= prefStore; if (fPreferenceStore != null) { boolean b= fPreferenceStore.getBoolean(ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE); setProperty(ICompareUIConstants.PROP_ANCESTOR_VISIBLE, Boolean.valueOf(b)); - + b= fPreferenceStore.getBoolean(ComparePreferencePage.IGNORE_WHITESPACE); setProperty(CompareConfiguration.IGNORE_WHITESPACE, Boolean.valueOf(b)); + + b= fPreferenceStore.getBoolean(ComparePreferencePage.SWAPPED); + setProperty(CompareConfiguration.MIRRORED, Boolean.valueOf(b)); } - } - + } + /** * Creates a new configuration with editable left and right sides, * suitable default labels, and no images. @@ -303,7 +312,7 @@ public class CompareConfiguration { public Image getImage(int kind) { if (fDisposed) return null; - ImageDescriptor id= fgImages[kind & 15]; + ImageDescriptor id= getImageDescriptor(kind); ResourceManager rm = getResourceManager(); return rm.createImage(id); } @@ -331,11 +340,25 @@ public class CompareConfiguration { public Image getImage(Image base, int kind) { if (fDisposed) return null; - kind &= 15; - ImageDescriptor id = new DiffImageDescriptor(base, fgImages[kind], ICompareUIConstants.COMPARE_IMAGE_WIDTH, !fLeftIsLocal); + ImageDescriptor id = new DiffImageDescriptor(base, getImageDescriptor(kind), ICompareUIConstants.COMPARE_IMAGE_WIDTH, false); ResourceManager rm = getResourceManager(); return rm.createImage(id); } + + /** + * <b>Only the views are mirrored. All model values for left and right are not changed!</b> + * + * @return true if the left and right side of the viewer are mirrored. Default is false. + * @since 3.7 + */ + public boolean isMirrored() { + Object property = getProperty(MIRRORED); + return property instanceof Boolean && (Boolean) property; + } + + private ImageDescriptor getImageDescriptor(int kind) { + return fgImages[(kind & 15) + (isMirrored() ? 16 : 0)]; + } /** * Dispose of this compare configuration. diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java index 81cd5603b..5587587eb 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2015 IBM Corporation and others. + * Copyright (c) 2000, 2016 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 @@ -9,10 +9,12 @@ * IBM Corporation - initial API and implementation * Alex Blewitt <alex.blewitt@gmail.com> - replace new Boolean with Boolean.valueOf - https://bugs.eclipse.org/470344 * Stefan Xenos <sxenos@gmail.com> (Google) - bug 448968 - Add diagnostic logging + * Conrad Groth - Bug 213780 - Compare With direction should be configurable *******************************************************************************/ package org.eclipse.compare.contentmergeviewer; +import java.io.IOException; import java.util.ResourceBundle; import org.eclipse.compare.CompareConfiguration; @@ -26,11 +28,13 @@ import org.eclipse.compare.internal.ChangePropertyAction; import org.eclipse.compare.internal.CompareEditor; import org.eclipse.compare.internal.CompareHandlerService; import org.eclipse.compare.internal.CompareMessages; +import org.eclipse.compare.internal.ComparePreferencePage; import org.eclipse.compare.internal.CompareUIPlugin; import org.eclipse.compare.internal.ICompareUIConstants; import org.eclipse.compare.internal.IFlushable2; import org.eclipse.compare.internal.ISavingSaveable; import org.eclipse.compare.internal.MergeViewerContentProvider; +import org.eclipse.compare.internal.MirroredMergeViewerContentProvider; import org.eclipse.compare.internal.Policy; import org.eclipse.compare.internal.Utilities; import org.eclipse.compare.internal.ViewerSwitchingCancelled; @@ -49,6 +53,8 @@ import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.preference.IPersistentPreferenceStore; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ContentViewer; @@ -116,10 +122,12 @@ public abstract class ContentMergeViewer extends ContentViewer private class ContentMergeViewerLayout extends Layout { + @Override public Point computeSize(Composite c, int w, int h, boolean force) { return new Point(100, 100); } + @Override public void layout(Composite composite, boolean force) { if (fLeftLabel == null) { @@ -131,7 +139,7 @@ public abstract class ContentMergeViewer extends ContentViewer logTrace("found bad label. Layout = " + System.identityHashCode(this) + ". composite = " //$NON-NLS-1$//$NON-NLS-2$ + System.identityHashCode(composite) + ". fComposite = " //$NON-NLS-1$ + System.identityHashCode(fComposite) + ". fComposite.isDisposed() = " //$NON-NLS-1$ - + fComposite.isDisposed()); //$NON-NLS-2$ + + fComposite.isDisposed()); logStackTrace(); } // Help to find out the cause for bug 449558 @@ -233,6 +241,7 @@ public abstract class ContentMergeViewer extends ContentViewer fControl.addMouseMoveListener(this); fControl.addDisposeListener( new DisposeListener() { + @Override public void widgetDisposed(DisposeEvent e) { fControl= null; } @@ -240,6 +249,7 @@ public abstract class ContentMergeViewer extends ContentViewer ); } + @Override public void mouseDoubleClick(MouseEvent e) { if ((fDirection & HORIZONTAL) != 0) fHSplit= -1; @@ -248,6 +258,7 @@ public abstract class ContentMergeViewer extends ContentViewer fComposite.layout(true); } + @Override public void mouseDown(MouseEvent e) { Composite parent= fControl.getParent(); @@ -266,12 +277,14 @@ public abstract class ContentMergeViewer extends ContentViewer fIsDown= true; } + @Override public void mouseUp(MouseEvent e) { fIsDown= false; if (!fLiveResize) resize(e); } + @Override public void mouseMove(MouseEvent e) { if (fIsDown && fLiveResize) resize(e); @@ -317,14 +330,17 @@ public abstract class ContentMergeViewer extends ContentViewer private boolean fAncestorVisible; // whether the ancestor pane is visible private ActionContributionItem fAncestorItem; - private Action fCopyLeftToRightAction; // copy from left to right - private Action fCopyRightToLeftAction; // copy from right to left + private ActionContributionItem copyLeftToRightItem; // copy from left to right + private ActionContributionItem copyRightToLeftItem; // copy from right to left private boolean fIsLeftDirty; private boolean fIsRightDirty; private CompareHandlerService fHandlerService; + private final MergeViewerContentProvider fDefaultContentProvider; + private Action fSwitchLeftAndRight; + // SWT widgets /* package */ Composite fComposite; private CLabel fAncestorLabel; @@ -345,6 +361,7 @@ public abstract class ContentMergeViewer extends ContentViewer private Cursor fHVSashCursor; private ILabelProviderListener labelChangeListener = new ILabelProviderListener() { + @Override public void labelProviderChanged(LabelProviderChangedEvent event) { Object[] elements = event.getElements(); for (int i = 0; i < elements.length; i++) { @@ -377,28 +394,16 @@ public abstract class ContentMergeViewer extends ContentViewer fAncestorVisible= Utilities.getBoolean(cc, ICompareUIConstants.PROP_ANCESTOR_VISIBLE, fAncestorVisible); fConfirmSave= Utilities.getBoolean(cc, CompareEditor.CONFIRM_SAVE_PROPERTY, fConfirmSave); - - setContentProvider(new MergeViewerContentProvider(cc)); - fCompareInputChangeListener= new ICompareInputChangeListener() { - public void compareInputChanged(ICompareInput input) { - if (input == getInput()) { - handleCompareInputChange(); - } - } - }; + fCompareInputChangeListener = (input) -> { if (input == getInput()) handleCompareInputChange(); }; // Make sure the compare configuration is not null - if (cc == null) - fCompareConfiguration = new CompareConfiguration(); - else - fCompareConfiguration= cc; - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - ContentMergeViewer.this.handlePropertyChangeEvent(event); - } - }; + fCompareConfiguration = cc != null ? cc : new CompareConfiguration(); + fPropertyChangeListener = (event) -> handlePropertyChangeEvent(event); fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener); + + fDefaultContentProvider = new MergeViewerContentProvider(fCompareConfiguration); + updateContentProvider(); fIsLeftDirty = false; fIsRightDirty = false; @@ -515,10 +520,9 @@ public abstract class ContentMergeViewer extends ContentViewer } /** - * Returns the compare configuration of this viewer, - * or <code>null</code> if this viewer does not yet have a configuration. + * Returns the compare configuration of this viewer. * - * @return the compare configuration, or <code>null</code> if none + * @return the compare configuration, never <code>null</code> */ protected CompareConfiguration getCompareConfiguration() { return fCompareConfiguration; @@ -530,11 +534,18 @@ public abstract class ContentMergeViewer extends ContentViewer * checks to ensure that the content provider is an <code>IMergeViewerContentProvider</code>. * @param contentProvider the content provider to set. Must implement IMergeViewerContentProvider. */ + @Override public void setContentProvider(IContentProvider contentProvider) { Assert.isTrue(contentProvider instanceof IMergeViewerContentProvider); super.setContentProvider(contentProvider); } + private void updateContentProvider() { + setContentProvider(getCompareConfiguration().isMirrored() + ? new MirroredMergeViewerContentProvider(getCompareConfiguration(), fDefaultContentProvider) + : fDefaultContentProvider); + } + /* package */ IMergeViewerContentProvider getMergeContentProvider() { return (IMergeViewerContentProvider) getContentProvider(); } @@ -544,8 +555,10 @@ public abstract class ContentMergeViewer extends ContentViewer * <code>Viewer</code> method returns the empty selection. Subclasses may override. * @return empty selection. */ + @Override public ISelection getSelection() { return new ISelection() { + @Override public boolean isEmpty() { return true; } @@ -557,6 +570,7 @@ public abstract class ContentMergeViewer extends ContentViewer * <code>Viewer</code> method does nothing. Subclasses may reimplement. * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean) */ + @Override public void setSelection(ISelection selection, boolean reveal) { // empty implementation } @@ -586,6 +600,13 @@ public abstract class ContentMergeViewer extends ContentViewer setAncestorVisibility(false, !Utilities.getBoolean(getCompareConfiguration(), ICompareUIConstants.PROP_IGNORE_ANCESTOR, false)); return; } + + if (key.equals(ComparePreferencePage.SWAPPED)) { + getCompareConfiguration().setProperty(CompareConfiguration.MIRRORED, event.getNewValue()); + updateContentProvider(); + updateToolItems(); + return; + } } void updateCursor(Control c, int dir) { @@ -653,6 +674,7 @@ public abstract class ContentMergeViewer extends ContentViewer * @param input the new input of this viewer, or <code>null</code> if there is no new input * @param oldInput the old input element, or <code>null</code> if there was previously no input */ + @Override protected final void inputChanged(Object input, Object oldInput) { if (input != oldInput && oldInput != null) { @@ -759,6 +781,7 @@ public abstract class ContentMergeViewer extends ContentViewer /* (non-Javadoc) * @see org.eclipse.jface.viewers.Viewer#refresh() */ + @Override public void refresh() { internalRefresh(getInput()); } @@ -799,6 +822,7 @@ public abstract class ContentMergeViewer extends ContentViewer } } + @Override protected void hookControl(Control control) { if (Policy.debugContentMergeViewer) { logTrace("Attached dispose listener to control " + System.identityHashCode(control)); //$NON-NLS-1$ @@ -823,6 +847,7 @@ public abstract class ContentMergeViewer extends ContentViewer protected final Control buildControl(Composite parent) { fComposite= new Composite(parent, fStyles | SWT.LEFT_TO_RIGHT) { // we force a specific direction + @Override public boolean setFocus() { return ContentMergeViewer.this.handleSetFocus(); } @@ -894,32 +919,33 @@ public abstract class ContentMergeViewer extends ContentViewer tbm.add(new Separator("modes")); //$NON-NLS-1$ tbm.add(new Separator("merge")); //$NON-NLS-1$ tbm.add(new Separator("navigation")); //$NON-NLS-1$ - - CompareConfiguration cc= getCompareConfiguration(); - - if (cc.isRightEditable()) { - fCopyLeftToRightAction= - new Action() { - public void run() { - copy(true); - } - }; - Utilities.initAction(fCopyLeftToRightAction, getResourceBundle(), "action.CopyLeftToRight."); //$NON-NLS-1$ - tbm.appendToGroup("merge", fCopyLeftToRightAction); //$NON-NLS-1$ - fHandlerService.registerAction(fCopyLeftToRightAction, "org.eclipse.compare.copyAllLeftToRight"); //$NON-NLS-1$ - } - - if (cc.isLeftEditable()) { - fCopyRightToLeftAction= - new Action() { - public void run() { - copy(false); + + copyLeftToRightItem= createCopyAction(true); + Utilities.initAction(copyLeftToRightItem.getAction(), getResourceBundle(), "action.CopyLeftToRight."); //$NON-NLS-1$ + tbm.appendToGroup("merge", copyLeftToRightItem); //$NON-NLS-1$ + fHandlerService.registerAction(copyLeftToRightItem.getAction(), "org.eclipse.compare.copyAllLeftToRight"); //$NON-NLS-1$ + + copyRightToLeftItem= createCopyAction(false); + Utilities.initAction(copyRightToLeftItem.getAction(), getResourceBundle(), "action.CopyRightToLeft."); //$NON-NLS-1$ + tbm.appendToGroup("merge", copyRightToLeftItem); //$NON-NLS-1$ + fHandlerService.registerAction(copyRightToLeftItem.getAction(), "org.eclipse.compare.copyAllRightToLeft"); //$NON-NLS-1$ + + fSwitchLeftAndRight = new Action() { + @Override + public void run() { + IPreferenceStore preferences = getCompareConfiguration().getPreferenceStore(); + preferences.setValue(ComparePreferencePage.SWAPPED, !getCompareConfiguration().isMirrored()); + if (preferences instanceof IPersistentPreferenceStore) { + try { + ((IPersistentPreferenceStore) preferences).save(); + } catch (IOException e) { + CompareUIPlugin.log(e); } - }; - Utilities.initAction(fCopyRightToLeftAction, getResourceBundle(), "action.CopyRightToLeft."); //$NON-NLS-1$ - tbm.appendToGroup("merge", fCopyRightToLeftAction); //$NON-NLS-1$ - fHandlerService.registerAction(fCopyRightToLeftAction, "org.eclipse.compare.copyAllRightToLeft"); //$NON-NLS-1$ - } + } + } + }; + Utilities.initAction(fSwitchLeftAndRight, getResourceBundle(), "action.SwitchLeftAndRight."); //$NON-NLS-1$ + tbm.appendToGroup("modes", fSwitchLeftAndRight); //$NON-NLS-1$ final ChangePropertyAction a= new ChangePropertyAction(fBundle, getCompareConfiguration(), "action.EnableAncestor.", ICompareUIConstants.PROP_ANCESTOR_VISIBLE); //$NON-NLS-1$ a.setChecked(fAncestorVisible); @@ -927,14 +953,23 @@ public abstract class ContentMergeViewer extends ContentViewer fAncestorItem.setVisible(false); tbm.appendToGroup("modes", fAncestorItem); //$NON-NLS-1$ tbm.getControl().addDisposeListener(a); - + createToolItems(tbm); updateToolItems(); tbm.update(true); } } - + + private ActionContributionItem createCopyAction(boolean leftToRight) { + return new ActionContributionItem(new Action() { + @Override + public void run() { + copy(leftToRight); + } + }); + } + /** * Callback that is invoked when the control of this merge viewer is given focus. * This method should return <code>true</code> if a particular widget was given focus @@ -993,6 +1028,7 @@ public abstract class ContentMergeViewer extends ContentViewer /* (non-Javadoc) * @see org.eclipse.jface.viewers.Viewer#getControl() */ + @Override public Control getControl() { return fComposite; } @@ -1003,6 +1039,7 @@ public abstract class ContentMergeViewer extends ContentViewer * Clients may extend if they have to do additional cleanup. * @see org.eclipse.jface.viewers.ContentViewer#handleDispose(org.eclipse.swt.events.DisposeEvent) */ + @Override protected void handleDispose(DisposeEvent event) { if (fHandlerService != null) @@ -1080,24 +1117,20 @@ public abstract class ContentMergeViewer extends ContentViewer Object input= getInput(); - if (fCopyLeftToRightAction != null) { - boolean enable= content.isRightEditable(input); -// if (enable && input instanceof ICompareInput) { -// ITypedElement e= ((ICompareInput) input).getLeft(); -// if (e == null) -// enable= false; -// } - fCopyLeftToRightAction.setEnabled(enable); + if (copyLeftToRightItem != null) { + boolean rightEditable = content.isRightEditable(input); + copyLeftToRightItem.setVisible(rightEditable); + copyLeftToRightItem.getAction().setEnabled(rightEditable); } - if (fCopyRightToLeftAction != null) { - boolean enable= content.isLeftEditable(input); -// if (enable && input instanceof ICompareInput) { -// ITypedElement e= ((ICompareInput) input).getRight(); -// if (e == null) -// enable= false; -// } - fCopyRightToLeftAction.setEnabled(enable); + if (copyRightToLeftItem != null) { + boolean leftEditable = content.isLeftEditable(input); + copyRightToLeftItem.setVisible(leftEditable); + copyRightToLeftItem.getAction().setEnabled(leftEditable); + } + + if (fSwitchLeftAndRight != null) { + fSwitchLeftAndRight.setChecked(getCompareConfiguration().isMirrored()); } } @@ -1156,6 +1189,7 @@ public abstract class ContentMergeViewer extends ContentViewer /* (non-Javadoc) * @see org.eclipse.compare.IPropertyChangeNotifier#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) */ + @Override public void addPropertyChangeListener(IPropertyChangeListener listener) { if (fListenerList == null) fListenerList= new ListenerList(); @@ -1165,6 +1199,7 @@ public abstract class ContentMergeViewer extends ContentViewer /* (non-Javadoc) * @see org.eclipse.compare.IPropertyChangeNotifier#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) */ + @Override public void removePropertyChangeListener(IPropertyChangeListener listener) { if (fListenerList != null) { fListenerList.remove(listener); @@ -1219,6 +1254,7 @@ public abstract class ContentMergeViewer extends ContentViewer * @throws CoreException * @deprecated use {@link IFlushable#flush(IProgressMonitor)}. */ + @Deprecated public void save(IProgressMonitor monitor) throws CoreException { flush(monitor); } @@ -1231,6 +1267,7 @@ public abstract class ContentMergeViewer extends ContentViewer * @see org.eclipse.compare.contentmergeviewer.IFlushable#flush(org.eclipse.core.runtime.IProgressMonitor) * @since 3.3 */ + @Override public final void flush(IProgressMonitor monitor) { flushContent(getInput(), monitor); } @@ -1283,6 +1320,7 @@ public abstract class ContentMergeViewer extends ContentViewer * @param monitor * @noreference This method is not intended to be referenced by clients. */ + @Override public void flushLeft(IProgressMonitor monitor) { flushLeftSide(getInput(), monitor); } @@ -1291,6 +1329,7 @@ public abstract class ContentMergeViewer extends ContentViewer * @param monitor * @noreference This method is not intended to be referenced by clients. */ + @Override public void flushRight(IProgressMonitor monitor) { flushRightSide(getInput(), monitor); } @@ -1410,4 +1449,23 @@ public abstract class ContentMergeViewer extends ContentViewer return false; } + /** + * If the inputs are mirrored, this asks the right model value. + * + * @return true if the left viewer is editable. + * @since 3.7 + */ + protected boolean isLeftEditable() { + return fCompareConfiguration.isMirrored() ? fCompareConfiguration.isRightEditable() : fCompareConfiguration.isLeftEditable(); + } + + /** + * If the inputs are mirrored, this asks the right model value. + * + * @return true if the left viewer is editable. + * @since 3.7 + */ + protected boolean isRightEditable() { + return fCompareConfiguration.isMirrored() ? fCompareConfiguration.isLeftEditable() : fCompareConfiguration.isRightEditable(); + } } diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java index dffed0627..074dadbb4 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2015 IBM Corporation and others. + * Copyright (c) 2000, 2016 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 @@ -317,8 +317,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /** line width of change borders */ private static final int LW= 1; - // determines whether a change between left and right is considered incoming or outgoing - private boolean fLeftIsLocal; private boolean fShowCurrentOnly= false; private boolean fShowCurrentOnly2= false; private int fMarginWidth= MARGIN_WIDTH; @@ -376,7 +374,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private boolean fUseSplines= true; private boolean fUseSingleLine= true; - private boolean fUseResolveUI= true; private boolean fHighlightTokenChanges = false; private String fSymbolicFontName; @@ -460,6 +457,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private boolean fRedoDiff = false; private final class InternalOutlineViewerCreator extends OutlineViewerCreator implements ISelectionChangedListener { + @Override public Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent, CompareConfiguration configuration) { @@ -468,6 +466,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { final Viewer v = CompareUI.findStructureViewer(oldViewer, input, parent, configuration); if (v != null) { v.getControl().addDisposeListener(new DisposeListener() { + @Override public void widgetDisposed(DisposeEvent e) { v.removeSelectionChangedListener(InternalOutlineViewerCreator.this); } @@ -478,10 +477,12 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return v; } + @Override public boolean hasViewerFor(Object input) { return true; } + @Override public void selectionChanged(SelectionChangedEvent event) { ISelection s = event.getSelection(); if (s instanceof IStructuredSelection) { @@ -533,6 +534,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return null; } + @Override public Object getInput() { return TextMergeViewer.this.getInput(); } @@ -566,6 +568,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.ui.editors.text.IEncodingSupport#setEncoding(java.lang.String) */ + @Override public void setEncoding(String encoding) { if (fDocumentKey == null || fDocumentProvider == null) { return; @@ -594,6 +597,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.ui.editors.text.IEncodingSupport#getEncoding() */ + @Override public String getEncoding() { if (fDocumentProvider != null && fDocumentKey != null && fDocumentProvider instanceof IStorageDocumentProvider) { @@ -606,6 +610,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.ui.editors.text.IEncodingSupport#getDefaultEncoding() */ + @Override public String getDefaultEncoding() { if (fDocumentProvider != null && fDocumentKey != null && fDocumentProvider instanceof IStorageDocumentProvider) { @@ -776,15 +781,19 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { // install new document tp.setRegion(range); - if (this.fViewer.fSubDoc) { - if (range != null) { + SourceViewer sourceViewer = tp.getSourceViewer(); + sourceViewer.setRedraw(false); + try { + if (this.fViewer.fSubDoc && range != null) { IRegion r= this.fViewer.normalizeDocumentRegion(document, TextMergeViewer.toRegion(range)); - tp.getSourceViewer().setDocument(document, r.getOffset(), r.getLength()); - } else - tp.getSourceViewer().setDocument(document); - } else - tp.getSourceViewer().setDocument(document); - + sourceViewer.setDocument(document, r.getOffset(), r.getLength()); + } else { + sourceViewer.setDocument(document); + } + } finally { + sourceViewer.setRedraw(true); + } + tp.rememberDocument(document); } @@ -1006,6 +1015,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return false; } + @Override public void elementMoved(Object originalElement, Object movedElement) { IEditorInput input = getDocumentKey(); if (input != null && input.equals(originalElement)) { @@ -1013,6 +1023,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { resetDocument(); } } + @Override public void elementDirtyStateChanged(Object element, boolean isDirty) { if (!checkState()) return; @@ -1022,6 +1033,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override public void elementDeleted(Object element) { IEditorInput input = getDocumentKey(); if (input != null && input.equals(element)) { @@ -1049,6 +1061,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return !control.isDisposed(); } + @Override public void elementContentReplaced(Object element) { if (!checkState()) return; @@ -1058,6 +1071,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { // recalculate diffs and update controls new UIJob(CompareMessages.DocumentMerger_0) { + @Override public IStatus runInUIThread(IProgressMonitor monitor) { update(true); updateStructure(fLeg); @@ -1066,6 +1080,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { }.schedule(); } } + @Override public void elementContentAboutToBeReplaced(Object element) { // Nothing to do } @@ -1138,6 +1153,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent) */ + @Override public void verifyText(VerifyEvent e) { if (!validateChange()) { e.doit= false; @@ -1147,6 +1163,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) */ + @Override public void documentAboutToBeChanged(DocumentEvent e) { // nothing to do } @@ -1154,6 +1171,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent) */ + @Override public void documentChanged(DocumentEvent e) { boolean dirty = true; if (fDocumentProvider != null && fDocumentKey != null) { @@ -1202,6 +1220,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { gc.drawLine(x, y + h, x + w, y + h); } + @Override public void paintControl(PaintEvent e) { Point s= fSummaryHeader.getSize(); @@ -1239,6 +1258,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * Child document ranges cannot be deleted other then by calling * freeChildDocument. */ + @Override protected boolean notDeleted() { return true; } @@ -1249,6 +1269,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * right behind the end of the position, the position is extended rather * than kept stable. */ + @Override protected void adaptToInsert() { if (fPosition == fLeft.getRegion() || fPosition == fRight.getRegion()) { @@ -1284,6 +1305,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.jface.text.ITextPresentationListener#applyTextPresentation(org.eclipse.jface.text.TextPresentation) */ + @Override public void applyTextPresentation(TextPresentation textPresentation) { if (!fHighlightTokenChanges) return; @@ -1325,52 +1347,54 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (isThreeWay() && !isIgnoreAncestor()) { switch (diff.getKind()) { case RangeDifference.RIGHT: - if (fLeftIsLocal) - return INCOMING_TEXT_FILL; - return OUTGOING_TEXT_FILL; + return getCompareConfiguration().isMirrored() ? OUTGOING_TEXT_FILL : INCOMING_TEXT_FILL; case RangeDifference.ANCESTOR: - return CONFLICT_TEXT_FILL; - case RangeDifference.LEFT: - if (fLeftIsLocal) - return OUTGOING_TEXT_FILL; - return INCOMING_TEXT_FILL; case RangeDifference.CONFLICT: return CONFLICT_TEXT_FILL; + case RangeDifference.LEFT: + return getCompareConfiguration().isMirrored() ? INCOMING_TEXT_FILL : OUTGOING_TEXT_FILL; + default: + return null; } - return null; } return OUTGOING_TEXT_FILL; } - } private class FindReplaceTarget implements IFindReplaceTarget, IFindReplaceTargetExtension, IFindReplaceTargetExtension2, IFindReplaceTargetExtension3 { + @Override public boolean canPerformFind() { return fFocusPart != null; } + @Override public int findAndSelect(int widgetOffset, String findString, boolean searchForward, boolean caseSensitive, boolean wholeWord) { return fFocusPart.getSourceViewer().getFindReplaceTarget().findAndSelect(widgetOffset, findString, searchForward, caseSensitive, wholeWord); } + @Override public Point getSelection() { return fFocusPart.getSourceViewer().getFindReplaceTarget().getSelection(); } + @Override public String getSelectionText() { return fFocusPart.getSourceViewer().getFindReplaceTarget().getSelectionText(); } + @Override public boolean isEditable() { return fFocusPart.getSourceViewer().getFindReplaceTarget().isEditable(); } + @Override public void replaceSelection(String text) { fFocusPart.getSourceViewer().getFindReplaceTarget().replaceSelection(text); } + @Override public int findAndSelect(int offset, String findString, boolean searchForward, boolean caseSensitive, boolean wholeWord, boolean regExSearch) { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension3) { @@ -1383,6 +1407,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return -1; } + @Override public void replaceSelection(String text, boolean regExReplace) { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension3) { @@ -1395,6 +1420,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { findReplaceTarget.replaceSelection(text); } + @Override public boolean validateTargetState() { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension2) { @@ -1403,6 +1429,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return true; } + @Override public void beginSession() { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1410,6 +1437,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override public void endSession() { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1417,6 +1445,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override public IRegion getScope() { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1425,6 +1454,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return null; } + @Override public void setScope(IRegion scope) { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1432,6 +1462,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override public Point getLineSelection() { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1440,6 +1471,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return null; } + @Override public void setSelection(int offset, int length) { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1447,6 +1479,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override public void setScopeHighlightColor(Color color) { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1454,6 +1487,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override public void setReplaceAllMode(boolean replaceAll) { IFindReplaceTarget findReplaceTarget = fFocusPart.getSourceViewer().getFindReplaceTarget(); if (findReplaceTarget instanceof IFindReplaceTargetExtension) { @@ -1486,6 +1520,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { super(style, ResourceBundle.getBundle(BUNDLE_NAME), configuration); operationHistoryListener = new IOperationHistoryListener() { + @Override public void historyNotification(OperationHistoryEvent event) { TextMergeViewer.this.historyNotification(event); } @@ -1494,12 +1529,15 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { .addOperationHistoryListener(operationHistoryListener); fMerger = new DocumentMerger(new IDocumentMergerInput() { + @Override public ITokenComparator createTokenComparator(String line) { return TextMergeViewer.this.createTokenComparator(line); } + @Override public CompareConfiguration getCompareConfiguration() { return TextMergeViewer.this.getCompareConfiguration(); } + @Override public IDocument getDocument(char contributor) { switch (contributor) { case LEFT_CONTRIBUTOR: @@ -1511,9 +1549,11 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } return null; } + @Override public int getHunkStart() { return TextMergeViewer.this.getHunkStart(); } + @Override public Position getRegion(char contributor) { switch (contributor) { case LEFT_CONTRIBUTOR: @@ -1525,23 +1565,29 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } return null; } + @Override public boolean isHunkOnLeft() { ITypedElement left = ((ICompareInput)getInput()).getRight(); return left != null && Utilities.getAdapter(left, IHunk.class) != null; } + @Override public boolean isIgnoreAncestor() { return TextMergeViewer.this.isIgnoreAncestor(); } + @Override public boolean isPatchHunk() { return TextMergeViewer.this.isPatchHunk(); } + @Override public boolean isShowPseudoConflicts() { return fShowPseudoConflicts; } + @Override public boolean isThreeWay() { return TextMergeViewer.this.isThreeWay(); } + @Override public boolean isPatchHunkOk() { return TextMergeViewer.this.isPatchHunkOk(); } @@ -1573,6 +1619,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fMarginWidth= 0; fPreferenceChangeListener= new IPropertyChangeListener() { + @Override public void propertyChange(PropertyChangeEvent event) { TextMergeViewer.this.handlePropertyChangeEvent(event); } @@ -1582,7 +1629,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (fPreferenceStore != null) { fPreferenceStore.addPropertyChangeListener(fPreferenceChangeListener); - fLeftIsLocal= Utilities.getBoolean(getCompareConfiguration(), "LEFT_IS_LOCAL", false); //$NON-NLS-1$ fSynchronizedScrolling= fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING); fShowPseudoConflicts= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS); //fUseSplines= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SPLINES); @@ -1596,6 +1642,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { setColors(); INavigatable nav= new INavigatable() { + @Override public boolean selectChange(int flag) { if (flag == INavigatable.FIRST_CHANGE || flag == INavigatable.LAST_CHANGE) { selectFirstDiff(flag == INavigatable.FIRST_CHANGE); @@ -1603,12 +1650,15 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } return navigate(flag == INavigatable.NEXT_CHANGE, false, false); } + @Override public Object getInput() { return TextMergeViewer.this.getInput(); } + @Override public boolean openSelectedChange() { return false; } + @Override public boolean hasChange(int flag) { return getNextVisibleDiff(flag == INavigatable.NEXT_CHANGE, false) != null; } @@ -1627,16 +1677,17 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { super(label, viewers, preferenceKey); } + @Override protected boolean toggleState(boolean checked) { return true; } } private ChainedPreferenceStore createChainedPreferenceStore() { - ArrayList stores= new ArrayList(2); + List<IPreferenceStore> stores= new ArrayList<>(2); stores.add(getCompareConfiguration().getPreferenceStore()); stores.add(EditorsUI.getPreferenceStore()); - return new ChainedPreferenceStore((IPreferenceStore[]) stores.toArray(new IPreferenceStore[stores.size()])); + return new ChainedPreferenceStore(stores.toArray(new IPreferenceStore[stores.size()])); } /** @@ -1916,6 +1967,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * Clients may extend if they have to do additional cleanup. * @param event */ + @Override protected void handleDispose(DisposeEvent event) { OperationHistoryFactory.getOperationHistory() .removeOperationHistoryListener(operationHistoryListener); @@ -2016,6 +2068,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * Creates the specific SWT controls for the content areas. * Clients must not call or override this method. */ + @Override protected void createControls(Composite composite) { PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ICompareContextIds.TEXT_MERGE_VIEW); @@ -2023,12 +2076,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { // 1st row if (fMarginWidth > 0) { fAncestorCanvas= new BufferedCanvas(composite, SWT.NONE) { + @Override public void doPaint(GC gc) { paintSides(gc, fAncestor, fAncestorCanvas, false); } }; fAncestorCanvas.addMouseListener( new MouseAdapter() { + @Override public void mouseDown(MouseEvent e) { setCurrentDiff2(handleMouseInSides(fAncestorCanvas, fAncestor, e.y), false); } @@ -2039,6 +2094,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fAncestor= createPart(composite); setEditable(fAncestor.getSourceViewer(), false); fAncestor.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() { + @Override public void getName(AccessibleEvent e) { e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_ancestor, getCompareConfiguration().getAncestorLabel(getInput())); } @@ -2053,12 +2109,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { // 2nd row if (fMarginWidth > 0) { fLeftCanvas= new BufferedCanvas(composite, SWT.NONE) { + @Override public void doPaint(GC gc) { paintSides(gc, fLeft, fLeftCanvas, false); } }; fLeftCanvas.addMouseListener( new MouseAdapter() { + @Override public void mouseDown(MouseEvent e) { setCurrentDiff2(handleMouseInSides(fLeftCanvas, fLeft, e.y), false); } @@ -2069,6 +2127,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fLeft= createPart(composite); fLeft.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); fLeft.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() { + @Override public void getName(AccessibleEvent e) { e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_left, getCompareConfiguration().getLeftLabel(getInput())); } @@ -2078,6 +2137,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fRight= createPart(composite); fRight.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); fRight.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() { + @Override public void getName(AccessibleEvent e) { e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_right, getCompareConfiguration().getRightLabel(getInput())); } @@ -2101,12 +2161,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (fMarginWidth > 0) { fRightCanvas= new BufferedCanvas(composite, SWT.NONE) { + @Override public void doPaint(GC gc) { paintSides(gc, fRight, fRightCanvas, fSynchronizedScrolling); } }; fRightCanvas.addMouseListener( new MouseAdapter() { + @Override public void mouseDown(MouseEvent e) { setCurrentDiff2(handleMouseInSides(fRightCanvas, fRight, e.y), false); } @@ -2123,6 +2185,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fVScrollBar.setVisible(true); fVScrollBar.addListener(SWT.Selection, new Listener() { + @Override public void handleEvent(Event e) { int vpos= ((ScrollBar)e.widget).getSelection(); synchronizedScrollVertical(vpos); @@ -2131,12 +2194,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { ); fBirdsEyeCanvas= new BufferedCanvas(composite, SWT.NONE) { + @Override public void doPaint(GC gc) { paintBirdsEyeView(this, gc); } }; fBirdsEyeCanvas.addMouseListener( new MouseAdapter() { + @Override public void mouseDown(MouseEvent e) { setCurrentDiff2(handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y), true); } @@ -2147,6 +2212,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private Cursor fLastCursor; + @Override public void mouseMove(MouseEvent e) { Cursor cursor= null; Diff diff= handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y); @@ -2175,6 +2241,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { final StyledText st3= tv3.getTextWidget(); final ScrollBar sb1= st1.getHorizontalBar(); sb1.addSelectionListener(new SelectionAdapter() { + @Override public void widgetSelected(SelectionEvent e) { if (fSynchronizedScrolling) { int v= sb1.getSelection(); @@ -2359,9 +2426,11 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleSetFocus() * @since 3.3 */ + @Override protected boolean handleSetFocus() { if (fRedoDiff) { new UIJob(CompareMessages.DocumentMerger_0) { + @Override public IStatus runInUIThread(IProgressMonitor monitor) { update(true); updateStructure(); @@ -2394,6 +2463,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { super(c, dir); fCanvas= c; } + @Override public void mouseMove(MouseEvent e) { if (!fIsDown && fUseSingleLine && isAnySideEditable() && handleMouseMoveOverCenter(fCanvas, e.x, e.y)) return; @@ -2404,52 +2474,51 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#createCenterControl(org.eclipse.swt.widgets.Composite) */ + @Override protected final Control createCenterControl(Composite parent) { if (fSynchronizedScrolling) { final Canvas canvas= new BufferedCanvas(parent, SWT.NONE) { + @Override public void doPaint(GC gc) { paintCenter(this, gc); } }; - if (fUseResolveUI) { - - new HoverResizer(canvas, HORIZONTAL); + new HoverResizer(canvas, HORIZONTAL); - if (fNormalCursor == null) fNormalCursor= new Cursor(canvas.getDisplay(), SWT.CURSOR_ARROW); - int style= fIsMac ? SWT.FLAT : SWT.PUSH; + if (fNormalCursor == null) fNormalCursor= new Cursor(canvas.getDisplay(), SWT.CURSOR_ARROW); + int style= fIsMac ? SWT.FLAT : SWT.PUSH; - fLeftToRightButton= new Button(canvas, style); - fLeftToRightButton.setCursor(fNormalCursor); - fLeftToRightButton.setText(COPY_LEFT_TO_RIGHT_INDICATOR); - fLeftToRightButton.setToolTipText( - Utilities.getString(getResourceBundle(), "action.CopyDiffLeftToRight.tooltip")); //$NON-NLS-1$ - fLeftToRightButton.pack(); - fLeftToRightButton.setVisible(false); - fLeftToRightButton.addSelectionListener( + fLeftToRightButton= new Button(canvas, style); + fLeftToRightButton.setCursor(fNormalCursor); + fLeftToRightButton.setText(COPY_LEFT_TO_RIGHT_INDICATOR); + fLeftToRightButton.setToolTipText( + Utilities.getString(getResourceBundle(), "action.CopyDiffLeftToRight.tooltip")); //$NON-NLS-1$ + fLeftToRightButton.pack(); + fLeftToRightButton.setVisible(false); + fLeftToRightButton.addSelectionListener( + new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleCenterButtonSelection(true); + } + } + ); + + fRightToLeftButton= new Button(canvas, style); + fRightToLeftButton.setCursor(fNormalCursor); + fRightToLeftButton.setText(COPY_RIGHT_TO_LEFT_INDICATOR); + fRightToLeftButton.setToolTipText( + Utilities.getString(getResourceBundle(), "action.CopyDiffRightToLeft.tooltip")); //$NON-NLS-1$ + fRightToLeftButton.pack(); + fRightToLeftButton.setVisible(false); + fRightToLeftButton.addSelectionListener( new SelectionAdapter() { + @Override public void widgetSelected(SelectionEvent e) { - handleCenterButtonSelection(true); + handleCenterButtonSelection(false); } } - ); - - fRightToLeftButton= new Button(canvas, style); - fRightToLeftButton.setCursor(fNormalCursor); - fRightToLeftButton.setText(COPY_RIGHT_TO_LEFT_INDICATOR); - fRightToLeftButton.setToolTipText( - Utilities.getString(getResourceBundle(), "action.CopyDiffRightToLeft.tooltip")); //$NON-NLS-1$ - fRightToLeftButton.pack(); - fRightToLeftButton.setVisible(false); - fRightToLeftButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - handleCenterButtonSelection(false); - } - } - ); - } else { - new Resizer(canvas, HORIZONTAL); - } + ); return canvas; } @@ -2468,8 +2537,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private boolean handleMouseMoveOverCenter(Canvas canvas, int x, int y) { Rectangle r= new Rectangle(0, 0, 0, 0); Diff diff= getDiffUnderMouse(canvas, x, y, r); - if (diff != null && !diff.isUnresolvedIncomingOrConflicting()) - diff= null; if (diff != fButtonDiff) { if (diff != null) { fButtonDiff= diff; @@ -2517,6 +2584,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#getCenterWidth() */ + @Override protected final int getCenterWidth() { if (fSynchronizedScrolling) return CENTER_WIDTH; @@ -2606,6 +2674,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { te.addPaintListener( new PaintListener() { + @Override public void paintControl(PaintEvent e) { paint(e, viewer); } @@ -2613,6 +2682,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { ); te.addKeyListener( new KeyAdapter() { + @Override public void keyPressed(KeyEvent e) { handleSelectionChanged(viewer); } @@ -2620,6 +2690,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { ); te.addMouseListener( new MouseAdapter() { + @Override public void mouseDown(MouseEvent e) { //syncViewport(part); handleSelectionChanged(viewer); @@ -2629,9 +2700,11 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { te.addFocusListener( new FocusAdapter() { + @Override public void focusGained(FocusEvent fe) { setActiveViewer(viewer, true); } + @Override public void focusLost(FocusEvent fe) { setActiveViewer(viewer, false); } @@ -2640,6 +2713,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { viewer.getSourceViewer().addViewportListener( new IViewportListener() { + @Override public void viewportChanged(int verticalPosition) { syncViewport(viewer); } @@ -2707,6 +2781,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private void contributeDiffBackgroundListener(final MergeSourceViewer viewer) { viewer.getSourceViewer().getTextWidget().addLineBackgroundListener( new LineBackgroundListener() { + @Override public void lineGetBackground(LineBackgroundEvent event) { StyledText textWidget = viewer.getSourceViewer() .getTextWidget(); @@ -2740,6 +2815,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (part != null) part.updateActions(); fHandlerService.updatePaneActionHandlers(new Runnable() { + @Override public void run() { for (int i= 0; i < GLOBAL_ACTIONS.length; i++) { IAction action= null; @@ -2756,6 +2832,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private void connectContributedActions(final MergeSourceViewer viewer, final boolean connect) { if (fHandlerService != null) { fHandlerService.updatePaneActionHandlers(new Runnable() { + @Override public void run() { if (viewer != null) { setActionsActivated(viewer.getSourceViewer(), connect); @@ -2860,6 +2937,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * @return <code>true</code> if saving was successful, or if the user didn't want to save (by pressing 'NO' in the confirmation dialog). * @since 2.0 */ + @Override protected boolean doSave(Object newInput, Object oldInput) { // TODO: Would be good if this could be restated in terms of Saveables and moved up if (oldInput != null && newInput != null) { @@ -2903,6 +2981,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * Initializes the text viewers of the three content areas with the given input objects. * Subclasses may extend. */ + @Override protected void updateContent(Object ancestor, Object left, Object right) { boolean emptyInput= (ancestor == null && left == null && right == null); @@ -2931,24 +3010,18 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { rightRange= ((IDocumentRange)right).getRange(); ancestor= ci.getAncestor(); - left= ci.getLeft(); - right= ci.getRight(); + left= getCompareConfiguration().isMirrored() ? ci.getRight() : ci.getLeft(); + right= getCompareConfiguration().isMirrored() ? ci.getLeft() : ci.getRight(); } } } } - int n= 0; - if (left != null) - n++; - if (right != null) - n++; - fHighlightRanges= n > 1; + fHighlightRanges= left != null && right != null; resetDiffs(); fHasErrors= false; // start with no errors - CompareConfiguration cc= getCompareConfiguration(); IMergeViewerContentProvider cp= getMergeContentProvider(); if (cp instanceof MergeViewerContentProvider) { @@ -2986,26 +3059,20 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (!isConfigured) { configureSourceViewer(fAncestor.getSourceViewer(), false, null); - configureSourceViewer(fLeft.getSourceViewer(), cc.isLeftEditable() && cp.isLeftEditable(input), fLeftContributor); - configureSourceViewer(fRight.getSourceViewer(), cc.isRightEditable() && cp.isRightEditable(input), fRightContributor); + configureSourceViewer(fLeft.getSourceViewer(), isLeftEditable() && cp.isLeftEditable(input), fLeftContributor); + configureSourceViewer(fRight.getSourceViewer(), isRightEditable() && cp.isRightEditable(input), fRightContributor); isConfigured = true; // configure once } // set new documents - fLeftContributor.setDocument(fLeft, cc.isLeftEditable() && cp.isLeftEditable(input)); + fLeftContributor.setDocument(fLeft, isLeftEditable() && cp.isLeftEditable(input)); fLeftLineCount= fLeft.getLineCount(); - fRightContributor.setDocument(fRight, cc.isRightEditable() && cp.isRightEditable(input)); + fRightContributor.setDocument(fRight, isRightEditable() && cp.isRightEditable(input)); fRightLineCount= fRight.getLineCount(); fAncestorContributor.setDocument(fAncestor, false); - //if the input is part of a patch hunk, toggle synchronized scrolling - /*if (isPatchHunk()){ - setSyncScrolling(false); - } else { - setSyncScrolling(fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING)); - }*/ setSyncScrolling(fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING)); update(false); @@ -3119,6 +3186,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fRedoDiff = false; final Diff oldDiff = getLastDiff(); new UIJob(CompareMessages.DocumentMerger_0) { + @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (!getControl().isDisposed()) { doDiff(); @@ -3307,6 +3375,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * @param left if <code>true</code> the contents of the left side is returned; otherwise the right side * @return the contents of the left or right document or null */ + @Override protected byte[] getContents(boolean left) { MergeSourceViewer v= left ? fLeft : fRight; if (v != null) { @@ -3353,6 +3422,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleResizeAncestor(int, int, int, int) */ + @Override protected final void handleResizeAncestor(int x, int y, int width, int height) { if (width > 0) { Rectangle trim= fLeft.getSourceViewer().getTextWidget().computeTrim(0, 0, 0, 0); @@ -3386,7 +3456,8 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleResizeLeftRight(int, int, int, int, int, int) */ - protected final void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2, int height) { + @Override + protected final void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2, int height) { if (fBirdsEyeCanvas != null) width2-= BIRDS_EYE_VIEW_WIDTH; @@ -3557,9 +3628,9 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } if (fCopyDiffLeftToRightItem != null) - ((Action)fCopyDiffLeftToRightItem.getAction()).setEnabled(leftToRight); + fCopyDiffLeftToRightItem.getAction().setEnabled(leftToRight); if (fCopyDiffRightToLeftItem != null) - ((Action)fCopyDiffRightToLeftItem.getAction()).setEnabled(rightToLeft); + fCopyDiffRightToLeftItem.getAction().setEnabled(rightToLeft); if (fNextDiff != null) { IAction a = fNextDiff.getAction(); @@ -3601,7 +3672,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (showResolveUI()) { // we only show red or green if there is at least one incoming or conflicting change - int incomingOrConflicting= 0; int unresolvedIncoming= 0; int unresolvedConflicting= 0; @@ -3609,8 +3679,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { for (Iterator iterator = fMerger.changesIterator(); iterator .hasNext();) { Diff d = (Diff) iterator.next(); - if (d.isIncomingOrConflicting() /* && useChange(d.fDirection) && !d.fIsWhitespace */) { - incomingOrConflicting++; if (!d.isResolved()) { if (d.getKind() == RangeDifference.CONFLICT) { unresolvedConflicting++; @@ -3618,18 +3686,15 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } unresolvedIncoming++; } - } } } - if (incomingOrConflicting > 0) { - if (unresolvedConflicting > 0) - rgb= SELECTED_CONFLICT; - else if (unresolvedIncoming > 0) - rgb= SELECTED_INCOMING; - else - rgb= RESOLVED; - } + if (unresolvedConflicting > 0) + rgb= SELECTED_CONFLICT; + else if (unresolvedIncoming > 0) + rgb= SELECTED_INCOMING; + else + rgb= RESOLVED; } if (fHeaderPainter.setColor(rgb)) @@ -3670,10 +3735,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { String s= ""; //$NON-NLS-1$ switch(diff.getKind()) { case RangeDifference.LEFT: - s= CompareMessages.TextMergeViewer_direction_outgoing; + s= getCompareConfiguration().isMirrored() ? + CompareMessages.TextMergeViewer_direction_incoming : + CompareMessages.TextMergeViewer_direction_outgoing; break; case RangeDifference.RIGHT: - s= CompareMessages.TextMergeViewer_direction_incoming; + s= getCompareConfiguration().isMirrored() ? + CompareMessages.TextMergeViewer_direction_outgoing : + CompareMessages.TextMergeViewer_direction_incoming; break; case RangeDifference.CONFLICT: s= CompareMessages.TextMergeViewer_direction_conflicting; @@ -3749,6 +3818,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return ""; //$NON-NLS-1$ } + @Override protected void updateHeader() { super.updateHeader(); @@ -3760,12 +3830,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { * Creates the two items for copying a difference range from one side to the other * and adds them to the given toolbar manager. */ + @Override protected void createToolItems(ToolBarManager tbm) { fHandlerService= CompareHandlerService.createFor(getCompareConfiguration().getContainer(), fLeft.getSourceViewer().getControl().getShell()); final String ignoreAncestorActionKey= "action.IgnoreAncestor."; //$NON-NLS-1$ Action ignoreAncestorAction= new Action() { + @Override public void run() { // First make sure the ancestor is hidden if (!isIgnoreAncestor()) @@ -3786,6 +3858,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { tbm.add(new Separator()); Action a= new Action() { + @Override public void run() { if (navigate(true, false, false)) { endOfDocumentReached(true); @@ -3798,6 +3871,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { // Don't register this action since it is probably registered by the container a= new Action() { + @Override public void run() { if (navigate(false, false, false)) { endOfDocumentReached(false); @@ -3810,6 +3884,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { // Don't register this action since it is probably registered by the container a= new Action() { + @Override public void run() { if (navigate(true, false, true)) { endOfDocumentReached(true); @@ -3822,6 +3897,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fHandlerService.registerAction(a, "org.eclipse.compare.selectNextChange"); //$NON-NLS-1$ a= new Action() { + @Override public void run() { if (navigate(false, false, true)) { endOfDocumentReached(false); @@ -3833,33 +3909,29 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { tbm.appendToGroup("navigation", fPreviousChange); //$NON-NLS-1$ fHandlerService.registerAction(a, "org.eclipse.compare.selectPreviousChange"); //$NON-NLS-1$ - CompareConfiguration cc= getCompareConfiguration(); - - if (cc.isRightEditable()) { - a= new Action() { - public void run() { - copyDiffLeftToRight(); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.CopyDiffLeftToRight."); //$NON-NLS-1$ - fCopyDiffLeftToRightItem= new ActionContributionItem(a); - fCopyDiffLeftToRightItem.setVisible(true); - tbm.appendToGroup("merge", fCopyDiffLeftToRightItem); //$NON-NLS-1$ - fHandlerService.registerAction(a, "org.eclipse.compare.copyLeftToRight"); //$NON-NLS-1$ - } + a= new Action() { + @Override + public void run() { + copyDiffLeftToRight(); + } + }; + Utilities.initAction(a, getResourceBundle(), "action.CopyDiffLeftToRight."); //$NON-NLS-1$ + fCopyDiffLeftToRightItem= new ActionContributionItem(a); + fCopyDiffLeftToRightItem.setVisible(isRightEditable()); + tbm.appendToGroup("merge", fCopyDiffLeftToRightItem); //$NON-NLS-1$ + fHandlerService.registerAction(a, "org.eclipse.compare.copyLeftToRight"); //$NON-NLS-1$ - if (cc.isLeftEditable()) { - a= new Action() { - public void run() { - copyDiffRightToLeft(); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.CopyDiffRightToLeft."); //$NON-NLS-1$ - fCopyDiffRightToLeftItem= new ActionContributionItem(a); - fCopyDiffRightToLeftItem.setVisible(true); - tbm.appendToGroup("merge", fCopyDiffRightToLeftItem); //$NON-NLS-1$ - fHandlerService.registerAction(a, "org.eclipse.compare.copyRightToLeft"); //$NON-NLS-1$ - } + a= new Action() { + @Override + public void run() { + copyDiffRightToLeft(); + } + }; + Utilities.initAction(a, getResourceBundle(), "action.CopyDiffRightToLeft."); //$NON-NLS-1$ + fCopyDiffRightToLeftItem= new ActionContributionItem(a); + fCopyDiffRightToLeftItem.setVisible(isLeftEditable()); + tbm.appendToGroup("merge", fCopyDiffRightToLeftItem); //$NON-NLS-1$ + fHandlerService.registerAction(a, "org.eclipse.compare.copyRightToLeft"); //$NON-NLS-1$ fIgnoreWhitespace= ChangePropertyAction.createIgnoreWhiteSpaceAction(getResourceBundle(), getCompareConfiguration()); fIgnoreWhitespace.setActionDefinitionId(ICompareUIConstants.COMMAND_IGNORE_WHITESPACE); @@ -4019,6 +4091,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handlePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent) */ + @Override protected void handlePropertyChangeEvent(PropertyChangeEvent event) { String key= event.getProperty(); @@ -4147,7 +4220,15 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override protected void updateToolItems() { + if (fCopyDiffLeftToRightItem != null) { + fCopyDiffLeftToRightItem.setVisible(isRightEditable()); + } + if (fCopyDiffRightToLeftItem != null) { + fCopyDiffRightToLeftItem.setVisible(isLeftEditable()); + } + //only update toolbar items if diffs need to be calculated (which //dictates whether a toolbar gets added at all) if (!isPatchHunk()){ @@ -4164,9 +4245,8 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (a != null) a.setEnabled(a.isEnabled() && !fHasErrors); } - - super.updateToolItems(); } + super.updateToolItems(); } //---- painting lines @@ -4232,18 +4312,14 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } private boolean showResolveUI() { - if (!fUseResolveUI || !isThreeWay() || isIgnoreAncestor()) + if (!isThreeWay() || isIgnoreAncestor()) return false; return isAnySideEditable(); } private boolean isAnySideEditable() { - CompareConfiguration cc= getCompareConfiguration(); // we only enable the new resolve UI if exactly one side is editable - boolean l= cc.isLeftEditable(); - boolean r= cc.isRightEditable(); - //return (l && !r) || (r && !l); - return l || r; + return isLeftEditable() || isRightEditable(); } private void paintCenter(Canvas canvas, GC g) { @@ -4276,8 +4352,6 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (! fHighlightRanges) return; - boolean isAnySideEditable= isAnySideEditable(); - if (fMerger.hasChanges()) { int lshift= fLeft.getVerticalScrollOffset(); int rshift= fRight.getVerticalScrollOffset(); @@ -4360,7 +4434,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } - if (fUseSingleLine && isAnySideEditable && diff.isUnresolvedIncomingOrConflicting()) { + if (fUseSingleLine && isAnySideEditable()) { // draw resolve state int cx= (w-RESOLVE_SIZE)/2; int cy= ((ly+lh/2) + (ry+rh/2) - RESOLVE_SIZE)/2; @@ -4514,19 +4588,19 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (isThreeWay() && !isIgnoreAncestor()) { switch (diff.getKind()) { case RangeDifference.RIGHT: - if (fLeftIsLocal) + if (!getCompareConfiguration().isMirrored()) return selected ? selected_fill : INCOMING_FILL; return selected ? selected_fill : OUTGOING_FILL; case RangeDifference.ANCESTOR: + case RangeDifference.CONFLICT: return selected ? selected_fill : CONFLICT_FILL; case RangeDifference.LEFT: - if (fLeftIsLocal) + if (!getCompareConfiguration().isMirrored()) return selected ? selected_fill : OUTGOING_FILL; return selected ? selected_fill : INCOMING_FILL; - case RangeDifference.CONFLICT: - return selected ? selected_fill : CONFLICT_FILL; + default: + return null; } - return null; } return selected ? selected_fill : OUTGOING_FILL; } @@ -4537,19 +4611,19 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { if (isThreeWay() && !isIgnoreAncestor()) { switch (diff.getKind()) { case RangeDifference.RIGHT: - if (fLeftIsLocal) + if (!getCompareConfiguration().isMirrored()) return selected ? SELECTED_INCOMING : INCOMING; return selected ? SELECTED_OUTGOING : OUTGOING; case RangeDifference.ANCESTOR: + case RangeDifference.CONFLICT: return selected ? SELECTED_CONFLICT : CONFLICT; case RangeDifference.LEFT: - if (fLeftIsLocal) + if (!getCompareConfiguration().isMirrored()) return selected ? SELECTED_OUTGOING : OUTGOING; return selected ? SELECTED_INCOMING : INCOMING; - case RangeDifference.CONFLICT: - return selected ? SELECTED_CONFLICT : CONFLICT; + default: + return null; } - return null; } return selected ? SELECTED_OUTGOING : OUTGOING; } @@ -4956,6 +5030,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* * Copy whole document from one side to the other. */ + @Override protected void copy(boolean leftToRight) { if (!validateChange(!leftToRight)) return; @@ -5202,6 +5277,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return fMerger.virtualToRealPosition(contributor, v); } + @Override void flushLeftSide(Object oldInput, IProgressMonitor monitor){ IMergeViewerContentProvider content= getMergeContentProvider(); Object leftContent = content.getLeftContent(oldInput); @@ -5218,6 +5294,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + @Override void flushRightSide(Object oldInput, IProgressMonitor monitor){ IMergeViewerContentProvider content= getMergeContentProvider(); Object rightContent = content.getRightContent(oldInput); @@ -5237,6 +5314,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#flushContent(java.lang.Object, org.eclipse.core.runtime.IProgressMonitor) */ + @Override protected void flushContent(Object oldInput, IProgressMonitor monitor) { flushLeftSide(oldInput, monitor); flushRightSide(oldInput, monitor); @@ -5270,9 +5348,11 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ + @Override public Object getAdapter(Class adapter) { if (adapter == IMergeViewerTestAdapter.class) { return new IMergeViewerTestAdapter() { + @Override public IDocument getDocument(char leg) { switch (leg) { case LEFT_CONTRIBUTOR: @@ -5285,6 +5365,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return null; } + @Override public int getChangesCount() { return fMerger.changesCount(); } @@ -5322,6 +5403,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { /* (non-Javadoc) * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleCompareInputChange() */ + @Override protected void handleCompareInputChange() { try { beginRefresh(); @@ -5465,60 +5547,76 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { */ private ITextEditor getTextEditorAdapter() { return new ITextEditor() { + @Override public void close(boolean save) { // Implementing interface method } + @Override public void doRevertToSaved() { // Implementing interface method } + @Override public IAction getAction(String actionId) { // Implementing interface method return null; } + @Override public IDocumentProvider getDocumentProvider() { // Implementing interface method return null; } + @Override public IRegion getHighlightRange() { // Implementing interface method return null; } + @Override public ISelectionProvider getSelectionProvider() { // Implementing interface method return null; } + @Override public boolean isEditable() { // Implementing interface method return false; } + @Override public void removeActionActivationCode(String actionId) { // Implementing interface method } + @Override public void resetHighlightRange() { // Implementing interface method } + @Override public void selectAndReveal(int offset, int length) { // Implementing interface method } + @Override public void setAction(String actionId, IAction action) { // Implementing interface method } + @Override public void setActionActivationCode(String actionId, char activationCharacter, int activationKeyCode, int activationStateMask) { // Implementing interface method } + @Override public void setHighlightRange(int offset, int length, boolean moveCursor) { // Implementing interface method } + @Override public void showHighlightRangeOnly(boolean showHighlightRangeOnly) { // Implementing interface method } + @Override public boolean showsHighlightRangeOnly() { // Implementing interface method return false; } + @Override public IEditorInput getEditorInput() { if (fFocusPart == fAncestor && fAncestorContributor != null) { return fAncestorContributor.getDocumentKey(); @@ -5530,105 +5628,132 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { return null; } } + @Override public IEditorSite getEditorSite() { // Implementing interface method return null; } + @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { // Implementing interface method } + @Override public void addPropertyListener(IPropertyListener listener) { // Implementing interface method } + @Override public void createPartControl(Composite parent) { // Implementing interface method } + @Override public void dispose() { // Implementing interface method } + @Override public IWorkbenchPartSite getSite() { // Implementing interface method return new IWorkbenchPartSite() { + @Override public String getId() { // Implementing interface method return null; } + @Override public IKeyBindingService getKeyBindingService() { // Implementing interface method return null; } + @Override public IWorkbenchPart getPart() { // Implementing interface method return null; } + @Override public String getPluginId() { // Implementing interface method return null; } + @Override public String getRegisteredName() { // Implementing interface method return null; } + @Override public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider) { // Implementing interface method } + @Override public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) { // Implementing interface method } + @Override public IWorkbenchPage getPage() { // Implementing interface method return null; } + @Override public ISelectionProvider getSelectionProvider() { // Implementing interface method return null; } + @Override public Shell getShell() { return fComposite.getShell(); } + @Override public IWorkbenchWindow getWorkbenchWindow() { // Implementing interface method return null; } + @Override public void setSelectionProvider(ISelectionProvider provider) { // Implementing interface method } + @Override public Object getAdapter(Class adapter) { // Implementing interface method return null; } + @Override public Object getService(Class api) { // Implementing interface method return null; } + @Override public boolean hasService(Class api) { // Implementing interface method return false; } }; } + @Override public String getTitle() { // Implementing interface method return null; } + @Override public Image getTitleImage() { // Implementing interface method return null; } + @Override public String getTitleToolTip() { // Implementing interface method return null; } + @Override public void removePropertyListener(IPropertyListener listener) { // Implementing interface method } + @Override public void setFocus() { // Implementing interface method } + @Override public Object getAdapter(Class adapter) { if (adapter == IEncodingSupport.class) { if (fFocusPart == fAncestor) { @@ -5647,12 +5772,15 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } return null; } + @Override public void doSave(IProgressMonitor monitor) { // Implementing interface method } + @Override public void doSaveAs() { // Implementing interface method } + @Override public boolean isDirty() { if (fFocusPart == fLeft) { return isLeftDirty(); @@ -5661,10 +5789,12 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } return false; } + @Override public boolean isSaveAsAllowed() { // Implementing interface method return false; } + @Override public boolean isSaveOnCloseNeeded() { // Implementing interface method return false; diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties index a459d147f..00988671e 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2011 IBM Corporation and others. +# Copyright (c) 2000, 2016 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 @@ -73,6 +73,9 @@ action.IgnoreAncestor.description.unchecked=Two-Way Compare (Ignore Ancestor) action.IgnoreAncestor.description.checked=Three-Way Compare action.IgnoreAncestor.image=twowaycompare_co.gif +action.SwitchLeftAndRight.label=Swap Left and Right View +action.SwitchLeftAndRight.tooltip=Swap Left and Right View +action.SwitchLeftAndRight.image=switch.png ##################################################### # Context menu actions diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java index 57fe155d1..54becc37b 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2016 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 @@ -41,10 +41,10 @@ public class BinaryCompareViewer extends AbstractViewer { private static final int EOF = -1; private ICompareInput fInput; private ResourceBundle fBundle; - private boolean fLeftIsLocal; private Composite fComposite; private Label fMessage; + private CompareConfiguration compareConfiguration; public BinaryCompareViewer(Composite parent, final CompareConfiguration cc) { @@ -60,19 +60,20 @@ public class BinaryCompareViewer extends AbstractViewer { fMessage= new Label(fComposite, SWT.WRAP); fComposite.setData(CompareUI.COMPARE_VIEWER_TITLE, Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - fLeftIsLocal= Utilities.getBoolean(cc, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - - if (cc != null && cc.getContainer() instanceof CompareEditorInput) { + compareConfiguration = cc != null ? cc : new CompareConfiguration(); + + if (compareConfiguration.getContainer() instanceof CompareEditorInput) { Label compareAsTextLabel = new Label(fComposite, SWT.WRAP); - compareAsTextLabel - .setText(Utilities.getString(fBundle, "compareAsText")); //$NON-NLS-1$ + compareAsTextLabel.setText(Utilities.getString(fBundle, "compareAsText")); //$NON-NLS-1$ } } + @Override public Control getControl() { return fComposite; } + @Override public void setInput(Object input) { if (fComposite != null && input instanceof ICompareInput) { fInput= (ICompareInput) input; @@ -102,20 +103,13 @@ public class BinaryCompareViewer extends AbstractViewer { } else if (left == null && right == null) { message= Utilities.getString(fBundle, "deleteConflictMessage"); //$NON-NLS-1$ } else if (left == null) { - if (fLeftIsLocal) - message= Utilities.getString(fBundle, "deletedMessage"); //$NON-NLS-1$ - else - message= Utilities.getString(fBundle, "addedMessage"); //$NON-NLS-1$ + message= Utilities.getString(fBundle, compareConfiguration.isMirrored() ? + "addedMessage" : "deletedMessage"); //$NON-NLS-1$ //$NON-NLS-2$ } else if (right == null) { - if (fLeftIsLocal) - message= Utilities.getString(fBundle, "addedMessage"); //$NON-NLS-1$ - else - message= Utilities.getString(fBundle, "deletedMessage"); //$NON-NLS-1$ + message= Utilities.getString(fBundle, compareConfiguration.isMirrored() ? + "deletedMessage" : "addedMessage"); //$NON-NLS-1$ //$NON-NLS-2$ } - } catch (CoreException ex) { - message = Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$ - CompareUIPlugin.log(ex); - } catch (IOException ex) { + } catch (CoreException | IOException ex) { message = Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$ CompareUIPlugin.log(ex); } finally { @@ -128,6 +122,7 @@ public class BinaryCompareViewer extends AbstractViewer { } } + @Override public Object getInput() { return fInput; } diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java index 8fe2bee11..cd262b46e 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2015 IBM Corporation and others. + * Copyright (c) 2000, 2016 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 @@ -8,13 +8,16 @@ * Contributors: * IBM Corporation - initial API and implementation * Alex Blewitt <alex.blewitt@gmail.com> - replace new Boolean with Boolean.valueOf - https://bugs.eclipse.org/470344 + * Conrad Groth - Bug 213780 - Compare With direction should be configurable *******************************************************************************/ package org.eclipse.compare.internal; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.eclipse.compare.CompareConfiguration; @@ -25,6 +28,7 @@ import org.eclipse.compare.internal.core.ComparePlugin; import org.eclipse.compare.structuremergeviewer.DiffNode; import org.eclipse.compare.structuremergeviewer.Differencer; import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.RadioGroupFieldEditor; @@ -98,13 +102,14 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP public static final String PATH_FILTER= PREFIX + "PathFilter"; //$NON-NLS-1$ public static final String ADDED_LINES_REGEX= PREFIX + "AddedLinesRegex"; //$NON-NLS-1$ public static final String REMOVED_LINES_REGEX= PREFIX + "RemovedLinesRegex"; //$NON-NLS-1$ + public static final String SWAPPED = PREFIX + "Swapped"; //$NON-NLS-1$ - + private TextMergeViewer fPreviewViewer; private IPropertyChangeListener fPreferenceChangeListener; private CompareConfiguration fCompareConfiguration; private OverlayPreferenceStore fOverlayStore; - private Map fCheckBoxes= new HashMap(); + private Map<Button, String> fCheckBoxes = new HashMap<>(); private Text fFilters; private Text addedLinesRegex; private Text removedLinesRegex; @@ -129,8 +134,9 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PATH_FILTER), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL), + new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, SWAPPED), }; - private RadioGroupFieldEditor editor; + private List<FieldEditor> editors = new ArrayList<>(); private TabItem fTextCompareTab; private Button fDisableCappingCheckBox; @@ -153,6 +159,7 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP store.setDefault(PATH_FILTER, ""); //$NON-NLS-1$ store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, ICompareUIConstants.PREF_VALUE_PROMPT); store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL, ICompareUIConstants.PREF_VALUE_LOOP); + store.setDefault(SWAPPED, false); } public ComparePreferencePage() { @@ -190,7 +197,7 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP fOverlayStore.setValue(ADDED_LINES_REGEX, addedLinesRegex.getText()); fOverlayStore.setValue(REMOVED_LINES_REGEX, removedLinesRegex.getText()); - editor.store(); + editors.forEach(editor -> editor.store()); fOverlayStore.propagate(); ComparePlugin.getDefault().setCappingDisabled( @@ -206,7 +213,7 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP fOverlayStore.loadDefaults(); initializeFields(); - + super.performDefaults(); } @@ -356,10 +363,13 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP addCheckBox(composite, "ComparePreferencePage.highlightTokenChanges.label", HIGHLIGHT_TOKEN_CHANGES, 0); //$NON-NLS-1$ //addCheckBox(composite, "ComparePreferencePage.useResolveUI.label", USE_RESOLVE_UI, 0); //$NON-NLS-1$ fDisableCappingCheckBox = addCheckBox(composite, "ComparePreferencePage.disableCapping.label", CAPPING_DISABLED, 0); //$NON-NLS-1$ + addCheckBox(composite, "ComparePreferencePage.swapped.label", SWAPPED, 0); //$NON-NLS-1$ Composite radioGroup = new Composite(composite, SWT.NULL); radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - editor = new RadioGroupFieldEditor(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, CompareMessages.ComparePreferencePage_0, 1, + RadioGroupFieldEditor editor = new RadioGroupFieldEditor( + ICompareUIConstants.PREF_NAVIGATION_END_ACTION, + CompareMessages.ComparePreferencePage_0, 1, new String[][] { new String[] { CompareMessages.ComparePreferencePage_1, ICompareUIConstants.PREF_VALUE_PROMPT }, new String[] { CompareMessages.ComparePreferencePage_2, ICompareUIConstants.PREF_VALUE_LOOP }, @@ -369,6 +379,7 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP radioGroup, true); editor.setPreferenceStore(fOverlayStore); editor.fillIntoGrid(radioGroup, 1); + editors.add(editor); // a spacer Label separator= new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); @@ -427,10 +438,10 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP private void initializeFields() { - Iterator e= fCheckBoxes.keySet().iterator(); + Iterator<Button> e = fCheckBoxes.keySet().iterator(); while (e.hasNext()) { - Button b= (Button) e.next(); - String key= (String) fCheckBoxes.get(b); + Button b = e.next(); + String key= fCheckBoxes.get(b); b.setSelection(fOverlayStore.getBoolean(key)); } @@ -441,7 +452,7 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP if (removedLinesRegex != null) removedLinesRegex.setText(fOverlayStore.getString(REMOVED_LINES_REGEX)); - editor.load(); + editors.forEach(editor -> editor.load()); } // overlay stuff @@ -455,14 +466,13 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP GridData gd= new GridData(GridData.FILL_HORIZONTAL); gd.horizontalIndent= indentation; - gd.horizontalSpan= 2; checkBox.setLayoutData(gd); if (fCheckBoxListener == null) { fCheckBoxListener= new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Button button= (Button) e.widget; - fOverlayStore.setValue((String) fCheckBoxes.get(button), button.getSelection()); + fOverlayStore.setValue(fCheckBoxes.get(button), button.getSelection()); } }; } @@ -472,7 +482,7 @@ public class ComparePreferencePage extends PreferencePage implements IWorkbenchP return checkBox; } - + private String loadPreviewContentFromFile(String key) { String preview= Utilities.getString(key); diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties index 3e733b451..197855ca8 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2011 IBM Corporation and others. +# Copyright (c) 2000, 2016 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 @@ -30,3 +30,7 @@ action.CopyRightToLeft.image= elcl16/copy_l_co.gif action.EnableAncestor.label= Enable Ancestor Pane action.EnableAncestor.tooltip= Control Visibility of Ancestor Pane action.EnableAncestor.image= elcl16/ancestorpane_co.gif + +action.SwitchLeftAndRight.label=Swap Left and Right View +action.SwitchLeftAndRight.tooltip=Swap Left and Right View +action.SwitchLeftAndRight.image=switch.png diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MirroredMergeViewerContentProvider.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MirroredMergeViewerContentProvider.java new file mode 100644 index 000000000..b3b755846 --- /dev/null +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MirroredMergeViewerContentProvider.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright (c) 2016 Conrad Groth 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: + * Conrad Groth - Bug 213780 - Compare With direction should be configurable + *******************************************************************************/ +package org.eclipse.compare.internal; + +import org.eclipse.compare.CompareConfiguration; +import org.eclipse.swt.graphics.Image; + +/** + * This class just swaps the left and right input for display. + * The model values for left and right are not changed. + * We must extend from the class and not the interface, because some implementations expect the class. + */ +public class MirroredMergeViewerContentProvider extends MergeViewerContentProvider { + private MergeViewerContentProvider delegate; + + public MirroredMergeViewerContentProvider(CompareConfiguration cc, MergeViewerContentProvider delegate) { + super(cc); + this.delegate = delegate; + } + + @Override + public String getLeftLabel(Object input) { + return delegate.getRightLabel(input); + } + + @Override + public Image getLeftImage(Object input) { + return delegate.getRightImage(input); + } + + @Override + public Object getLeftContent(Object input) { + return delegate.getRightContent(input); + } + + @Override + public boolean isLeftEditable(Object input) { + return delegate.isRightEditable(input); + } + + @Override + public void saveLeftContent(Object input, byte[] bytes) { + delegate.saveRightContent(input, bytes); + } + + @Override + public String getRightLabel(Object input) { + return delegate.getLeftLabel(input); + } + + @Override + public Image getRightImage(Object input) { + return delegate.getLeftImage(input); + } + + @Override + public Object getRightContent(Object input) { + return delegate.getLeftContent(input); + } + + @Override + public boolean isRightEditable(Object input) { + return delegate.isLeftEditable(input); + } + + @Override + public void saveRightContent(Object input, byte[] bytes) { + delegate.saveLeftContent(input, bytes); + } + + @Override + public String getAncestorLabel(Object input) { + return delegate.getAncestorLabel(input); + } + + @Override + public Image getAncestorImage(Object input) { + return delegate.getAncestorImage(input); + } + + @Override + public Object getAncestorContent(Object input) { + return delegate.getAncestorContent(input); + } + + @Override + public boolean showAncestor(Object input) { + return delegate.showAncestor(input); + } + + @Override + public void setAncestorError(String errorMessage) { + delegate.setAncestorError(errorMessage); + } + + @Override + public void setLeftError(String errorMessage) { + delegate.setLeftError(errorMessage); + } + + @Override + public void setRightError(String errorMessage) { + delegate.setRightError(errorMessage); + } +} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java index 3f7938ecc..43738a7a9 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java @@ -74,8 +74,6 @@ public class DocumentMerger { /** Subset of above: just real differences. */ private ArrayList fChangeDiffs; - private final boolean fLeftIsLocal; - private IDocumentMergerInput fInput; /** @@ -120,7 +118,7 @@ public class DocumentMerger { int fDirection; boolean fIsToken= false; /** child token diffs */ - ArrayList fDiffs; + List<Diff> fDiffs; boolean fIsWhitespace= false; /* @@ -177,10 +175,10 @@ public class DocumentMerger { int code= Differencer.CHANGE; switch (fDirection) { case RangeDifference.RIGHT: - code+= Differencer.LEFT; + code+= getCompareConfiguration().isMirrored() ? Differencer.RIGHT : Differencer.LEFT; break; case RangeDifference.LEFT: - code+= Differencer.RIGHT; + code+= getCompareConfiguration().isMirrored() ? Differencer.LEFT : Differencer.RIGHT ; break; case RangeDifference.ANCESTOR: case RangeDifference.CONFLICT: @@ -226,7 +224,7 @@ public class DocumentMerger { void add(Diff d) { if (fDiffs == null) - fDiffs= new ArrayList(); + fDiffs= new ArrayList<>(); fDiffs.add(d); } @@ -255,48 +253,6 @@ public class DocumentMerger { return fResolved; } -// private boolean isIncoming() { -// switch (fDirection) { -// case RangeDifference.RIGHT: -// if (fLeftIsLocal) -// return true; -// break; -// case RangeDifference.LEFT: -// if (!fLeftIsLocal) -// return true; -// break; -// } -// return false; -// } - - public boolean isIncomingOrConflicting() { - switch (fDirection) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return true; - break; - case RangeDifference.LEFT: - if (!fLeftIsLocal) - return true; - break; - case RangeDifference.CONFLICT: - return true; - } - return false; - } - -// private boolean isUnresolvedIncoming() { -// if (fResolved) -// return false; -// return isIncoming(); -// } - - public boolean isUnresolvedIncomingOrConflicting() { - if (fResolved) - return false; - return isIncomingOrConflicting(); - } - Position getPosition(int contributor) { if (contributor == MergeViewerContentProvider.LEFT_CONTRIBUTOR) return fLeftPos; @@ -392,7 +348,6 @@ public class DocumentMerger { public DocumentMerger(IDocumentMergerInput input) { this.fInput = input; - fLeftIsLocal= Utilities.getBoolean(getCompareConfiguration(), "LEFT_IS_LOCAL", false); //$NON-NLS-1$ } /** @@ -1238,7 +1193,7 @@ public class DocumentMerger { public boolean isFirstChildDiff(char contributor, int childStart, Diff diff) { if (!diff.hasChildren()) return false; - Diff d = (Diff)diff.fDiffs.get(0); + Diff d = diff.fDiffs.get(0); Position p= d.getPosition(contributor); return (p.getOffset() >= childStart); } diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java index 44d9c907e..d5df14bd0 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java @@ -40,15 +40,15 @@ import org.eclipse.swt.widgets.*; public class DiffTreeViewer extends TreeViewer { class DiffViewerContentProvider implements ITreeContentProvider { - + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // empty implementation } - + public boolean isDeleted(Object element) { return false; } - + public void dispose() { inputChanged(DiffTreeViewer.this, getInput(), null); } @@ -71,6 +71,7 @@ public class DiffTreeViewer extends TreeViewer { return new Object[0]; } + @Override public Object[] getElements(Object element) { return getChildren(element); } @@ -81,7 +82,7 @@ public class DiffTreeViewer extends TreeViewer { * is true. */ class DiffViewerLabelProvider extends LabelProvider { - + @Override public String getText(Object element) { if (element instanceof IDiffElement) @@ -90,26 +91,42 @@ public class DiffTreeViewer extends TreeViewer { return Utilities.getString(fBundle, "defaultLabel"); //$NON-NLS-1$ } + @Override public Image getImage(Object element) { if (element instanceof IDiffElement) { IDiffElement input= (IDiffElement) element; int kind= input.getKind(); - if (fLeftIsLocal) { - switch (kind & Differencer.DIRECTION_MASK) { + // Flip the direction and the change type, because all images are the other way round, + // i.e. for comparison from left to right. + switch (kind & Differencer.DIRECTION_MASK) { case Differencer.LEFT: kind= (kind &~ Differencer.LEFT) | Differencer.RIGHT; break; case Differencer.RIGHT: kind= (kind &~ Differencer.RIGHT) | Differencer.LEFT; break; - } } - + switch (kind & Differencer.CHANGE_TYPE_MASK) { + case Differencer.ADDITION: + kind= (kind &~ Differencer.ADDITION) | Differencer.DELETION; + break; + case Differencer.DELETION: + kind= (kind &~ Differencer.DELETION) | Differencer.ADDITION; + break; + } + return fCompareConfiguration.getImage(input.getImage(), kind); } return null; } + + /** + * Informs the platform, that the images have changed. + */ + public void fireLabelProviderChanged() { + fireLabelProviderChanged(new LabelProviderChangedEvent(this)); + } } static class FilterSame extends ViewerFilter { @@ -125,11 +142,9 @@ public class DiffTreeViewer extends TreeViewer { private ResourceBundle fBundle; private CompareConfiguration fCompareConfiguration; - /* package */ boolean fLeftIsLocal; private IPropertyChangeListener fPropertyChangeListener; + private DiffViewerLabelProvider diffViewerLabelProvider = new DiffViewerLabelProvider(); - private Action fCopyLeftToRightAction; - private Action fCopyRightToLeftAction; private Action fEmptyMenuAction; private Action fExpandAllAction; @@ -182,9 +197,6 @@ public class DiffTreeViewer extends TreeViewer { } }; tree.setData(INavigatable.NAVIGATOR_PROPERTY, nav); - - fLeftIsLocal= Utilities.getBoolean(configuration, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - tree.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); Composite parent= tree.getParent(); @@ -194,25 +206,15 @@ public class DiffTreeViewer extends TreeViewer { // register for notification with the CompareConfiguration fCompareConfiguration= configuration; if (fCompareConfiguration != null) { - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - DiffTreeViewer.this.propertyChange(event); - } - }; + fPropertyChangeListener = event -> propertyChange(event); fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener); } setContentProvider(new DiffViewerContentProvider()); - setLabelProvider(new DiffViewerLabelProvider()); - - addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent se) { - updateActions(); - } - } - ); - + setLabelProvider(diffViewerLabelProvider); + + addSelectionChangedListener(event -> updateActions()); + setComparator(new DiffViewerComparator()); ToolBarManager tbm= CompareViewerPane.getToolBarManager(parent); @@ -301,12 +303,16 @@ public class DiffTreeViewer extends TreeViewer { /** * Tracks property changes of the configuration object. * Clients may extend to track their own property changes. + * In this case they must call the inherited method. * @param event property change event that triggered call to this method */ protected void propertyChange(PropertyChangeEvent event) { - // empty default implementation + if (event.getProperty().equals(CompareConfiguration.MIRRORED)) { + diffViewerLabelProvider.fireLabelProviderChanged(); + } } + @Override protected void inputChanged(Object in, Object oldInput) { super.inputChanged(in, oldInput); @@ -375,38 +381,6 @@ public class DiffTreeViewer extends TreeViewer { * @param toolbarManager the toolbar manager for which to add the actions */ protected void createToolItems(ToolBarManager toolbarManager) { - -// fCopyLeftToRightAction= new Action() { -// public void run() { -// copySelected(true); -// } -// }; -// Utilities.initAction(fCopyLeftToRightAction, fBundle, "action.TakeLeft."); -// toolbarManager.appendToGroup("merge", fCopyLeftToRightAction); - -// fCopyRightToLeftAction= new Action() { -// public void run() { -// copySelected(false); -// } -// }; -// Utilities.initAction(fCopyRightToLeftAction, fBundle, "action.TakeRight."); -// toolbarManager.appendToGroup("merge", fCopyRightToLeftAction); - -// fNextAction= new Action() { -// public void run() { -// navigate(true); -// } -// }; -// Utilities.initAction(fNextAction, fBundle, "action.NextDiff."); //$NON-NLS-1$ -// toolbarManager.appendToGroup("navigation", fNextAction); //$NON-NLS-1$ - -// fPreviousAction= new Action() { -// public void run() { -// navigate(false); -// } -// }; -// Utilities.initAction(fPreviousAction, fBundle, "action.PrevDiff."); //$NON-NLS-1$ -// toolbarManager.appendToGroup("navigation", fPreviousAction); //$NON-NLS-1$ } /** @@ -442,13 +416,7 @@ public class DiffTreeViewer extends TreeViewer { } } fExpandAllAction.setEnabled(enable); - manager.add(fExpandAllAction); - - if (fCopyLeftToRightAction != null) - manager.add(fCopyLeftToRightAction); - if (fCopyRightToLeftAction != null) - manager.add(fCopyRightToLeftAction); } /** @@ -669,48 +637,10 @@ public class DiffTreeViewer extends TreeViewer { } } - private final boolean isEditable(Object element, boolean left) { - if (element instanceof ICompareInput) { - ICompareInput diff= (ICompareInput) element; - Object side= left ? diff.getLeft() : diff.getRight(); - if (side == null && diff instanceof IDiffElement) { - IDiffContainer container= ((IDiffElement)diff).getParent(); - if (container instanceof ICompareInput) { - ICompareInput parent= (ICompareInput) container; - side= left ? parent.getLeft() : parent.getRight(); - } - } - if (side instanceof IEditableContent) - return ((IEditableContent) side).isEditable(); - } - return false; - } - private void updateActions() { - int leftToRight= 0; - int rightToLeft= 0; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) selection; - Iterator e= ss.iterator(); - while (e.hasNext()) { - Object element= e.next(); - if (element instanceof ICompareInput) { - if (isEditable(element, false)) - leftToRight++; - if (isEditable(element, true)) - rightToLeft++; - if (leftToRight > 0 && rightToLeft > 0) - break; - } - } - if (fExpandAllAction != null) - fExpandAllAction.setEnabled(selection.isEmpty()); + if (fExpandAllAction != null) { + fExpandAllAction.setEnabled(getSelection().isEmpty()); } - if (fCopyLeftToRightAction != null) - fCopyLeftToRightAction.setEnabled(leftToRight > 0); - if (fCopyRightToLeftAction != null) - fCopyRightToLeftAction.setEnabled(rightToLeft > 0); } /* diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java index b51e56254..7df336d0c 100644 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java @@ -482,8 +482,8 @@ public class StructureDiffViewer extends DiffTreeViewer { } protected Object visit(Object data, int result, Object ancestor, Object left, Object right) { Object o= super.visit(data, result, ancestor, left, right); - if (fLeftIsLocal && o instanceof DiffNode) - ((DiffNode)o).swapSides(fLeftIsLocal); + if (!getCompareConfiguration().isMirrored() && o instanceof DiffNode) + ((DiffNode)o).swapSides(true); return o; } }; @@ -692,11 +692,8 @@ public class StructureDiffViewer extends DiffTreeViewer { if (Display.getCurrent() != null) runnable.run(); else - getControl().getDisplay().syncExec(new Runnable() { - public void run() { - if (!getControl().isDisposed()) - runnable.run(); - } + getControl().getDisplay().syncExec(() -> { + if (!getControl().isDisposed()) runnable.run(); }); } } diff --git a/bundles/org.eclipse.compare/icons/full/dlcl16/switch.png b/bundles/org.eclipse.compare/icons/full/dlcl16/switch.png Binary files differnew file mode 100644 index 000000000..f3132b9dc --- /dev/null +++ b/bundles/org.eclipse.compare/icons/full/dlcl16/switch.png diff --git a/bundles/org.eclipse.compare/icons/full/elcl16/switch.png b/bundles/org.eclipse.compare/icons/full/elcl16/switch.png Binary files differnew file mode 100644 index 000000000..96cef47ee --- /dev/null +++ b/bundles/org.eclipse.compare/icons/full/elcl16/switch.png diff --git a/bundles/org.eclipse.compare/plugin.properties b/bundles/org.eclipse.compare/plugin.properties index 9335310b5..d314944f8 100644 --- a/bundles/org.eclipse.compare/plugin.properties +++ b/bundles/org.eclipse.compare/plugin.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2014 IBM Corporation and others. +# Copyright (c) 2000, 2016 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 @@ -132,6 +132,7 @@ ComparePreferencePage.synchronizeScrolling.label= Synchronize &scrolling between ComparePreferencePage.useSingleLine.label= Connect &ranges with single line ComparePreferencePage.highlightTokenChanges.label=&Highlight individual changes ComparePreferencePage.disableCapping.label=Disable &capping when comparing large documents +ComparePreferencePage.swapped.label=Swap sid&es ComparePreferencePage.preview.label= Previe&w: ComparePreferencePage.ancestor.label= Common Ancestor diff --git a/bundles/org.eclipse.compare/pom.xml b/bundles/org.eclipse.compare/pom.xml index 85568fe6d..75ab2a57f 100644 --- a/bundles/org.eclipse.compare/pom.xml +++ b/bundles/org.eclipse.compare/pom.xml @@ -19,6 +19,6 @@ </parent> <groupId>org.eclipse.compare</groupId> <artifactId>org.eclipse.compare</artifactId> - <version>3.6.0-SNAPSHOT</version> + <version>3.7.0-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewer.java b/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewer.java index af1ae11f5..cb8757304 100644 --- a/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewer.java +++ b/examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewer.java @@ -499,6 +499,7 @@ public class XMLStructureViewer extends StructureDiffViewer { !getXMLStructureCreator().getRemoveWhiteSpace()); contentChanged(); } + super.propertyChange(event); } private void performMatching(final XMLNode left, final XMLNode right, |