/******************************************************************************
* Copyright (C) 2008 Elaine Tan *
* 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.dashboard;
import java.util.Enumeration;
import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.session.SessionManager;
import org.compiere.model.MTree;
import org.compiere.model.MTreeNode;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.DropEvent;
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.Box;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.Panel;
import org.zkoss.zul.Panelchildren;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Treerow;
import org.zkoss.zul.Vbox;
/**
* Dashboard item: User favourites
* @author Elaine
* @date November 20, 2008
*/
public class DPFavourites extends DashboardPanel implements EventListener {
/**
*
*/
private static final long serialVersionUID = -481859785800845108L;
public static final String FAVOURITE_DROPPABLE = "favourite";
public static final String DELETE_FAV_DROPPABLE = "deleteFav";
private Box bxFav;
private Label lblMsg;
private int m_AD_Tree_ID;
public DPFavourites()
{
super();
Panel panel = new Panel();
this.appendChild(panel);
Panelchildren favContent = new Panelchildren();
panel.appendChild(favContent);
favContent.appendChild(createFavouritesPanel());
Toolbar favToolbar = new Toolbar();
this.appendChild(favToolbar);
// Elaine 2008/07/24
Image img = new Image("/images/Delete24.png");
favToolbar.appendChild(img);
img.setAlign("right");
img.setDroppable(DELETE_FAV_DROPPABLE);
img.addEventListener(Events.ON_DROP, this);
//
favContent.setDroppable(FAVOURITE_DROPPABLE);
favContent.addEventListener(Events.ON_DROP, this);
}
private Box createFavouritesPanel()
{
bxFav = new Vbox();
int AD_Role_ID = Env.getAD_Role_ID(Env.getCtx());
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=?", AD_Role_ID);
if (AD_Tree_ID <= 0)
AD_Tree_ID = 10; // Menu
m_AD_Tree_ID = AD_Tree_ID;
MTree vTree = new MTree(Env.getCtx(), AD_Tree_ID, false, true, null);
MTreeNode m_root = vTree.getRoot();
Enumeration enTop = m_root.children();
while(enTop.hasMoreElements())
{
MTreeNode ndTop = (MTreeNode)enTop.nextElement();
Enumeration en = ndTop.preorderEnumeration();
while (en.hasMoreElements())
{
MTreeNode nd = (MTreeNode)en.nextElement();
if (nd.isOnBar()) {
String label = nd.toString().trim();
ToolBarButton btnFavItem = new ToolBarButton(String.valueOf(nd.getNode_ID()));
btnFavItem.setLabel(label);
btnFavItem.setImage(getIconFile(nd));
btnFavItem.setDraggable(DELETE_FAV_DROPPABLE);
btnFavItem.addEventListener(Events.ON_CLICK, this);
btnFavItem.addEventListener(Events.ON_DROP, this);
bxFav.appendChild(btnFavItem);
}
}
}
lblMsg = new Label("(Drag and drop menu item here)");
if(bxFav.getChildren().isEmpty()) bxFav.appendChild(lblMsg);
return bxFav;
}
/**
* Make Bar add/remove persistent
* @param add true if add - otherwise remove
* @param Node_ID Node ID
* @return true if updated
*/
private boolean barDBupdate(boolean add, int Node_ID)
{
int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx());
int AD_Org_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Org_ID");
int AD_User_ID = Env.getContextAsInt(Env.getCtx(), "#AD_User_ID");
StringBuffer sql = new StringBuffer();
if (add)
sql.append("INSERT INTO AD_TreeBar "
+ "(AD_Tree_ID,AD_User_ID,Node_ID, "
+ "AD_Client_ID,AD_Org_ID, "
+ "IsActive,Created,CreatedBy,Updated,UpdatedBy)VALUES (")
.append(m_AD_Tree_ID).append(",").append(AD_User_ID).append(",").append(Node_ID).append(",")
.append(AD_Client_ID).append(",").append(AD_Org_ID).append(",")
.append("'Y',SysDate,").append(AD_User_ID).append(",SysDate,").append(AD_User_ID).append(")");
// if already exist, will result in ORA-00001: unique constraint (ADEMPIERE.AD_TREEBAR_KEY)
else
sql.append("DELETE AD_TreeBar WHERE AD_Tree_ID=").append(m_AD_Tree_ID)
.append(" AND AD_User_ID=").append(AD_User_ID)
.append(" AND Node_ID=").append(Node_ID);
int no = DB.executeUpdate(sql.toString(), false, null);
return no == 1;
}
public void onEvent(Event event)
{
Component comp = event.getTarget();
String eventName = event.getName();
if(eventName.equals(Events.ON_CLICK))
{
if(comp instanceof ToolBarButton)
{
ToolBarButton btn = (ToolBarButton) comp;
int menuId = 0;
try
{
menuId = Integer.valueOf(btn.getName());
}
catch (Exception e) {
}
if(menuId > 0) SessionManager.getAppDesktop().onMenuSelected(menuId);
}
}
// Elaine 2008/07/24
else if(eventName.equals(Events.ON_DROP))
{
DropEvent de = (DropEvent) event;
Component dragged = de.getDragged();
if(comp instanceof Panelchildren)
{
if(dragged instanceof Treerow)
{
Treerow treerow = (Treerow) dragged;
Treeitem treeitem = (Treeitem) treerow.getParent();
addItem(treeitem);
}
}
else if(comp instanceof Image)
{
if(dragged instanceof ToolBarButton)
{
ToolBarButton btn = (ToolBarButton) dragged;
removeLink(btn);
}
}
}
//
}
private void removeLink(ToolBarButton btn) {
String value = btn.getName();
if(value != null)
{
int Node_ID = Integer.valueOf(value.toString());
if(barDBupdate(false, Node_ID))
{
bxFav.removeChild(btn);
if(bxFav.getChildren().isEmpty())
bxFav.appendChild(lblMsg);
bxFav.invalidate();
}
}
}
/**
* Add menu treeitem into the user favorite panel
* @param treeitem
*/
public void addItem(Treeitem treeitem) {
Object value = treeitem.getValue();
if(value != null)
{
int Node_ID = Integer.valueOf(value.toString());
if(barDBupdate(true, Node_ID))
{
String label = treeitem.getLabel().trim();
ToolBarButton btnFavItem = new ToolBarButton(String.valueOf(Node_ID));
btnFavItem.setLabel(label);
btnFavItem.setImage(treeitem.getImage());
btnFavItem.setDraggable(DELETE_FAV_DROPPABLE);
btnFavItem.addEventListener(Events.ON_CLICK, this);
btnFavItem.addEventListener(Events.ON_DROP, this);
bxFav.appendChild(btnFavItem);
bxFav.removeChild(lblMsg);
bxFav.invalidate();
}
}
}
private String getIconFile(MTreeNode mt) {
if (mt.isWindow())
return "images/mWindow.png";
if (mt.isReport())
return "images/mReport.png";
if (mt.isProcess())
return "images/mProcess.png";
if (mt.isWorkFlow())
return "images/mWorkFlow.png";
return "images/mWindow.png";
}
}