/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* 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., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.webui.apps.wf;
import java.util.logging.Level;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Textbox;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.event.DialogEvents;
import org.compiere.model.MEntityType;
import org.compiere.model.MQuery;
import org.compiere.model.MSysConfig;
import org.compiere.model.MTable;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.wf.MWFNode;
import org.compiere.wf.MWFNodeNext;
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.Hbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Space;
import org.zkoss.zul.Vbox;
public class WFPopupItem extends Menuitem {
/**
* generated serial id
*/
private static final long serialVersionUID = -8409752634782368108L;
/** Node actions */
public static final int WFPOPUPITEM_DELETENODE = -1;
public static final int WFPOPUPITEM_PROPERTIES = -2;
public static final int WFPOPUPITEM_ZOOM = -3;
private int m_AD_Workflow_ID;
private static final CLogger log = CLogger.getCLogger(WFPopupItem.class);
/**
* Add Line Item
* @param title title
* @param node workflow node
* @param AD_WF_NodeTo_ID if > 0, next workflow node id. if < 0, actions to apply to node
*/
public WFPopupItem (String title, MWFNode node, int AD_WF_NodeTo_ID)
{
super (title);
m_node = node;
m_AD_WF_NodeTo_ID = AD_WF_NodeTo_ID;
m_AD_Workflow_ID = node.getAD_Workflow_ID();
} // WFPopupItem
/**
* Delete Line Item
* @param title title
* @param line line to be deleted
*/
public WFPopupItem (String title, MWFNodeNext line)
{
super (title);
m_line = line;
m_AD_Workflow_ID = line.getAD_WF_Node().getAD_Workflow_ID();
} // WFPopupItem
/** Source Workfklow Node */
private MWFNode m_node;
/** The Line to delete (if {@link #m_AD_WF_NodeTo_ID} = 0) */
private MWFNodeNext m_line;
/**
*
> 0 - next workflow node id
* < 0 - actions to apply to {@link #m_node}
* 0 - to delete {@link #m_node}
*/
private int m_AD_WF_NodeTo_ID;
/**
* Execute action for menu item
* @param wfp WFEditor
*/
public void execute(final WFEditor wfp)
{
// Add Line
if (m_node != null && m_AD_WF_NodeTo_ID > 0)
{
int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx());
MWFNodeNext newLine = new MWFNodeNext(m_node, m_AD_WF_NodeTo_ID);
newLine.setClientOrg(AD_Client_ID, 0);
newLine.setSeqNo(0);
if (AD_Client_ID > 11)
newLine.setEntityType(MSysConfig.getValue(MSysConfig.DEFAULT_ENTITYTYPE, MEntityType.ENTITYTYPE_UserMaintained));
newLine.saveEx();
if (log.isLoggable(Level.INFO))
log.info("Add Line to " + m_node + " -> " + newLine);
wfp.reload(m_AD_Workflow_ID, true);
}
// Edit Properties
else if (m_node != null && m_AD_WF_NodeTo_ID == WFPOPUPITEM_PROPERTIES)
{
editNode(wfp);
}
// Zoom to Node
else if (m_node != null && m_AD_WF_NodeTo_ID == WFPOPUPITEM_ZOOM)
{
int AD_Window_ID = MTable.get(Env.getCtx(), MWFNode.Table_ID).getAD_Window_ID();
if (AD_Window_ID > 0) {
MQuery query = new MQuery();
query.setZoomColumnName("AD_WF_Node_ID");
//remove _ID to get table name
query.setZoomTableName("AD_WF_Node");
query.setZoomValue(m_node.getAD_WF_Node_ID());
query.addRestriction("AD_WF_Node_ID", MQuery.EQUAL, m_node.getAD_WF_Node_ID());
query.setRecordCount(1); // guess
AEnv.zoom(AD_Window_ID, query);
}
}
// Delete Node
else if (m_node != null && m_AD_WF_NodeTo_ID == WFPOPUPITEM_DELETENODE)
{
if (log.isLoggable(Level.INFO))
log.info("Delete Node: " + m_node);
m_node.delete(false);
wfp.reload(m_AD_Workflow_ID, true);
}
// Delete Line
else if (m_line != null)
{
if (log.isLoggable(Level.INFO))
log.info("Delete Line: " + m_line);
m_line.delete(false);
wfp.reload(m_AD_Workflow_ID, true);
}
else
log.warning("No Action??");
} // execute
/**
* Edit node properties
* @param wfp WFEditor
*/
private void editNode(final WFEditor wfp) {
String title = Msg.getMsg(Env.getCtx(), "Properties");
final Window w = new Window();
w.setTitle(title);
Vbox vbox = new Vbox();
w.appendChild(vbox);
vbox.appendChild(new Separator());
// Name
String labelName = Msg.getElement(Env.getCtx(), MWFNode.COLUMNNAME_Name);
Hbox hboxName = new Hbox();
hboxName.appendChild(new Label(labelName));
hboxName.appendChild(new Space());
final Textbox textName = new Textbox(m_node.getName());
hboxName.appendChild(textName);
vbox.appendChild(hboxName);
// Description
String labelDescription = Msg.getElement(Env.getCtx(), MWFNode.COLUMNNAME_Description);
Hbox hboxDescription = new Hbox();
hboxDescription.appendChild(new Label(labelDescription));
hboxDescription.appendChild(new Space());
final Textbox textDescription = new Textbox(m_node.getDescription());
hboxDescription.appendChild(textDescription);
vbox.appendChild(hboxDescription);
//
vbox.appendChild(new Separator());
final ConfirmPanel panel = new ConfirmPanel(true, false, false, false, false, false, false);
vbox.appendChild(panel);
panel.addActionListener(Events.ON_CLICK, new EventListener() {
public void onEvent(Event event) throws Exception {
if (event.getTarget() == panel.getButton(ConfirmPanel.A_CANCEL)) {
textName.setText("");
}
w.onClose();
}
});
w.setBorder("normal");
w.setPage(this.getPage());
w.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
String name = textName.getText();
if (name != null && name.length() > 0)
{
m_node.setName(name);
m_node.setDescription(textDescription.getText());
m_node.saveEx();
wfp.reload(m_AD_Workflow_ID, true);
}
}
});
w.doHighlighted();
}
}