/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.texteditors;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
public class TextMerge {
public static boolean replace(IDocument document, String text) {
if(document == null) return false;
String oldtext = document.get();
if(oldtext == null || oldtext.length() == 0) return false;
int b = getFirstDifference(oldtext, text);
if(b < 0) return true;
int e = getLastDifference(oldtext, text);
if(e < 0) return false;
++e;
if(e < b) {
e = b;
}
int e2 = text.length() - oldtext.length() + e;
if(e2 < b) {
e = e + b - e2;
e2 = b;
}
if(e == b) while(true) {
if(b > 0 && oldtext.charAt(b - 1) == text.charAt(e2 - 1) && oldtext.charAt(b - 1) != '\n') {
--e;
--b;
--e2;
} else break;
} else if(b == e2) while(true) {
if(b > 0 && text.charAt(b - 1) == oldtext.charAt(e - 1) && text.charAt(b - 1) != '\n') {
--e;
--b;
--e2;
} else break;
}
try {
document.replace(b, e - b, text.substring(b, e2));
} catch (BadLocationException exc) {
return false;
}
return true;
}
static int getFirstDifference(String s1, String s2) {
for (int i = 0; i < s1.length() && i < s2.length(); i++) {
if(s1.charAt(i) != s2.charAt(i)) return i;
}
return (s1.length() < s2.length()) ? s1.length() :
(s2.length() < s1.length()) ? s2.length() : -1;
}
static int getLastDifference(String s1, String s2) {
for (int i1 = s1.length() - 1, i2 = s2.length() - 1; i1 >= 0 && i2 >= 0; i1--, i2--) {
if(s1.charAt(i1) != s2.charAt(i2)) return i1;
}
return -1;
}
}