From f36c5ed815e090357890e4d76551d0641a233c82 Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Wed, 10 Apr 2013 09:50:06 +0300 Subject: Fixed native button not triggering click event in IE #11094 Change-Id: I210a7ab59b107eefb9ba5d00566c2138fc83acf2 --- .../client/ui/AbstractClickEventHandler.java | 3 ++- client/src/com/vaadin/client/ui/VNativeButton.java | 31 +++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) (limited to 'client') diff --git a/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java b/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java index bd2654df75..2f97d30ece 100644 --- a/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java +++ b/client/src/com/vaadin/client/ui/AbstractClickEventHandler.java @@ -33,6 +33,7 @@ import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Event.NativePreviewHandler; import com.vaadin.client.ComponentConnector; import com.vaadin.client.Util; +import com.vaadin.client.VConsole; public abstract class AbstractClickEventHandler implements MouseDownHandler, MouseUpHandler, DoubleClickHandler, ContextMenuHandler { @@ -77,7 +78,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, && elementUnderMouse == lastMouseDownTarget) { mouseUpPreviewMatched = true; } else { - System.out.println("Ignoring mouseup from " + VConsole.log("Ignoring mouseup from " + elementUnderMouse + " when mousedown was on " + lastMouseDownTarget); } diff --git a/client/src/com/vaadin/client/ui/VNativeButton.java b/client/src/com/vaadin/client/ui/VNativeButton.java index 6fd5d8d2ee..6e1c5bae77 100644 --- a/client/src/com/vaadin/client/ui/VNativeButton.java +++ b/client/src/com/vaadin/client/ui/VNativeButton.java @@ -16,9 +16,14 @@ package com.vaadin.client.ui; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.MouseEvent; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Button; @@ -26,6 +31,7 @@ import com.vaadin.client.ApplicationConnection; import com.vaadin.client.BrowserInfo; import com.vaadin.client.MouseEventDetailsBuilder; import com.vaadin.client.Util; +import com.vaadin.client.VConsole; import com.vaadin.shared.MouseEventDetails; import com.vaadin.shared.ui.button.ButtonServerRpc; @@ -60,6 +66,8 @@ public class VNativeButton extends Button implements ClickHandler { */ private boolean clickPending; + private boolean cancelNextClick = false; + /** For internal use only. May be removed or replaced in the future. */ public boolean disableOnClick = false; @@ -71,8 +79,8 @@ public class VNativeButton extends Button implements ClickHandler { addClickHandler(this); - sinkEvents(Event.ONMOUSEDOWN); - sinkEvents(Event.ONMOUSEUP); + sinkEvents(Event.ONMOUSEDOWN | Event.ONLOAD | Event.ONMOUSEMOVE + | Event.ONFOCUS); } @Override @@ -95,6 +103,7 @@ public class VNativeButton extends Button implements ClickHandler { } else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN && event.getButton() == Event.BUTTON_LEFT) { clickPending = true; + } else if (DOM.eventGetType(event) == Event.ONMOUSEMOVE) { clickPending = false; } else if (DOM.eventGetType(event) == Event.ONMOUSEOUT) { @@ -102,6 +111,21 @@ public class VNativeButton extends Button implements ClickHandler { click(); } clickPending = false; + } else if (event.getTypeInt() == Event.ONFOCUS) { + if (BrowserInfo.get().isIE() && clickPending) { + /* + * The focus event will mess up IE and IE will not trigger the + * mouse up event (which in turn triggers the click event) until + * the mouse is moved. This will result in it appearing as a + * native button not triggering the event. So we manually + * trigger the click here and cancel the next original event + * which will occur on the next mouse move. See ticket #11094 + * for details. + */ + click(); + clickPending = false; + cancelNextClick = true; + } } } @@ -120,7 +144,8 @@ public class VNativeButton extends Button implements ClickHandler { */ @Override public void onClick(ClickEvent event) { - if (paintableId == null || client == null) { + if (paintableId == null || client == null || cancelNextClick) { + cancelNextClick = false; return; } -- cgit v1.2.3 From fc4aeac8b43bb3f200b25a997ade05075592ee90 Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Wed, 17 Apr 2013 17:17:39 +0300 Subject: Fixed IE8 scrollbar issue with vertical layout when using both expansions and alignments #11169 Change-Id: Ia62db30e4e7f9bd02966db31b3bb691a1a60e58d --- .../ui/orderedlayout/VAbstractOrderedLayout.java | 16 ++++++-- .../VerticalLayoutSlotExpansionAndAlignment.html | 26 +++++++++++++ .../VerticalLayoutSlotExpansionAndAlignment.java | 45 ++++++++++++++++++++++ 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.html create mode 100644 uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.java (limited to 'client') diff --git a/client/src/com/vaadin/client/ui/orderedlayout/VAbstractOrderedLayout.java b/client/src/com/vaadin/client/ui/orderedlayout/VAbstractOrderedLayout.java index 93176f67bb..d8b0888936 100644 --- a/client/src/com/vaadin/client/ui/orderedlayout/VAbstractOrderedLayout.java +++ b/client/src/com/vaadin/client/ui/orderedlayout/VAbstractOrderedLayout.java @@ -29,6 +29,7 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.client.BrowserInfo; import com.vaadin.client.LayoutManager; import com.vaadin.client.Util; import com.vaadin.shared.ui.MarginInfo; @@ -411,10 +412,19 @@ public class VAbstractOrderedLayout extends FlowPanel { } else { // Non-relative child without expansion should be unconstrained - if (vertical) { - slotStyle.clearHeight(); + if (BrowserInfo.get().isIE8()) { + // unconstrained in IE8 is auto + if (vertical) { + slot.setHeight("auto"); + } else { + slot.setWidth("auto"); + } } else { - slotStyle.clearWidth(); + if (vertical) { + slotStyle.clearHeight(); + } else { + slotStyle.clearWidth(); + } } } } diff --git a/uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.html b/uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.html new file mode 100644 index 0000000000..e0b17ec8cf --- /dev/null +++ b/uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.html @@ -0,0 +1,26 @@ + + + + + + +New Test + + + + + + + + + + + + + + + + +
New Test
openrun/com.vaadin.tests.layouts.VerticalLayoutSlotExpansionAndAlignment?restartApplication
screenCaptureno-scrollbars
+ + diff --git a/uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.java b/uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.java new file mode 100644 index 0000000000..bba8ccf120 --- /dev/null +++ b/uitest/src/com/vaadin/tests/layouts/VerticalLayoutSlotExpansionAndAlignment.java @@ -0,0 +1,45 @@ +package com.vaadin.tests.layouts; + +import com.vaadin.annotations.Theme; +import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.Reindeer; + +@SuppressWarnings("serial") +public class VerticalLayoutSlotExpansionAndAlignment extends UI { + + @Override + protected void init(VaadinRequest request) { + + VerticalLayout layout = new VerticalLayout(); + layout.setSizeFull(); + setContent(layout); + + HorizontalLayout header = new HorizontalLayout(new Label("HEADER")); + header.setHeight("100px"); + header.setWidth("100%"); + header.setStyleName(Reindeer.LAYOUT_WHITE); + layout.addComponent(header); + + HorizontalLayout content = new HorizontalLayout(new Label("CONTENT")); + content.setSizeFull(); + content.setStyleName(Reindeer.LAYOUT_BLUE); + layout.addComponent(content); + + HorizontalLayout footer = new HorizontalLayout(new Label("FOOTER")); + footer.setHeight("150px"); + footer.setWidth("100%"); + footer.setStyleName(Reindeer.LAYOUT_BLACK); + layout.addComponent(footer); + + // This break things + layout.setComponentAlignment(footer, Alignment.BOTTOM_LEFT); + layout.setExpandRatio(content, 1); + + } + +} \ No newline at end of file -- cgit v1.2.3 From 4f9df1f6f0926cfce846a43c557e9b69302a4ca3 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Wed, 17 Apr 2013 17:35:38 +0300 Subject: Don't detach and reattach VAbstractSplitPanel child widgets unnecessarily (#11628) Change-Id: I84da9b786706410b42ae4116be0b0a3da896538b --- client/src/com/vaadin/client/ui/VAbstractSplitPanel.java | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'client') diff --git a/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java b/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java index 45c5cb6453..1cc25c741e 100644 --- a/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java +++ b/client/src/com/vaadin/client/ui/VAbstractSplitPanel.java @@ -499,6 +499,9 @@ public class VAbstractSplitPanel extends ComplexPanel { /** For internal use only. May be removed or replaced in the future. */ public void setFirstWidget(Widget w) { + if (firstChild == w) { + return; + } if (firstChild != null) { firstChild.removeFromParent(); } @@ -510,6 +513,9 @@ public class VAbstractSplitPanel extends ComplexPanel { /** For internal use only. May be removed or replaced in the future. */ public void setSecondWidget(Widget w) { + if (secondChild == w) { + return; + } if (secondChild != null) { secondChild.removeFromParent(); } -- cgit v1.2.3 From 747a88c642eb08992467ce88862fb93463d6ea20 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Thu, 18 Apr 2013 16:45:02 +0300 Subject: Prevent double encoding problems when URI fragment contains special characters (#10769) Change-Id: I9043a1f84140b441ab4b3e86eadb708359a29155 --- client/src/com/vaadin/client/ui/VUI.java | 8 +- .../src/com/vaadin/client/ui/ui/UIConnector.java | 6 +- .../com/vaadin/tests/navigator/NavigatorTest.html | 145 ++++++++++++++++++--- .../com/vaadin/tests/navigator/NavigatorTest.java | 32 ++++- 4 files changed, 160 insertions(+), 31 deletions(-) (limited to 'client') diff --git a/client/src/com/vaadin/client/ui/VUI.java b/client/src/com/vaadin/client/ui/VUI.java index b07593896f..9a73aa5f8f 100644 --- a/client/src/com/vaadin/client/ui/VUI.java +++ b/client/src/com/vaadin/client/ui/VUI.java @@ -133,10 +133,16 @@ public class VUI extends SimplePanel implements ResizeHandler, // Send the location to the server if the fragment has changed // and flush active connectors in UI. if (!newFragment.equals(currentFragment) && connection != null) { + + // Ensure the fragment is properly encoded in all browsers + // (#10769) + String location = Window.Location.createUrlBuilder() + .buildString(); + currentFragment = newFragment; connection.flushActiveConnector(); connection.updateVariable(id, UIConstants.LOCATION_VARIABLE, - Window.Location.getHref(), true); + location, true); } } }; diff --git a/client/src/com/vaadin/client/ui/ui/UIConnector.java b/client/src/com/vaadin/client/ui/ui/UIConnector.java index ac441fc625..593aa0d793 100644 --- a/client/src/com/vaadin/client/ui/ui/UIConnector.java +++ b/client/src/com/vaadin/client/ui/ui/UIConnector.java @@ -28,6 +28,7 @@ import com.google.gwt.event.dom.client.ScrollEvent; import com.google.gwt.event.dom.client.ScrollHandler; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; @@ -303,8 +304,9 @@ public class UIConnector extends AbstractSingleComponentContainerConnector .getStringAttribute(UIConstants.LOCATION_VARIABLE); int fragmentIndex = location.indexOf('#'); if (fragmentIndex >= 0) { - getWidget().currentFragment = location - .substring(fragmentIndex + 1); + // Decode fragment to avoid double encoding (#10769) + getWidget().currentFragment = URL.decodePathSegment(location + .substring(fragmentIndex + 1)); } if (!getWidget().currentFragment.equals(History.getToken())) { History.newItem(getWidget().currentFragment, true); diff --git a/uitest/src/com/vaadin/tests/navigator/NavigatorTest.html b/uitest/src/com/vaadin/tests/navigator/NavigatorTest.html index 030b30f37a..7eba02aa94 100644 --- a/uitest/src/com/vaadin/tests/navigator/NavigatorTest.html +++ b/uitest/src/com/vaadin/tests/navigator/NavigatorTest.html @@ -18,8 +18,13 @@ assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] - 1. Navigated to DefaultView with params + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 1. Navigated to DefaultView without params + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VLabel[0] + Default view: click @@ -28,8 +33,13 @@ assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] - 2. Navigated to ListView with params + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 2. Navigated to ListView without params + + + assertElementPresent + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VScrollTable[0] + assertLocation @@ -43,8 +53,13 @@ assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] - 3. Navigated to EditView with params + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 3. Navigated to EditView without params + + + assertElementPresent + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VRichTextArea[0] + assertLocation @@ -53,12 +68,12 @@ mouseClick - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VTextField[0] + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[4]/VTextField[0] 56,6 enterCharacter - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VTextField[0] + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[4]/VTextField[0] param=value @@ -68,9 +83,19 @@ assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 4. Navigated to ListView with params param=value + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]/domChild[0] + param + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[1]/domChild[0] + value + assertLocation *#!list/param=value @@ -83,7 +108,7 @@ assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 5. Navigated to EditView with params param=value @@ -98,7 +123,7 @@ assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 6. Prevent navigation to ForbiddenView @@ -106,46 +131,124 @@ *#!edit/param=value + + click + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[3]/VButton[0]/domChild[0]/domChild[0] + + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 7. Navigated to SpecialCharsView: öääö !%&/()=; fragment: !öääö !%&/()=/param=value + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VLabel[0] + öääö !%&/()= + + + assertLocation + *#!%C3%B6%C3%A4%C3%A4%C3%B6%20!%25&/()=/param=value + + + + runScript + window.location.hash='!foo bar' + + + + pause + 3000 + + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 8. View 'foo bar' not found! + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VLabel[0] + Tried to navigate to foo bar but such a view could not be found :( + + + assertLocation + regex:.*#!foo( |%20)bar + + + + runScript + window.location.hash='!/foo=bar' + + + + pause + 3000 + + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 9. Navigated to DefaultView with params foo=bar + + + assertText + vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/Slot[6]/VVerticalLayout[0]/Slot[0]/VLabel[0] + Default view: foo=bar + + + assertLocation + *#!/foo=bar + + runScript - window.location.hash='!foo' + window.location.hash='foo bar' pause - 1000 + 3000 assertText - vaadin=runcomvaadintestsnavigatorNavigatorTest::/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VLabel[0] - 7. View 'foo' not found! + vaadin=runcomvaadintestsnavigatorNavigatorTest::PID_SLog_row_0 + 10. Navigated to DefaultView without params assertLocation - *#!foo + regex:.*#foo( |%20)bar + diff --git a/uitest/src/com/vaadin/tests/navigator/NavigatorTest.java b/uitest/src/com/vaadin/tests/navigator/NavigatorTest.java index f35c8b876d..81944abd40 100644 --- a/uitest/src/com/vaadin/tests/navigator/NavigatorTest.java +++ b/uitest/src/com/vaadin/tests/navigator/NavigatorTest.java @@ -37,7 +37,9 @@ public class NavigatorTest extends UI { @Override public void enter(ViewChangeEvent event) { String params = event.getParameters(); - log.log("Navigated to ListView with params " + params); + log.log("Navigated to ListView " + + (params.isEmpty() ? "without params" : "with params " + + params)); removeAllItems(); for (String arg : params.split(",")) { addItem(arg.split("=|$", 2), arg); @@ -49,19 +51,33 @@ public class NavigatorTest extends UI { @Override public void enter(ViewChangeEvent event) { - log.log("Navigated to EditView with params " - + event.getParameters()); - setValue("Displaying edit view with parameters " - + event.getParameters()); + String params = event.getParameters(); + log.log("Navigated to EditView " + + (params.isEmpty() ? "without params" : "with params " + + params)); + setValue("Displaying edit view with parameters " + params); } } + class SpecialCharsView extends Label implements View { + + @Override + public void enter(ViewChangeEvent event) { + log.log("Navigated to SpecialCharsView: " + event.getViewName() + + "; fragment: " + getPage().getUriFragment()); + setValue(event.getViewName()); + } + + } + class DefaultView extends Label implements View { @Override public void enter(ViewChangeEvent event) { - log.log("Navigated to DefaultView with params " - + event.getParameters()); + String params = event.getParameters(); + log.log("Navigated to DefaultView " + + (params.isEmpty() ? "without params" : "with params " + + params)); setValue("Default view: " + event.getParameters()); } } @@ -123,6 +139,7 @@ public class NavigatorTest extends UI { navi.addView("list", new ListView()); navi.addView("edit", new EditView()); + navi.addView("öääö !%&/()=", new SpecialCharsView()); navi.addView("forbidden", new ForbiddenView()); navi.addViewChangeListener(new NaviListener()); @@ -132,6 +149,7 @@ public class NavigatorTest extends UI { layout.addComponent(new NaviButton("list")); layout.addComponent(new NaviButton("edit")); layout.addComponent(new NaviButton("forbidden")); + layout.addComponent(new NaviButton("öääö !%&/()=")); layout.addComponent(params); layout.addComponent(log); -- cgit v1.2.3 From 184114b0881a5323139e5cafd6bd7e5c04afd8e2 Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Fri, 12 Apr 2013 10:35:36 +0000 Subject: Fixed Accordion tab stylenames which never got applied on the tab widgets #11645 (merged from #10605 in 6.8 branch) Change-Id: I6af93e3846ecedd31cb9afac6321316b122c9df5 --- client/src/com/vaadin/client/ui/VAccordion.java | 32 +++++++++++++++++ .../accordion/AccordionTabStylenames.html | 41 ++++++++++++++++++++++ .../accordion/AccordionTabStylenames.java | 32 +++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.html create mode 100644 uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.java (limited to 'client') diff --git a/client/src/com/vaadin/client/ui/VAccordion.java b/client/src/com/vaadin/client/ui/VAccordion.java index 6c4bd06b6d..f87186fe37 100644 --- a/client/src/com/vaadin/client/ui/VAccordion.java +++ b/client/src/com/vaadin/client/ui/VAccordion.java @@ -34,6 +34,7 @@ import com.vaadin.client.Util; import com.vaadin.client.VCaption; import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler; import com.vaadin.shared.ui.tabsheet.TabsheetBaseConstants; +import com.vaadin.shared.ui.tabsheet.TabsheetConstants; public class VAccordion extends VTabsheetBase { @@ -76,6 +77,9 @@ public class VAccordion extends VTabsheetBase { } item.updateCaption(tabUidl); + item.updateTabStyleName(tabUidl + .getStringAttribute(TabsheetConstants.TAB_STYLE_NAME)); + item.setVisible(!hidden); if (selected) { @@ -290,6 +294,7 @@ public class VAccordion extends VTabsheetBase { private boolean open = false; private Element content = DOM.createDiv(); private Element captionNode = DOM.createDiv(); + private String styleName; public StackItem(UIDL tabUidl) { setElement(DOM.createDiv()); @@ -312,6 +317,7 @@ public class VAccordion extends VTabsheetBase { captionNode.removeClassName(getStylePrimaryName() + "-caption"); setStylePrimaryName(primaryStyleName + "-item"); + updateTabStyleName(getStylePrimaryName()); captionNode.addClassName(getStylePrimaryName() + "-caption"); content.addClassName(getStylePrimaryName() + "-content"); @@ -399,6 +405,32 @@ public class VAccordion extends VTabsheetBase { uidl.getStringAttribute(TabsheetBaseConstants.ATTRIBUTE_TAB_ICON)); } + /** + * Updates a tabs stylename from the child UIDL + * + * @param uidl + * The child uidl of the tab + */ + private void updateTabStyleName(String newStyleName) { + if (newStyleName != null && newStyleName.length() != 0) { + if (!newStyleName.equals(styleName)) { + // If we have a new style name + if (styleName != null && styleName.length() != 0) { + // Remove old style name if present + removeStyleDependentName(styleName); + } + // Set new style name + addStyleDependentName(newStyleName); + styleName = newStyleName; + } + } else if (styleName != null) { + // Remove the set stylename if no stylename is present in the + // uidl + removeStyleDependentName(styleName); + styleName = null; + } + } + public int getWidgetWidth() { return DOM.getFirstChild(content).getOffsetWidth(); } diff --git a/uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.html b/uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.html new file mode 100644 index 0000000000..4870777717 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.html @@ -0,0 +1,41 @@ + + + + + + +New Test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
New Test
open/run/com.vaadin.tests.components.accordion.AccordionTabStylenames?restartApplication
assertCSSClassvaadin=runcomvaadintestscomponentsaccordionAccordionTabStylenames::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VAccordion[0]/domChild[0]v-accordion-item-tab0
assertCSSClassvaadin=runcomvaadintestscomponentsaccordionAccordionTabStylenames::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VAccordion[0]/domChild[1]v-accordion-item-tab1
assertCSSClassvaadin=runcomvaadintestscomponentsaccordionAccordionTabStylenames::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VAccordion[0]/domChild[2]v-accordion-item-tab2
assertCSSClassvaadin=runcomvaadintestscomponentsaccordionAccordionTabStylenames::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VAccordion[0]/domChild[3]v-accordion-item-tab3
+ + diff --git a/uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.java b/uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.java new file mode 100644 index 0000000000..1412ae6289 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/accordion/AccordionTabStylenames.java @@ -0,0 +1,32 @@ +package com.vaadin.tests.components.accordion; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Accordion; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet.Tab; + +public class AccordionTabStylenames extends TestBase { + + @Override + protected void setup() { + Accordion acc = new Accordion(); + addComponent(acc); + + for (int tabIndex = 0; tabIndex < 5; tabIndex++) { + Tab tab = acc.addTab(new Label("Tab " + tabIndex)); + tab.setCaption("Tab " + tabIndex); + tab.setStyleName("tab" + tabIndex); + } + } + + @Override + protected String getDescription() { + return null; + } + + @Override + protected Integer getTicketNumber() { + return 10605; + } + +} -- cgit v1.2.3