/**
* Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.shared_interactive_console.console.ui.internal.actions;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.python.pydev.shared_core.log.Log;
import org.python.pydev.shared_core.string.TextSelectionUtils;
import org.python.pydev.shared_interactive_console.console.ui.IScriptConsoleViewer;
import org.python.pydev.shared_interactive_console.console.ui.ScriptConsolePartitioner;
import org.python.pydev.shared_interactive_console.console.ui.ScriptStyleRange;
/**
* Handles the action of going to the start of the line (Home)
*
* @author Fabio
*/
public class HandleLineStartAction {
/**
* When going to the line start, we must actually go to: 1st char / prompt end / line start (depending
* on where we are currently)
*
* @return true if it was done and false otherwise.
*/
public boolean execute(IDocument doc, int caretOffset, int commandLineOffset, IScriptConsoleViewer viewer) {
try {
TextSelectionUtils ps = new TextSelectionUtils(doc, caretOffset);
int lineOffset = ps.getLineOffset();
int promptEndOffset = lineOffset;
ScriptConsolePartitioner partitioner = (ScriptConsolePartitioner) doc.getDocumentPartitioner();
int docLen = doc.getLength();
for (; promptEndOffset < docLen; promptEndOffset++) {
ScriptStyleRange[] range = partitioner.getStyleRanges(promptEndOffset, 1);
if (range.length >= 1) {
if (range[0].scriptType != ScriptStyleRange.PROMPT) {
break;
}
}
}
int absoluteCursorOffset = ps.getAbsoluteCursorOffset();
IRegion lineInformation = doc.getLineInformationOfOffset(absoluteCursorOffset);
String contentsFromPrompt = doc.get(promptEndOffset,
lineInformation.getOffset() + lineInformation.getLength() - promptEndOffset);
int firstCharPosition = TextSelectionUtils.getFirstCharPosition(contentsFromPrompt);
int firstCharOffset = promptEndOffset + firstCharPosition;
//1st see: if we're in the start of the line, go to the 1st char after the prompt
if (lineOffset == absoluteCursorOffset || firstCharOffset < absoluteCursorOffset) {
viewer.setCaretOffset(firstCharOffset, false);
return true;
}
if (promptEndOffset < absoluteCursorOffset) {
viewer.setCaretOffset(promptEndOffset, false);
return true;
}
viewer.setCaretOffset(lineOffset, false);
return true;
} catch (BadLocationException e) {
Log.log(e);
}
return false;
}
}