diff options
6 files changed, 296 insertions, 13 deletions
diff --git a/client/src/com/vaadin/client/ui/VSlider.java b/client/src/com/vaadin/client/ui/VSlider.java index 3fdd8f0313..3951550dd2 100644 --- a/client/src/com/vaadin/client/ui/VSlider.java +++ b/client/src/com/vaadin/client/ui/VSlider.java @@ -195,6 +195,10 @@ public class VSlider extends SimpleFocusablePanel implements Field, // clear unnecessary opposite style attribute base.getStyle().clearProperty(oppositeStyleAttribute); + if (!getElement().hasParentElement()) { + return; + } + final Element p = getElement().getParentElement().cast(); if (p.getPropertyInt(domProperty) > 50) { if (isVertical()) { diff --git a/client/src/com/vaadin/client/ui/slider/SliderConnector.java b/client/src/com/vaadin/client/ui/slider/SliderConnector.java index e155336d75..2b78921f93 100644 --- a/client/src/com/vaadin/client/ui/slider/SliderConnector.java +++ b/client/src/com/vaadin/client/ui/slider/SliderConnector.java @@ -71,6 +71,7 @@ public class SliderConnector extends AbstractFieldConnector implements getWidget().setFeedbackValue(getState().value); getWidget().buildBase(); + getWidget().setTabIndex(getState().tabIndex); } } diff --git a/server/src/com/vaadin/data/util/filter/Compare.java b/server/src/com/vaadin/data/util/filter/Compare.java index 7730bace6b..a13a5bfaa7 100644 --- a/server/src/com/vaadin/data/util/filter/Compare.java +++ b/server/src/com/vaadin/data/util/filter/Compare.java @@ -47,7 +47,8 @@ public abstract class Compare implements Filter { * A {@link Compare} filter that accepts items for which the identified * property value is equal to <code>value</code>. * - * For in-memory filters, equals() is used for the comparison. For other + * For in-memory filters, {@link Comparable#compareTo(Object)} or, if not + * Comparable, {@link #equals(Object)} is used for the comparison. For other * containers, the comparison implementation is container dependent and may * use e.g. database comparison operations. * @@ -248,8 +249,7 @@ public abstract class Compare implements Filter { Object value = p.getValue(); switch (getOperation()) { case EQUAL: - return (null == this.value) ? (null == value) : this.value - .equals(value); + return compareEquals(value); case GREATER: return compareValue(value) > 0; case LESS: @@ -263,6 +263,29 @@ public abstract class Compare implements Filter { return false; } + /** + * Checks if the this value equals the given value. Favors Comparable over + * equals to better support e.g. BigDecimal where equals is stricter than + * compareTo. + * + * @param otherValue + * The value to compare to + * @return true if the values are equal, false otherwise + */ + private boolean compareEquals(Object otherValue) { + if (value == null || otherValue == null) { + return (otherValue == value); + } else if (value == otherValue) { + return true; + } else if (value instanceof Comparable + && otherValue.getClass() + .isAssignableFrom(getValue().getClass())) { + return ((Comparable) value).compareTo(otherValue) == 0; + } else { + return value.equals(otherValue); + } + } + @SuppressWarnings({ "unchecked", "rawtypes" }) protected int compareValue(Object value1) { if (null == value) { diff --git a/server/tests/src/com/vaadin/data/util/filter/CompareFilterTest.java b/server/tests/src/com/vaadin/data/util/filter/CompareFilterTest.java index 99e8429a51..b7ccd68429 100644 --- a/server/tests/src/com/vaadin/data/util/filter/CompareFilterTest.java +++ b/server/tests/src/com/vaadin/data/util/filter/CompareFilterTest.java @@ -1,5 +1,6 @@ package com.vaadin.data.util.filter; +import java.math.BigDecimal; import java.util.Date; import junit.framework.Assert; @@ -153,6 +154,59 @@ public class CompareFilterTest extends AbstractFilterTest<Compare> { Assert.assertFalse(isNonPositive.passesFilter(null, itemPositive)); } + public void testCompareBigDecimal() { + BigDecimal negative = new BigDecimal(-1); + BigDecimal zero = new BigDecimal(0); + BigDecimal positive = new BigDecimal(1); + positive.setScale(1); + BigDecimal positiveScaleTwo = new BigDecimal(1).setScale(2); + + Item itemNegative = new PropertysetItem(); + itemNegative.addItemProperty(PROPERTY1, new ObjectProperty<BigDecimal>( + negative, BigDecimal.class)); + Item itemZero = new PropertysetItem(); + itemZero.addItemProperty(PROPERTY1, new ObjectProperty<BigDecimal>( + zero, BigDecimal.class)); + Item itemPositive = new PropertysetItem(); + itemPositive.addItemProperty(PROPERTY1, new ObjectProperty<BigDecimal>( + positive, BigDecimal.class)); + Item itemPositiveScaleTwo = new PropertysetItem(); + itemPositiveScaleTwo.addItemProperty(PROPERTY1, + new ObjectProperty<BigDecimal>(positiveScaleTwo, + BigDecimal.class)); + + Filter equalZero = new Equal(PROPERTY1, zero); + Assert.assertFalse(equalZero.passesFilter(null, itemNegative)); + Assert.assertTrue(equalZero.passesFilter(null, itemZero)); + Assert.assertFalse(equalZero.passesFilter(null, itemPositive)); + + Filter isPositive = new Greater(PROPERTY1, zero); + Assert.assertFalse(isPositive.passesFilter(null, itemNegative)); + Assert.assertFalse(isPositive.passesFilter(null, itemZero)); + Assert.assertTrue(isPositive.passesFilter(null, itemPositive)); + + Filter isNegative = new Less(PROPERTY1, zero); + Assert.assertTrue(isNegative.passesFilter(null, itemNegative)); + Assert.assertFalse(isNegative.passesFilter(null, itemZero)); + Assert.assertFalse(isNegative.passesFilter(null, itemPositive)); + + Filter isNonNegative = new GreaterOrEqual(PROPERTY1, zero); + Assert.assertFalse(isNonNegative.passesFilter(null, itemNegative)); + Assert.assertTrue(isNonNegative.passesFilter(null, itemZero)); + Assert.assertTrue(isNonNegative.passesFilter(null, itemPositive)); + + Filter isNonPositive = new LessOrEqual(PROPERTY1, zero); + Assert.assertTrue(isNonPositive.passesFilter(null, itemNegative)); + Assert.assertTrue(isNonPositive.passesFilter(null, itemZero)); + Assert.assertFalse(isNonPositive.passesFilter(null, itemPositive)); + + Filter isPositiveScaleTwo = new Equal(PROPERTY1, positiveScaleTwo); + Assert.assertTrue(isPositiveScaleTwo.passesFilter(null, + itemPositiveScaleTwo)); + Assert.assertTrue(isPositiveScaleTwo.passesFilter(null, itemPositive)); + + } + public void testCompareDate() { Date now = new Date(); // new Date() is only accurate to the millisecond, so repeating it gives diff --git a/uitest/src/com/vaadin/tests/fields/TabIndexes.html b/uitest/src/com/vaadin/tests/fields/TabIndexes.html index 1f865627ad..a78be3045c 100644 --- a/uitest/src/com/vaadin/tests/fields/TabIndexes.html +++ b/uitest/src/com/vaadin/tests/fields/TabIndexes.html @@ -52,8 +52,58 @@ <td>0</td> </tr> <tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-8/domChild[0]/domChild[0]@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-9/domChild[1]/domChild[1]@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-10/domChild[1]@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-11/domChild[1]@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-12@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-13@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-14@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-15/domChild[1]@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-16/domChild[0]@tabIndex</td> + <td>0</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-17@tabIndex</td> + <td>0</td> +</tr> +<tr> <td>click</td> - <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[2]/VButton[0]/domChild[0]/domChild[0]</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VHorizontalLayout[0]/VOrderedLayout$Slot[1]/VButton[0]/domChild[0]/domChild[0]</td> <td></td> </tr> <tr> @@ -92,8 +142,58 @@ <td>1</td> </tr> <tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-8/domChild[0]/domChild[0]@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-9/domChild[1]/domChild[1]@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-10/domChild[1]@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-11/domChild[1]@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-12@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-13@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-14@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-15/domChild[1]@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-16/domChild[0]@tabIndex</td> + <td>1</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-17@tabIndex</td> + <td>1</td> +</tr> +<tr> <td>click</td> - <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VButton[0]/domChild[0]/domChild[0]</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VHorizontalLayout[0]/VOrderedLayout$Slot[2]/VButton[0]/domChild[0]/domChild[0]</td> <td></td> </tr> <tr> @@ -132,43 +232,143 @@ <td>7</td> </tr> <tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-8/domChild[0]/domChild[0]@tabIndex</td> + <td>8</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-9/domChild[1]/domChild[1]@tabIndex</td> + <td>9</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-10/domChild[1]@tabIndex</td> + <td>10</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-11/domChild[1]@tabIndex</td> + <td>11</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-12@tabIndex</td> + <td>12</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-13@tabIndex</td> + <td>13</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-14@tabIndex</td> + <td>14</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-15/domChild[1]@tabIndex</td> + <td>15</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-16/domChild[0]@tabIndex</td> + <td>16</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-17@tabIndex</td> + <td>17</td> +</tr> +<tr> <td>click</td> - <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VButton[0]/domChild[0]/domChild[0]</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VHorizontalLayout[0]/VOrderedLayout$Slot[3]/VButton[0]/domChild[0]/domChild[0]</td> <td></td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-1/domChild[1]/domChild[1]@tabIndex</td> - <td>7</td> + <td>17</td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-2/domChild[0]@tabIndex</td> - <td>6</td> + <td>16</td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-3/domChild[0]@tabIndex</td> - <td>5</td> + <td>15</td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-4/domChild[0]@tabIndex</td> - <td>4</td> + <td>14</td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-5@tabIndex</td> - <td>3</td> + <td>13</td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-6/domChild[0]@tabIndex</td> - <td>2</td> + <td>12</td> </tr> <tr> <td>assertAttribute</td> <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-7/domChild[0]@tabIndex</td> + <td>11</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-8/domChild[0]/domChild[0]@tabIndex</td> + <td>10</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-9/domChild[1]/domChild[1]@tabIndex</td> + <td>9</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-10/domChild[1]@tabIndex</td> + <td>8</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-11/domChild[1]@tabIndex</td> + <td>7</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-12@tabIndex</td> + <td>6</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-13@tabIndex</td> + <td>5</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-14@tabIndex</td> + <td>4</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-15/domChild[1]@tabIndex</td> + <td>3</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-16/domChild[0]@tabIndex</td> + <td>2</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-17@tabIndex</td> <td>1</td> </tr> </tbody></table> diff --git a/uitest/src/com/vaadin/tests/fields/TabIndexes.java b/uitest/src/com/vaadin/tests/fields/TabIndexes.java index c88bb97c73..cf2e253d08 100644 --- a/uitest/src/com/vaadin/tests/fields/TabIndexes.java +++ b/uitest/src/com/vaadin/tests/fields/TabIndexes.java @@ -22,6 +22,7 @@ import com.vaadin.ui.OptionGroup; import com.vaadin.ui.PasswordField; import com.vaadin.ui.PopupDateField; import com.vaadin.ui.RichTextArea; +import com.vaadin.ui.Slider; import com.vaadin.ui.Table; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; @@ -121,7 +122,7 @@ public class TabIndexes extends AbstractTestUI { fields.add(new TextArea()); fields.add(new RichTextArea()); fields.add(new CheckBox()); - // fields.add(new Slider()); + fields.add(new Slider()); clearTabIndexes.click(); |