/***** BEGIN LICENSE BLOCK *****
* Version: CPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Common Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/cpl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2006 Lukas Felber <lfelber@hsr.ch>
* Copyright (C) 2007 Lukas Felber <lfelber@hsr.ch>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the CPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the CPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.rubypeople.rdt.refactoring.editprovider;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.text.edits.DeleteEdit;
import org.eclipse.text.edits.TextEdit;
import org.jruby.ast.Node;
import org.rubypeople.rdt.refactoring.util.Constants;
import org.rubypeople.rdt.refactoring.util.FileHelper;
import org.rubypeople.rdt.refactoring.util.NodeUtil;
public class DeleteEditProvider extends EditProvider {
public final static int DELETE_LINEBREAK_AFTER = 0;
public final static int DELETE_LINEBREAK_BEFORE = 1;
public final static int DEFAULT_DELETE_TYPE = DELETE_LINEBREAK_BEFORE;
private Node fromNode;
private Node toNode;
private int type;
public DeleteEditProvider(Node fromNode, Node toNode) {
super(true, false);
this.fromNode = fromNode;
this.toNode = toNode;
this.type = DEFAULT_DELETE_TYPE;
}
public DeleteEditProvider(Node node) {
this(node, node);
}
public TextEdit getEdit(String document) {
int startOffset = getStartOffset(document);
int endOffset = getEndOffset(document);
int length = endOffset - startOffset;
return new DeleteEdit(startOffset, length);
}
private int getStartOffset(String document) {
int startLine = NodeUtil.subPositionUnion(fromNode).getStartLine() - 1;
int pos = -1;
String lineDelimiter = FileHelper.getLineDelimiter(document);
for (int i = 0; i < startLine; i++) {
pos = document.indexOf(lineDelimiter, pos + 1);
}
if (pos < 0) {
pos = 0;
}
String leadingStr = document.substring(pos, NodeUtil.subPositionUnion(fromNode).getStartOffset());
if (leadingStr.trim().equals("")) { //$NON-NLS-1$
return pos;
}
return NodeUtil.subPositionUnion(fromNode).getStartOffset();
}
private int getEndOffset(String document) {
int offset = NodeUtil.subPositionUnion(toNode).getEndOffset();
int aktPos = offset;
Matcher matcher = Pattern.compile("\\r\\n|[\\s;]").matcher(document); //$NON-NLS-1$
String lineDelimiter = FileHelper.getLineDelimiter(document);
while (matcher.find(aktPos)) {
if (matcher.start() == aktPos) {
aktPos += matcher.group().length();
} else {
offset = aktPos;
break;
}
if (foundTerminator(matcher.group()))
break;
}
if (type != DELETE_LINEBREAK_AFTER) {
if (matcher.find(offset) && matcher.group().equals(lineDelimiter)) {
aktPos -= lineDelimiter.length();
}
}
return aktPos;
}
private boolean foundTerminator(String terminator) {
return (terminator.equals(Character.toString(Constants.NL)) || terminator.equals(";")); //$NON-NLS-1$
}
@Override
protected Node getEditNode(int offset, String document) {
return null;
}
@Override
protected int getOffset(String document) {
return Integer.MAX_VALUE;
}
public void setDeleteType(int deleteType) {
type = deleteType;
}
}