}
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
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);
// 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++;
}
+ int tabCount = getTabCount();
+ while (tabCount-- > index) {
+ removeTab(index);
+ }
+
for (Iterator iterator = oldPaintables.iterator(); iterator.hasNext();) {
Object oldPaintable = iterator.next();
if (oldPaintable instanceof Paintable) {
*/
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);
}
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
*/\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
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());
}
}
class MyTab extends CustomComponent {
public MyTab(String text) {
- OrderedLayout ol = new OrderedLayout();
+ setSizeUndefined();
+ HorizontalLayout ol = new HorizontalLayout();
setCompositionRoot(ol);
ol.addComponent(new Label(text));
}