/* Tabs.java
Purpose:
Description:
History:
Tue Jul 12 10:43:14 2005, Created by tomyeh
Copyright (C) 2005 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
This program is distributed under LGPL Version 2.1 in the hope that
it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.zul;
import java.util.Iterator;
import org.zkoss.lang.Objects;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.impl.XulElement;
/**
* A collection of tabs ({@link Tab}).
*
* <p>Default {@link #getZclass}: z-tabs. (since 3.5.2)
* @author tomyeh
*/
public class Tabs extends XulElement {
private String _align = "start";
/** Returns the tabbox owns this component.
* <p>It is the same as {@link #getParent}.
*/
public Tabbox getTabbox() {
return (Tabbox) getParent();
}
public String getWidth() {
String width = super.getWidth();
Tabbox tabbox = getTabbox();
if (width == null && tabbox != null && tabbox.isVertical())
width = "50px";
return width;
}
/** Returns the alignment of tab.
* Reserved for future extension; not supported yet.
* @since 3.0.0
*/
public String getAlign() {
return _align;
}
/** Sets the alignment of tab.
* Reserved for future extension; not supported yet.
* <p>Default: "start".
* @param align must be "start" or "center" or "end".
* @since 3.0.0
*/
public void setAlign(String align) throws WrongValueException {
if (!"start".equals(align) && !"center".equals(align) && !"end".equals(align))
throw new WrongValueException(align);
if (!Objects.equals(_align, align)) {
_align = align;
smartUpdate("align", _align);
}
}
public void invalidate() {
Tabbox tbox = getTabbox();
if (tbox != null && tbox.isVertical())
tbox.invalidate();
else
super.invalidate();
}
public String getZclass() {
return _zclass == null ? "z-tabs" : _zclass;
}
//-- Component --//
public void beforeParentChanged(Component parent) {
if (parent != null && !(parent instanceof Tabbox))
throw new UiException("Wrong parent: " + parent);
super.beforeParentChanged(parent);
}
public void beforeChildAdded(Component child, Component refChild) {
if (!(child instanceof Tab))
throw new UiException("Unsupported child for tabs: " + child);
super.beforeChildAdded(child, refChild);
}
public boolean insertBefore(Component child, Component refChild) {
boolean sel = getChildren().isEmpty(), desel = false;
final Tab newtab = (Tab) child;
if (!sel && newtab.isSelected()) {
if (newtab.getTabbox() != null) // B65-ZK-1597
newtab.setSelected(false); //reset it
else
newtab.setSelectedDirectly(false); //turn off first
sel = desel = true; //turn on later
}
if (super.insertBefore(child, refChild)) {
final Tabbox tabbox = getTabbox();
if (sel)
if (tabbox != null) {
if (tabbox.getModel() == null || tabbox.getSelectableModel().isSelectionEmpty())
tabbox.setSelectedTab(newtab);
} else {
newtab.setSelectedDirectly(true);
if (desel)
for (Iterator<Component> it = getChildren().iterator(); it.hasNext();) {
final Tab tab = (Tab) it.next();
if (tab != newtab && tab.isSelected()) {
tab.setSelectedDirectly(false);
break;
}
}
}
return true;
}
return false;
}
public void onChildRemoved(Component child) {
super.onChildRemoved(child);
final Tabbox tabbox = getTabbox();
if (tabbox != null) {
Tab tab = (Tab) child;
tab.removeEventListener(Events.ON_SELECT, tabbox._listener);
if (tabbox.getSelectedTab() == tab) {
tabbox.clearSelectedTab();
}
}
}
public void onChildAdded(Component child) {
super.onChildAdded(child);
final Tabbox tabbox = getTabbox();
if (tabbox != null)
((Tab) child).addEventListener(Events.ON_SELECT, tabbox._listener);
}
protected void renderProperties(org.zkoss.zk.ui.sys.ContentRenderer renderer) throws java.io.IOException {
super.renderProperties(renderer);
if (!"start".equals(_align))
render(renderer, "align", _align);
}
}