Addition of previous bugfix. Adjusting cursor positioning.
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / actions / RTrimAction.java
index d4a1718..a014e9e 100644 (file)
@@ -77,12 +77,14 @@ public class RTrimAction implements IEditorActionDelegate {
                                int offset = doc.getLineOffset(currentLine);
                                int length = doc.getLineLength(currentLine);
                                oldText = doc.get(offset, length);
+                               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(); lineEnd > 0; --lineEnd) {
+                               for (lineEnd = oldText.length() - lineDelimiter.length(); lineEnd > 0; --lineEnd) {
                                        if (oldText.charAt(lineEnd - 1) != '\t'
                                                        && oldText.charAt(lineEnd - 1) != ' ') {
                                                break;
@@ -90,28 +92,49 @@ public class RTrimAction implements IEditorActionDelegate {
                                }
 
                                // -- Only replace the line if the lengths are different
-                               if (lineEnd != oldText.length()) {
-                                       String newText = oldText.substring(0, lineEnd);
+                               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++;