/****************************************************************************** * 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.List; import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.Grid; import org.adempiere.webui.component.GridFactory; import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.Row; import org.adempiere.webui.component.Rows; import org.adempiere.webui.component.Window; import org.adempiere.webui.window.FDialog; import org.compiere.model.GridTab; import org.compiere.model.MTable; import org.compiere.model.PO; import org.compiere.process.DocOptions; import org.compiere.process.DocumentEngine; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; import org.compiere.wf.MWFActivity; 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.Label; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listitem; import org.zkoss.zul.Space; public class WDocActionPanel extends Window implements EventListener { /** * */ private static final long serialVersionUID = -5205192043399137291L; private Label lblDocAction; private Label label; private Listbox lstDocAction; private static GridTab gridTab; private static String[] s_value = null; private static String[] s_name; private static String[] s_description; private String DocStatus; private String DocAction; private int m_AD_Table_ID; private boolean m_OKpressed; private ConfirmPanel confirmPanel; private static final CLogger logger; static { logger = CLogger.getCLogger(WDocActionPanel.class); } public WDocActionPanel(GridTab mgridTab) { gridTab = mgridTab; DocStatus = (String)gridTab.getValue("DocStatus"); DocAction = (String)gridTab.getValue("DocAction"); m_AD_Table_ID = Env.getContextAsInt(Env.getCtx(), gridTab.getWindowNo(), "BaseTable_ID"); readReference(); initComponents(); dynInit(); init(); this.setAttribute("mode","modal"); } /** * Dynamic Init - determine valid DocActions based on DocStatus for the different documents. */ private void dynInit() { // Object Processing = gridTab.getValue("Processing"); String OrderType = Env.getContext(Env.getCtx(), gridTab.getWindowNo(), "OrderType"); String IsSOTrx = Env.getContext(Env.getCtx(), gridTab.getWindowNo(), "IsSOTrx"); if (DocStatus == null) { //message.setText("*** ERROR ***"); return; } logger.fine("DocStatus=" + DocStatus + ", DocAction=" + DocAction + ", OrderType=" + OrderType + ", IsSOTrx=" + IsSOTrx + ", Processing=" + Processing + ", AD_Table_ID=" +gridTab.getAD_Table_ID() + ", Record_ID=" + gridTab.getRecord_ID()); int index = 0; if(lstDocAction.getSelectedItem() != null) { String selected = (lstDocAction.getSelectedItem().getValue()).toString(); for(int i = 0; i < s_value.length && index == 0; i++) { if(s_value[i].equals(selected)) { index = i; } } } String[] options = new String[s_value.length]; /** * Check Existence of Workflow Acrivities */ String wfStatus = MWFActivity.getActiveInfo(Env.getCtx(), m_AD_Table_ID, gridTab.getRecord_ID()); if (wfStatus != null) { FDialog.error(gridTab.getWindowNo(), this, "WFActiveForRecord", wfStatus); return; } // Status Change if (!checkStatus(gridTab.getTableName(), gridTab.getRecord_ID(), DocStatus)) { FDialog.error(gridTab.getWindowNo(), this, "DocumentStatusChanged"); return; } /******************* * General Actions */ String[] docActionHolder = new String[]{DocAction}; index = DocumentEngine.getValidActions(DocStatus, Processing, OrderType, IsSOTrx, m_AD_Table_ID, docActionHolder, options); MTable table = MTable.get(Env.getCtx(), m_AD_Table_ID); PO po = table.getPO(gridTab.getRecord_ID(), null); if (po instanceof DocOptions) index = ((DocOptions) po).customizeValidActions(DocStatus, Processing, OrderType, IsSOTrx, m_AD_Table_ID, docActionHolder, options, index); Integer doctypeId = (Integer)gridTab.getValue("C_DocType_ID"); if(doctypeId==null || doctypeId.intValue()==0){ doctypeId = (Integer)gridTab.getValue("C_DocTypeTarget_ID"); } logger.fine("get doctype: " + doctypeId); if (doctypeId != null) { index = DocumentEngine.checkActionAccess(Env.getAD_Client_ID(Env.getCtx()), Env.getAD_Role_ID(Env.getCtx()), doctypeId, options, index); } DocAction = docActionHolder[0]; /** * Fill actionCombo */ boolean firstadded = true; for (int i = 0; i < index; i++) { // Serach for option and add it boolean added = false; for (int j = 0; j < s_value.length && !added; j++) { if (options[i].equals(s_value[j])) { Listitem newitem = lstDocAction.appendItem(s_name[j],s_value[j]); if (firstadded) { // select by default the first added item - can be changed below lstDocAction.setSelectedItem(newitem); firstadded = false; } added = true; } } } // look if the current DocAction is within the list and assign it as selected if it exists List<Listitem> lst = (List<Listitem>)lstDocAction.getItems(); for(Listitem item: lst) { String value = item.getValue().toString(); if(DocAction.equals(value)) { lstDocAction.setSelectedItem(item); label.setValue(s_description[getSelectedIndex()]); } } // setDefault if (DocAction.equals("--")) // If None, suggest closing DocAction = DocumentEngine.ACTION_Close; } private boolean checkStatus (String TableName, int Record_ID, String DocStatus) { String sql = "SELECT 2 FROM " + TableName + " WHERE " + TableName + "_ID=" + Record_ID + " AND DocStatus='" + DocStatus + "'"; int result = DB.getSQLValue(null, sql); return result == 2; } private void initComponents() { lblDocAction = new Label(); lblDocAction.setId("lblDocAction"); lblDocAction.setValue(Msg.translate(Env.getCtx(), "DocAction")); label = new Label(); label.setId("label"); lstDocAction = new Listbox(); lstDocAction.setId("lstDocAction"); lstDocAction.setRows(0); lstDocAction.setMold("select"); lstDocAction.setWidth("100px"); lstDocAction.addEventListener(Events.ON_SELECT, this); confirmPanel = new ConfirmPanel(true); confirmPanel.addActionListener(Events.ON_CLICK, this); } private void init() { Grid grid = GridFactory.newGridLayout(); grid.setId("grd"); grid.setWidth("400px"); Rows rows = new Rows(); Row rowDocAction = new Row(); Row rowLabel = new Row(); Row rowConfirm = new Row(); Row rowSpacer = new Row(); Panel pnlDocAction = new Panel(); pnlDocAction.appendChild(lblDocAction); pnlDocAction.appendChild(lstDocAction); rowDocAction.appendChild(pnlDocAction); rowDocAction.setAlign("right"); rowLabel.appendChild(label); rowConfirm.appendChild(confirmPanel); rowSpacer.appendChild(new Space()); rows.appendChild(rowDocAction); rows.appendChild(rowLabel); rows.appendChild(rowSpacer); rows.appendChild(rowConfirm); grid.appendChild(rows); this.setTitle(Msg.translate(Env.getCtx(), "DocAction")); this.setWidth("410px"); this.setBorder("normal"); this.appendChild(grid); } /** * Should the process be started? * @return OK pressed */ public boolean isStartProcess() { return m_OKpressed; } // isStartProcess public void onEvent(Event event) { if (Events.ON_CLICK.equals(event.getName())) { if (confirmPanel.getButton("Ok").equals(event.getTarget())) { m_OKpressed = true; setValue(); this.detach(); } else if (confirmPanel.getButton("Cancel").equals(event.getTarget())) { m_OKpressed = false; this.detach(); } } else if (Events.ON_SELECT.equals(event.getName())) { if (lstDocAction.equals(event.getTarget())) { label.setValue(s_description[getSelectedIndex()]); } } } private void setValue() { int index = getSelectedIndex(); // Save Selection logger.config("DocAction=" + s_value[index]); gridTab.setValue("DocAction", s_value[index]); } // save private void readReference() { ArrayList<String> v_value = new ArrayList<String>(); ArrayList<String> v_name = new ArrayList<String>(); ArrayList<String> v_description = new ArrayList<String>(); DocumentEngine.readReferenceList(v_value, v_name, v_description); int size = v_value.size(); s_value = new String[size]; s_name = new String[size]; s_description = new String[size]; for (int i = 0; i < size; i++) { s_value[i] = (String)v_value.get(i); s_name[i] = (String)v_name.get(i); s_description[i] = (String)v_description.get(i); } } // readReference public int getSelectedIndex() { int index = 0; if(lstDocAction.getSelectedItem() != null) { String selected = (lstDocAction.getSelectedItem().getValue()).toString(); for(int i = 0; i < s_value.length && index == 0; i++) { if(s_value[i].equals(selected)) { index = i; break; } } } return index; } // getSelectedIndex public int getNumberOfOptions() { return lstDocAction != null ? lstDocAction.getItemCount() : 0; } }