]> source.dussan.org Git - vaadin-framework.git/commitdiff
fixing major issues in client side tabsheets (Widget structure, Paintable unregistering)
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 14 May 2008 11:27:11 +0000 (11:27 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 14 May 2008 11:27:11 +0000 (11:27 +0000)
svn changeset:4476/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

index a21c5e14e6ab3cfed9dc666a81d0068197c46c1a..bd591bd2299c6b189fdcac165b6b0a372b871ff6 100644 (file)
@@ -1,6 +1,9 @@
 package com.itmill.toolkit.terminal.gwt.client.ui;
 
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
@@ -21,13 +24,14 @@ public class IAccordion extends ITabsheetBase implements
 
     public static final String CLASSNAME = "i-accordion";
 
-    private ArrayList stack;
+    private ArrayList stack = new ArrayList();
+
+    private Set paintables = new HashSet();
 
     private String height;
 
     public IAccordion() {
         super(CLASSNAME);
-        stack = new ArrayList();
         // IE6 needs this to calculate offsetHeight correctly
         if (Util.isIE6()) {
             DOM.setStyleAttribute(getElement(), "zoom", "1");
@@ -36,15 +40,9 @@ public class IAccordion extends ITabsheetBase implements
 
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
         super.updateFromUIDL(uidl, client);
-
         iLayout();
     }
 
-    public void clear() {
-        super.clear();
-        stack.clear();
-    }
-
     private StackItem getSelectedStack() {
         if (stack.size() == 0) {
             return null;
@@ -63,7 +61,7 @@ public class IAccordion extends ITabsheetBase implements
         }
 
         stack.add(item);
-        add(item);
+        add(item, getElement());
 
         if (selected) {
             item.open();
@@ -240,10 +238,13 @@ public class IAccordion extends ITabsheetBase implements
             ((Widget) newPntbl).setVisible(true);
             if (getPaintable() == null) {
                 add((Widget) newPntbl, content);
+                paintables.add(newPntbl);
             } else if (getPaintable() != newPntbl) {
                 client.unregisterPaintable((Paintable) getWidget(1));
+                paintables.remove(getWidget(1));
                 remove(1);
                 add((Widget) newPntbl, content);
+                paintables.add(newPntbl);
             }
             paintable = newPntbl;
             paintable.updateFromUIDL(contentUidl, client);
@@ -254,4 +255,13 @@ public class IAccordion extends ITabsheetBase implements
         }
     }
 
+    protected void clearPaintables() {
+        stack.clear();
+        clear();
+    }
+
+    protected Iterator getPaintableIterator() {
+        return paintables.iterator();
+    }
+
 }
index 5f7ae863491a45d9ae1abe8d78e660cb1812df9e..273b00676ea145ce39c92d7b786db9e984660a27 100644 (file)
@@ -4,6 +4,8 @@
 
 package com.itmill.toolkit.terminal.gwt.client.ui;
 
+import java.util.Iterator;
+
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.DeferredCommand;
@@ -93,18 +95,17 @@ public class ITabsheet extends ITabsheetBase implements
                         + "-content");
         DOM.setElementProperty(deco, "className", CLASSNAME + "-deco");
 
-        add(tb);
+        add(tb, getElement());
         DOM.appendChild(getElement(), contentNode);
-        insert(tp, contentNode, 0, true);
+        add(tp, contentNode);
         DOM.appendChild(getElement(), deco);
 
         tb.addTabListener(tl);
 
-        clear();
-
         // TODO Use for Safari only. Fix annoying 1px first cell in TabBar.
         DOM.setStyleAttribute(DOM.getFirstChild(DOM.getFirstChild(DOM
                 .getFirstChild(tb.getElement()))), "display", "none");
+
     }
 
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -168,48 +169,30 @@ public class ITabsheet extends ITabsheetBase implements
     }
 
     private void renderContent(final UIDL contentUIDL) {
-        DeferredCommand.addCommand(new Command() {
-            public void execute() {
-                final Paintable content = client.getPaintable(contentUIDL);
-                if (tp.getWidgetCount() > activeTabIndex) {
-                    Widget old = tp.getWidget(activeTabIndex);
-                    if (old != content) {
-                        tp.remove(activeTabIndex);
-                        if (old instanceof Paintable) {
-                            client.unregisterPaintable((Paintable) old);
-                        }
-                        tp.insert((Widget) content, activeTabIndex);
-                    }
-                } else {
-                    tp.add((Widget) content);
-                }
-
-                tp.showWidget(activeTabIndex);
-
-                ITabsheet.this.iLayout();
-                (content).updateFromUIDL(contentUIDL, client);
-                ITabsheet.this.removeStyleDependentName("loading");
-                if (previousVisibleWidget != null) {
-                    DOM.setStyleAttribute(previousVisibleWidget.getElement(),
-                            "visibility", "");
-                    previousVisibleWidget = null;
+        final Paintable content = client.getPaintable(contentUIDL);
+        if (tp.getWidgetCount() > activeTabIndex) {
+            Widget old = tp.getWidget(activeTabIndex);
+            if (old != content) {
+                tp.remove(activeTabIndex);
+                if (old instanceof Paintable) {
+                    client.unregisterPaintable((Paintable) old);
                 }
+                tp.insert((Widget) content, activeTabIndex);
             }
-        });
-    }
-
-    public void clear() {
-        int i = tb.getTabCount();
-        while (i > 0) {
-            tb.removeTab(--i);
+        } else {
+            tp.add((Widget) content);
         }
-        tp.clear();
 
-        // Get rid of unnecessary 100% cell heights in TabBar (really ugly hack)
-        final Element tr = DOM.getChild(DOM.getChild(tb.getElement(), 0), 0);
-        final Element rest = DOM.getChild(DOM.getChild(tr, DOM
-                .getChildCount(tr) - 1), 0);
-        DOM.removeElementAttribute(rest, "style");
+        tp.showWidget(activeTabIndex);
+
+        ITabsheet.this.iLayout();
+        (content).updateFromUIDL(contentUIDL, client);
+        ITabsheet.this.removeStyleDependentName("loading");
+        if (previousVisibleWidget != null) {
+            DOM.setStyleAttribute(previousVisibleWidget.getElement(),
+                    "visibility", "");
+            previousVisibleWidget = null;
+        }
     }
 
     public void setHeight(String height) {
@@ -261,4 +244,24 @@ public class ITabsheet extends ITabsheetBase implements
         }
         Util.runDescendentsLayout(this);
     }
+
+    protected void clearPaintables() {
+
+        int i = tb.getTabCount();
+        while (i > 0) {
+            tb.removeTab(--i);
+        }
+        tp.clear();
+
+        // Get rid of unnecessary 100% cell heights in TabBar (really ugly hack)
+        final Element tr = DOM.getChild(DOM.getChild(tb.getElement(), 0), 0);
+        final Element rest = DOM.getChild(DOM.getChild(tr, DOM
+                .getChildCount(tr) - 1), 0);
+        DOM.removeElementAttribute(rest, "style");
+
+    }
+
+    protected Iterator getPaintableIterator() {
+        return tp.iterator();
+    }
 }
index c5a9f6130b930b4a113fe07bf9d2d666f988f37f..05a77cfaf2858a5f754b1e991a75b2545d0b7720 100644 (file)
@@ -5,13 +5,14 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.DOM;
+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.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 
-abstract class ITabsheetBase extends FlowPanel implements Paintable {
+abstract class ITabsheetBase extends ComplexPanel implements Paintable {
 
     String id;
     ApplicationConnection client;
@@ -24,6 +25,7 @@ abstract class ITabsheetBase extends FlowPanel implements Paintable {
     protected Set disabledTabKeys = new HashSet();
 
     public ITabsheetBase(String classname) {
+        setElement(DOM.createDiv());
         setStylePrimaryName(classname);
     }
 
@@ -61,11 +63,18 @@ abstract class ITabsheetBase extends FlowPanel implements Paintable {
                 index++;
             }
         } else {
+
+            ArrayList oldPaintables = new ArrayList();
+            for (Iterator iterator = getPaintableIterator(); iterator.hasNext();) {
+                oldPaintables.add(iterator.next());
+            }
+
             // Clear previous values
             tabKeys.clear();
             captions.clear();
             disabledTabKeys.clear();
-            clear();
+
+            clearPaintables();
 
             int index = 0;
             for (final Iterator it = tabs.getChildIterator(); it.hasNext();) {
@@ -87,13 +96,35 @@ abstract class ITabsheetBase extends FlowPanel implements Paintable {
                 if (selected) {
                     activeTabIndex = index;
                 }
+                if (tab.getChildCount() > 0) {
+                    Paintable p = client.getPaintable(tab.getChildUIDL(0));
+                    oldPaintables.remove(p);
+                }
                 renderTab(tab, index, selected);
                 index++;
             }
+
+            for (Iterator iterator = oldPaintables.iterator(); iterator
+                    .hasNext();) {
+                Object oldPaintable = iterator.next();
+                if (oldPaintable instanceof Paintable) {
+                    client.unregisterPaintable((Paintable) oldPaintable);
+                }
+            }
         }
 
     }
 
+    /**
+     * @return a list of currently shown Paintables
+     */
+    abstract protected Iterator getPaintableIterator();
+
+    /**
+     * Clears current tabs and contents
+     */
+    abstract protected void clearPaintables();
+
     protected boolean keepCurrentTabs(UIDL uidl) {
         final UIDL tabs = uidl.getChildUIDL(0);
         boolean retval = tabKeys.size() == tabs.getNumberOfChildren();
@@ -109,14 +140,14 @@ abstract class ITabsheetBase extends FlowPanel implements Paintable {
         return retval;
     }
 
-    /*
+    /**
      * Implement in extending classes. This method should render needed elements
      * and set the visibility of the tab according to the 'selected' parameter.
      */
     protected abstract void renderTab(final UIDL tabUidl, int index,
             boolean selected);
 
-    /*
+    /**
      * Implement in extending classes. This method should render any previously
      * non-cached content and set the activeTabIndex property to the specified
      * index.