diff options
author | Malgorzata Janczarska | 2013-07-09 13:08:03 +0000 |
---|---|---|
committer | Malgorzata Janczarska | 2013-07-09 13:08:03 +0000 |
commit | 7b8db75d7e1cb639dafec4c03cd66ba78718e11d (patch) | |
tree | 1f62ba548e7845c309ce46857aa16bde8e82ef8f | |
parent | 993a62289e5805ed41286af020819cb3f3d2e636 (diff) | |
download | eclipse.platform.team-7b8db75d7e1cb639dafec4c03cd66ba78718e11d.tar.gz eclipse.platform.team-7b8db75d7e1cb639dafec4c03cd66ba78718e11d.tar.xz eclipse.platform.team-7b8db75d7e1cb639dafec4c03cd66ba78718e11d.zip |
Bug 412579 - [Backport][Edit] "Copy Current from Right to Left" doesn'tM20130724-0800M20130717-0800M20130710-0800
work when triggered after Undo
2 files changed, 51 insertions, 4 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 b1db00552..3492dbd31 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 @@ -433,6 +433,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private DocumentMerger fMerger; /** The current diff */ private Diff fCurrentDiff; + private Diff fSavedDiff; // Bug 259362 - Update diffs after undo private boolean copyOperationInProgress = false; @@ -3007,11 +3008,17 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } if (!isLeftDirty() && !isRightDirty()) { fRedoDiff = false; + final Diff oldDiff = getLastDiff(); new UIJob(CompareMessages.DocumentMerger_0) { public IStatus runInUIThread(IProgressMonitor monitor) { if (!getControl().isDisposed()) { doDiff(); - if (!getControl().isDisposed()) { // doDiff() might have closed the editor + if (!getControl().isDisposed()) { + Diff newDiff = findNewDiff(oldDiff); + if (newDiff != null) { + updateStatus(newDiff); + setCurrentDiff(newDiff, true); + } invalidateLines(); updateLines(doc); } @@ -3024,6 +3031,43 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } } + + private void saveDiff() { + fSavedDiff = fCurrentDiff; + } + + private Diff getLastDiff() { + if (fCurrentDiff != null) { + return fCurrentDiff; + } + return fSavedDiff; + } + + + private Diff findNewDiff(Diff oldDiff) { + if (oldDiff == null) + return null; + Diff newDiff = findNewDiff(oldDiff, LEFT_CONTRIBUTOR); + if (newDiff == null) { + newDiff = findNewDiff(oldDiff, RIGHT_CONTRIBUTOR); + } + return newDiff; + } + + private Diff findNewDiff(Diff oldDiff, char type) { + int offset = oldDiff.getPosition(type).offset; + int length = oldDiff.getPosition(type).length; + + // DocumentMerger.findDiff method doesn't really work well with 0-length + // diffs + if (length == 0) { + if (offset > 0) + offset--; + length = 1; + } + return fMerger.findDiff(type, offset, offset + length); + } + /* * This method is called if a range of text on one side is copied into an empty sub-document * on the other side. The method returns the position where the sub-document is placed into the base document. @@ -3336,7 +3380,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { fAncestor.resetLineBackground(); fLeft.resetLineBackground(); fRight.resetLineBackground(); - + saveDiff(); fCurrentDiff= null; try { fMerger.doDiff(); @@ -4637,9 +4681,11 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { } // now switch diffs + saveDiff(); fCurrentDiff= d; revealDiff(d, d.isToken()); } else { + saveDiff(); fCurrentDiff= d; } @@ -4890,7 +4936,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { */ private boolean copy(Diff diff, boolean leftToRight) { - if (diff != null && !diff.isResolved()) { + if (diff != null) { if (!validateChange(!leftToRight)) return false; if (leftToRight) { @@ -5222,6 +5268,7 @@ public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { private void resetDiffs() { // clear stuff + saveDiff(); fCurrentDiff= null; fMerger.reset(); resetPositions(fLeft.getSourceViewer().getDocument()); 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 c961c8028..ef7bf0223 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 @@ -1258,7 +1258,7 @@ public class DocumentMerger { */ public boolean copy(Diff diff, boolean leftToRight) { - if (diff != null && !diff.isResolved()) { + if (diff != null) { Position fromPos= null; Position toPos= null; IDocument fromDoc= null; |