Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConrad Groth2016-08-06 09:06:05 +0000
committerSergey Prigogin2016-10-02 19:53:05 +0000
commitd12c403fa89f023f6e29425649bab0780712002c (patch)
treef735432de0c6a79d799dc68461cdf463bb349b0c
parent64fa7e494663df59669e29209f632b51756fc170 (diff)
downloadeclipse.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>
-rw-r--r--bundles/org.eclipse.compare/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java95
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java194
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java416
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties5
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java33
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java38
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties6
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MirroredMergeViewerContentProvider.java113
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java55
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java146
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java11
-rw-r--r--bundles/org.eclipse.compare/icons/full/dlcl16/switch.pngbin0 -> 401 bytes
-rw-r--r--bundles/org.eclipse.compare/icons/full/elcl16/switch.pngbin0 -> 558 bytes
-rw-r--r--bundles/org.eclipse.compare/plugin.properties3
-rw-r--r--bundles/org.eclipse.compare/pom.xml2
-rw-r--r--examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewer.java1
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
new file mode 100644
index 000000000..f3132b9dc
--- /dev/null
+++ b/bundles/org.eclipse.compare/icons/full/dlcl16/switch.png
Binary files differ
diff --git a/bundles/org.eclipse.compare/icons/full/elcl16/switch.png b/bundles/org.eclipse.compare/icons/full/elcl16/switch.png
new file mode 100644
index 000000000..96cef47ee
--- /dev/null
+++ b/bundles/org.eclipse.compare/icons/full/elcl16/switch.png
Binary files differ
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,

Back to the top