]> source.dussan.org Git - vaadin-framework.git/commitdiff
Extended test case and fix for #2289 - Client does not remove removed tabs from TabSh...
authorArtur Signell <artur.signell@itmill.com>
Mon, 8 Dec 2008 12:46:38 +0000 (12:46 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 8 Dec 2008 12:46:38 +0000 (12:46 +0000)
svn changeset:6117/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetPanel.java
src/com/itmill/toolkit/tests/tickets/Ticket2289.java

index c303914e3c7862562510a45512990752b5d6bf6c..571b0f115985c4794e13f67416089726ad895b73 100644 (file)
@@ -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);
+    }
+
 }
index f78c2ca63899e163d8315008afd1abdeb3eaffa8..22d3b915be0e7a2b9714d956ba0d279c61f40ff6 100644 (file)
@@ -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);
+        }
+    }
+
 }
index 0e4774dfc0452ff698f3f2179fcecb3b9992c348..d6cb53457744cc942d84bc92329ad4ba92cc2e2e 100644 (file)
@@ -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);
 }
index b430dc5a4ab9be8f2df85f880f8530005d232de4..9f268b368913e539b197d184b7bbce80f4148d1b 100644 (file)
@@ -8,6 +8,7 @@ import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;\r
 import com.google.gwt.user.client.ui.ComplexPanel;\r
 import com.google.gwt.user.client.ui.Widget;\r
+import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;\r
 import com.itmill.toolkit.terminal.gwt.client.Util;\r
 \r
 /**\r
@@ -72,8 +73,8 @@ public class ITabsheetPanel extends ComplexPanel {
      */\r
     public void insert(Widget w, int beforeIndex) {\r
         Element el = createContainerElement();\r
-        DOM.insertChild(getElement(), el, beforeIndex);\r
         super.insert(w, el, beforeIndex, false);\r
+        DOM.insertChild(getElement(), el, beforeIndex);\r
     }\r
 \r
     @Override\r
index 886c9e882ab107bb3e0c0d7e5a9025d66d4341ee..10e1fba6792907a8545da6de8ad941e1fe3c8406 100644 (file)
@@ -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));
     }