]> source.dussan.org Git - vaadin-framework.git/commitdiff
Correctly display an item which is too long for the textfield. (#13477)
authorGuillermo Alvarez <guillermo@vaadin.com>
Mon, 11 Aug 2014 07:56:58 +0000 (10:56 +0300)
committerBogdan Udrescu <bogdan@vaadin.com>
Wed, 13 Aug 2014 07:39:04 +0000 (10:39 +0300)
New JSNI function allows direction parameter in setSelectionRange.
This allows setting selection backward and fixes the issue in FF.

Change-Id: I1e34b70983e3f525b7009668877038f108d286a7

client/src/com/vaadin/client/Util.java
client/src/com/vaadin/client/ui/VFilterSelect.java

index 49c862006b2e61b372e3a326da1916b29bf44b7f..e37b0448268b29a61727946a1f4a12c9a7f572f2 100644 (file)
@@ -1419,6 +1419,37 @@ public class Util {
         }
     }
 
+    /**
+     * Sets the selection range of an input element.
+     * 
+     * We need this JSNI function to set selection range so that we can use the
+     * optional direction attribute to set the anchor to the end and the focus
+     * to the start. This makes Firefox work the same way as other browsers
+     * (#13477)
+     * 
+     * @param elem
+     *            the html input element.
+     * @param pos
+     *            the index of the first selected character.
+     * @param length
+     *            the selection length.
+     * @param direction
+     *            a string indicating the direction in which the selection was
+     *            performed. This may be "forward" or "backward", or "none" if
+     *            the direction is unknown or irrelevant.
+     * 
+     * @since
+     */
+    public native static void setSelectionRange(Element elem, int pos,
+            int length, String direction)
+    /*-{
+       try {
+           elem.setSelectionRange(pos, pos + length, direction);
+       } catch (e) {
+          // Firefox throws exception if TextBox is not visible, even if attached
+       }
+    }-*/;
+
     /**
      * Wrap a css size value and its unit and translate back and forth to the
      * string representation.<br/>
@@ -1571,7 +1602,8 @@ public class Util {
          * @return true if the two sizes are equals, otherwise false.
          */
         public static boolean equals(String cssSize1, String cssSize2) {
-            return CssSize.fromString(cssSize1).equals(CssSize.fromString(cssSize2));
+            return CssSize.fromString(cssSize1).equals(
+                    CssSize.fromString(cssSize2));
         }
 
     }
index 6ba0785acccb7c7dacd6e567ef8bf9937db9c266..516fe5e9b32787465c4a6a1d4011fc581450d68e 100644 (file)
@@ -1057,11 +1057,33 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
         @Override
         public void setSelectionRange(int pos, int length) {
             if (textInputEnabled) {
-                super.setSelectionRange(pos, length);
+                /*
+                 * set selection range with a backwards direction: anchor at the
+                 * back, focus at the front. This means that items that are too
+                 * long to display will display from the start and not the end
+                 * even on Firefox.
+                 * 
+                 * We need the JSNI function to set selection range so that we
+                 * can use the optional direction attribute to set the anchor to
+                 * the end and the focus to the start. This makes Firefox work
+                 * the same way as other browsers (#13477)
+                 */
+                Util.setSelectionRange(getElement(), pos, length, "backward");
+
             } else {
-                super.setSelectionRange(0, getValue().length());
+                /*
+                 * Setting the selectionrange for an uneditable textbox leads to
+                 * unwanted behaviour when the width of the textbox is narrower
+                 * than the width of the entry: the end of the entry is shown
+                 * instead of the beginning. (see #13477)
+                 * 
+                 * To avoid this, we set the caret to the beginning of the line.
+                 */
+
+                super.setSelectionRange(0, 0);
             }
         }
+
     }
 
     @Deprecated
@@ -1456,9 +1478,8 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
 
     private void setText(final String text) {
         /**
-         * To leave caret in the beginning of the line.
-         * SetSelectionRange wouldn't work on IE
-         * (see #13477)
+         * To leave caret in the beginning of the line. SetSelectionRange
+         * wouldn't work on IE (see #13477)
          */
         Direction previousDirection = tb.getDirection();
         tb.setDirection(Direction.RTL);