You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by rw...@apache.org on 2013/03/26 17:39:58 UTC

svn commit: r1461214 - in /pivot/trunk: ./ wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java

Author: rwhitcomb
Date: Tue Mar 26 16:39:58 2013
New Revision: 1461214

URL: http://svn.apache.org/r1461214
Log:
PIVOT-891 (more): Fix the up/down selection logic in TextArea to do the "right" thing
by remembering the "anchor" point where the selection started and reducing / enlarging
the area depending on whether you are on one side of the anchor or the other.  A
previous change fixed the left/right logic.  Further changes will make these same
changes to TextPane.

Probably need to check selection logic in lists and text input fields as well.

This is a merge of revision 1460982 from branches/2.0.x to trunk.


Modified:
    pivot/trunk/   (props changed)
    pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java

Propchange: pivot/trunk/
------------------------------------------------------------------------------
  Merged /pivot/branches/2.0.x:r1460982

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java?rev=1461214&r1=1461213&r2=1461214&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java Tue Mar 26 16:39:58 2013
@@ -364,7 +364,6 @@ public class TextAreaSkin extends Compon
     @Override
     public int getNextInsertionPoint(int x, int from, TextArea.ScrollDirection direction) {
         int index = -1;
-
         if (paragraphViews.getLength() > 0) {
             if (from == -1) {
                 int i = (direction == TextArea.ScrollDirection.DOWN) ? 0 : paragraphViews.getLength() - 1;
@@ -1021,7 +1020,7 @@ public class TextAreaSkin extends Compon
                     textArea.setSelection(textArea.getRowOffset(index), textArea.getRowLength(index));
                 }
             }
-       }
+        }
         return consumed;
     }
 
@@ -1330,17 +1329,48 @@ public class TextAreaSkin extends Compon
                 int selectionStart = textArea.getSelectionStart();
                 int selectionLength = textArea.getSelectionLength();
 
-                int index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
-
-                if (index != -1) {
-                    if (shiftPressed) {
-                        selectionLength = selectionStart + selectionLength - index;
+                int index = -1;
+                if (shiftPressed) {
+                    if (anchor == -1) {
+                        anchor = selectionStart;
+                        index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
+                        if (index != -1) {
+                            selectionLength = selectionStart - index;
+                        }
                     } else {
+                        if (selectionStart < anchor) {
+                            // continue upwards
+                            index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
+                            if (index != -1) {
+                                selectionLength = selectionStart + selectionLength - index;
+                            }
+                        } else {
+                            // reduce downward size
+                            Bounds trailingSelectionBounds = getCharacterBounds(selectionStart + selectionLength - 1);
+                            int x = trailingSelectionBounds.x + trailingSelectionBounds.width;
+                            index = getNextInsertionPoint(x, selectionStart + selectionLength - 1, TextArea.ScrollDirection.UP);
+                            if (index != -1) {
+                                if (index < anchor) {
+                                    selectionLength = anchor - index;
+                                } else {
+                                    selectionLength = index - selectionStart;
+                                    index = selectionStart;
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
+                    if (index != -1) {
                         selectionLength = 0;
                     }
+                    anchor = -1;
+                }
 
+                if (index != -1) {
                     textArea.setSelection(index, selectionLength);
                     scrollCharacterToVisible(index);
+                    caretX = caret.x;
                 }
 
                 consumed = true;
@@ -1351,31 +1381,58 @@ public class TextAreaSkin extends Compon
                 if (shiftPressed) {
                     int from;
                     int x;
-                    if (selectionLength == 0) {
-                        // Get next insertion point from leading selection character
-                        from = selectionStart;
-                        x = caretX;
-                    } else {
-                        // Get next insertion point from right edge of trailing selection
-                        // character
-                        from = selectionStart + selectionLength;
+                    int index;
 
-                        Bounds trailingSelectionBounds = getCharacterBounds(from);
-                        x = trailingSelectionBounds.x + trailingSelectionBounds.width;
-                    }
+                    if (anchor == -1) {
+                        anchor = selectionStart;
+                        index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.DOWN);
+                        if (index != -1) {
+                            selectionLength = index - selectionStart;
+                        }
+                    } else {
+                        if (selectionStart < anchor) {
+                            // Reducing upward size
+                            // Get next insertion point from leading selection character
+                            from = selectionStart;
+                            x = caretX;
+
+                            index = getNextInsertionPoint(x, from, TextArea.ScrollDirection.DOWN);
+
+                            if (index != -1) {
+                                if (index < anchor) {
+                                    selectionStart = index;
+                                    selectionLength = anchor - index;
+                                } else {
+                                    selectionStart = anchor;
+                                    selectionLength = index - anchor;
+                                }
 
-                    int index = getNextInsertionPoint(x, from, TextArea.ScrollDirection.DOWN);
+                                textArea.setSelection(selectionStart, selectionLength);
+                                scrollCharacterToVisible(selectionStart);
+                            }
+                        } else {
+                            // Increasing downward size
+                            // Get next insertion point from right edge of trailing selection
+                            // character
+                            from = selectionStart + selectionLength - 1;
+
+                            Bounds trailingSelectionBounds = getCharacterBounds(from);
+                            x = trailingSelectionBounds.x + trailingSelectionBounds.width;
+
+                            index = getNextInsertionPoint(x, from, TextArea.ScrollDirection.DOWN);
+
+                            if (index != -1) {
+                                // If the next character is a paragraph terminator and is
+                                // not the final terminator character, increment the selection
+                                if (index < textArea.getCharacterCount() - 1
+                                    && textArea.getCharacterAt(index) == '\n') {
+                                    index++;
+                                }
 
-                    if (index != -1) {
-                        // If the next character is a paragraph terminator and is
-                        // not the final terminator character, increment the selection
-                        if (index < textArea.getCharacterCount() - 1
-                            && textArea.getCharacterAt(index) == '\n') {
-                            index++;
+                                textArea.setSelection(selectionStart, index - selectionStart);
+                                scrollCharacterToVisible(index);
+                            }
                         }
-
-                        textArea.setSelection(selectionStart, index - selectionStart);
-                        scrollCharacterToVisible(index);
                     }
                 } else {
                     int from;
@@ -1392,7 +1449,9 @@ public class TextAreaSkin extends Compon
                     if (index != -1) {
                         textArea.setSelection(index, 0);
                         scrollCharacterToVisible(index);
+                        caretX = caret.x;
                     }
+                    anchor = -1;
                 }
 
                 consumed = true;