/****************************************************************************** * Copyright (C) 2008 Low Heng Sin * * Copyright (C) 2009 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.adempiere.webui.component.ADTabListModel.ADTabLabel; import org.zkoss.zhtml.Button; import org.zkoss.zhtml.Text; 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; /** * * @author <a href="mailto:hengsin@gmail.com">Low Heng Sin</a> * */ public class ADButtonTabList extends Panel implements IADTabList, EventListener { /** * */ private static final long serialVersionUID = -9203013067784673646L; private List<ADTabLabel> listItems = new ArrayList<ADTabLabel>(); private List<EventListener> listeners = new ArrayList<EventListener>(); private IADTab tabbox; private int selectedIndex = 0; private int tabPlacement = IADTab.LEFT; public ADButtonTabList() { this.setStyle("margin:0;padding:0"); } /** * Set tab placement ( left or right ) * @param tabPlacement */ public void setTabplacement(int tabPlacement) { if (tabPlacement != IADTab.LEFT && tabPlacement != IADTab.RIGHT) return; else if (tabPlacement == this.tabPlacement) return; else { this.tabPlacement = tabPlacement; this.invalidate(); } } public synchronized void refresh() { List<?> childs = getChildren(); int childCount = childs.size(); for (int c = childCount - 1; c >=0; c--) { removeChild((Component) childs.get(c)); } Object[] items = listItems.toArray(); int tabWidth = 100; List<Button> btnList = new ArrayList<Button>(); for (int i = 0; i < items.length; i++) { ADTabLabel tabLabel = (ADTabLabel) items[i]; Button button = new Button(); button.setDynamicProperty("Title", tabLabel.description); Text text = new Text(tabLabel.label); button.appendChild(text); int s = tabbox.getSelectedIndex(); if ( s == i) { button.setSclass("adwindow-navbtn-sel " + (tabPlacement == IADTab.LEFT ? "adwindow-left-navbtn-sel" : "adwindow-right-navbtn-sel")); button.setDynamicProperty("disabled", null); } else { if (!tabbox.canNavigateTo(s, i)) { button.setDynamicProperty("disabled", "disabled"); button.setSclass("adwindow-navbtn-dis " + (tabPlacement == IADTab.LEFT ? "adwindow-left-navbtn-dis" : "adwindow-right-navbtn-dis")); if (!tabbox.isDisplay(i)) button.setVisible(false); else button.setVisible(true); } else { button.setDynamicProperty("disabled", null); button.setSclass("adwindow-navbtn-uns " + (tabPlacement == IADTab.LEFT ? "adwindow-left-navbtn-uns" : "adwindow-right-navbtn-uns")); button.setVisible(true); } } String style = (tabPlacement == IADTab.LEFT ? "margin-left:" : "margin-right:") + (tabLabel.tabLevel*15+5) + "px"; if (button.isVisible()) { int width = tabLabel.label.length() * 10 + 20; if (width > tabWidth) tabWidth = width; } btnList.add(button); button.setStyle(style); button.setParent(this); button.addEventListener(Events.ON_CLICK, this); } //set width if (tabWidth > 190) tabWidth = 190; for (int i = 0; i < items.length; i++) { ADTabLabel tabLabel = (ADTabLabel) items[i]; Button button = btnList.get(i); if (!button.isVisible()) continue; String width = (tabWidth - tabLabel.tabLevel*15)+"px"; button.setStyle(button.getStyle() + "; display: block; width:" + width); } } public int getSelectedIndex() { return selectedIndex; } public void setSelectedIndex(int index) { this.selectedIndex = index; } public synchronized void setItems(List<ADTabLabel> listItems) { this.listItems = listItems; refresh(); } public void setADTab(IADTab adTab) { this.tabbox = adTab; } public void addSelectionEventListener(EventListener listener) { listeners.add(listener); } public boolean removeSelectionEventListener(EventListener listener) { return listeners.remove(listener); } public void onEvent(Event event) throws Exception { Event selectEvent = new Event(Events.ON_SELECT, this); Button button = (Button) event.getTarget(); int i = 0; for (ADTabLabel tabLabel : listItems) { Text text = (Text) button.getFirstChild(); if (tabLabel.label.equals(text.getValue())) { break; } i++; } selectedIndex = i; for (EventListener listener : listeners) { listener.onEvent(selectEvent); } } }