]> source.dussan.org Git - vaadin-framework.git/commitdiff
Make VFilterSelect work with border-box & MeasureManager (#8313)
authorLeif Åstrand <leif@vaadin.com>
Thu, 16 Feb 2012 10:14:30 +0000 (12:14 +0200)
committerLeif Åstrand <leif@vaadin.com>
Thu, 16 Feb 2012 10:14:30 +0000 (12:14 +0200)
WebContent/VAADIN/themes/base/select/select.css
WebContent/VAADIN/themes/reindeer/select/select.css
src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java
src/com/vaadin/terminal/gwt/client/ui/VFilterSelectPaintable.java

index 4487bc6a4e19d9371a7121cc58c5f5d5d9316e37..612ffbf69cdc54083389ee54d10227cf983e69a6 100644 (file)
@@ -56,6 +56,7 @@
 .v-filterselect {
        white-space: nowrap;
        text-align: left;
+       display: inline-block;
 }
 .v-filterselect .v-icon {
        float: left;
@@ -65,6 +66,8 @@
 .v-popupview-popup .v-filterselect-input {
        float: left;
        -webkit-border-radius: 0px;
+       box-sizing: border-box;
+       -moz-box-sizing: border-box;
 }
 .v-filterselect-prompt .v-filterselect-input {
        color: #999;
index a685e3322a265ea699945e761571e18ee4cb4f58..c71de8fbc0fe9007b143241f68a26bea1d795a77 100644 (file)
@@ -10,7 +10,7 @@
        background: transparent repeat-x;
        background-image: url(img/center.png); /** sprite-ref: verticals; sprite-alignment: repeat; sprite-margin-bottom: 1px */
        border: none;
-       height: 16px;
+       height: 24px;
 }
 /* More specific selector to override padding */
 .v-app input.v-filterselect-input,
index 5e061175c00ce6e69c658015853864c7d5d09647..ec5f90e812d85d84de0ef8b2e277c29995de4bbe 100644 (file)
@@ -46,9 +46,12 @@ import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
 import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Focusable;
+import com.vaadin.terminal.gwt.client.MeasuredSize;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VConsole;
+import com.vaadin.terminal.gwt.client.VPaintableMap;
+import com.vaadin.terminal.gwt.client.VPaintableWidget;
 import com.vaadin.terminal.gwt.client.VTooltip;
 
 /**
@@ -914,9 +917,6 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
     // This handles the special case where are not filtering yet and the
     // selected value has changed on the server-side. See #2119
     protected boolean popupOpenerClicked;
-    private String width = null;
-    private int textboxPadding = -1;
-    private int componentPadding = -1;
     protected int suggestionPopupMinWidth = 0;
     private int popupWidth = -1;
     /*
@@ -925,7 +925,6 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
      */
     protected String lastNewItemString;
     protected boolean focused = false;
-    private int horizPaddingAndBorder = 2;
 
     /**
      * If set to false, the component should not allow entering text to the
@@ -1071,22 +1070,6 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
         tb.setText(text);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.google.gwt.user.client.ui.Composite#onAttach()
-     */
-    @Override
-    protected void onAttach() {
-        super.onAttach();
-
-        /*
-         * We need to recalculate the root width when the select is attached, so
-         * #2974 won't happen.
-         */
-        updateRootWidth();
-    }
-
     /**
      * Turns prompting on. When prompting is turned on a command prompt is shown
      * in the text box if nothing has been entered.
@@ -1573,44 +1556,14 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
         tb.setFocus(true);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.google.gwt.user.client.ui.UIObject#setWidth(java.lang.String)
-     */
-    @Override
-    public void setWidth(String width) {
-        if (width == null || width.equals("")) {
-            this.width = null;
-        } else {
-            this.width = width;
-        }
-
-        horizPaddingAndBorder = Util.setWidthExcludingPaddingAndBorder(this,
-                width, horizPaddingAndBorder);
-
-        if (initDone) {
-            updateRootWidth();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.google.gwt.user.client.ui.UIObject#setHeight(java.lang.String)
-     */
-    @Override
-    public void setHeight(String height) {
-        super.setHeight(height);
-        Util.setHeightExcludingPaddingAndBorder(tb, height, 3);
-    }
-
     /**
      * Calculates the width of the select if the select has undefined width.
      * Should be called when the width changes or when the icon changes.
      */
     protected void updateRootWidth() {
-        if (width == null) {
+        VPaintableWidget paintable = VPaintableMap.get(client).getPaintable(
+                this);
+        if (paintable.isUndefinedWidth()) {
             /*
              * When the width is not specified we must specify width for root
              * div so the popupopener won't wrap to the next line and also so
@@ -1618,15 +1571,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
              */
             int tbWidth = Util.getRequiredWidth(tb);
 
-            /*
-             * Note: iconWidth is here calculated as a negative pixel value so
-             * you should consider this in further calculations.
-             */
-            int iconWidth = selectedItemIcon.isAttached() ? Util
-                    .measureMarginLeft(tb.getElement())
-                    - Util.measureMarginLeft(selectedItemIcon.getElement()) : 0;
-
-            int w = tbWidth + getPopUpOpenerWidth() + iconWidth;
+            int w = tbWidth + getNonTextboxSpace();
 
             /*
              * When the select has a undefined with we need to check that we are
@@ -1638,26 +1583,14 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
             if ((!initDone || currentPage + 1 < 0)
                     && suggestionPopupMinWidth > w) {
                 setTextboxWidth(suggestionPopupMinWidth);
-                w = suggestionPopupMinWidth;
-            } else {
-                /*
-                 * Firefox3 has its own way of doing rendering so we need to
-                 * specify the width for the TextField to make sure it actually
-                 * is rendered as wide as FF3 says it is
-                 */
-                tb.setWidth((tbWidth - getTextboxPadding()) + "px");
             }
-            super.setWidth((w) + "px");
-            // Freeze the initial width, so that it won't change even if the
-            // icon size changes
-            width = w + "px";
 
         } else {
             /*
              * When the width is specified we also want to explicitly specify
-             * widths for textbox and popupopener
+             * width for textbox
              */
-            setTextboxWidth(getMainWidth() - getComponentPadding());
+            setTextboxWidth(getMainWidth());
 
         }
     }
@@ -1690,47 +1623,23 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
      * Sets the text box width in pixels.
      * 
      * @param componentWidth
-     *            The width of the text box in pixels
+     *            The width of the combo box in pixels
      */
     private void setTextboxWidth(int componentWidth) {
-        int padding = getTextboxPadding();
-        int iconWidth = selectedItemIcon.isAttached() ? Util
-                .getRequiredWidth(selectedItemIcon) : 0;
-
-        int textboxWidth = componentWidth - padding - getPopUpOpenerWidth()
-                - iconWidth;
+        int extraSpace = getNonTextboxSpace();
+        int textboxWidth = componentWidth - extraSpace;
         if (textboxWidth < 0) {
             textboxWidth = 0;
         }
         tb.setWidth(textboxWidth + "px");
     }
 
-    /**
-     * Gets the horizontal padding of the text box in pixels. The measurement
-     * includes the border width.
-     * 
-     * @return The padding in pixels
-     */
-    private int getTextboxPadding() {
-        if (textboxPadding < 0) {
-            textboxPadding = Util.measureHorizontalPaddingAndBorder(
-                    tb.getElement(), 4);
-        }
-        return textboxPadding;
-    }
-
-    /**
-     * Gets the horizontal padding of the select. The measurement includes the
-     * border width.
-     * 
-     * @return The padding in pixels
-     */
-    private int getComponentPadding() {
-        if (componentPadding < 0) {
-            componentPadding = Util.measureHorizontalPaddingAndBorder(
-                    getElement(), 3);
-        }
-        return componentPadding;
+    private int getNonTextboxSpace() {
+        MeasuredSize measuredSize = VPaintableMap.get(client)
+                .getPaintable(this).getMeasuredSize();
+        int extraSpace = getPopUpOpenerWidth() + measuredSize.getPaddingWidth()
+                + measuredSize.getBorderWidth();
+        return extraSpace;
     }
 
     /**
index eaf9eec16a2c12644cc665bd2a4fffa1579088e7..374b43914e1d47eb8747d1b72891a7a843474abe 100644 (file)
@@ -12,7 +12,8 @@ import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.VFilterSelect.FilterSelectSuggestion;
 
-public class VFilterSelectPaintable extends VAbstractPaintableWidget {
+public class VFilterSelectPaintable extends VAbstractPaintableWidget implements
+        ResizeRequired {
 
     /*
      * (non-Javadoc)
@@ -244,4 +245,11 @@ public class VFilterSelectPaintable extends VAbstractPaintableWidget {
     public VFilterSelect getWidgetForPaintable() {
         return (VFilterSelect) super.getWidgetForPaintable();
     }
+
+    public void onResize() {
+        VFilterSelect widget = getWidgetForPaintable();
+        if (widget.initDone) {
+            widget.updateRootWidth();
+        }
+    }
 }