ITextEditor editor = null;
/**
- *
+ *
*/
public RTrimAction() {
super();
* this gets called for every action
*/
public void run(IAction action) {
- IDocument doc = editor.getDocumentProvider().getDocument(editor.getEditorInput());
- ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection();
+ IDocument doc = editor.getDocumentProvider().getDocument(
+ editor.getEditorInput());
+ ITextSelection sel = (ITextSelection) editor.getSelectionProvider()
+ .getSelection();
int currentLine = 0;
int originalCursorOffset = sel.getOffset();
int originalSelectionLength = sel.getLength();
int selectionLength = originalSelectionLength;
String oldText;
- int lineEnd;
-
+ int lineEnd;
+
try {
while (currentLine < doc.getNumberOfLines()) {
int offset = doc.getLineOffset(currentLine);
int length = doc.getLineLength(currentLine);
oldText = doc.get(offset, length);
-
- //-- Starts at the end of the line, looking for the first non-first 'white space'
- //-- it then breaks out. No point in carrying on, as we have found our true line end
- for (lineEnd=oldText.length(); lineEnd > 0; --lineEnd ){
- if ( oldText.charAt(lineEnd-1) != '\t' && oldText.charAt(lineEnd-1) != ' ' ){
+ String lineDelimiter = doc.getLineDelimiter(currentLine);
+ if (lineDelimiter == null) lineDelimiter = "";
+
+ // -- Starts at the end of the line, looking for the first
+ // non-first 'white space'
+ // -- it then breaks out. No point in carrying on, as we have
+ // found our true line end
+ for (lineEnd = oldText.length() - lineDelimiter.length(); lineEnd > 0; --lineEnd) {
+ if (oldText.charAt(lineEnd - 1) != '\t'
+ && oldText.charAt(lineEnd - 1) != ' ') {
break;
}
}
-
- //-- Only replace the line if the lengths are different
- if ( lineEnd != oldText.length() ) {
- String newText = oldText.substring(0, lineEnd);
+
+ // -- Only replace the line if the lengths are different
+ if (lineEnd != oldText.length() - lineDelimiter.length()) {
+ String newText = oldText.substring(0, lineEnd) + lineDelimiter;
doc.replace(offset, length, newText);
- if (offset + length <= cursorOffset) {
- if (oldText.length() != newText.length()) {
- cursorOffset -= oldText.length() - newText.length();
+// if (offset + length <= cursorOffset) {
+// if (oldText.length() != newText.length()) {
+// cursorOffset -= oldText.length() - newText.length();
+// }
+// } else if (offset <= cursorOffset + selectionLength
+// && selectionLength > 0) {
+// selectionLength -= oldText.length() - newText.length();
+// } else if (offset + length == cursorOffset + 2) {
+// // Check if the cursor is at the end of the line.
+// cursorOffset -= 2;
+// }
+
+ int oldEndOffset = offset + length - lineDelimiter.length();
+ int newEndOffset = offset + lineEnd;
+
+ if (cursorOffset >= oldEndOffset) {
+ cursorOffset -= oldText.length() - newText.length();
+ } else if (cursorOffset >= newEndOffset) {
+ cursorOffset = newEndOffset;
+ }
+ if (selectionLength > 0) {
+ int selectionEndOffset = cursorOffset + selectionLength;
+ if (selectionEndOffset >= oldEndOffset) {
+ if (cursorOffset <= newEndOffset) {
+ // full overlap
+ selectionLength -= oldText.length() - newText.length();
+ } else {
+ // starts inside
+ selectionLength -= oldEndOffset - cursorOffset;
+ }
+ } else if (selectionEndOffset >= newEndOffset) {
+ if (cursorOffset <= newEndOffset) {
+ // ends inside
+ selectionLength -= selectionEndOffset - newEndOffset;
+ } else {
+ // full inside
+ selectionLength = 0;
+ }
}
- } else if (offset <= cursorOffset + selectionLength && selectionLength > 0) {
- selectionLength -= oldText.length() - newText.length();
- } else if (offset + length == cursorOffset + 2) { // Check if the cursor is at the end of the line.
- cursorOffset -= 2;
}
}
currentLine++;
}
- TextSelection selection = new TextSelection(doc, cursorOffset, selectionLength);
+ TextSelection selection = new TextSelection(doc, cursorOffset,
+ selectionLength);
editor.getSelectionProvider().setSelection(selection);
} catch (Exception blx) {
blx.printStackTrace();