/* Bandbox.java
{{IS_NOTE
Purpose:
Description:
History:
Mon Mar 20 12:14:46 2006, Created by tomyeh
}}IS_NOTE
Copyright (C) 2006 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
}}IS_RIGHT
*/
package org.zkoss.zul;
import org.zkoss.zk.au.out.AuInvoke;
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.zk.ui.event.OpenEvent;
/**
* A band box. A bank box consists of an input box ({@link Textbox} and
* a popup window {@link Bandpopup}.
* It is similar to {@link Combobox} except the popup window could have
* any kind of children. For example, you could place a textbox in
* the popup to let user search particular items.
*
* <p>Default {@link #getZclass}: z-bandbox.(since 3.5.0)
*
* <p>Events: onOpen<br/>
* Developers can listen to the onOpen event and initializes it
* when {@link org.zkoss.zk.ui.event.OpenEvent#isOpen} is true, and/or
* clean up if false.
*
* <p>Note: to have better performance, onOpen is sent only if
* a non-deferrable event listener is registered
* (see {@link org.zkoss.zk.ui.event.Deferrable}).
*
* @author tomyeh
*/
public class Bandbox extends Textbox {
private boolean _autodrop, _btnVisible = true, _open;
private String _popupWidth;
static {
addClientEvent(Bandbox.class, Events.ON_OPEN, CE_DUPLICATE_IGNORE);
}
public Bandbox() {
}
public Bandbox(String value) throws WrongValueException {
this();
setValue(value);
}
/** Returns the dropdown window belonging to this band box.
*/
public Bandpopup getDropdown() {
return (Bandpopup) getFirstChild();
}
/** Returns whether to automatically drop the list if users is changing
* this text box.
* <p>Default: false.
*/
public boolean isAutodrop() {
return _autodrop;
}
/** Sets whether to automatically drop the list if users is changing
* this text box.
*/
public void setAutodrop(boolean autodrop) {
if (_autodrop != autodrop) {
_autodrop = autodrop;
smartUpdate("autodrop", autodrop);
}
}
/** Returns whether the button (on the right of the textbox) is visible.
* <p>Default: true.
*/
public boolean isButtonVisible() {
return _btnVisible;
}
/** Sets whether the button (on the right of the textbox) is visible.
*/
public void setButtonVisible(boolean visible) {
if (_btnVisible != visible) {
_btnVisible = visible;
smartUpdate("buttonVisible", visible);
}
}
/** Returns whether this bandbox is open.
*
* <p>Default: false.
* @since 6.0.0
*/
public boolean isOpen() {
return _open;
}
/** Drops down or closes the child.
* only works while visible
* @since 3.0.1
* @see #open
* @see #close
*/
public void setOpen(boolean open) {
if (_open != open) {
_open = open;
if (isVisible()) {
if (open)
open();
else
close();
}
}
}
/** Drops down the child.
* The same as setOpen(true).
*
* @since 3.0.1
*/
public void open() {
response("open", new AuInvoke(this, "setOpen", true), -1000); //don't use smartUpdate
}
/** Closes the child if it was dropped down.
* The same as setOpen(false).
*
* @since 3.0.1
*/
public void close() {
response("open", new AuInvoke(this, "setOpen", false), -1000); //don't use smartUpdate
}
/**
* Bandbox can't be enabled the multiline functionality.
*/
public void setMultiline(boolean multiline) {
if (multiline)
throw new UnsupportedOperationException("Bandbox doesn't support multiline");
}
/**
* Bandbox can't be enabled the rows functionality.
*/
public void setRows(int rows) {
if (rows != 1)
throw new UnsupportedOperationException("Bandbox doesn't support multiple rows, " + rows);
}
// super
public String getZclass() {
return _zclass == null ? "z-bandbox" : _zclass;
}
protected void renderProperties(org.zkoss.zk.ui.sys.ContentRenderer renderer) throws java.io.IOException {
super.renderProperties(renderer);
render(renderer, "autodrop", _autodrop);
if (!_btnVisible)
renderer.render("buttonVisible", false);
if (_popupWidth != null)
renderer.render("popupWidth", _popupWidth);
}
/** Processes an AU request.
*
* <p>Default: in addition to what are handled by {@link Textbox#service},
* it also handles onOpen and onSelect.
* @since 5.0.0
*/
public void service(org.zkoss.zk.au.AuRequest request, boolean everError) {
final String cmd = request.getCommand();
if (cmd.equals(Events.ON_OPEN)) {
OpenEvent evt = OpenEvent.getOpenEvent(request);
_open = evt.isOpen();
Events.postEvent(evt);
} else
super.service(request, everError);
}
//-- Component --//
public void beforeChildAdded(Component newChild, Component refChild) {
if (!(newChild instanceof Bandpopup))
throw new UiException("Unsupported child for Bandbox: " + newChild);
if (getFirstChild() != null)
throw new UiException("At most one bandpopup is allowed, " + this);
super.beforeChildAdded(newChild, refChild);
}
/** Childable. */
protected boolean isChildable() {
return true;
}
/**
* @return the width of the popup of this component
* @since 8.0.3
*/
public String getPopupWidth() {
return _popupWidth;
}
/**
* Sets the width of the popup of this component.
* If the input is a percentage, the popup width will be calculated by multiplying the width of this component with the percentage.
* (e.g. if the input string is 130%, and the width of this component is 300px, the popup width will be 390px = 300px * 130%)
* Others will be set directly.
* @param popupWidth the width of the popup of this component
* @since 8.0.3
*/
public void setPopupWidth(String popupWidth) {
if (popupWidth != _popupWidth) {
_popupWidth = popupWidth;
smartUpdate("popupWidth", popupWidth);
}
}
}