package org.ovirt.engine.ui.common.widget.dialog.tab;
import java.util.ArrayList;
import java.util.List;
import org.gwtbootstrap3.client.ui.NavTabs;
import org.gwtbootstrap3.client.ui.TabContent;
import org.gwtbootstrap3.client.ui.TabListItem;
import org.gwtbootstrap3.client.ui.TabPane;
import org.gwtbootstrap3.client.ui.TabPanel;
import org.gwtbootstrap3.client.ui.constants.Styles;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiChild;
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class DialogTabPanel extends Composite {
interface WidgetUiBinder extends UiBinder<Widget, DialogTabPanel> {
WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
}
interface DialogTabStyle extends CssResource {
String headerSeparator();
}
@UiField
DialogTabStyle style;
@UiField
NavTabs navTabs;
@UiField
TabContent tabContent;
@UiField
TabPanel tabPanel;
@UiField
FlowPanel tabContainer;
@UiField
SimplePanel tabHeaderContainer;
private TabListItem activeTab;
private final String height;
@UiConstructor
public DialogTabPanel(String height) {
this.height = height;
initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
removeTabClasses();
}
@UiChild(tagname = "header", limit = 1)
public void setHeader(Widget widget) {
tabHeaderContainer.getElement().getStyle().setDisplay(Display.BLOCK);
tabHeaderContainer.setWidget(widget);
tabHeaderContainer.addStyleName(style.headerSeparator());
}
@UiChild(tagname = "tab")
public void addTab(final DialogTab tab) {
navTabs.add(tab.getTabListItem());
tab.getTabListItem().addStyleName(Styles.LIST_GROUP_ITEM);
String tabId = "tab" + navTabs.getWidgetCount(); //$NON-NLS-1$
tab.getTabListItem().setDataTarget(tabId);
tab.getTabListItem().addShownHandler(event -> switchTab(event.getTab()));
TabPane pane = new TabPane();
FlowPanel panel = new FlowPanel();
panel.add(tab.getContent());
pane.add(panel);
pane.setId(tabId);
tabContent.add(pane);
// Switch to first tab automatically
if (tabContent.getWidgetCount() == 1) {
switchTab(tab);
}
}
private void removeTabClasses() {
tabPanel.removeStyleName(Styles.TABBABLE);
navTabs.removeStyleName(Styles.NAV);
navTabs.removeStyleName(Styles.NAV_TABS);
}
public void setBarStyle(String styleName) {
tabContainer.addStyleName(styleName);
}
public FlowPanel getBar() {
return tabContainer;
}
public void setContentStyle(String styleName) {
tabContent.addStyleName(styleName);
}
public void setNavStyle(String styleName) {
navTabs.addStyleName(styleName);
}
public void switchTab(DialogTab tab) {
switchTab(tab.getTabListItem());
}
public void switchTab(TabListItem tabItem) {
boolean found = false;
for (int i = 0; i < navTabs.getWidgetCount(); i++) {
if (tabItem.getText().equals(((TabListItem) navTabs.getWidget(i)).getText())) {
((TabListItem) navTabs.getWidget(i)).showTab();
TabPane tabPane = (TabPane) tabContent.getWidget(i);
((FlowPanel) tabPane.getWidget(0)).insert(tabHeaderContainer, 0);
tabPane.getWidget(0).setHeight(height);
tabPane.setActive(true);
activeTab = (TabListItem) navTabs.getWidget(i);
found = true;
} else {
TabPane tabPane = (TabPane) tabContent.getWidget(i);
((FlowPanel) tabPane.getWidget(0)).remove(tabHeaderContainer);
tabPane.setActive(false);
}
}
// If not found, set first active.
if (!found && navTabs.getWidgetCount() > 0) {
((TabListItem) navTabs.getWidget(0)).showTab();
TabPane tabPane = (TabPane) tabContent.getWidget(0);
((FlowPanel) tabPane.getWidget(0)).insert(tabHeaderContainer, 0);
tabPane.setActive(true);
}
}
public TabListItem getActiveTab() {
return activeTab;
}
public void setHeaderVisible(boolean visible) {
if (visible) {
tabHeaderContainer.getElement().getStyle().setDisplay(Display.BLOCK);
} else {
tabHeaderContainer.getElement().getStyle().setDisplay(Display.NONE);
}
}
public List<OvirtTabListItem> getTabs() {
List<OvirtTabListItem> tabs = new ArrayList<>();
for (int i = 0; i < navTabs.getWidgetCount(); i++) {
Widget tab = navTabs.getWidget(i);
if (tab instanceof OvirtTabListItem) {
tabs.add((OvirtTabListItem) tab);
}
}
return tabs;
}
}