package org.ovirt.engine.ui.webadmin.widget.tab; import org.ovirt.engine.ui.webadmin.widget.Align; import com.google.gwt.dom.client.Element; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.Panel; import com.gwtplatform.mvp.client.TabData; /** * Base class used to implement tab widgets. * <p> * Subclasses are free to style the UI, given that they declare: * <ul> * <li>{@link #tabContainer} widget which wraps the tab content * <li>{@link #leftElement} that represents the left corner of the tab * <li>{@link #rightElement} that represents the right corner of the tab * <li>{@link #middleElement} that represents the middle area of the tab * <li>{@link #arrowElement} that represents the arrow area of the tab * <li>{@link #hyperlink} widget used to select (activate) the given tab * <li>{@link #style} with required CSS classes * </ul> */ public abstract class AbstractTab extends Composite implements TabDefinition { protected interface Style extends CssResource { String activeLeft(); String inactiveLeft(); String activeRight(); String inactiveRight(); String activeMiddle(); String inactiveMiddle(); String activeMiddleLink(); String inactiveMiddleLink(); String activeArrow(); String inactiveArrow(); String alignLeft(); String alignRight(); } @UiField Panel tabContainer; @UiField Element leftElement; @UiField Element rightElement; @UiField Element middleElement; @UiField Element arrowElement; @UiField Hyperlink hyperlink; @UiField Style style; private final float priority; private final AbstractTabPanel tabPanel; private boolean accessible; public AbstractTab(TabData tabData, AbstractTabPanel tabPanel) { this.priority = tabData.getPriority(); this.tabPanel = tabPanel; this.accessible = true; } @Override public void activate() { leftElement.replaceClassName(style.inactiveLeft(), style.activeLeft()); rightElement.replaceClassName(style.inactiveRight(), style.activeRight()); middleElement.replaceClassName(style.inactiveMiddle(), style.activeMiddle()); hyperlink.getElement().replaceClassName(style.inactiveMiddleLink(), style.activeMiddleLink()); arrowElement.replaceClassName(style.inactiveArrow(), style.activeArrow()); } @Override public void deactivate() { leftElement.replaceClassName(style.activeLeft(), style.inactiveLeft()); rightElement.replaceClassName(style.activeRight(), style.inactiveRight()); middleElement.replaceClassName(style.activeMiddle(), style.inactiveMiddle()); hyperlink.getElement().replaceClassName(style.activeMiddleLink(), style.inactiveMiddleLink()); arrowElement.replaceClassName(style.activeArrow(), style.inactiveArrow()); } @Override public float getPriority() { return priority; } @Override public String getText() { return hyperlink.getText(); } @Override public void setTargetHistoryToken(String historyToken) { hyperlink.setTargetHistoryToken(historyToken); } @Override public void setText(String text) { hyperlink.setText(text); } @Override public boolean isAccessible() { return accessible; } @Override public void setAccessible(boolean accessible) { this.accessible = accessible; tabPanel.updateTab(this); } @Override public void setAlign(Align align) { if (align == Align.RIGHT) { tabContainer.removeStyleName(style.alignLeft()); tabContainer.addStyleName(style.alignRight()); } else { tabContainer.removeStyleName(style.alignRight()); tabContainer.addStyleName(style.alignLeft()); } } }