/******************************************************************************
* Copyright (C) 2013 Fabio Zadrozny
*
* 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation
******************************************************************************/
package org.python.pydev.shared_core.auto_edit;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DocumentCommand;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.python.pydev.shared_core.string.FastStringBuffer;
import org.python.pydev.shared_core.string.TextSelectionUtils;
public class AutoEditStrategyNewLineHelper {
public static boolean isNewLineText(IDocument document, int length, String text) {
return length == 0 && text != null && TextSelectionUtils.endsWithNewline(document, text) && text.length() < 3; //could be \r\n
}
protected int findEndOfWhiteSpace(IDocument document, int offset, int end) throws BadLocationException {
while (offset < end) {
char c = document.getChar(offset);
if (c != ' ' && c != '\t') {
return offset;
}
offset++;
}
return end;
}
public void handleNewLine(TextSelectionUtils ts, String contentType, DocumentCommand command,
String regularIndent) {
IDocument document = ts.getDoc();
if (command.offset == -1 || document.getLength() == 0) {
return;
}
String prevLineIndent = getPreviousLineIndent(command, document);
boolean insideBrackets = false;
try {
String found = document.get(command.offset - 1, 2);
if (found.equals("{}") || found.equals("><")) {
insideBrackets = true;
}
} catch (BadLocationException e) {
//ignore
}
if (insideBrackets) {
command.shiftsCaret = false;
command.caretOffset = command.offset + command.text.length() + prevLineIndent.length()
+ regularIndent.length();
command.text = new FastStringBuffer(command.text, prevLineIndent.length() + 10).append(prevLineIndent)
.append(regularIndent).append(command.text).append(prevLineIndent).toString();
} else {
command.text = new FastStringBuffer(command.text, prevLineIndent.length()).append(prevLineIndent)
.toString();
}
}
public String getPreviousLineIndent(DocumentCommand command, IDocument document) {
String prevLineIndent = "";
try {
// find start of line
int p = (command.offset == document.getLength() ? command.offset - 1 : command.offset);
IRegion info = document.getLineInformationOfOffset(p);
int start = info.getOffset();
// find white spaces
int end = findEndOfWhiteSpace(document, start, command.offset);
if (end > start) {
prevLineIndent = document.get(start, end - start);
}
} catch (BadLocationException e) {
//ignore
}
return prevLineIndent;
}
}