From: Artur Signell Date: Mon, 8 Dec 2008 12:46:38 +0000 (+0000) Subject: Extended test case and fix for #2289 - Client does not remove removed tabs from TabSh... X-Git-Tag: 6.7.0.beta1~3641 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=374ba866f7e5325da40998f223e23f393bf4663f;p=vaadin-framework.git Extended test case and fix for #2289 - Client does not remove removed tabs from TabSheet/Accordion svn changeset:6117/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java index c303914e3c..571b0f1159 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java @@ -547,4 +547,15 @@ public class IAccordion extends ITabsheetBase implements return renderSpace; } + @Override + protected int getTabCount() { + return stack.size(); + } + + @Override + protected void removeTab(int index) { + StackItem item = stack.get(index); + remove(item); + } + } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java index f78c2ca638..22d3b915be 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java @@ -88,7 +88,23 @@ public class ITabsheet extends ITabsheetBase { } public void removeTab(int i) { - remove(i); + Widget w = getWidget(i); + if (w == null) { + return; + } + + Element caption = w.getElement(); + Element div = DOM.getParent(caption); + Element td = DOM.getParent(div); + Element tr = DOM.getParent(td); + remove(w); + + /* + * Widget is the Caption but we want to remove everything up to and + * including the parent TD + */ + + DOM.removeChild(tr, td); } @Override @@ -349,7 +365,11 @@ public class ITabsheet extends ITabsheetBase { String width = style.getProperty("width"); style.setProperty("width", tabsWidth + "px"); // Get content width from actual widget - int contentWidth = tp.getWidget(tp.getVisibleWidget()).getOffsetWidth(); + + int contentWidth = 0; + if (tp.getWidgetCount() > 0) { + contentWidth = tp.getWidget(tp.getVisibleWidget()).getOffsetWidth(); + } style.setProperty("width", width); style.setProperty("overflow", overflow); @@ -675,4 +695,22 @@ public class ITabsheet extends ITabsheetBase { // All tabs have equal amount of space allocated return renderSpace; } + + @Override + protected int getTabCount() { + return tb.getWidgetCount(); + } + + @Override + protected void removeTab(int index) { + tb.removeTab(index); + /* + * This must be checked because renderTab automatically removes the + * active tab content when it changes + */ + if (tp.getWidgetCount() > index) { + tp.remove(index); + } + } + } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java index 0e4774dfc0..d6cb534577 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java @@ -78,6 +78,11 @@ abstract class ITabsheetBase extends ComplexPanel implements Container { index++; } + int tabCount = getTabCount(); + while (tabCount-- > index) { + removeTab(index); + } + for (Iterator iterator = oldPaintables.iterator(); iterator.hasNext();) { Object oldPaintable = iterator.next(); if (oldPaintable instanceof Paintable) { @@ -115,4 +120,15 @@ abstract class ITabsheetBase extends ComplexPanel implements Container { */ protected abstract void selectTab(int index, final UIDL contentUidl); + /** + * Implement in extending classes. This method should return the number of + * tabs currently rendered. + */ + protected abstract int getTabCount(); + + /** + * Implement in extending classes. This method should remove the rendered + * tab with the specified index. + */ + protected abstract void removeTab(int index); } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java index b430dc5a4a..9f268b3689 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java @@ -8,6 +8,7 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Util; /** @@ -72,8 +73,8 @@ public class ITabsheetPanel extends ComplexPanel { */ public void insert(Widget w, int beforeIndex) { Element el = createContainerElement(); - DOM.insertChild(getElement(), el, beforeIndex); super.insert(w, el, beforeIndex, false); + DOM.insertChild(getElement(), el, beforeIndex); } @Override diff --git a/src/com/itmill/toolkit/tests/tickets/Ticket2289.java b/src/com/itmill/toolkit/tests/tickets/Ticket2289.java index 886c9e882a..10e1fba679 100644 --- a/src/com/itmill/toolkit/tests/tickets/Ticket2289.java +++ b/src/com/itmill/toolkit/tests/tickets/Ticket2289.java @@ -1,55 +1,89 @@ package com.itmill.toolkit.tests.tickets; import com.itmill.toolkit.Application; +import com.itmill.toolkit.ui.Accordion; import com.itmill.toolkit.ui.Button; +import com.itmill.toolkit.ui.Component; import com.itmill.toolkit.ui.CustomComponent; +import com.itmill.toolkit.ui.HorizontalLayout; import com.itmill.toolkit.ui.Label; -import com.itmill.toolkit.ui.OrderedLayout; import com.itmill.toolkit.ui.TabSheet; +import com.itmill.toolkit.ui.VerticalLayout; import com.itmill.toolkit.ui.Window; import com.itmill.toolkit.ui.Button.ClickEvent; -import com.itmill.toolkit.ui.Button.ClickListener; public class Ticket2289 extends Application { - TabSheet ts; + TabSheet ts = null; + Accordion acc = null; public void init() { Window w = new Window(); setMainWindow(w); - OrderedLayout ol = new OrderedLayout(); + VerticalLayout ol = new VerticalLayout(); w.setLayout(ol); - - w - .addComponent(new Label( - "When one tab is removed by clicking 'close a tab', client side get's mixed up.")); - - Button b = new Button("close a tab"); - b.addListener(new ClickListener() { - - @Override + Button b = new Button("close current tab"); + b.addListener(new Button.ClickListener() { public void buttonClick(ClickEvent event) { closeCurrentTab(); } + }); + ol.addComponent(b); + b = new Button("close first tab"); + b.addListener(new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + closeFirstTab(); + + } }); + ol.addComponent(b); ts = new TabSheet(); - + ts.setSizeUndefined(); + ts.setWidth("300px"); ts.addTab(new MyTab("tab one"), "Caption1", null); ts.addTab(new MyTab("tab two"), "Caption2", null); ts.addTab(new MyTab("tab three"), "Caption3", null); ts.addTab(new MyTab("tab four"), "Caption4", null); - ol.addComponent(ts); + ts.addTab(new MyTab("tab five"), "Caption5", null); + + acc = new Accordion(); + acc.setSizeUndefined(); + acc.addTab(new MyTab("tab one"), "Caption1", null); + acc.addTab(new MyTab("tab two"), "Caption2", null); + acc.addTab(new MyTab("tab three"), "Caption3", null); + acc.addTab(new MyTab("tab four"), "Caption4", null); + + ol.addComponent(acc); + ts = null; + // ol.addComponent(ts); } private void closeCurrentTab() { - MyTab m = (MyTab) ts.getSelectedTab(); - if (m != null) { - ts.removeComponent(m); + if (ts != null) { + MyTab m = (MyTab) ts.getSelectedTab(); + if (m != null) { + ts.removeComponent(m); + } + } + if (acc != null) { + MyTab m = (MyTab) acc.getSelectedTab(); + if (m != null) { + acc.removeComponent(m); + } + } + } + + private void closeFirstTab() { + if (ts != null) { + ts.removeComponent((Component) ts.getComponentIterator().next()); + } + if (acc != null) { + acc.removeComponent((Component) acc.getComponentIterator().next()); } } @@ -57,7 +91,8 @@ public class Ticket2289 extends Application { class MyTab extends CustomComponent { public MyTab(String text) { - OrderedLayout ol = new OrderedLayout(); + setSizeUndefined(); + HorizontalLayout ol = new HorizontalLayout(); setCompositionRoot(ol); ol.addComponent(new Label(text)); }