Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java121
1 files changed, 85 insertions, 36 deletions
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 77dd1a511..727a07943 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, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -14,6 +14,7 @@
* Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 178968 [Viewers] Lines scrambled and different font size in compare
* Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 191524 [Viewers] Synchronize horizontal scrolling by # characters, not % of longest line
* Stephan Herrmann (stephan@cs.tu-berlin.de) - Bug 291695: Element compare fails to use source range
+ * Robin Stocker (robin@nibor.org) - Bug 398594: [Edit] Enable center arrow buttons when editable and for both sides
*******************************************************************************/
package org.eclipse.compare.contentmergeviewer;
@@ -409,7 +410,8 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
// points for center curves
private double[] fBasicCenterCurve;
- private Button fCenterButton;
+ private Button fLeftToRightButton;
+ private Button fRightToLeftButton;
private Diff fButtonDiff;
private ContributorInfo fLeftContributor;
@@ -2274,7 +2276,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
fCanvas= c;
}
public void mouseMove(MouseEvent e) {
- if (!fIsDown && fUseSingleLine && showResolveUI() && handleMouseMoveOverCenter(fCanvas, e.x, e.y))
+ if (!fIsDown && fUseSingleLine && isAnySideEditable() && handleMouseMoveOverCenter(fCanvas, e.x, e.y))
return;
super.mouseMove(e);
}
@@ -2293,25 +2295,39 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
if (fUseResolveUI) {
new HoverResizer(canvas, HORIZONTAL);
-
- fCenterButton= new Button(canvas, fIsMac ? SWT.FLAT : SWT.PUSH);
+
if (fNormalCursor == null) fNormalCursor= new Cursor(canvas.getDisplay(), SWT.CURSOR_ARROW);
- fCenterButton.setCursor(fNormalCursor);
- fCenterButton.setText(COPY_RIGHT_TO_LEFT_INDICATOR);
- fCenterButton.pack();
- fCenterButton.setVisible(false);
- fCenterButton.addSelectionListener(
+ 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(
new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
- fCenterButton.setVisible(false);
- if (fButtonDiff != null) {
- setCurrentDiff(fButtonDiff, false);
- copy(fCurrentDiff, fCenterButton.getText().equals(
- COPY_LEFT_TO_RIGHT_INDICATOR), false);
- }
+ 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() {
+ public void widgetSelected(SelectionEvent e) {
+ handleCenterButtonSelection(false);
+ }
+ }
+ );
} else {
new Resizer(canvas, HORIZONTAL);
}
@@ -2320,7 +2336,16 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
}
return super.createCenterControl(parent);
}
-
+
+ private void handleCenterButtonSelection(boolean leftToRight) {
+ fLeftToRightButton.setVisible(false);
+ fRightToLeftButton.setVisible(false);
+ if (fButtonDiff != null) {
+ setCurrentDiff(fButtonDiff, false);
+ copy(fCurrentDiff, leftToRight, false);
+ }
+ }
+
private boolean handleMouseMoveOverCenter(Canvas canvas, int x, int y) {
Rectangle r= new Rectangle(0, 0, 0, 0);
Diff diff= getDiffUnderMouse(canvas, x, y, r);
@@ -2328,24 +2353,42 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
diff= null;
if (diff != fButtonDiff) {
if (diff != null) {
- if (fLeft.getSourceViewer().isEditable()) {
- fButtonDiff= diff;
- fCenterButton.setText(COPY_RIGHT_TO_LEFT_INDICATOR);
- String tt= fCopyDiffRightToLeftItem.getAction().getToolTipText();
- fCenterButton.setToolTipText(tt);
- fCenterButton.setBounds(r);
- fCenterButton.setVisible(true);
- } else if (fRight.getSourceViewer().isEditable()) {
- fButtonDiff= diff;
- fCenterButton.setText(COPY_LEFT_TO_RIGHT_INDICATOR);
- String tt= fCopyDiffLeftToRightItem.getAction().getToolTipText();
- fCenterButton.setToolTipText(tt);
- fCenterButton.setBounds(r);
- fCenterButton.setVisible(true);
+ fButtonDiff= diff;
+ boolean leftEditable= fLeft.getSourceViewer().isEditable();
+ boolean rightEditable= fRight.getSourceViewer().isEditable();
+ if (leftEditable && rightEditable) {
+ int height= r.height;
+ int leftToRightY= r.y - height/2;
+ int rightToLeftY= leftToRightY + height;
+ Rectangle bounds = canvas.getBounds();
+ if (leftToRightY < 0) {
+ // button must not be hidden at top
+ leftToRightY= 0;
+ rightToLeftY= height;
+ } else if (rightToLeftY + height > bounds.height) {
+ // button must not be hidden at bottom
+ leftToRightY= bounds.height - height - height;
+ rightToLeftY= leftToRightY + height;
+ }
+ Rectangle leftToRightBounds= new Rectangle(r.x, leftToRightY, r.width, r.height);
+ fLeftToRightButton.setBounds(leftToRightBounds);
+ fLeftToRightButton.setVisible(true);
+ Rectangle rightToLeftBounds= new Rectangle(r.x, rightToLeftY, r.width, r.height);
+ fRightToLeftButton.setBounds(rightToLeftBounds);
+ fRightToLeftButton.setVisible(true);
+ } else if (leftEditable) {
+ fRightToLeftButton.setBounds(r);
+ fRightToLeftButton.setVisible(true);
+ fLeftToRightButton.setVisible(false);
+ } else if (rightEditable) {
+ fLeftToRightButton.setBounds(r);
+ fLeftToRightButton.setVisible(true);
+ fRightToLeftButton.setVisible(false);
} else
fButtonDiff= null;
} else {
- fCenterButton.setVisible(false);
+ fRightToLeftButton.setVisible(false);
+ fLeftToRightButton.setVisible(false);
fButtonDiff= null;
}
}
@@ -3878,6 +3921,10 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
private boolean showResolveUI() {
if (!fUseResolveUI || !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();
@@ -3916,7 +3963,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
if (! fHighlightRanges)
return;
- boolean showResolveUI= showResolveUI();
+ boolean isAnySideEditable= isAnySideEditable();
if (fMerger.hasChanges()) {
int lshift= fLeft.getVerticalScrollOffset();
@@ -4000,7 +4047,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
}
}
- if (fUseSingleLine && showResolveUI && diff.isUnresolvedIncomingOrConflicting()) {
+ if (fUseSingleLine && isAnySideEditable && diff.isUnresolvedIncomingOrConflicting()) {
// draw resolve state
int cx= (w-RESOLVE_SIZE)/2;
int cy= ((ly+lh/2) + (ry+rh/2) - RESOLVE_SIZE)/2;
@@ -4406,8 +4453,10 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable {
// return;
boolean diffChanged = fCurrentDiff != d;
- if (fCenterButton != null && !fCenterButton.isDisposed())
- fCenterButton.setVisible(false);
+ if (fLeftToRightButton != null && !fLeftToRightButton.isDisposed())
+ fLeftToRightButton.setVisible(false);
+ if (fRightToLeftButton != null && !fRightToLeftButton.isDisposed())
+ fRightToLeftButton.setVisible(false);
if (d != null && revealAndSelect) {

Back to the top