/******************************************************************************
* Copyright (C) 2008 Low Heng Sin *
* Copyright (C) 2008 Idalica Corporation *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.adempiere.webui.component;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.North;
import org.zkoss.zkex.zul.South;
import org.zkoss.zul.Div;
import org.zkoss.zul.Vbox;
/**
* A custom accoridon implementation using borderlayout
* @author hengsin
*
*/
public class Accordion extends Borderlayout implements EventListener {
private static final long serialVersionUID = 5898232602746332810L;
private Vbox southBox;
private Vbox northBox;
private List<String> labelList = new ArrayList<String>();
private List<Div> headerList = new ArrayList<Div>();
private List<Component> componentList = new ArrayList<Component>();
private int selectedIndex = -1;
public Accordion() {
North north = new North();
appendChild(north);
northBox = new Vbox();
northBox.setWidth("100%");
north.appendChild(northBox);
north.setSplittable(false);
north.setCollapsible(false);
Center center = new Center();
center.setFlex(true);
appendChild(new Center());
South south = new South();
appendChild(south);
southBox = new Vbox();
southBox.setWidth("100%");
south.appendChild(southBox);
south.setSplittable(false);
south.setCollapsible(false);
}
/**
*
* @param component
* @param label
*/
public void add(Component component, String label) {
ToolBarButton button = new ToolBarButton();
button.setLabel(label);
button.addEventListener(Events.ON_CLICK, this);
button.setWidth("100%");
Div div = new Div();
div.setClass("z-center-header");
div.appendChild(button);
northBox.appendChild(div);
labelList.add(label);
headerList.add(div);
componentList.add(component);
}
/**
*
* @param index
* @param label
*/
public void setLabel(int index, String label) {
labelList.set(index, label);
((ToolBarButton)headerList.get(index).getFirstChild()).setLabel(label);
if (selectedIndex == index) {
getCenter().setTitle(label);
}
}
public void onEvent(Event event) throws Exception {
if (Events.ON_CLICK.equals(event.getName()) && event.getTarget() instanceof ToolBarButton) {
ToolBarButton button = (ToolBarButton) event.getTarget();
String label = button.getLabel();
int index = labelList.indexOf(label);
if (index >= 0) {
setSelectedIndex(index);
}
}
}
/**
*
* @param index
*/
public void setSelectedIndex(int index) {
selectedIndex = index;
render(index);
}
private void render(int index) {
northBox.getChildren().clear();
southBox.getChildren().clear();
getCenter().getChildren().clear();
for (int i = 0; i < index; i++) {
northBox.appendChild(headerList.get(i));
}
getCenter().setTitle(labelList.get(index));
getCenter().appendChild(componentList.get(index));
for (int i = index + 1; i < labelList.size(); i++) {
southBox.appendChild(headerList.get(i));
}
this.invalidate();
}
/**
* @param index
* @param tooltiptext
*/
public void setTooltiptext(int index, String tooltiptext) {
headerList.get(index).setTooltiptext(tooltiptext);
}
/**
* Get the header div component
* @param index
* @return Div
*/
public Div getHeader(int index) {
return headerList.get(index);
}
}