IDEMPIERE-144 Performance: Reduce use of modal dialog

This commit is contained in:
Heng Sin Low 2012-05-01 00:20:09 +08:00
parent 336fd52791
commit 44fecb0ca9
2 changed files with 82 additions and 45 deletions

View File

@ -58,8 +58,16 @@ import org.zkoss.zul.Html;
* @author arboleda - globalqss
* - Implement ShowHelp option on processes and reports
*/
public class ProcessModalDialog extends Window implements EventListener, IProcessMonitor
public class ProcessModalDialog extends Window implements EventListener<Event>, IProcessMonitor
{
private static final String ON_STATUS_UPDATE = "onStatusUpdate";
private static final String ON_COMPLETE = "onComplete";
/**
* on modal close event, use this for highlight mode modal dialog to perform action after the modal dialog closed.
*/
public final static String ON_MODAL_CLOSE = "onModalClose";
/**
* generated serial version ID
*/
@ -140,7 +148,7 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
centerPanel = new Panel();
dialogBody.appendChild(centerPanel);
div = new Div();
div.setAlign("right");
div.setStyle("text-align: right");
Hbox hbox = new Hbox();
Button btn = new Button("Ok");
LayoutUtils.addSclass("action-text-button", btn);
@ -167,6 +175,7 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
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 boolean m_cancel = false;
private Panel centerPanel = null;
private Html message = null;
@ -181,7 +190,6 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
private boolean isLocked = false;
private org.adempiere.webui.apps.ProcessModalDialog.ProcessDialogRunnable processDialogRunnable;
private Thread thread;
private String statusUpdate;
/**
* Set Visible
@ -212,6 +220,14 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
return m_valid;
}
/**
* @return true if user have press the cancel button to close the dialog
*/
public boolean isCancel()
{
return m_cancel;
}
/**
* Dynamic Init
* @return true, if there is something to process (start from menu)
@ -351,37 +367,8 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
processDialogRunnable = new ProcessDialogRunnable(p);
thread = new Thread(processDialogRunnable);
thread.start();
Clients.response(new AuEcho(this, "checkProgress", null));
}
public void checkProgress() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.interrupted();
}
if (thread.isAlive()) {
synchronized(this) {
if (statusUpdate != null) {
if (progressWindow != null)
progressWindow.statusUpdate(statusUpdate);
statusUpdate = null;
}
}
Clients.response(new AuEcho(this, "checkProgress", null));
} else {
Env.getCtx().putAll(processDialogRunnable.getProperties());
thread = null;
processDialogRunnable = null;
dispose();
if (m_processMonitor != null) {
m_processMonitor.unlockUI(m_pi);
}
unlockUI(m_pi);
}
}
private void hideBusyDialog() {
if (progressWindow != null) {
progressWindow.dispose();
@ -392,18 +379,50 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
/**
* handle events
*/
public void onEvent(Event event) {
public void onEvent(Event event) {
Component component = event.getTarget();
if (component instanceof Button) {
Button element = (Button)component;
if ("Ok".equalsIgnoreCase(element.getId())) {
this.startProcess();
onOK();
} else if ("Cancel".equalsIgnoreCase(element.getId())) {
this.dispose();
onCancel();
}
} else if (event.getName().equals(ON_STATUS_UPDATE)) {
onStatusUpdate(event);
} else if (event.getName().equals(ON_COMPLETE)) {
onComplete();
}
}
private void onOK() {
this.startProcess();
}
private void onCancel() {
m_cancel = true;
this.dispose();
Events.sendEvent(this, new Event(ON_MODAL_CLOSE, this, null));
}
private void onStatusUpdate(Event event) {
String message = (String) event.getData();
if (progressWindow != null)
progressWindow.statusUpdate(message);
}
private void onComplete() {
Env.getCtx().putAll(processDialogRunnable.getProperties());
thread = null;
processDialogRunnable = null;
dispose();
if (m_processMonitor != null) {
m_processMonitor.unlockUI(m_pi);
}
unlockUI(m_pi);
Events.sendEvent(this, new Event(ON_MODAL_CLOSE, this, null));
}
@Override
public void lockUI(ProcessInfo pi) {
if (isLocked || Executions.getCurrent() == null)
@ -429,10 +448,18 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
@Override
public void statusUpdate(String message) {
statusUpdate = message;
Executions.schedule(getDesktop(), this, new Event(ON_STATUS_UPDATE, this, message));
}
class ProcessDialogRunnable implements Runnable {
/**
*
* @return ProcessInfo
*/
public ProcessInfo getProcessInfo() {
return m_pi;
}
class ProcessDialogRunnable implements Runnable {
private Properties properties;
ProcessDialogRunnable(Properties properties) {
@ -446,6 +473,7 @@ public class ProcessModalDialog extends Window implements EventListener, IProces
WProcessCtl.process(ProcessModalDialog.this, m_WindowNo, parameterPanel, m_pi, null);
} finally {
ServerContext.dispose();
Executions.schedule(getDesktop(), ProcessModalDialog.this, new Event(ON_COMPLETE, ProcessModalDialog.this, null));
}
}

View File

@ -118,7 +118,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
EventListener<Event>, DataStatusListener, ActionListener, IProcessMonitor
{
private static final CLogger logger;
@ -777,7 +777,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
m_lock = new Menuitem(Msg.translate(Env.getCtx(), "Lock"));
m_popup.appendChild(m_lock);
m_lock.addEventListener(Events.ON_CLICK, new EventListener()
m_lock.addEventListener(Events.ON_CLICK, new EventListener<Event>()
{
public void onEvent(Event event) throws Exception
{
@ -790,7 +790,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
m_access = new Menuitem(Msg.translate(Env.getCtx(), "RecordAccessDialog"));
m_popup.appendChild(m_access);
m_access.addEventListener(Events.ON_CLICK, new EventListener()
m_access.addEventListener(Events.ON_CLICK, new EventListener<Event>()
{
public void onEvent(Event event) throws Exception
{
@ -1760,7 +1760,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
messagePanel.appendChild(listbox);
Div div = new Div();
div.setAlign("center");
div.setStyle("text-align: center");
messagePanel.appendChild(div);
Hbox hbox = new Hbox();
@ -1769,9 +1769,8 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
Button btnOk = new Button();
btnOk.setLabel(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "OK")));
btnOk.setImage("/images/Ok16.png");
btnOk.addEventListener(Events.ON_CLICK, new EventListener()
btnOk.addEventListener(Events.ON_CLICK, new EventListener<Event>()
{
@SuppressWarnings("unchecked")
public void onEvent(Event event) throws Exception
{
if (FDialog.ask(curWindowNo, messagePanel, "DeleteSelection"))
@ -1812,7 +1811,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
Button btnCancel = new Button();
btnCancel.setLabel(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Cancel")));
btnCancel.setImage("/images/Cancel16.png");
btnCancel.addEventListener(Events.ON_CLICK, new EventListener()
btnCancel.addEventListener(Events.ON_CLICK, new EventListener<Event>()
{
public void onEvent(Event event) throws Exception
{
@ -2247,9 +2246,19 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
dialog.setWidth("500px");
dialog.setVisible(true);
dialog.setPosition("center");
dialog.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
dialog.addEventListener(ProcessModalDialog.ON_MODAL_CLOSE, new EventListener<Event>() {
@Override
public void onEvent(Event event) throws Exception {
onRefresh(false);
}
});
AEnv.showWindow(dialog);
}
onRefresh(false);
else
{
onRefresh(false);
}
}
} // actionButton