/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 2007 Adempiere, Inc. 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. *
*
* Copyright (C) 2007 Low Heng Sin hengsin@avantz.com
* _____________________________________________
*****************************************************************************/
package org.adempiere.webui.apps;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.VerticalBox;
import org.adempiere.webui.component.Window;
import org.compiere.apps.ProcessCtl;
import org.compiere.apps.ProcessDialog;
import org.compiere.process.ProcessInfo;
import org.compiere.util.ASyncProcess;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.zkoss.zk.au.out.AuEcho;
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.zk.ui.util.Clients;
import org.zkoss.zul.Div;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Html;
/**
*
* Modal Dialog to Start process.
* Displays information about the process
* and lets the user decide to start it
* and displays results (optionally print them).
* Calls ProcessCtl to execute.
* @author Low Heng Sin
* @author arboleda - globalqss
* - Implement ShowHelp option on processes and reports
*/
public class ProcessModalDialog extends Window implements EventListener
{
/**
* generated serial version ID
*/
private static final long serialVersionUID = -7109707014309321369L;
private boolean m_autoStart;
private VerticalBox dialogBody;
/**
* @param aProcess
* @param WindowNo
* @param pi
* @param autoStart
*/
public ProcessModalDialog(ASyncProcess aProcess, int WindowNo, ProcessInfo pi, boolean autoStart)
{
m_ctx = Env.getCtx();
m_ASyncProcess = aProcess;
m_WindowNo = WindowNo;
m_pi = pi;
m_autoStart = autoStart;
log.info("Process=" + pi.getAD_Process_ID());
try
{
initComponents();
init();
}
catch(Exception ex)
{
log.log(Level.SEVERE, "", ex);
}
}
/**
* Dialog to start a process/report
* @param ctx
* @param aProcess
* @param WindowNo
* @param AD_Process_ID
* @param tableId
* @param recordId
* @param autoStart
*/
public ProcessModalDialog ( ASyncProcess aProcess, int WindowNo, int AD_Process_ID, int tableId, int recordId, boolean autoStart)
{
this(aProcess, WindowNo, new ProcessInfo("", AD_Process_ID, tableId, recordId), autoStart);
}
/**
* Dialog to start a process/report
* @param ctx
* @param parent not used
* @param title not used
* @param aProcess
* @param WindowNo
* @param AD_Process_ID
* @param tableId
* @param recordId
* @param autoStart
* @deprecated
*/
public ProcessModalDialog (Window parent, String title,
ASyncProcess aProcess, int WindowNo, int AD_Process_ID,
int tableId, int recordId, boolean autoStart)
{
this(aProcess, WindowNo, AD_Process_ID, tableId, recordId, autoStart);
} // ProcessDialog
private void initComponents() {
this.setBorder("normal");
dialogBody = new VerticalBox();
Div div = new Div();
message = new Html();
div.appendChild(message);
div.setStyle("max-height: 150pt; overflow: auto;");
dialogBody.appendChild(div);
centerPanel = new Panel();
dialogBody.appendChild(centerPanel);
div = new Div();
div.setAlign("right");
Hbox hbox = new Hbox();
Button btn = new Button("Ok");
LayoutUtils.addSclass("action-text-button", btn);
btn.setId("Ok");
btn.addEventListener(Events.ON_CLICK, this);
hbox.appendChild(btn);
btn = new Button("Cancel");
btn.setId("Cancel");
LayoutUtils.addSclass("action-text-button", btn);
btn.addEventListener(Events.ON_CLICK, this);
hbox.appendChild(btn);
div.appendChild(hbox);
dialogBody.appendChild(div);
this.appendChild(dialogBody);
}
private ASyncProcess m_ASyncProcess;
private int m_WindowNo;
private Properties m_ctx;
private String m_Name = null;
private StringBuffer m_messageText = new StringBuffer();
private String m_ShowHelp = null; // Determine if a Help Process Window is shown
private boolean m_valid = true;
private Panel centerPanel = null;
private Html message = null;
/** Logger */
private static CLogger log = CLogger.getCLogger(ProcessDialog.class);
//
private ProcessParameterPanel parameterPanel = null;
private ProcessInfo m_pi = null;
private BusyDialog progressWindow;
/**
* Set Visible
* (set focus to OK if visible)
* @param visible true if visible
*/
public boolean setVisible (boolean visible)
{
return super.setVisible(visible);
} // setVisible
/**
* Dispose
*/
public void dispose()
{
parameterPanel.restoreContext();
m_valid = false;
this.detach();
} // dispose
/**
* is dialog still valid
* @return boolean
*/
public boolean isValid()
{
return m_valid;
}
/**
* Dynamic Init
* @return true, if there is something to process (start from menu)
*/
public boolean init()
{
log.config("");
//
boolean trl = !Env.isBaseLanguage(m_ctx, "AD_Process");
String sql = "SELECT Name, Description, Help, IsReport, ShowHelp "
+ "FROM AD_Process "
+ "WHERE AD_Process_ID=?";
if (trl)
sql = "SELECT t.Name, t.Description, t.Help, p.IsReport, p.ShowHelp "
+ "FROM AD_Process p, AD_Process_Trl t "
+ "WHERE p.AD_Process_ID=t.AD_Process_ID"
+ " AND p.AD_Process_ID=? AND t.AD_Language=?";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, m_pi.getAD_Process_ID());
if (trl)
pstmt.setString(2, Env.getAD_Language(m_ctx));
rs = pstmt.executeQuery();
if (rs.next())
{
m_Name = rs.getString(1);
m_ShowHelp = rs.getString(5);
//
m_messageText.append("<b>");
String s = rs.getString(2); // Description
if (rs.wasNull())
m_messageText.append(Msg.getMsg(m_ctx, "StartProcess?"));
else
m_messageText.append(s);
m_messageText.append("</b>");
s = rs.getString(3); // Help
if (!rs.wasNull())
m_messageText.append("<p>").append(s).append("</p>");
}
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
return false;
}
finally
{
DB.close(rs, pstmt);
}
if (m_Name == null)
return false;
//
this.setTitle(m_Name);
message.setContent(m_messageText.toString());
// Move from APanel.actionButton
m_pi.setAD_User_ID (Env.getAD_User_ID(Env.getCtx()));
m_pi.setAD_Client_ID(Env.getAD_Client_ID(Env.getCtx()));
m_pi.setTitle(m_Name);
parameterPanel = new ProcessParameterPanel(m_WindowNo, m_pi);
centerPanel.getChildren().clear();
if ( parameterPanel.init() ) {
centerPanel.appendChild(parameterPanel);
} else {
if (m_ShowHelp != null && m_ShowHelp.equals("N")) {
m_autoStart = true;
}
if (m_autoStart) {
this.getFirstChild().setVisible(false);
startProcess();
return true;
}
}
// Check if the process is a silent one
if(isValid() && m_ShowHelp != null && m_ShowHelp.equals("S"))
{
this.getFirstChild().setVisible(false);
startProcess();
}
return true;
} // init
/**
* launch process
*/
private void startProcess()
{
m_pi.setPrintPreview(true);
if (m_ASyncProcess != null) {
m_ASyncProcess.lockUI(m_pi);
Clients.showBusy(null, false);
}
showBusyDialog();
//use echo, otherwise lock ui wouldn't work
Clients.response(new AuEcho(this, "runProcess", null));
}
private void showBusyDialog() {
this.setBorder("none");
this.setTitle(null);
dialogBody.setVisible(false);
progressWindow = new BusyDialog();
this.appendChild(progressWindow);
}
/**
* internal use, don't call this directly
*/
public void runProcess() {
try {
ProcessCtl.process(null, m_WindowNo, parameterPanel, m_pi, null);
} finally {
dispose();
if (m_ASyncProcess != null) {
m_ASyncProcess.unlockUI(m_pi);
}
hideBusyDialog();
}
}
private void hideBusyDialog() {
if (progressWindow != null) {
progressWindow.dispose();
progressWindow = null;
}
}
/**
* handle events
*/
public void onEvent(Event event) {
Component component = event.getTarget();
if (component instanceof Button) {
Button element = (Button)component;
if ("Ok".equalsIgnoreCase(element.getId())) {
this.startProcess();
} else if ("Cancel".equalsIgnoreCase(element.getId())) {
this.dispose();
}
}
}
} // ProcessDialog