diff options
author | Sauli Tähkäpää <sauli@vaadin.com> | 2015-08-26 21:43:17 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2016-05-13 12:21:46 +0000 |
commit | 7f3481b7a69d9edc31c7e70b305ece6816eee36f (patch) | |
tree | a96219d0ff50c4531625886c0af271ed97e7384a | |
parent | c6f185a1c420af5ca67a5dc9200db15dcc8e2365 (diff) | |
download | vaadin-framework-7f3481b7a69d9edc31c7e70b305ece6816eee36f.tar.gz vaadin-framework-7f3481b7a69d9edc31c7e70b305ece6816eee36f.zip |
Disable multiselect checkboxes when Grid is disabled. (#18560)
Change-Id: Ief0531fe90b9bc8bcf0a60132211a0633b9401d4
6 files changed, 254 insertions, 6 deletions
diff --git a/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java new file mode 100644 index 0000000000..2e4be88671 --- /dev/null +++ b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.client.widget.grid.events; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * An enabled/disabled event, fired by the Grid when it is disabled or enabled. + * + * @since + * @author Vaadin Ltd + */ +public class GridEnabledEvent extends GwtEvent<GridEnabledHandler> { + /** + * The type of this event + */ + public static final Type<GridEnabledHandler> TYPE = new Type<GridEnabledHandler>(); + private final boolean enabled; + + public GridEnabledEvent(boolean enabled) { + this.enabled = enabled; + } + + @Override + public Type<GridEnabledHandler> getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(final GridEnabledHandler handler) { + handler.onEnabled(enabled); + } +} diff --git a/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java new file mode 100644 index 0000000000..26ac498bcc --- /dev/null +++ b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.client.widget.grid.events; + +import com.google.gwt.event.shared.EventHandler; + +/** + * Handler for a Grid enabled/disabled event, called when the Grid is enabled + * or disabled. + * + * @since + * @author Vaadin Ltd + */ +public interface GridEnabledHandler extends EventHandler { + + /** + * Called when Grid is enabled or disabled. + * + * @param enabled + * true if status changes from disabled to enabled, otherwise false. + */ + public void onEnabled(boolean enabled); +} diff --git a/client/src/main/java/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java b/client/src/main/java/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java index c64908f24c..f244682b49 100644 --- a/client/src/main/java/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java +++ b/client/src/main/java/com/vaadin/client/widget/grid/selection/MultiSelectionRenderer.java @@ -42,6 +42,8 @@ import com.vaadin.client.WidgetUtil; import com.vaadin.client.renderers.ClickableRenderer; import com.vaadin.client.widget.grid.CellReference; import com.vaadin.client.widget.grid.RendererCellReference; +import com.vaadin.client.widget.grid.events.GridEnabledEvent; +import com.vaadin.client.widget.grid.events.GridEnabledHandler; import com.vaadin.client.widget.grid.selection.SelectionModel.Multi.Batched; import com.vaadin.client.widgets.Grid; @@ -76,7 +78,7 @@ public class MultiSelectionRenderer<T> extends * @since 7.5 */ private final class CheckBoxEventHandler implements MouseDownHandler, - TouchStartHandler, ClickHandler { + TouchStartHandler, ClickHandler, GridEnabledHandler { private final CheckBox checkBox; /** @@ -89,14 +91,18 @@ public class MultiSelectionRenderer<T> extends @Override public void onMouseDown(MouseDownEvent event) { - if (event.getNativeButton() == NativeEvent.BUTTON_LEFT) { - startDragSelect(event.getNativeEvent(), checkBox.getElement()); + if(checkBox.isEnabled()) { + if (event.getNativeButton() == NativeEvent.BUTTON_LEFT) { + startDragSelect(event.getNativeEvent(), checkBox.getElement()); + } } } @Override public void onTouchStart(TouchStartEvent event) { - startDragSelect(event.getNativeEvent(), checkBox.getElement()); + if(checkBox.isEnabled()) { + startDragSelect(event.getNativeEvent(), checkBox.getElement()); + } } @Override @@ -105,6 +111,11 @@ public class MultiSelectionRenderer<T> extends event.preventDefault(); event.stopPropagation(); } + + @Override + public void onEnabled(boolean enabled) { + checkBox.setEnabled(enabled); + } } /** @@ -595,6 +606,7 @@ public class MultiSelectionRenderer<T> extends final CheckBox checkBox = GWT.create(CheckBox.class); checkBox.setStylePrimaryName(grid.getStylePrimaryName() + SELECTION_CHECKBOX_CLASSNAME); + CheckBoxEventHandler handler = new CheckBoxEventHandler(checkBox); // Sink events @@ -606,6 +618,9 @@ public class MultiSelectionRenderer<T> extends checkBox.addMouseDownHandler(handler); checkBox.addTouchStartHandler(handler); checkBox.addClickHandler(handler); + grid.addHandler(handler, GridEnabledEvent.TYPE); + + checkBox.setEnabled(grid.isEnabled()); return checkBox; } @@ -614,7 +629,7 @@ public class MultiSelectionRenderer<T> extends public void render(final RendererCellReference cell, final Boolean data, CheckBox checkBox) { checkBox.setValue(data, false); - checkBox.setEnabled(!grid.isEditorActive()); + checkBox.setEnabled(grid.isEnabled() && !grid.isEditorActive()); checkBox.getElement().setPropertyInt(LOGICAL_ROW_PROPERTY_INT, cell.getRowIndex()); } diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java index c388dbc951..a022db58a4 100644 --- a/client/src/main/java/com/vaadin/client/widgets/Grid.java +++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java @@ -140,6 +140,8 @@ import com.vaadin.client.widget.grid.events.FooterKeyPressHandler; import com.vaadin.client.widget.grid.events.FooterKeyUpHandler; import com.vaadin.client.widget.grid.events.GridClickEvent; import com.vaadin.client.widget.grid.events.GridDoubleClickEvent; +import com.vaadin.client.widget.grid.events.GridEnabledEvent; +import com.vaadin.client.widget.grid.events.GridEnabledHandler; import com.vaadin.client.widget.grid.events.GridKeyDownEvent; import com.vaadin.client.widget.grid.events.GridKeyPressEvent; import com.vaadin.client.widget.grid.events.GridKeyUpEvent; @@ -2845,7 +2847,8 @@ public class Grid<T> extends ResizeComposite implements } } - public final class SelectionColumn extends Column<Boolean, T> { + public final class SelectionColumn extends Column<Boolean, T> + implements GridEnabledHandler { private boolean initDone = false; private boolean selected = false; @@ -2853,6 +2856,8 @@ public class Grid<T> extends ResizeComposite implements SelectionColumn(final Renderer<Boolean> selectColumnRenderer) { super(selectColumnRenderer); + + addEnabledHandler(this); } void initDone() { @@ -3002,6 +3007,24 @@ public class Grid<T> extends ResizeComposite implements super.setEditable(editable); return this; } + + /** + * Sets whether the selection column is enabled. + * + * @since + * @param enabled <code>true</code> to enable the column, + * <code>false</code> to disable it. + */ + public void setEnabled(boolean enabled) { + if(selectAllCheckBox != null) { + selectAllCheckBox.setEnabled(enabled); + } + } + + @Override + public void onEnabled(boolean enabled) { + setEnabled(enabled); + } } /** @@ -5971,6 +5994,8 @@ public class Grid<T> extends ResizeComposite implements getEscalator().setScrollLocked(Direction.VERTICAL, !enabled || editorOpen); getEscalator().setScrollLocked(Direction.HORIZONTAL, !enabled); + + fireEvent(new GridEnabledEvent(enabled)); } @Override @@ -7538,6 +7563,8 @@ public class Grid<T> extends ResizeComposite implements selectionColumn = new SelectionColumn(selectColumnRenderer); addColumnSkipSelectionColumnCheck(selectionColumn, 0); + + selectionColumn.setEnabled(isEnabled()); selectionColumn.initDone(); } else { selectionColumn = null; @@ -8100,6 +8127,17 @@ public class Grid<T> extends ResizeComposite implements } /** + * Register a enabled status change handler to this Grid. + * The event for this handler is fired when the Grid changes from disabled + * to enabled and vice-versa. + * @param handler the handler for the event + * @return the registration for the event + */ + public HandlerRegistration addEnabledHandler(GridEnabledHandler handler) { + return addHandler(handler, GridEnabledEvent.TYPE); + } + + /** * Apply sorting to data source. */ private void sort(boolean userOriginated) { diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridDisabledMultiselect.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridDisabledMultiselect.java new file mode 100644 index 0000000000..4846a41672 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridDisabledMultiselect.java @@ -0,0 +1,32 @@ +package com.vaadin.tests.components.grid; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Button; +import com.vaadin.ui.Grid; + +public class GridDisabledMultiselect extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + final Grid grid = new Grid(); + grid.addColumn("foo", String.class); + grid.addRow("bar"); + grid.setSelectionMode(Grid.SelectionMode.SINGLE); + addComponent(grid); + + addButton("Multi", new Button.ClickListener() { + @Override + public void buttonClick(Button.ClickEvent event) { + grid.setSelectionMode(Grid.SelectionMode.MULTI); + } + }); + + addButton("Disable", new Button.ClickListener() { + @Override + public void buttonClick(Button.ClickEvent event) { + grid.setEnabled(!grid.isEnabled()); + } + }); + } +}
\ No newline at end of file diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridDisabledMultiselectTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridDisabledMultiselectTest.java new file mode 100644 index 0000000000..390b855c55 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridDisabledMultiselectTest.java @@ -0,0 +1,81 @@ +package com.vaadin.tests.components.grid; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import java.util.List; + +import org.junit.Test; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; + +import com.vaadin.testbench.By; +import com.vaadin.testbench.elements.ButtonElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class GridDisabledMultiselectTest extends MultiBrowserTest { + + @Override + public void setup() throws Exception { + super.setup(); + + openTestURL(); + } + + private void disable() { + $(ButtonElement.class).caption("Disable").first().click(); + } + + private void setMultiselect() { + $(ButtonElement.class).caption("Multi").first().click(); + } + + private WebElement getSelectAllCheckBox() { + return findCheckBoxes().get(0); + } + + private List<WebElement> findCheckBoxes() { + return findElements(By.cssSelector("span input")); + } + + private WebElement getFirstSelectCheckBox() { + return findCheckBoxes().get(1); + } + + @Test + public void checkBoxesAreDisabledAfterModeChange() { + disable(); + + setMultiselect(); + + assertThat(getSelectAllCheckBox().isEnabled(), is(false)); + assertThat(getFirstSelectCheckBox().isEnabled(), is(false)); + } + + @Test + public void checkBoxesAreDisabledAfterDisabled() { + setMultiselect(); + + assertThat(getSelectAllCheckBox().isEnabled(), is(true)); + assertThat(getFirstSelectCheckBox().isEnabled(), is(true)); + + disable(); + + assertThat(getSelectAllCheckBox().isEnabled(), is(false)); + assertThat(getFirstSelectCheckBox().isEnabled(), is(false)); + } + + @Test + public void parentSpanCannotBeClickedWhenDisabled() { + setMultiselect(); + disable(); + + WebElement firstCheckBoxSpan + = findElements(By.cssSelector("span")).get(1); + new Actions(driver).moveToElement(firstCheckBoxSpan, 1, 1) + .click() + .perform(); + + assertThat(getFirstSelectCheckBox().isSelected(), is(false)); + } +}
\ No newline at end of file |