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;
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");
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;
}
stack.add(item);
- add(item);
+ add(item, getElement());
if (selected) {
item.open();
((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);
}
}
+ protected void clearPaintables() {
+ stack.clear();
+ clear();
+ }
+
+ protected Iterator getPaintableIterator() {
+ return paintables.iterator();
+ }
+
}
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;
+ "-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) {
}
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) {
}
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();
+ }
}
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;
protected Set disabledTabKeys = new HashSet();
public ITabsheetBase(String classname) {
+ setElement(DOM.createDiv());
setStylePrimaryName(classname);
}
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();) {
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();
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.