Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Weinand2001-08-08 16:57:55 +0000
committerAndre Weinand2001-08-08 16:57:55 +0000
commit6e3579a911388315816db081e75328077984b021 (patch)
tree5d0eaff06079675b5a08dbc624744a88c043e392 /bundles/org.eclipse.compare/compare/org/eclipse/compare
parent74897f6654b8259651b954726b25a826531f2c4b (diff)
downloadeclipse.platform.team-6e3579a911388315816db081e75328077984b021.tar.gz
eclipse.platform.team-6e3579a911388315816db081e75328077984b021.tar.xz
eclipse.platform.team-6e3579a911388315816db081e75328077984b021.zip
1GI5DN9: ITPUI:WIN2000 - Conflicting token deletions don't show up in text compare viewer
Diffstat (limited to 'bundles/org.eclipse.compare/compare/org/eclipse/compare')
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java4
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java77
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java6
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java70
4 files changed, 82 insertions, 75 deletions
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 67c727690..61150fdab 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
@@ -690,6 +690,10 @@ public abstract class ContentMergeViewer extends ContentViewer implements IPrope
return 3;
}
+ /* package */ boolean getAncestorEnabled() {
+ return fAncestorEnabled;
+ }
+
/* package */ Control createCenter(Composite parent) {
Sash sash= new Sash(parent, SWT.VERTICAL);
new Resizer(sash, HORIZONTAL);
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 10ed92589..2e3a4acf8 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
@@ -1243,7 +1243,7 @@ public class TextMergeViewer extends ContentMergeViewer {
for (int i= 0; i < e.length; i++) {
RangeDifference es= e[i];
int kind= es.kind();
- if (kind != RangeDifference.NOCHANGE && kind != RangeDifference.ANCESTOR) {
+ if (kind != RangeDifference.NOCHANGE) {
int ancestorStart2= ancestorStart;
int ancestorEnd2= ancestorStart;
@@ -1954,43 +1954,52 @@ public class TextMergeViewer extends ContentMergeViewer {
//---- Navigating and resolving Diffs
- /**
- */
private boolean navigate(boolean down, boolean wrap, boolean deep) {
Diff diff= null;
- if (fChangeDiffs != null) {
- MergeSourceViewer part= fFocusPart;
- if (part == null)
- part= fRight;
+
+ for (;;) {
- if (part != null) {
- Point s= part.getSelectedRange();
- if (down)
- diff= findNext(part, fChangeDiffs, s.x, s.x+s.y, deep);
- else
- diff= findPrev(part, fChangeDiffs, s.x, s.x+s.y, deep);
- }
- }
-
- if (diff == null) {
- if (wrap) {
- Control c= getControl();
- if (Utilities.okToUse(c))
- c.getDisplay().beep();
- if (DEAD_STEP)
- return true;
- if (fChangeDiffs.size() > 0) {
+ if (fChangeDiffs != null) {
+ MergeSourceViewer part= fFocusPart;
+ if (part == null)
+ part= fRight;
+
+ if (part != null) {
+ Point s= part.getSelectedRange();
if (down)
- diff= (Diff) fChangeDiffs.get(0);
+ diff= findNext(part, fChangeDiffs, s.x, s.x+s.y, deep);
else
- diff= (Diff) fChangeDiffs.get(fChangeDiffs.size()-1);
- }
- } else
- return true;
- }
+ diff= findPrev(part, fChangeDiffs, s.x, s.x+s.y, deep);
+ }
+ }
+
+ if (diff == null) {
+ if (wrap) {
+ Control c= getControl();
+ if (Utilities.okToUse(c))
+ c.getDisplay().beep();
+ if (DEAD_STEP)
+ return true;
+ if (fChangeDiffs.size() > 0) {
+ if (down)
+ diff= (Diff) fChangeDiffs.get(0);
+ else
+ diff= (Diff) fChangeDiffs.get(fChangeDiffs.size()-1);
+ }
+ } else
+ return true;
+ }
- setCurrentDiff(diff, true);
+ setCurrentDiff(diff, true);
+
+ if (diff != null && diff.fDirection == RangeDifference.ANCESTOR
+ && !getAncestorEnabled())
+ continue;
+
+ break;
+ }
+
return false;
}
@@ -2017,13 +2026,13 @@ public class TextMergeViewer extends ContentMergeViewer {
Position p= diff.getPosition(tp);
if (p != null) {
int startOffset= p.getOffset();
- if (end <= startOffset)
+ if (end < startOffset) // <=
return diff;
if (deep && diff.fDiffs != null) {
Diff d= null;
int endOffset= startOffset + p.getLength();
- if (start == startOffset && end == endOffset) {
- d= findNext(tp, diff.fDiffs, start, start, deep);
+ if (start == startOffset && (end == endOffset || end == endOffset-1)) {
+ d= findNext(tp, diff.fDiffs, start-1, start-1, deep);
} else if (end < endOffset) {
d= findNext(tp, diff.fDiffs, start, end, deep);
}
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java
index ce2b2ec72..5fe9104ac 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java
@@ -74,9 +74,13 @@ public class DocLineComparator implements IRangeComparator {
* @return the contents of the specified line range as a String
*/
public String extract(int start, int length) {
+ if (length == 0)
+ return "";
if (fLength > 0) {
- if (fLineCount == 1)
+ //if (fLineCount == 1)
+ if (length == 1)
return extract(start);
+
int startPos= getTokenStart(start);
int endPos= getTokenStart(start + length);
try {
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java
index 70502c1ee..05f2f4f64 100644
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java
+++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java
@@ -4,8 +4,6 @@
*/
package org.eclipse.compare.internal;
-import java.util.StringTokenizer;
-
import org.eclipse.compare.rangedifferencer.IRangeComparator;
import org.eclipse.compare.contentmergeviewer.ITokenComparator;
@@ -34,24 +32,39 @@ public class TokenComparator implements ITokenComparator {
else
fText= ""; //$NON-NLS-1$
- fStarts= new int[fText.length()];
- fLengths= new int[fText.length()];
+ int length= fText.length();
+ fStarts= new int[length]; // pessimistic assumption!
+ fLengths= new int[length];
fCount= 0;
- StringTokenizer tokenizer= new StringTokenizer(fText, " \t\n\r", true); //$NON-NLS-1$
-
- for (int pos= 0; tokenizer.hasMoreElements();) {
- fStarts[fCount]= pos;
- String s= tokenizer.nextToken();
- int l= 0;
- if (s != null)
- l= s.length();
- pos += l;
- fLengths[fCount]= l;
- fCount++;
+ char lastCategory= 0; // 0: no category
+ for (int i= 0; i < length; i++) {
+ char c= fText.charAt(i);
+
+ char category= '?'; // unspecified category
+ if (Character.isWhitespace(c))
+ category= ' '; // white space category
+ else if (Character.isDigit(c))
+ category= '0'; // digits
+ else if (Character.isLetter(c))
+ category= 'a'; // letters
+
+ if (category != lastCategory) {
+ // start a new token
+ fStarts[fCount++]= i;
+ lastCategory= category;
+ }
+ fLengths[fCount-1]++;
}
+
+// System.out.println("Tokens:");
+// for (int j= 0; j < fCount; j++) {
+// int s= fStarts[j];
+// int e= s+fLengths[j];
+// System.out.println(" <" + fText.substring(s, e) + ">");
+// }
}
-
+
/**
* Creates a <code>TokenComparator</code> for the given string.
*
@@ -91,29 +104,6 @@ public class TokenComparator implements ITokenComparator {
}
/**
- * Returns the content of tokens in the specified range as a String.
- * If the number of token is 0 the empty string ("") is returned.
- *
- * @param start index of first token
- * @param length number of tokens
- * @return the contents of the specified token range as a String
- */
-// public String extract(int start, int length) {
-// int startPos= fStarts[start];
-// int endPos= 0;
-// if (length > 0) {
-// int e= start + length-1;
-// endPos= fStarts[e] + fLengths[e];
-// } else {
-// endPos= fStarts[start];
-// }
-// //int endPos= getTokenStart(start + length);
-// if (endPos >= fText.length())
-// return fText.substring(startPos);
-// return fText.substring(startPos, endPos);
-// }
-
- /**
* Returns <code>true</code> if a token given by the first index
* matches a token specified by the other <code>IRangeComparator</code> and index.
*
@@ -164,7 +154,7 @@ public class TokenComparator implements ITokenComparator {
// public static void main(String args[]) {
// //String in= "private static boolean isWhitespace(char c) {";
// //String in= "for (int j= 0; j < l-1; j++) {";
-// String in= "for do";
+// String in= "for do i= 123; i++";
// TokenComparator tc= new TokenComparator(in, false);
//
// System.out.println("n: " + tc.getRangeCount());

Back to the top