From a68344764d982dc96e27d9b098d3dcefe6987bd1 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Wed, 14 May 2008 11:27:11 +0000 Subject: [PATCH] fixing major issues in client side tabsheets (Widget structure, Paintable unregistering) svn changeset:4476/svn branch:trunk --- .../terminal/gwt/client/ui/IAccordion.java | 28 ++++-- .../terminal/gwt/client/ui/ITabsheet.java | 87 ++++++++++--------- .../terminal/gwt/client/ui/ITabsheetBase.java | 41 +++++++-- 3 files changed, 100 insertions(+), 56 deletions(-) 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 a21c5e14e6..bd591bd229 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java @@ -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(); + } + } 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 5f7ae86349..273b00676e 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java @@ -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(); + } } 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 c5a9f6130b..05a77cfaf2 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheetBase.java @@ -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. -- 2.39.5