/******************************************************************************
* Product: Posterita Ajax UI *
* Copyright (C) 2007 Posterita Ltd. All Rights Reserved. *
* 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. *
* For the text or an alternative of this public license, you may reach us *
* Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius *
* or via info@posterita.org or http://www.posterita.org/ *
*****************************************************************************/
package org.adempiere.webui.panel;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.event.MenuListener;
import org.adempiere.webui.exception.ApplicationException;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.util.TreeUtils;
import org.compiere.model.MTree;
import org.compiere.model.MTreeNode;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;
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.zul.Panel;
import org.zkoss.zul.Panelchildren;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Tree;
import org.zkoss.zul.Treechildren;
import org.zkoss.zul.Treecol;
import org.zkoss.zul.Treecols;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Treerow;
/**
*
* @author <a href="mailto:agramdass@gmail.com">Ashley G Ramdass</a>
* @date Feb 25, 2007
* @version $Revision: 0.10 $
*/
public class MenuPanel extends Panel implements EventListener
{
/**
*
*/
private static final long serialVersionUID = -593280866781665891L;
private Properties ctx;
private TreeSearchPanel pnlSearch;
private Tree menuTree;
private ArrayList<MenuListener> menuListeners = new ArrayList<MenuListener>();
private Checkbox chkExpand; // Elaine 2009/02/27 - expand tree
public MenuPanel()
{
ctx = Env.getCtx();
int adRoleId = Env.getAD_Role_ID(ctx);
int adTreeId = getTreeId(ctx, adRoleId);
MTree mTree = new MTree(ctx, adTreeId, false, true, null);
if(mTree == null)
{
throw new ApplicationException("Could not load menu tree");
}
MTreeNode rootNode = mTree.getRoot();
init();
initMenu(rootNode);
pnlSearch.initialise();
}
private void init()
{
this.setWidth("100%");
this.setHeight("100%");
menuTree = new Tree();
menuTree.setMultiple(false);
menuTree.setId("mnuMain");
menuTree.setWidth("100%");
menuTree.setVflex(true);
menuTree.setFixedLayout(false);
menuTree.setPageSize(-1); // Due to bug in the new paging functionality
menuTree.setStyle("border: none");
pnlSearch = new TreeSearchPanel(menuTree);
Toolbar toolbar = new Toolbar();
toolbar.appendChild(pnlSearch);
this.appendChild(toolbar);
Panelchildren pc = new Panelchildren();
this.appendChild(pc);
pc.appendChild(menuTree);
// Elaine 2009/02/27 - expand tree
toolbar = new Toolbar();
chkExpand = new Checkbox();
chkExpand.setText(Msg.getMsg(Env.getCtx(), "ExpandTree"));
chkExpand.addEventListener(Events.ON_CHECK, this);
toolbar.appendChild(chkExpand);
this.appendChild(toolbar);
}
private void initMenu(MTreeNode rootNode)
{
Treecols treeCols = new Treecols();
Treecol treeCol = new Treecol();
Treechildren rootTreeChildren = new Treechildren();
generateMenu(rootTreeChildren, rootNode);
treeCols.appendChild(treeCol);
menuTree.appendChild(treeCols);
menuTree.appendChild(rootTreeChildren);
}
private int getTreeId(Properties ctx, int adRoleId)
{
int AD_Tree_ID = DB.getSQLValue(null,
"SELECT COALESCE(r.AD_Tree_Menu_ID, ci.AD_Tree_Menu_ID)"
+ "FROM AD_ClientInfo ci"
+ " INNER JOIN AD_Role r ON (ci.AD_Client_ID=r.AD_Client_ID) "
+ "WHERE AD_Role_ID=?", adRoleId);
if (AD_Tree_ID <= 0)
AD_Tree_ID = 10; // Menu
return AD_Tree_ID;
}
private void generateMenu(Treechildren treeChildren, MTreeNode mNode)
{
Enumeration<?> nodeEnum = mNode.children();
while(nodeEnum.hasMoreElements())
{
MTreeNode mChildNode = (MTreeNode)nodeEnum.nextElement();
Treeitem treeitem = new Treeitem();
treeChildren.appendChild(treeitem);
treeitem.setLabel(mChildNode.getName());
treeitem.setTooltiptext(mChildNode.getDescription());
if(mChildNode.getChildCount() != 0)
{
treeitem.setOpen(false);
Treechildren treeItemChildren = new Treechildren();
generateMenu(treeItemChildren, mChildNode);
if(treeItemChildren.getChildren().size() != 0)
treeitem.appendChild(treeItemChildren);
treeitem.getTreerow().addEventListener(Events.ON_CLICK, this);
}
else
{
treeitem.setValue(String.valueOf(mChildNode.getNode_ID()));
if (mChildNode.isReport())
treeitem.setImage("/images/mReport.png");
else if (mChildNode.isProcess() || mChildNode.isTask())
treeitem.setImage("/images/mProcess.png");
else if (mChildNode.isWorkFlow())
treeitem.setImage("/images/mWorkFlow.png");
else
treeitem.setImage("/images/mWindow.png");
treeitem.getTreerow().setDraggable("favourite"); // Elaine 2008/07/24
treeitem.getTreerow().addEventListener(Events.ON_CLICK, this);
}
}
}
public void addMenuListener(MenuListener menuListener)
{
menuListeners.add(menuListener);
}
public void removeMenuListener(MenuListener menuListener)
{
menuListeners.remove(menuListener);
}
public void onEvent(Event event)
{
Component comp = event.getTarget();
String eventName = event.getName();
if (eventName.equals(Events.ON_CLICK))
{
if (comp instanceof Treerow)
{
Treeitem selectedItem = (Treeitem) comp.getParent();
if(selectedItem.getValue() != null)
{
fireMenuSelectedEvent(selectedItem);
}
else
{
selectedItem.setOpen(!selectedItem.isOpen());
}
}
}
// Elaine 2009/02/27 - expand tree
else if (eventName.equals(Events.ON_CHECK) && event.getTarget() == chkExpand)
{
expandOnCheck();
}
//
}
protected void fireMenuSelectedEvent(Treeitem selectedItem) {
int nodeId = Integer.parseInt((String)selectedItem.getValue());
try
{
/*Iterator<MenuListener> menuListenersIter = menuListeners.iterator();
while(menuListenersIter.hasNext())
{
menuListenersIter.next().onMenuSelected(nodeId);
menuTree.setSelectedItem(null);
}*/
SessionManager.getAppDesktop().onMenuSelected(nodeId);
}
catch (Exception e)
{
throw new ApplicationException(e.getMessage(), e);
}
}
public Tree getMenuTree()
{
return menuTree;
}
/**
* expand all node
*/
public void expandAll()
{
if (!chkExpand.isChecked())
chkExpand.setChecked(true);
TreeUtils.expandAll(menuTree);
}
/**
* collapse all node
*/
public void collapseAll()
{
if (chkExpand.isChecked())
chkExpand.setChecked(false);
TreeUtils.collapseAll(menuTree);
}
/**
* On check event for the expand checkbox
*/
private void expandOnCheck()
{
if (chkExpand.isChecked())
expandAll();
else
collapseAll();
}
//
}