diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/Callback.java b/org.adempiere.base/src/org/adempiere/util/Callback.java similarity index 97% rename from org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/Callback.java rename to org.adempiere.base/src/org/adempiere/util/Callback.java index 2ef7c9ee13..85c035e7c6 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/Callback.java +++ b/org.adempiere.base/src/org/adempiere/util/Callback.java @@ -11,7 +11,7 @@ * 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.util; +package org.adempiere.util; /** * diff --git a/org.adempiere.base/src/org/adempiere/util/IProcessMonitor.java b/org.adempiere.base/src/org/adempiere/util/IProcessMonitor.java deleted file mode 100644 index b2cd750e65..0000000000 --- a/org.adempiere.base/src/org/adempiere/util/IProcessMonitor.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.adempiere.util; - -import org.compiere.process.ProcessInfo; - -public interface IProcessMonitor { - - /** - * Lock User Interface. - * Called from the Worker before processing - * @param pi process info - */ - public void lockUI (ProcessInfo pi); - - /** - * Unlock User Interface. - * Called from the Worker when processing is done - * @param pi process info - */ - public void unlockUI (ProcessInfo pi); - - /** - * Is the UI locked - * @return true, if UI is locked - */ - public boolean isUILocked(); - - /** - * - * @param message - */ - public void statusUpdate(String message); - -} diff --git a/org.adempiere.base/src/org/adempiere/util/IProcessUI.java b/org.adempiere.base/src/org/adempiere/util/IProcessUI.java new file mode 100644 index 0000000000..be37203357 --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/util/IProcessUI.java @@ -0,0 +1,86 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * 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.util; + +import java.io.File; + +import org.compiere.process.ProcessInfo; + +/** + * + * @author hengsin + * + */ +public interface IProcessUI { + + /** + * Lock User Interface. + * Called from the Worker before processing + * @param pi process info + */ + public void lockUI (ProcessInfo pi); + + /** + * Unlock User Interface. + * Called from the Worker when processing is done + * @param pi process info + */ + public void unlockUI (ProcessInfo pi); + + /** + * Is the UI locked + * @return true, if UI is locked + */ + public boolean isUILocked(); + + /** + * Provide status feedback to user + * @param message + */ + public void statusUpdate(String message); + + /** + * Prompt for user input. + * + * Example Usage in process: + *
+	 * 	    final StringBuffer answer = new StringBuffer();
+	 *		aProcessMonitor.ask(adMessage, new Callback() {				
+	 *			@Override
+	 *			public void onCallback(String result) {
+	 *				answer.append(result != null ? result : "-");
+	 *			}
+	 *		});
+	 *      
+	 *      //wait for answer		
+	 *		while (answer.length() == 0) {
+	 *			try {
+	 *				Thread.sleep(200);
+	 *			} catch (InterruptedException e) {}
+	 *		}
+	 *
+	 *      //process answer from user
+	 *      ...
+	 * 
+ * @param message + * @param callback + */ + public void ask(String message, Callback callback); + + /** + * add to list of file available for download after process end + * @param file + */ + public void download(File file); +} diff --git a/org.adempiere.base/src/org/adempiere/util/ProcessUtil.java b/org.adempiere.base/src/org/adempiere/util/ProcessUtil.java index 06543c68f9..af9a200138 100644 --- a/org.adempiere.base/src/org/adempiere/util/ProcessUtil.java +++ b/org.adempiere.base/src/org/adempiere/util/ProcessUtil.java @@ -144,7 +144,7 @@ public final class ProcessUtil { * @param managedTrx false if trx is managed by caller * @return boolean */ - public static boolean startJavaProcess(Properties ctx, ProcessInfo pi, Trx trx, boolean managedTrx, IProcessMonitor processMonitor) { + public static boolean startJavaProcess(Properties ctx, ProcessInfo pi, Trx trx, boolean managedTrx, IProcessUI processMonitor) { String className = pi.getClassName(); if (className == null) { MProcess proc = new MProcess(ctx, pi.getAD_Process_ID(), trx.getTrxName()); @@ -208,14 +208,14 @@ public final class ProcessUtil { boolean success = false; try { - process.setProcessMonitor(processMonitor); + process.setProcessUI(processMonitor); success = process.startProcess(ctx, pi, trx); if (success && trx != null && managedTrx) { trx.commit(true); } } - catch (Exception e) + catch (Throwable e) { pi.setSummary (Msg.getMsg(Env.getCtx(), "ProcessError") + " " + e.getLocalizedMessage(), true); log.log(Level.SEVERE, pi.getClassName(), e); diff --git a/org.adempiere.base/src/org/compiere/process/ProcessCall.java b/org.adempiere.base/src/org/compiere/process/ProcessCall.java index cddeaf08fd..33611cc38d 100644 --- a/org.adempiere.base/src/org/compiere/process/ProcessCall.java +++ b/org.adempiere.base/src/org/compiere/process/ProcessCall.java @@ -18,7 +18,7 @@ package org.compiere.process; import java.util.Properties; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.util.Trx; /** @@ -49,6 +49,6 @@ public interface ProcessCall /** * @param processMonitor */ - public void setProcessMonitor(IProcessMonitor processMonitor); + public void setProcessUI(IProcessUI processUI); } // ProcessCall diff --git a/org.adempiere.base/src/org/compiere/process/SvrProcess.java b/org.adempiere.base/src/org/compiere/process/SvrProcess.java index c9af9566cd..73b1a9a457 100644 --- a/org.adempiere.base/src/org/compiere/process/SvrProcess.java +++ b/org.adempiere.base/src/org/compiere/process/SvrProcess.java @@ -25,7 +25,7 @@ import java.sql.Timestamp; import java.util.Properties; import java.util.logging.Level; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.model.MPInstance; import org.compiere.model.PO; import org.compiere.util.CLogger; @@ -52,7 +52,7 @@ import org.compiere.util.Trx; public abstract class SvrProcess implements ProcessCall { public static final String PROCESS_INFO_CTX_KEY = "ProcessInfo"; - public static final String PROCESS_MONITOR_CTX_KEY = "ProcessMonitor"; + public static final String PROCESS_UI_CTX_KEY = "ProcessUI"; /** * Server Process. @@ -75,7 +75,7 @@ public abstract class SvrProcess implements ProcessCall private PO m_lockedObject = null; /** Process Main transaction */ private Trx m_trx; - private IProcessMonitor processMonitor; + protected IProcessUI processUI; /** Common Error Message */ protected static String MSG_SaveErrorRowNotFound = "@SaveErrorRowNotFound@"; @@ -111,14 +111,14 @@ public abstract class SvrProcess implements ProcessCall try { m_ctx.put(PROCESS_INFO_CTX_KEY, m_pi); - if (processMonitor != null) - m_ctx.put(PROCESS_MONITOR_CTX_KEY, processMonitor); + if (processUI != null) + m_ctx.put(PROCESS_UI_CTX_KEY, processUI); success = process(); } finally { m_ctx.remove(PROCESS_INFO_CTX_KEY); - m_ctx.remove(PROCESS_MONITOR_CTX_KEY); + m_ctx.remove(PROCESS_UI_CTX_KEY); if (localTrx) { if (success) @@ -536,9 +536,9 @@ public abstract class SvrProcess implements ProcessCall } // get_TrxName @Override - public void setProcessMonitor(IProcessMonitor monitor) + public void setProcessUI(IProcessUI monitor) { - processMonitor = monitor; + processUI = monitor; } /** @@ -547,9 +547,9 @@ public abstract class SvrProcess implements ProcessCall */ protected void statusUpdate(String message) { - if (processMonitor != null) + if (processUI != null) { - processMonitor.statusUpdate(message); + processUI.statusUpdate(message); } } } // SvrProcess diff --git a/org.adempiere.base/src/org/compiere/util/ASyncProcess.java b/org.adempiere.base/src/org/compiere/util/ASyncProcess.java index 601d44daa3..8f9cc68651 100644 --- a/org.adempiere.base/src/org/compiere/util/ASyncProcess.java +++ b/org.adempiere.base/src/org/compiere/util/ASyncProcess.java @@ -16,7 +16,7 @@ *****************************************************************************/ package org.compiere.util; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.process.ProcessInfo; /** @@ -38,7 +38,7 @@ import org.compiere.process.ProcessInfo; * @version $Id: ASyncProcess.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $ * @deprecated */ -public interface ASyncProcess extends IProcessMonitor +public interface ASyncProcess extends IProcessUI { /** * Method to be executed async. diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java index b10291b569..a5e009d032 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo2/PackOutProcess.java @@ -97,17 +97,10 @@ public class PackOutProcess extends SvrProcess if (packageExp.getAD_Package_Exp_ID() == p_PackOut_ID){ //Create the package documentation - packoutDirectory = packageExp.getFile_Directory(); - if (packoutDirectory == null || packoutDirectory.trim().length() == 0) { - packoutDirectory = Adempiere.getAdempiereHome().trim(); - if (!packoutDirectory.endsWith("/") && !packoutDirectory.endsWith("\\")) - packoutDirectory+= File.separator; - packoutDirectory = packoutDirectory + "packout" + File.separator; - } else { - packoutDirectory = packoutDirectory.trim(); - if (!packoutDirectory.endsWith("/") && !packoutDirectory.endsWith("\\")) - packoutDirectory+= File.separator; - } + packoutDirectory = Adempiere.getAdempiereHome().trim(); + if (!packoutDirectory.endsWith("/") && !packoutDirectory.endsWith("\\")) + packoutDirectory+= File.separator; + packoutDirectory = packoutDirectory + "packout" + File.separator; //create packout folder if needed File packoutDirectoryFile = new File(packoutDirectory); @@ -152,6 +145,9 @@ public class PackOutProcess extends SvrProcess throw e; } + if (processUI != null) + processUI.download(new File(exportFile)); + return "Exported="+processedCount + " File=" + exportFile; } // doIt diff --git a/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java b/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java index c6faee2d3d..b7fe688de5 100644 --- a/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java +++ b/org.adempiere.report.jasper/src/org/compiere/report/ReportStarter.java @@ -65,7 +65,7 @@ import net.sf.jasperreports.engine.util.JRSwapFile; import org.adempiere.base.Service; import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.DBException; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.model.MAttachment; import org.compiere.model.MAttachmentEntry; import org.compiere.model.MProcess; @@ -120,7 +120,8 @@ public class ReportStarter implements ProcessCall, ClientProcess private ProcessInfo processInfo; private MAttachment attachment; - private IProcessMonitor m_processMonitor; + @SuppressWarnings("unused") + private IProcessUI m_processUI; /** * @author rlemeill @@ -1164,8 +1165,8 @@ public class ReportStarter implements ProcessCall, ClientProcess } @Override - public void setProcessMonitor(IProcessMonitor processMonitor) { - m_processMonitor = processMonitor; + public void setProcessUI(IProcessUI processUI) { + m_processUI = processUI; } } \ No newline at end of file diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java index 01ff68580e..3f194f80ef 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java @@ -29,6 +29,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -59,7 +60,8 @@ import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.compiere.apps.form.FormFrame; import org.compiere.apps.search.Find; import org.compiere.grid.APanelTab; @@ -144,7 +146,7 @@ import org.compiere.util.Util; * @sponsor www.metas.de */ public final class APanel extends CPanel - implements DataStatusListener, ChangeListener, ActionListener, IProcessMonitor, SystemIDs + implements DataStatusListener, ChangeListener, ActionListener, IProcessUI, SystemIDs { /** * @@ -2968,4 +2970,16 @@ public final class APanel extends CPanel } // updateToolBarAndMenuWithRestriction + @Override + public void ask(String message, Callback callback) { + boolean b = ADialog.ask(m_curWindowNo, this, message); + if (callback != null) { + callback.onCallback(b ? "OK" : "CANCEL"); + } + } + + @Override + public void download(File file) { + } + } // APanel diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/ClientProcessCtrl.java b/org.adempiere.ui.swing/src/org/compiere/apps/ClientProcessCtrl.java index a973d17657..2f65b3560f 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/ClientProcessCtrl.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/ClientProcessCtrl.java @@ -2,7 +2,7 @@ package org.compiere.apps; import java.awt.Container; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.model.MPInstance; import org.compiere.process.ProcessInfo; import org.compiere.util.CLogger; @@ -34,7 +34,7 @@ public class ClientProcessCtrl { * @param trx Transaction * @return worker started ProcessCtl instance or null for workflow */ - public static ProcessCtl process (IProcessMonitor parent, int WindowNo, ProcessInfo pi, Trx trx) + public static ProcessCtl process (IProcessUI parent, int WindowNo, ProcessInfo pi, Trx trx) { log.fine("WindowNo=" + WindowNo + " - " + pi); diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/ProcessCtl.java b/org.adempiere.ui.swing/src/org/compiere/apps/ProcessCtl.java index f769545b60..61f7ecd954 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/ProcessCtl.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/ProcessCtl.java @@ -21,7 +21,7 @@ import java.awt.Container; import javax.swing.JFrame; import javax.swing.SwingUtilities; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.model.MPInstance; import org.compiere.process.ProcessInfo; import org.compiere.util.CLogger; @@ -64,7 +64,7 @@ public class ProcessCtl extends AbstractProcessCtl * @param trx Transaction * @return worker started ProcessCtl instance or null for workflow */ - public static ProcessCtl process (IProcessMonitor parent, int WindowNo, ProcessInfo pi, Trx trx) + public static ProcessCtl process (IProcessUI parent, int WindowNo, ProcessInfo pi, Trx trx) { log.fine("WindowNo=" + WindowNo + " - " + pi); @@ -142,7 +142,7 @@ public class ProcessCtl extends AbstractProcessCtl * @param trx Transaction * @return worker started ProcessCtl instance or null for workflow */ - public static ProcessCtl process(IProcessMonitor parent, int WindowNo, IProcessParameter parameter, ProcessInfo pi, Trx trx) + public static ProcessCtl process(IProcessUI parent, int WindowNo, IProcessParameter parameter, ProcessInfo pi, Trx trx) { log.fine("WindowNo=" + WindowNo + " - " + pi); @@ -206,7 +206,7 @@ public class ProcessCtl extends AbstractProcessCtl * @param trx Transaction * Created in process(), VInvoiceGen.generateInvoices */ - public ProcessCtl (IProcessMonitor parent, int WindowNo, ProcessInfo pi, Trx trx) + public ProcessCtl (IProcessUI parent, int WindowNo, ProcessInfo pi, Trx trx) { super(parent, WindowNo, pi, trx); } // ProcessCtl @@ -317,14 +317,14 @@ public class ProcessCtl extends AbstractProcessCtl abstract class ProcessUpdateRunnable implements Runnable { protected ProcessInfo pi = null; - protected IProcessMonitor parent = null; + protected IProcessUI parent = null; public void setProcessInfo(ProcessInfo pi) { this.pi = pi; } - public void setParent(IProcessMonitor parent) + public void setParent(IProcessUI parent) { this.parent = parent; } diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/ProcessDialog.java b/org.adempiere.ui.swing/src/org/compiere/apps/ProcessDialog.java index 0ea0621ce4..8795f207aa 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/ProcessDialog.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/ProcessDialog.java @@ -24,6 +24,7 @@ import java.awt.FlowLayout; import java.awt.GraphicsConfiguration; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -36,7 +37,8 @@ import javax.swing.JSeparator; import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.DBException; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.compiere.model.SystemIDs; import org.compiere.print.ReportCtl; import org.compiere.print.ReportEngine; @@ -68,7 +70,7 @@ import org.compiere.util.Msg; *
  • BF [ 1963128 ] Running a process w/o trl should display an error */ public class ProcessDialog extends CFrame - implements ActionListener, IProcessMonitor, SystemIDs + implements ActionListener, IProcessUI, SystemIDs { /** * @@ -523,4 +525,18 @@ public class ProcessDialog extends CFrame message.setText(status); } + @Override + public void ask(String message, Callback callback) { + boolean b = ADialog.ask(m_WindowNo, this, message); + if (callback != null) { + callback.onCallback(b ? "OK" : "CANCEL"); + } + } + + @Override + public void download(File file) { + // TODO Auto-generated method stub + + } + } // ProcessDialog diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/ProcessModalDialog.java b/org.adempiere.ui.swing/src/org/compiere/apps/ProcessModalDialog.java index 47e333cdb9..2d59fe31c8 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/ProcessModalDialog.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/ProcessModalDialog.java @@ -32,7 +32,7 @@ import javax.swing.JScrollPane; import javax.swing.JSeparator; import org.adempiere.exceptions.DBException; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.process.ProcessInfo; import org.compiere.swing.CButton; import org.compiere.swing.CDialog; @@ -76,13 +76,13 @@ public class ProcessModalDialog extends CDialog * @param autoStart */ public ProcessModalDialog (Properties ctx, Frame parent, String title, - IProcessMonitor aProcess, int WindowNo, int AD_Process_ID, + IProcessUI aProcess, int WindowNo, int AD_Process_ID, int tableId, int recordId, boolean autoStart) { super(parent, title, true); log.info("Process=" + AD_Process_ID ); m_ctx = ctx; - m_processMonitor = aProcess; + m_processUI = aProcess; m_WindowNo = WindowNo; m_AD_Process_ID = AD_Process_ID; m_tableId = tableId; @@ -99,7 +99,7 @@ public class ProcessModalDialog extends CDialog } } // ProcessDialog - private IProcessMonitor m_processMonitor; + private IProcessUI m_processUI; private int m_WindowNo; private Properties m_ctx; private int m_tableId; @@ -333,7 +333,7 @@ public class ProcessModalDialog extends CDialog { if (e.getSource() == bOK) { - ProcessCtl.process(m_processMonitor, m_WindowNo, parameterPanel, m_pi, null); + ProcessCtl.process(m_processUI, m_WindowNo, parameterPanel, m_pi, null); dispose(); } diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/form/VGenPanel.java b/org.adempiere.ui.swing/src/org/compiere/apps/form/VGenPanel.java index 9ba016a7f7..5ec585ad0f 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/form/VGenPanel.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/form/VGenPanel.java @@ -18,6 +18,7 @@ import java.awt.Cursor; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.util.logging.Level; import javax.swing.JOptionPane; @@ -28,7 +29,8 @@ import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import org.adempiere.plaf.AdempierePLAF; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.compiere.apps.ADialog; import org.compiere.apps.ADialogDialog; import org.compiere.apps.AEnv; @@ -58,7 +60,7 @@ import org.compiere.util.Msg; * Generate custom form panel * */ -public class VGenPanel extends CPanel implements ActionListener, ChangeListener, TableModelListener, IProcessMonitor +public class VGenPanel extends CPanel implements ActionListener, ChangeListener, TableModelListener, IProcessUI { /** * @@ -385,4 +387,18 @@ public class VGenPanel extends CPanel implements ActionListener, ChangeListener, public void statusUpdate(String message) { statusBar.setStatusLine(message); } + + @Override + public void ask(String message, Callback callback) { + boolean b = ADialog.ask(m_WindowNo, this, message); + if (callback != null) { + callback.onCallback(b ? "OK" : "CANCEL"); + } + } + + @Override + public void download(File file) { + // TODO Auto-generated method stub + + } } \ No newline at end of file diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/form/VPaySelect.java b/org.adempiere.ui.swing/src/org/compiere/apps/form/VPaySelect.java index 6fc4b847d9..9777d3039a 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/form/VPaySelect.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/form/VPaySelect.java @@ -25,6 +25,7 @@ import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.sql.Timestamp; import java.util.ArrayList; import java.util.logging.Level; @@ -35,7 +36,8 @@ import javax.swing.JScrollPane; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.compiere.apps.ADialog; import org.compiere.apps.AEnv; import org.compiere.apps.ConfirmPanel; @@ -66,7 +68,7 @@ import org.compiere.util.ValueNamePair; * @author Jorg Janke * @version $Id: VPaySelect.java,v 1.2 2008/07/11 08:20:12 cruiz Exp $ */ -public class VPaySelect extends PaySelect implements FormPanel, ActionListener, TableModelListener, IProcessMonitor, SystemIDs +public class VPaySelect extends PaySelect implements FormPanel, ActionListener, TableModelListener, IProcessUI, SystemIDs { /** @todo withholding */ private CPanel panel = new CPanel(); @@ -444,4 +446,18 @@ public class VPaySelect extends PaySelect implements FormPanel, ActionListener, public void statusUpdate(String message) { dataStatus.setText(message); } + + @Override + public void ask(String message, Callback callback) { + boolean b = ADialog.ask(m_WindowNo, null, message); + if (callback != null) { + callback.onCallback(b ? "OK" : "CANCEL"); + } + } + + @Override + public void download(File file) { + // TODO Auto-generated method stub + + } } // VPaySelect diff --git a/org.adempiere.ui.swing/src/org/compiere/print/AReport.java b/org.adempiere.ui.swing/src/org/compiere/print/AReport.java index 141774f626..11bf64f7b0 100644 --- a/org.adempiere.ui.swing/src/org/compiere/print/AReport.java +++ b/org.adempiere.ui.swing/src/org/compiere/print/AReport.java @@ -27,7 +27,7 @@ import javax.sql.RowSet; import javax.swing.JComponent; import javax.swing.JPopupMenu; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.apps.ADialog; import org.compiere.apps.ClientProcessCtrl; import org.compiere.apps.ProcessCtl; @@ -73,7 +73,7 @@ public class AReport implements ActionListener * @param parent The invoking parent window * @param WindowNo The invoking parent window number */ - public AReport (int AD_Table_ID, JComponent invoker, MQuery query, IProcessMonitor parent, int WindowNo) + public AReport (int AD_Table_ID, JComponent invoker, MQuery query, IProcessUI parent, int WindowNo) { log.config("AD_Table_ID=" + AD_Table_ID + " " + query); if (!MRole.getDefault().isCanReport(AD_Table_ID)) @@ -100,7 +100,7 @@ public class AReport implements ActionListener * @param whereExtended The filtering where clause * @param WindowNo The invoking parent window number */ - public AReport (int AD_Table_ID, JComponent invoker, MQuery query, IProcessMonitor parent, int WindowNo, String whereExtended) + public AReport (int AD_Table_ID, JComponent invoker, MQuery query, IProcessUI parent, int WindowNo, String whereExtended) { log.config("AD_Table_ID=" + AD_Table_ID + " " + query); if (!MRole.getDefault().isCanReport(AD_Table_ID)) @@ -129,7 +129,7 @@ public class AReport implements ActionListener /** Logger */ private static CLogger log = CLogger.getCLogger(AReport.class); /** The parent window for locking/unlocking during process execution */ - IProcessMonitor parent; + IProcessUI parent; /** The filter to apply to this report */ String m_whereExtended; /** The parent window number */ diff --git a/org.adempiere.ui.swing/src/org/eevolution/form/VInOutInvoiceGen.java b/org.adempiere.ui.swing/src/org/eevolution/form/VInOutInvoiceGen.java index 3bfbaa88da..f2321eb2d8 100755 --- a/org.adempiere.ui.swing/src/org/eevolution/form/VInOutInvoiceGen.java +++ b/org.adempiere.ui.swing/src/org/eevolution/form/VInOutInvoiceGen.java @@ -22,6 +22,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.VetoableChangeListener; +import java.io.File; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -38,7 +39,8 @@ import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import org.adempiere.plaf.AdempierePLAF; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.compiere.apps.ADialog; import org.compiere.apps.ADialogDialog; import org.compiere.apps.AEnv; @@ -84,7 +86,7 @@ import org.compiere.util.Trx; */ public class VInOutInvoiceGen extends CPanel implements FormPanel, ActionListener, VetoableChangeListener, - ChangeListener, TableModelListener, IProcessMonitor, SystemIDs + ChangeListener, TableModelListener, IProcessUI, SystemIDs { /** * @@ -901,4 +903,18 @@ public class VInOutInvoiceGen extends CPanel public void statusUpdate(String message) { statusBar.setStatusLine(message); } + + @Override + public void ask(String message, Callback callback) { + boolean b = ADialog.ask(m_WindowNo, this, message); + if (callback != null) { + callback.onCallback(b ? "OK" : "CANCEL"); + } + } + + @Override + public void download(File file) { + // TODO Auto-generated method stub + + } } // VInOutGen diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessDialog.java index 243155505e..7a9125a698 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessDialog.java @@ -12,7 +12,8 @@ import java.util.Properties; import java.util.concurrent.Future; import java.util.logging.Level; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.adempiere.util.ServerContext; import org.adempiere.webui.AdempiereWebUI; import org.adempiere.webui.component.Button; @@ -22,6 +23,7 @@ import org.adempiere.webui.desktop.IDesktop; import org.adempiere.webui.process.WProcessInfo; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.window.FDialog; +import org.adempiere.webui.window.MultiFileDownloadDialog; import org.adempiere.webui.window.SimplePDFViewer; import org.compiere.Adempiere; import org.compiere.model.SystemIDs; @@ -81,7 +83,7 @@ import com.lowagie.text.pdf.PdfWriter; * @author arboleda - globalqss * - Implement ShowHelp option on processes and reports */ -public class ProcessDialog extends Window implements EventListener, IProcessMonitor, SystemIDs +public class ProcessDialog extends Window implements EventListener, IProcessUI, SystemIDs { /** * generate serial version ID @@ -92,6 +94,7 @@ public class ProcessDialog extends Window implements EventListener, IProc private Center center; private North north; + private List downloadFiles; /** * Dialog to start a process/report @@ -315,6 +318,9 @@ public class ProcessDialog extends Window implements EventListener, IProc m_pi.setPrintPreview(true); this.lockUI(m_pi); + + downloadFiles = new ArrayList(); + Clients.response(new AuEcho(this, "runProcess", null)); } @@ -344,6 +350,12 @@ public class ProcessDialog extends Window implements EventListener, IProc future = null; processDialogRunnable = null; unlockUI(m_pi); + if (downloadFiles.size() > 0) { + MultiFileDownloadDialog downloadDialog = new MultiFileDownloadDialog(downloadFiles.toArray(new File[0])); + downloadDialog.setPage(this.getPage()); + downloadDialog.setTitle(m_pi.getTitle()); + Events.postEvent(downloadDialog, new Event(MultiFileDownloadDialog.ON_SHOW)); + } } private void onStatusUpdate(Event event) { @@ -664,4 +676,19 @@ public class ProcessDialog extends Window implements EventListener, IProc public void statusUpdate(String message) { Executions.schedule(getDesktop(), this, new Event(ON_STATUS_UPDATE, this, message)); } + + @Override + public void ask(final String message, final Callback callback) { + Executions.schedule(getDesktop(), new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + FDialog.ask(m_WindowNo, null, message, callback); + } + }, new Event("onAsk")); + } + + @Override + public void download(File file) { + downloadFiles.add(file); + } } // ProcessDialog diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java index b9eb5e0e08..5bcfc29073 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java @@ -16,14 +16,18 @@ *****************************************************************************/ package org.adempiere.webui.apps; +import java.io.File; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import java.util.Properties; import java.util.concurrent.Future; import java.util.logging.Level; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.adempiere.util.ServerContext; import org.adempiere.webui.AdempiereWebUI; import org.adempiere.webui.LayoutUtils; @@ -32,6 +36,8 @@ import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.VerticalBox; import org.adempiere.webui.component.Window; import org.adempiere.webui.event.DialogEvents; +import org.adempiere.webui.window.FDialog; +import org.adempiere.webui.window.MultiFileDownloadDialog; import org.compiere.Adempiere; import org.compiere.process.ProcessInfo; import org.compiere.util.CLogger; @@ -61,7 +67,7 @@ import org.zkoss.zul.Html; * @author arboleda - globalqss * - Implement ShowHelp option on processes and reports */ -public class ProcessModalDialog extends Window implements EventListener, IProcessMonitor, DialogEvents +public class ProcessModalDialog extends Window implements EventListener, IProcessUI, DialogEvents { private static final String ON_STATUS_UPDATE = "onStatusUpdate"; private static final String ON_COMPLETE = "onComplete"; @@ -73,20 +79,37 @@ public class ProcessModalDialog extends Window implements EventListener, private boolean m_autoStart; private VerticalBox dialogBody; + private List downloadFiles; + /** * @param aProcess * @param WindowNo * @param pi * @param autoStart */ - public ProcessModalDialog(IProcessMonitor aProcess, int WindowNo, ProcessInfo pi, boolean autoStart) + public ProcessModalDialog(int WindowNo, ProcessInfo pi, boolean autoStart) + { + this(null, WindowNo, pi, autoStart); + } + + /** + * @param aProcess + * @param WindowNo + * @param pi + * @param autoStart + */ + public ProcessModalDialog(EventListener listener, int WindowNo, ProcessInfo pi, boolean autoStart) { m_ctx = Env.getCtx(); - m_processMonitor = aProcess; m_WindowNo = WindowNo; m_pi = pi; m_autoStart = autoStart; + if (listener != null) + { + addEventListener(ON_MODAL_CLOSE, listener); + } + log.info("Process=" + pi.getAD_Process_ID()); try { @@ -99,19 +122,22 @@ public class ProcessModalDialog extends Window implements EventListener, } } + public ProcessModalDialog (int WindowNo, int AD_Process_ID, int tableId, int recordId, boolean autoStart) + { + this(null, WindowNo, AD_Process_ID, tableId, recordId, autoStart); + } + /** * Dialog to start a process/report - * @param ctx - * @param aProcess * @param WindowNo * @param AD_Process_ID * @param tableId * @param recordId * @param autoStart */ - public ProcessModalDialog ( IProcessMonitor aProcess, int WindowNo, int AD_Process_ID, int tableId, int recordId, boolean autoStart) + public ProcessModalDialog (EventListener listener, int WindowNo, int AD_Process_ID, int tableId, int recordId, boolean autoStart) { - this(aProcess, WindowNo, new ProcessInfo("", AD_Process_ID, tableId, recordId), autoStart); + this(listener, WindowNo, new ProcessInfo("", AD_Process_ID, tableId, recordId), autoStart); } /** @@ -119,7 +145,6 @@ public class ProcessModalDialog extends Window implements EventListener, * @param ctx * @param parent not used * @param title not used - * @param aProcess * @param WindowNo * @param AD_Process_ID * @param tableId @@ -128,10 +153,10 @@ public class ProcessModalDialog extends Window implements EventListener, * @deprecated */ public ProcessModalDialog (Window parent, String title, - IProcessMonitor aProcess, int WindowNo, int AD_Process_ID, + int WindowNo, int AD_Process_ID, int tableId, int recordId, boolean autoStart) { - this(aProcess, WindowNo, AD_Process_ID, tableId, recordId, autoStart); + this(WindowNo, AD_Process_ID, tableId, recordId, autoStart); } // ProcessDialog private void initComponents() { @@ -145,8 +170,6 @@ public class ProcessModalDialog extends Window implements EventListener, dialogBody.appendChild(div); centerPanel = new Panel(); dialogBody.appendChild(centerPanel); -// div = new Div(); -// div.setStyle("text-align: right"); Hbox hbox = new Hbox(); hbox.setWidth("100%"); hbox.setStyle("margin-top: 10px"); @@ -163,13 +186,11 @@ public class ProcessModalDialog extends Window implements EventListener, hbox.appendChild(btn); hbox.setPack("end"); -// div.appendChild(hbox); dialogBody.appendChild(hbox); this.appendChild(dialogBody); } - private IProcessMonitor m_processMonitor; private int m_WindowNo; private Properties m_ctx; private String m_Name = null; @@ -326,12 +347,9 @@ public class ProcessModalDialog extends Window implements EventListener, { m_pi.setPrintPreview(true); - if (m_processMonitor != null) { - m_processMonitor.lockUI(m_pi); - Clients.clearBusy(); - } - lockUI(m_pi); + + downloadFiles = new ArrayList(); //use echo, otherwise lock ui wouldn't work Clients.response(new AuEcho(this, "runProcess", null)); @@ -416,11 +434,14 @@ public class ProcessModalDialog extends Window implements EventListener, Env.getCtx().putAll(processDialogRunnable.getProperties()); future = null; processDialogRunnable = null; - dispose(); - if (m_processMonitor != null) { - m_processMonitor.unlockUI(m_pi); - } unlockUI(m_pi); + if (downloadFiles.size() > 0) { + MultiFileDownloadDialog downloadDialog = new MultiFileDownloadDialog(downloadFiles.toArray(new File[0])); + downloadDialog.setPage(this.getPage()); + downloadDialog.setTitle(m_pi.getTitle()); + Events.postEvent(downloadDialog, new Event(MultiFileDownloadDialog.ON_SHOW)); + } + dispose(); Events.sendEvent(this, new Event(ON_MODAL_CLOSE, this, null)); } @@ -482,4 +503,19 @@ public class ProcessModalDialog extends Window implements EventListener, return properties; } } + + @Override + public void ask(final String message, final Callback callback) { + Executions.schedule(getDesktop(), new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + FDialog.ask(m_WindowNo, null, message, callback); + } + }, new Event("onAsk")); + } + + @Override + public void download(File file) { + downloadFiles.add(file); + } } // ProcessDialog diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WProcessCtl.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WProcessCtl.java index 2e68c539f8..9532a5b0e9 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WProcessCtl.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WProcessCtl.java @@ -16,7 +16,7 @@ *****************************************************************************/ package org.adempiere.webui.apps; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.adempiere.webui.component.Window; import org.compiere.apps.AbstractProcessCtl; import org.compiere.apps.IProcessParameter; @@ -48,12 +48,11 @@ public class WProcessCtl extends AbstractProcessCtl { * lockUI and unlockUI if parent is a ASyncProcess *
    * - * @param aProcessMonitor ASyncProcess & Container * @param WindowNo window no * @param pi ProcessInfo process info * @param trx Transaction */ - public static void process (IProcessMonitor aProcessMonitor, int WindowNo, ProcessInfo pi, Trx trx) + public static void process (int WindowNo, ProcessInfo pi, Trx trx) { log.fine("WindowNo=" + WindowNo + " - " + pi); @@ -82,7 +81,7 @@ public class WProcessCtl extends AbstractProcessCtl { pi.setAD_PInstance_ID (instance.getAD_PInstance_ID()); // Get Parameters (Dialog) - ProcessModalDialog para = new ProcessModalDialog(aProcessMonitor, WindowNo, pi, false); + ProcessModalDialog para = new ProcessModalDialog(WindowNo, pi, false); if (para.isValid()) { para.setWidth("500px"); @@ -105,13 +104,13 @@ public class WProcessCtl extends AbstractProcessCtl { *
    * Called from ProcessDialog.actionPerformed * - * @param aProcessMonitor ASyncProcess & Container + * @param aProcessUI ASyncProcess & Container * @param WindowNo window no * @param paraPanel Process Parameter Panel * @param pi ProcessInfo process info * @param trx Transaction */ - public static void process(IProcessMonitor aProcessMonitor, int WindowNo, IProcessParameter parameter, ProcessInfo pi, Trx trx) + public static void process(IProcessUI aProcessUI, int WindowNo, IProcessParameter parameter, ProcessInfo pi, Trx trx) { log.fine("WindowNo=" + WindowNo + " - " + pi); @@ -153,7 +152,7 @@ public class WProcessCtl extends AbstractProcessCtl { } // execute - WProcessCtl worker = new WProcessCtl(aProcessMonitor, WindowNo, pi, trx); + WProcessCtl worker = new WProcessCtl(aProcessUI, WindowNo, pi, trx); worker.run(); } @@ -163,9 +162,9 @@ public class WProcessCtl extends AbstractProcessCtl { * @param pi * @param trx */ - public WProcessCtl(IProcessMonitor aProcessMonitor, int WindowNo, ProcessInfo pi, + public WProcessCtl(IProcessUI aProcessUI, int WindowNo, ProcessInfo pi, Trx trx) { - super(aProcessMonitor, WindowNo, pi, trx); + super(aProcessUI, WindowNo, pi, trx); } @Override diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WReport.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WReport.java index 2bb4c53e1c..6616e33f2e 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WReport.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/WReport.java @@ -46,7 +46,7 @@ import org.zkoss.zul.Menupopup; * @author Low Heng Sin * */ -public class WReport implements EventListener { +public class WReport implements EventListener { /** * Constructor @@ -227,7 +227,7 @@ public class WReport implements EventListener { ProcessInfo pi = new ProcessInfo ("", pf.getJasperProcess_ID(), pf.getAD_Table_ID(), Record_ID); // Execute Process - WProcessCtl.process(null, WindowNo, pi, null); + WProcessCtl.process(WindowNo, pi, null); } else { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WPaySelect.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WPaySelect.java index cedefb5540..73576bd104 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WPaySelect.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WPaySelect.java @@ -18,11 +18,13 @@ *****************************************************************************/ package org.adempiere.webui.apps.form; +import java.io.File; import java.sql.Timestamp; import java.util.ArrayList; import java.util.logging.Level; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; +import org.adempiere.util.IProcessUI; import org.adempiere.webui.apps.ProcessModalDialog; import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Checkbox; @@ -52,6 +54,7 @@ import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.Msg; import org.compiere.util.ValueNamePair; +import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.SuspendNotAllowedException; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; @@ -73,15 +76,10 @@ import org.zkoss.zul.Space; * @version $Id: VPaySelect.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $ */ public class WPaySelect extends PaySelect - implements IFormController, EventListener, WTableModelListener, IProcessMonitor, SystemIDs + implements IFormController, EventListener, WTableModelListener, IProcessUI, SystemIDs { /** @todo withholding */ - /** - * - */ - private static final long serialVersionUID = -6031404894392912610L; - private CustomForm form = new CustomForm(); // @@ -447,4 +445,20 @@ public class WPaySelect extends PaySelect @Override public void statusUpdate(String message) { } + + @Override + public void ask(final String message, final Callback callback) { + Executions.schedule(form.getDesktop(), new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + FDialog.ask(m_WindowNo, null, message, callback); + } + }, new Event("onAsk")); + } + + @Override + public void download(File file) { + // TODO Auto-generated method stub + + } } // VPaySelect diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/DynamicMediaLink.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/DynamicMediaLink.java new file mode 100644 index 0000000000..b645080615 --- /dev/null +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/DynamicMediaLink.java @@ -0,0 +1,59 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * 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.component; + + +import org.zkoss.util.media.AMedia; +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.A; +import org.zkoss.zul.Filedownload; + +/** + * @author hengsin + * + */ +public class DynamicMediaLink extends A { + + /** + * generated serial id + */ + private static final long serialVersionUID = 5017833977652241179L; + + private AMedia media; + + public DynamicMediaLink() { + super(); + this.addEventListener(Events.ON_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + Filedownload.save(media); + } + }); + } + + public DynamicMediaLink(String label, String image) { + super(label, image); + } + + public DynamicMediaLink(String label) { + super(label); + } + + public void setMedia(AMedia media) { + this.media = media; + } +} diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java index eba40512eb..88544fea35 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/Messagebox.java @@ -19,6 +19,7 @@ package org.adempiere.webui.component; import java.util.Properties; +import org.adempiere.util.Callback; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.apps.AEnv; import org.compiere.util.Env; @@ -39,7 +40,7 @@ import org.zkoss.zul.Separator; * @date Jul 31, 2007 */ -public class Messagebox extends Window implements EventListener +public class Messagebox extends Window implements EventListener { /** * generated serial version ID @@ -62,6 +63,8 @@ public class Messagebox extends Window implements EventListener private Image img = new Image(); private int returnValue; + private Callback callback; + private String callbackValue; /** A OK button. */ public static final int OK = 0x0001; @@ -192,9 +195,15 @@ public class Messagebox extends Window implements EventListener } public int show(String message, String title, int buttons, String icon) + { + return show(message, title, buttons, icon, null); + } + + public int show(String message, String title, int buttons, String icon, Callback callback) { this.msg = message; this.imgSrc = icon; + this.callback = callback; btnOk.setVisible(false); btnCancel.setVisible(false); @@ -243,10 +252,15 @@ public class Messagebox extends Window implements EventListener } public static int showDialog(String message, String title, int buttons, String icon) throws InterruptedException + { + return showDialog(message, title, buttons, icon, null); + } + + public static int showDialog(String message, String title, int buttons, String icon, Callback callback) throws InterruptedException { Messagebox msg = new Messagebox(); - return msg.show(message, title, buttons, icon); + return msg.show(message, title, buttons, icon, callback); } public void onEvent(Event event) throws Exception @@ -254,35 +268,53 @@ public class Messagebox extends Window implements EventListener if (event == null) return; + callbackValue = null; + if (event.getTarget() == btnOk) { returnValue = OK; + callbackValue = "OK"; } else if (event.getTarget() == btnCancel) { returnValue = CANCEL; + callbackValue = "CANCEL"; } else if (event.getTarget() == btnYes) { returnValue = YES; + callbackValue = "YES"; } else if (event.getTarget() == btnNo) { returnValue = NO; + callbackValue = "NO"; } else if (event.getTarget() == btnAbort) { returnValue = ABORT; + callbackValue = "ABORT"; } else if (event.getTarget() == btnRetry) { returnValue = RETRY; + callbackValue = "RETRY"; } else if (event.getTarget() == btnIgnore) { returnValue = IGNORE; + callbackValue = "IGNORE"; } this.detach(); } + + @Override + public void detach() { + super.detach(); + if (callback != null) + { + callback.onCallback(callbackValue); + } + } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java index a0ef3b59ab..b0337f9cb9 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/AbstractADWindowPanel.java @@ -29,7 +29,7 @@ import java.util.TreeMap; import java.util.Vector; import java.util.logging.Level; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.Callback; import org.adempiere.webui.WArchive; import org.adempiere.webui.WRequest; import org.adempiere.webui.WZoomAcross; @@ -54,7 +54,6 @@ import org.adempiere.webui.exception.ApplicationException; import org.adempiere.webui.panel.action.ExportAction; import org.adempiere.webui.part.AbstractUIPart; import org.adempiere.webui.session.SessionManager; -import org.adempiere.webui.util.Callback; import org.adempiere.webui.window.FDialog; import org.adempiere.webui.window.FindWindow; import org.adempiere.webui.window.WChat; @@ -90,7 +89,6 @@ import org.zkoss.zk.ui.Session; 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.Button; import org.zkoss.zul.Div; import org.zkoss.zul.Hbox; @@ -122,7 +120,7 @@ import org.zkoss.zul.Menupopup; * https://sourceforge.net/tracker/?func=detail&aid=2985892&group_id=176962&atid=955896 */ public abstract class AbstractADWindowPanel extends AbstractUIPart implements ToolbarListener, - EventListener, DataStatusListener, ActionListener, IProcessMonitor, SystemIDs + EventListener, DataStatusListener, ActionListener, SystemIDs { private static final CLogger logger; @@ -161,8 +159,6 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To private Component parent; - private boolean m_uiLocked; - private boolean m_findCancelled; private int embeddedTabindex = -1; @@ -996,44 +992,50 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To */ public void onEvent(Event event) { - if (!Events.ON_SELECT.equals(event.getName())) - return; - - IADTabList tabList = null; - Component target = event.getTarget(); - if (target instanceof IADTabList) + if (Events.ON_SELECT.equals(event.getName())) { - tabList = (IADTabList) target; + IADTabList tabList = null; + Component target = event.getTarget(); + if (target instanceof IADTabList) + { + tabList = (IADTabList) target; + } + else + { + target = target.getParent(); + while(target != null) + { + if (target instanceof IADTabList) + { + tabList = (IADTabList) target; + break; + } + target = target.getParent(); + } + } + + if (tabList != null) + { + int newTabIndex = tabList.getSelectedIndex(); + + if (setActiveTab(newTabIndex)) + { + //force sync model + tabList.refresh(); + } + else + { + //reset to original + tabList.setSelectedIndex(curTabIndex); + } + } } - else + else if (event.getTarget() instanceof ProcessModalDialog) { - target = target.getParent(); - while(target != null) - { - if (target instanceof IADTabList) - { - tabList = (IADTabList) target; - break; - } - target = target.getParent(); - } + ProcessModalDialog dialog = (ProcessModalDialog) event.getTarget(); + onModalClose(dialog.getProcessInfo()); + onRefresh(false); } - - if (tabList != null) - { - int newTabIndex = tabList.getSelectedIndex(); - - if (setActiveTab(newTabIndex)) - { - //force sync model - tabList.refresh(); - } - else - { - //reset to original - tabList.setSelectedIndex(curTabIndex); - } - } } private boolean setActiveTab(int newTabIndex) { @@ -1935,12 +1937,11 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To int table_ID = curTab.getAD_Table_ID(); int record_ID = curTab.getRecord_ID(); - ProcessModalDialog dialog = new ProcessModalDialog(this,getWindowNo(), - AD_Process_ID,table_ID, record_ID, true); + ProcessModalDialog dialog = new ProcessModalDialog(this, getWindowNo(), AD_Process_ID,table_ID, record_ID, true); if (dialog.isValid()) { dialog.setPosition("center"); - dialog.setPage(this.getComponent().getPage()); - dialog.doModal(); + dialog.setPage(this.getComponent().getPage()); + dialog.doHighlighted(); } } @@ -2349,8 +2350,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To } else { - ProcessModalDialog dialog = new ProcessModalDialog(this, curWindowNo, - wButton.getProcess_ID(), table_ID, record_ID, startWOasking); + ProcessModalDialog dialog = new ProcessModalDialog(this, curWindowNo, wButton.getProcess_ID(), table_ID, record_ID, startWOasking); if (dialog.isValid()) { @@ -2358,12 +2358,6 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To dialog.setVisible(true); dialog.setPosition("center"); dialog.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED); - dialog.addEventListener(DialogEvents.ON_MODAL_CLOSE, new EventListener() { - @Override - public void onEvent(Event event) throws Exception { - onRefresh(false); - } - }); AEnv.showWindow(dialog); } else @@ -2427,49 +2421,10 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To public void executeASync(ProcessInfo pi) { } - /** - * @return boolean - */ - public boolean isUILocked() { - return m_uiLocked; - } - /** * @param pi */ - public void lockUI(ProcessInfo pi) { - if (m_uiLocked) return; - - m_uiLocked = true; - - if (Executions.getCurrent() != null) - Clients.showBusy(null); - else - { - try { - //acquire desktop, 2 second timeout - Executions.activate(getComponent().getDesktop(), 2000); - try { - Clients.showBusy(null); - } catch(Error ex){ - throw ex; - } finally{ - //release full control of desktop - Executions.deactivate(getComponent().getDesktop()); - } - } catch (Exception e) { - logger.log(Level.WARNING, "Failed to lock UI.", e); - } - } - } - - /** - * @param pi - */ - public void unlockUI(ProcessInfo pi) { - if (!m_uiLocked) return; - - m_uiLocked = false; + private void onModalClose(ProcessInfo pi) { boolean notPrint = pi != null && pi.getAD_Process_ID() != curTab.getAD_Process_ID() && pi.isReportingProcess() == false; @@ -2482,7 +2437,6 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To { updateUI(pi); } - Clients.clearBusy(null); } else { @@ -2494,7 +2448,6 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To { updateUI(pi); } - Clients.clearBusy(null); } catch(Error ex){ throw ex; } finally{ @@ -2502,23 +2455,15 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To Executions.deactivate(getComponent().getDesktop()); } } catch (Exception e) { - logger.log(Level.WARNING, "Failed to update UI upon unloc.", e); + logger.log(Level.WARNING, "Failed to update UI upon unlock.", e); } } } - @Override - public void statusUpdate(String message) { - statusBar.setStatusLine(message); - } - private void updateUI(ProcessInfo pi) { - // Refresh data - curTab.dataRefresh(false); // Timeout if (pi.isTimeout()) // set temporarily to R/O Env.setContext(ctx, curWindowNo, "Processed", "Y"); - curTabpanel.dynamicDisplay(0); // Update Status Line String summary = pi.getSummary(); if (summary != null && summary.indexOf('@') != -1) @@ -2553,5 +2498,4 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To public int getWindowNo() { return curWindowNo; } - } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java index 87fddbbdde..c8fe5c6a6e 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FDialog.java @@ -26,6 +26,7 @@ import org.compiere.util.Msg; import org.compiere.util.Trace; import org.zkoss.zk.ui.Component; +import org.adempiere.util.Callback; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Messagebox; @@ -267,7 +268,7 @@ public class FDialog return ask(windowNo, comp, s); } - /************************************************************************** + /************************************************************************** * Ask Question with question icon and (OK) (Cancel) buttons * * @param WindowNo Number of Window @@ -278,11 +279,27 @@ public class FDialog */ public static boolean ask(int windowNo, Component comp, String adMessage) + { + return ask(windowNo, comp, adMessage, (Callback)null); + } + + /************************************************************************** + * Ask Question with question icon and (OK) (Cancel) buttons + * + * @param WindowNo Number of Window + * @param c Container (owner) + * @param AD_Message Message to be translated + * + * @return true, if OK + */ + + public static boolean ask(int windowNo, Component comp, String adMessage, Callback callback) { try { String s = Msg.getMsg(Env.getCtx(), adMessage).replace("\n", "
    "); - int response = Messagebox.showDialog(s, AEnv.getDialogHeader(Env.getCtx(), windowNo), Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION); + int response = Messagebox.showDialog(s, AEnv.getDialogHeader(Env.getCtx(), windowNo), + Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, callback); return (response == Messagebox.OK); } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/MultiFileDownloadDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/MultiFileDownloadDialog.java new file mode 100644 index 0000000000..57589775cb --- /dev/null +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/MultiFileDownloadDialog.java @@ -0,0 +1,80 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * 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.window; + +import java.io.File; +import java.io.FileNotFoundException; + +import javax.activation.MimetypesFileTypeMap; + +import org.adempiere.webui.component.DynamicMediaLink; +import org.adempiere.webui.component.Window; +import org.zkoss.util.media.AMedia; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zul.Vlayout; + +/** + * @author hengsin + * + */ +public class MultiFileDownloadDialog extends Window { + + public static final String ON_SHOW = "onShow"; + /** + * generated serial dialog + */ + private static final long serialVersionUID = -6078788264410182680L; + private File[] files; + + public MultiFileDownloadDialog(File[] files) { + super(); + this.files = files; + this.addEventListener(ON_SHOW, new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + MultiFileDownloadDialog.this.show(); + } + }); + } + + private void show() { + Vlayout layout = new Vlayout(); + layout.setStyle("padding-top: 10px; padding-bottom: 10px;"); + appendChild(layout); + MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap(); + for(File file : files) { + try { + AMedia media = new AMedia(file, mimeMap.getContentType(file), null); + DynamicMediaLink link = new DynamicMediaLink(); + layout.appendChild(link); + link.setMedia(media); + link.setLabel(media.getName()); + link.setStyle("margin: 5px;"); + } catch (FileNotFoundException e) { + } + } + + this.setClosable(true); + this.setSizable(true); + this.setMaximizable(true); + this.setBorder("normal"); + this.setContentStyle("min-height: 200px; min-width:300px"); + this.setPosition("center"); + if (this.getTitle() == null || this.getTitle().length() == 0) { + this.setTitle("Downloads"); + } + this.doHighlighted(); + } +} diff --git a/org.adempiere.ui/src/org/compiere/apps/AbstractProcessCtl.java b/org.adempiere.ui/src/org/compiere/apps/AbstractProcessCtl.java index 5e47aeffa3..cafc55e69b 100644 --- a/org.adempiere.ui/src/org/compiere/apps/AbstractProcessCtl.java +++ b/org.adempiere.ui/src/org/compiere/apps/AbstractProcessCtl.java @@ -22,7 +22,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.logging.Level; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.adempiere.util.ProcessUtil; import org.compiere.db.CConnection; import org.compiere.interfaces.Server; @@ -62,10 +62,10 @@ public abstract class AbstractProcessCtl implements Runnable * @param trx Transaction * Created in process(), VInvoiceGen.generateInvoices */ - public AbstractProcessCtl (IProcessMonitor aProcessMonitor, int WindowNo, ProcessInfo pi, Trx trx) + public AbstractProcessCtl (IProcessUI aProcessUI, int WindowNo, ProcessInfo pi, Trx trx) { windowno = WindowNo; - m_processMonitor = aProcessMonitor; + m_processUI = aProcessUI; m_pi = pi; m_trx = trx; // handeled correctly } // ProcessCtl @@ -73,7 +73,7 @@ public abstract class AbstractProcessCtl implements Runnable /** Windowno */ private int windowno; /** Parenr */ - private IProcessMonitor m_processMonitor; + private IProcessUI m_processUI; /** Process Info */ private ProcessInfo m_pi; private Trx m_trx; @@ -276,7 +276,7 @@ public abstract class AbstractProcessCtl implements Runnable { m_pi.setReportingProcess(true); // Start Report ----------------------------------------------- - boolean ok = ReportCtl.start(m_processMonitor, windowno, m_pi, IsDirectPrint); + boolean ok = ReportCtl.start(m_processUI, windowno, m_pi, IsDirectPrint); m_pi.setSummary("Report", !ok); unlock (); } @@ -322,12 +322,12 @@ public abstract class AbstractProcessCtl implements Runnable return m_pi; } - protected IProcessMonitor getProcessMonitor() + protected IProcessUI getProcessMonitor() { - return m_processMonitor; + return m_processUI; } - protected IProcessMonitor getParent() + protected IProcessUI getParent() { return getProcessMonitor(); } @@ -445,7 +445,7 @@ public abstract class AbstractProcessCtl implements Runnable if (m_pi.getClassName().toLowerCase().startsWith(MRule.SCRIPT_PREFIX)) { return ProcessUtil.startScriptProcess(Env.getCtx(), m_pi, m_trx); } else { - return ProcessUtil.startJavaProcess(Env.getCtx(), m_pi, m_trx, true, m_processMonitor); + return ProcessUtil.startJavaProcess(Env.getCtx(), m_pi, m_trx, true, m_processUI); } } return !m_pi.isError(); diff --git a/org.adempiere.ui/src/org/compiere/print/ReportCtl.java b/org.adempiere.ui/src/org/compiere/print/ReportCtl.java index 28cdb24530..8207ba1209 100644 --- a/org.adempiere.ui/src/org/compiere/print/ReportCtl.java +++ b/org.adempiere.ui/src/org/compiere/print/ReportCtl.java @@ -21,7 +21,7 @@ import java.util.logging.Level; import org.adempiere.base.Service; import org.adempiere.exceptions.AdempiereException; -import org.adempiere.util.IProcessMonitor; +import org.adempiere.util.IProcessUI; import org.compiere.model.MPaySelectionCheck; import org.compiere.model.MProcess; import org.compiere.model.MQuery; @@ -92,7 +92,7 @@ public class ReportCtl implements SystemIDs * @param IsDirectPrint if true, prints directly - otherwise View * @return true if created */ - static public boolean start (IProcessMonitor parent, int WindowNo, ProcessInfo pi, boolean IsDirectPrint) + static public boolean start (IProcessUI parent, int WindowNo, ProcessInfo pi, boolean IsDirectPrint) { pi.setPrintPreview(!IsDirectPrint); return start(parent, WindowNo, pi); @@ -109,7 +109,7 @@ public class ReportCtl implements SystemIDs * @param IsDirectPrint if true, prints directly - otherwise View * @return true if created */ - static public boolean start (IProcessMonitor parent, int WindowNo, ProcessInfo pi) + static public boolean start (IProcessUI parent, int WindowNo, ProcessInfo pi) { s_log.info("start - " + pi); @@ -261,7 +261,7 @@ public class ReportCtl implements SystemIDs * @param printerName Specified printer name * @return true if success */ - public static boolean startDocumentPrint(int type, MPrintFormat customPrintFormat, int Record_ID, IProcessMonitor parent, int WindowNo, String printerName) + public static boolean startDocumentPrint(int type, MPrintFormat customPrintFormat, int Record_ID, IProcessUI parent, int WindowNo, String printerName) { return(startDocumentPrint(type, customPrintFormat, Record_ID, parent, WindowNo, true, printerName)); } @@ -276,7 +276,7 @@ public class ReportCtl implements SystemIDs * @param IsDirectPrint if true, prints directly - otherwise View * @return true if success */ - public static boolean startDocumentPrint(int type, int Record_ID, IProcessMonitor parent, int WindowNo, + public static boolean startDocumentPrint(int type, int Record_ID, IProcessUI parent, int WindowNo, boolean IsDirectPrint) { return(startDocumentPrint(type, null, Record_ID, parent, WindowNo, IsDirectPrint, null )); @@ -291,7 +291,7 @@ public class ReportCtl implements SystemIDs * @param printerName Specified printer name * @return true if success */ - public static boolean startDocumentPrint (int type, MPrintFormat customPrintFormat, int Record_ID, IProcessMonitor parent, int WindowNo, + public static boolean startDocumentPrint (int type, MPrintFormat customPrintFormat, int Record_ID, IProcessUI parent, int WindowNo, boolean IsDirectPrint, String printerName) { ReportEngine re = ReportEngine.get (Env.getCtx(), type, Record_ID);