package org.ovirt.engine.ui.webadmin.widget.tab;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.gwtplatform.mvp.client.Tab;
import com.gwtplatform.mvp.client.TabData;
import com.gwtplatform.mvp.client.TabPanel;
/**
* Base class used to implement tab panel widgets.
* <p>
* Subclasses are free to style the UI, given that they declare:
* <ul>
* <li>{@link #tabContentContainer} widget for displaying tab contents
* </ul>
*/
public abstract class AbstractTabPanel extends Composite implements TabPanel {
@UiField
SimplePanel tabContentContainer;
// List of tabs managed by this tab panel, sorted by tab priority
private final List<TabDefinition> tabList = new ArrayList<TabDefinition>();
private Tab activeTab;
@Override
public Tab addTab(TabData tabData, String historyToken) {
TabDefinition newTab = createNewTab(tabData);
int beforeIndex;
for (beforeIndex = 0; beforeIndex < tabList.size(); ++beforeIndex) {
if (newTab.getPriority() < tabList.get(beforeIndex).getPriority())
break;
}
addTabWidget(newTab.asWidget(), beforeIndex);
tabList.add(beforeIndex, newTab);
newTab.setTargetHistoryToken(historyToken);
newTab.setText(tabData.getLabel());
updateTab(newTab);
return newTab;
}
@Override
public void removeTab(Tab tab) {
removeTabWidget(tab.asWidget());
tabList.remove(tab);
}
@Override
public void removeTabs() {
for (Tab tab : tabList)
removeTabWidget(tab.asWidget());
tabList.clear();
}
@Override
public void setActiveTab(Tab tab) {
if (activeTab != null)
activeTab.deactivate();
if (tab != null)
tab.activate();
activeTab = tab;
}
/**
* Sets a content widget to be displayed for the active tab.
*/
public void setTabContent(Widget content) {
tabContentContainer.clear();
if (content != null)
tabContentContainer.setWidget(content);
}
/**
* Ensures that the specified tab is visible or hidden as it should.
*/
public void updateTab(TabDefinition tab) {
tab.asWidget().setVisible(tab.isAccessible());
}
/**
* Adds a tab widget to this tab panel at the given position.
*/
public abstract void addTabWidget(Widget tabWidget, int index);
/**
* Removes a tab widget from this tab panel.
*/
protected abstract void removeTabWidget(Widget tabWidget);
/**
* Returns a new tab widget based on the given data.
*/
protected abstract TabDefinition createNewTab(TabData tabData);
}