diff options
author | Teemu Suo-Anttila <teemusa@vaadin.com> | 2015-03-25 14:31:32 +0200 |
---|---|---|
committer | Teemu Suo-Anttila <teemusa@vaadin.com> | 2015-04-07 10:52:11 +0300 |
commit | ac6e06d57972601b4172b06a59076323e086a8b9 (patch) | |
tree | 5c526fb890ca72398c09b334c1a6c51b0aa2dd17 /server | |
parent | cd0b326851630d762b9e71631ef26c0385d4c850 (diff) | |
download | vaadin-framework-ac6e06d57972601b4172b06a59076323e086a8b9.tar.gz vaadin-framework-ac6e06d57972601b4172b06a59076323e086a8b9.zip |
Add declarative support for PopupView (#16334)
Change-Id: Ic5fb0238f538fd05bb6d6e37ddff3ec06175f782
Diffstat (limited to 'server')
-rw-r--r-- | server/src/com/vaadin/ui/PopupView.java | 88 | ||||
-rw-r--r-- | server/tests/src/com/vaadin/tests/server/component/popupview/PopupViewDeclarativeTest.java | 74 |
2 files changed, 149 insertions, 13 deletions
diff --git a/server/src/com/vaadin/ui/PopupView.java b/server/src/com/vaadin/ui/PopupView.java index 2a2da26b62..12034cb56c 100644 --- a/server/src/com/vaadin/ui/PopupView.java +++ b/server/src/com/vaadin/ui/PopupView.java @@ -20,8 +20,13 @@ import java.lang.reflect.Method; import java.util.Collections; import java.util.Iterator; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; +import org.jsoup.parser.Tag; + import com.vaadin.shared.ui.popupview.PopupViewServerRpc; import com.vaadin.shared.ui.popupview.PopupViewState; +import com.vaadin.ui.declarative.DesignContext; /** * @@ -61,9 +66,15 @@ public class PopupView extends AbstractComponent implements HasComponents { /* Constructors */ - private PopupView() { + /** + * This is an internal constructor. Use + * {@link PopupView#PopupView(String, Component)} instead. + */ + @Deprecated + public PopupView() { registerRpc(rpc); setHideOnMouseOut(true); + setContent(createContent("", new Label(""))); } /** @@ -77,18 +88,7 @@ public class PopupView extends AbstractComponent implements HasComponents { * the full, Component-type representation */ public PopupView(final java.lang.String small, final Component large) { - this(new PopupView.Content() { - @Override - public java.lang.String getMinimizedValueAsHTML() { - return small; - } - - @Override - public Component getPopupComponent() { - return large; - } - }); - + this(createContent(small, large)); } /** @@ -104,6 +104,30 @@ public class PopupView extends AbstractComponent implements HasComponents { } /** + * Creates a Content from given text representation and popup content. + * + * @param minimizedValue + * text representation when popup is hidden + * @param popupContent + * popup content + * @return content with given data + */ + protected static Content createContent(final String minimizedValue, + final Component popupContent) { + return new Content() { + @Override + public String getMinimizedValueAsHTML() { + return minimizedValue; + } + + @Override + public Component getPopupComponent() { + return popupContent; + } + }; + } + + /** * This method will replace the current content of the panel with a new one. * * @param newContent @@ -233,6 +257,44 @@ public class PopupView extends AbstractComponent implements HasComponents { } @Override + public void readDesign(Element design, DesignContext designContext) { + + // Read content first to avoid NPE when setting popup visible + Component popupContent = null; + String minimizedValue = ""; + for (Node childNode : design.childNodes()) { + if (childNode instanceof Element) { + Element child = (Element) childNode; + if (child.tagName().equals("popup-content")) { + popupContent = designContext.readDesign(child.child(0)); + } else { + minimizedValue += child.toString(); + } + } else { + minimizedValue += childNode.toString(); + } + } + setContent(createContent(minimizedValue.trim(), popupContent)); + + super.readDesign(design, designContext); + } + + @Override + public void writeDesign(Element design, DesignContext designContext) { + super.writeDesign(design, designContext); + + Element popupContent = new Element(Tag.valueOf("popup-content"), ""); + popupContent.appendChild(designContext.createElement(content + .getPopupComponent())); + + String minimizedHTML = content.getMinimizedValueAsHTML(); + if (minimizedHTML != null && !minimizedHTML.isEmpty()) { + design.append(minimizedHTML); + } + design.appendChild(popupContent); + } + + @Override protected PopupViewState getState() { return (PopupViewState) super.getState(); } diff --git a/server/tests/src/com/vaadin/tests/server/component/popupview/PopupViewDeclarativeTest.java b/server/tests/src/com/vaadin/tests/server/component/popupview/PopupViewDeclarativeTest.java new file mode 100644 index 0000000000..8bad68f5b9 --- /dev/null +++ b/server/tests/src/com/vaadin/tests/server/component/popupview/PopupViewDeclarativeTest.java @@ -0,0 +1,74 @@ +/* + * 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.server.component.popupview; + +import org.junit.Test; + +import com.vaadin.tests.design.DeclarativeTestBase; +import com.vaadin.ui.Component; +import com.vaadin.ui.Label; +import com.vaadin.ui.PopupView; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.declarative.DesignContext; + +public class PopupViewDeclarativeTest extends DeclarativeTestBase<PopupView> { + + @Test + public void testEmptyPopupView() { + PopupView component = new PopupView(); + Component popup = component.getContent().getPopupComponent(); + String design = "<v-popup-view><popup-content>" + + new DesignContext().createElement(popup) + + "</popup-content></v-popup-view>"; + testWrite(design, component); + testRead(design, component); + } + + @Test + public void testVisiblePopupDesign() { + final VerticalLayout verticalLayout = new VerticalLayout(); + verticalLayout.setWidth("300px"); + verticalLayout.setHeight("400px"); + + PopupView component = new PopupView("Click <u>here</u> to open", + verticalLayout); + component.setHideOnMouseOut(true); + component.setPopupVisible(true); + // hide-on-mouse-out is true by default. not seen in design + String design = "<v-popup-view popup-visible='true'>" // + + "Click <u>here</u> to open" + + "<popup-content>" + + new DesignContext().createElement(verticalLayout) + + "</popup-content>" // + + "</v-popup-view>"; + testWrite(design, component); + testRead(design, component); + } + + @Test + public void testHideOnMouseOutDisabled() { + final Label label = new Label("Foo"); + PopupView component = new PopupView("Click Me!", label); + component.setHideOnMouseOut(false); + String design = "<v-popup-view hide-on-mouse-out='false'>" // + + "Click Me!" + + "<popup-content>" + + new DesignContext().createElement(label) + "</popup-content>" // + + "</v-popup-view>"; + testWrite(design, component); + testRead(design, component); + } +} |