diff options
author | wodencafe <wodencafe@gmail.com> | 2015-02-04 11:28:51 -0600 |
---|---|---|
committer | Anna Koskinen <anna@vaadin.com> | 2015-03-26 10:52:11 +0000 |
commit | 6e208eb77a248c5f5b1baa055ded94a43b0c96ed (patch) | |
tree | 4f2e882720c4d3a7b59540f11970b9de16460b73 | |
parent | f7f581d57a8bfa42428c0751454aa8dccb00ec49 (diff) | |
download | vaadin-framework-6e208eb77a248c5f5b1baa055ded94a43b0c96ed.tar.gz vaadin-framework-6e208eb77a248c5f5b1baa055ded94a43b0c96ed.zip |
SplitPanel should have an event for the splitter being moved (#3855)
Change-Id: I473e5a0f8420c95971af52ef230849f468ebbbad
4 files changed, 290 insertions, 0 deletions
diff --git a/server/src/com/vaadin/ui/AbstractSplitPanel.java b/server/src/com/vaadin/ui/AbstractSplitPanel.java index af73fca6a8..8a7b9086c2 100644 --- a/server/src/com/vaadin/ui/AbstractSplitPanel.java +++ b/server/src/com/vaadin/ui/AbstractSplitPanel.java @@ -64,6 +64,8 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { @Override public void setSplitterPosition(float position) { getSplitterState().position = position; + fireEvent(new SplitPositionChangeEvent(AbstractSplitPanel.this, + position, getSplitPositionUnit())); } }; @@ -331,6 +333,8 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { splitterState.positionUnit = unit.getSymbol(); splitterState.positionReversed = reverse; posUnit = unit; + fireEvent(new SplitPositionChangeEvent(AbstractSplitPanel.this, pos, + posUnit)); } /** @@ -520,6 +524,54 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { } + /** + * Interface for listening for {@link SplitPositionChangeEvent}s fired by a + * SplitPanel. + * + * @since + */ + public interface SplitPositionChangeListener extends ConnectorEventListener { + + public static final Method moveMethod = ReflectTools.findMethod( + SplitPositionChangeListener.class, "onSplitPositionChanged", + SplitPositionChangeEvent.class); + + /** + * SplitPanel splitter position has been changed. + * + * @param event + * SplitPositionChangeEvent event. + */ + public void onSplitPositionChanged(SplitPositionChangeEvent event); + } + + /** + * Event that indicates a change in SplitPanel's splitter position. + * + * @since + */ + public static class SplitPositionChangeEvent extends Component.Event { + + private final float position; + private final Unit unit; + + public SplitPositionChangeEvent(final Component source, + final float position, final Unit unit) { + super(source); + this.position = position; + this.unit = unit; + } + + public float getSplitPosition() { + return position; + } + + public Unit getSplitPositionUnit() { + return unit; + } + + } + public void addSplitterClickListener(SplitterClickListener listener) { addListener(EventId.CLICK_EVENT_IDENTIFIER, SplitterClickEvent.class, listener, SplitterClickListener.clickMethod); @@ -548,6 +600,31 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { removeSplitterClickListener(listener); } + /** + * Register a listener to handle {@link SplitPositionChangeEvent}s. + * + * @since + * @param listener + * {@link SplitPositionChangeListener} to be registered. + */ + public void addSplitPositionChangeListener( + SplitPositionChangeListener listener) { + addListener(SplitPositionChangeEvent.class, listener, + SplitPositionChangeListener.moveMethod); + } + + /** + * Removes a {@link SplitPositionChangeListener}. + * + * @since + * @param listener + * SplitPositionChangeListener to be removed. + */ + public void removeSplitPositionChangeListener( + SplitPositionChangeListener listener) { + removeListener(SplitPositionChangeEvent.class, listener); + } + @Override protected AbstractSplitPanelState getState() { return (AbstractSplitPanelState) super.getState(); diff --git a/server/tests/src/com/vaadin/ui/SplitPositionChangeListenerTest.java b/server/tests/src/com/vaadin/ui/SplitPositionChangeListenerTest.java new file mode 100644 index 0000000000..02dc412cd9 --- /dev/null +++ b/server/tests/src/com/vaadin/ui/SplitPositionChangeListenerTest.java @@ -0,0 +1,44 @@ +/* + * 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.ui; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import org.junit.Test; + +import com.vaadin.server.Sizeable.Unit; +import com.vaadin.ui.AbstractSplitPanel.SplitPositionChangeEvent; +import com.vaadin.ui.AbstractSplitPanel.SplitPositionChangeListener; + +/** + * Test for {@link SplitPositionChangeListener} + * + * @author Vaadin Ltd + */ +public class SplitPositionChangeListenerTest { + + @Test + public void testSplitPositionListenerIsTriggered() throws Exception { + final HorizontalSplitPanel splitPanel = new HorizontalSplitPanel(); + SplitPositionChangeListener splitPositionChangeListener = mock(SplitPositionChangeListener.class); + splitPanel.addSplitPositionChangeListener(splitPositionChangeListener); + splitPanel.setSplitPosition(50, Unit.PERCENTAGE); + verify(splitPositionChangeListener).onSplitPositionChanged( + any(SplitPositionChangeEvent.class)); + } +} diff --git a/uitest/src/com/vaadin/tests/components/splitpanel/SplitPositionChange.java b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPositionChange.java new file mode 100644 index 0000000000..81c449731c --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPositionChange.java @@ -0,0 +1,87 @@ +/* + * 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.tests.components.splitpanel; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.AbstractSplitPanel; +import com.vaadin.ui.HorizontalSplitPanel; +import com.vaadin.ui.Label; +import com.vaadin.ui.Panel; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.VerticalSplitPanel; + +/** + * Test for {@link SplitPositionChangeListeners}. + * + * @author Vaadin Ltd + */ +public class SplitPositionChange extends AbstractTestUIWithLog { + + @Override + protected void setup(VaadinRequest request) { + addSplitPanel(true, "Left", "Right"); + addSplitPanel(false, "Top", "Bottom"); + } + + private void addSplitPanel(final boolean horizontal, String firstCaption, + String secondCaption) { + AbstractSplitPanel splitPanel; + if (horizontal) { + splitPanel = new HorizontalSplitPanel(); + } else { + splitPanel = new VerticalSplitPanel(); + } + splitPanel.setWidth("200px"); + splitPanel.setHeight("200px"); + splitPanel.addComponent(buildPanel(firstCaption)); + splitPanel.addComponent(buildPanel(secondCaption)); + splitPanel + .addSplitPositionChangeListener(new AbstractSplitPanel.SplitPositionChangeListener() { + + @Override + public void onSplitPositionChanged( + AbstractSplitPanel.SplitPositionChangeEvent event) { + log(String.format( + "Split position changed: %s, position: %s %s", + (horizontal ? "horizontal" : "vertical"), + event.getSplitPosition(), + event.getSplitPositionUnit())); + } + }); + addComponent(splitPanel); + } + + private Panel buildPanel(String caption) { + VerticalLayout pl = new VerticalLayout(); + pl.setMargin(true); + pl.addComponent(new Label("content")); + Panel panel = new Panel(caption, pl); + panel.setSizeFull(); + return panel; + } + + @Override + protected String getTestDescription() { + return "SplitPanel should have an event for the splitter being moved"; + } + + @Override + protected Integer getTicketNumber() { + return 3855; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/splitpanel/SplitPositionChangeTest.java b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPositionChangeTest.java new file mode 100644 index 0000000000..43edb56f3a --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/splitpanel/SplitPositionChangeTest.java @@ -0,0 +1,82 @@ +/* + * 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.tests.components.splitpanel; + +import org.junit.Assert; +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; + +import com.vaadin.testbench.elements.HorizontalSplitPanelElement; +import com.vaadin.testbench.elements.VerticalSplitPanelElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +/** + * Test for {@link SplitPositionChangeListeners}. + * + * @author Vaadin Ltd + */ +public class SplitPositionChangeTest extends MultiBrowserTest { + + @Override + public void setup() throws Exception { + super.setup(); + openTestURL(); + waitForElementPresent(By.className("v-splitpanel-horizontal")); + } + + @Test + public void testHorizontalSplit() { + HorizontalSplitPanelElement split = $(HorizontalSplitPanelElement.class) + .first(); + WebElement splitter = split.findElement(By + .className("v-splitpanel-hsplitter")); + int position = splitter.getLocation().getX(); + Actions actions = new Actions(driver); + actions.clickAndHold(splitter).moveByOffset(50, 0).release().perform(); + assertPosition(position, splitter.getLocation().getX()); + assertLogText(true); + } + + @Test + public void testVerticalSplit() { + VerticalSplitPanelElement split = $(VerticalSplitPanelElement.class) + .first(); + WebElement splitter = split.findElement(By + .className("v-splitpanel-vsplitter")); + int position = splitter.getLocation().getY(); + Actions actions = new Actions(driver); + actions.clickAndHold(splitter).moveByOffset(0, 50).release().perform(); + assertPosition(position, splitter.getLocation().getY()); + assertLogText(false); + } + + private void assertPosition(int original, int current) { + Assert.assertFalse("Position didn't change", original == current); + } + + private void assertLogText(boolean horizontal) { + String expected = String.format( + "1. Split position changed: %s, position: .*", + horizontal ? "horizontal" : "vertical"); + String actual = getLogRow(0); + Assert.assertTrue( + String.format( + "Log content didn't match the expected format.\nexpected: '%s'\nwas: '%s'", + expected, actual), actual.matches(expected)); + } +} |