From 2f1aa8ac910720394a3512cfabec54f86690648b Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Wed, 22 Aug 2012 17:45:31 +0800 Subject: [PATCH] IDEMPIERE-144 Performance: Remove the use of zk event thread. Fixed InfoSchedule not showing up and misc. timeline related javascript bugs. Fixed popup dialog sometime is position off screen. --- .../src/org/adempiere/webui/LayoutUtils.java | 31 +++++++++++ .../adempiere/webui/TimelineEventFeed.java | 12 +++-- .../webui/editor/WAssignmentEditor.java | 4 +- .../webui/editor/WLocationEditor.java | 5 +- .../webui/editor/WLocatorEditor.java | 5 +- .../org/adempiere/webui/panel/WSchedule.java | 27 +++++----- .../adempiere/webui/window/InfoSchedule.java | 51 ++++++++++++++----- .../webui/window/WAssignmentDialog.java | 41 ++++++++++----- org.adempiere.ui.zk/js/layout.js | 12 ++--- org.adempiere.ui.zk/js/window.js | 5 ++ .../metainfo/zk/lang-addon.xml | 1 + .../theme/default/css/theme.css.dsp | 4 ++ 12 files changed, 141 insertions(+), 57 deletions(-) create mode 100644 org.adempiere.ui.zk/js/window.js diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/LayoutUtils.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/LayoutUtils.java index 6610153249..ebcfb6a8f1 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/LayoutUtils.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/LayoutUtils.java @@ -19,6 +19,7 @@ import org.zkoss.zk.ui.HtmlBasedComponent; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.Borderlayout; import org.zkoss.zul.Div; +import org.zkoss.zul.Window; /** * @@ -72,4 +73,34 @@ public final class LayoutUtils { return div; } + + /** + * open popup window overlapping the ref component + * @param ref + * @param window + */ + public static void openPopupWindow(Component ref, Window window) { + openPopupWindow(ref, window, "overlap"); + } + + /** + * open popup window relative to the ref component + * @param ref + * @param window + * @param position + */ + public static void openPopupWindow(Component ref, Window window, String position) { + if (window.getPage() == null) + window.setPage(ref.getPage()); + StringBuilder script = new StringBuilder(); + script.append("_idempiere_popup_window('#") + .append(ref.getUuid()) + .append("','#") + .append(window.getUuid()) + .append("','") + .append(position) + .append("');"); + window.doPopup(); + Clients.response("_openPopupWindow_", new AuScript(window, script.toString())); + } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java index fe6b8506e5..8004ea8f32 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java @@ -123,11 +123,13 @@ public class TimelineEventFeed extends HttpServlet { } if (slot.getMAssignment() != null) { //encode assignment id as coordinate x - String link = "Edit"; + String link = "Edit"; xml.append("\r\n").append(XMLs.encodeText(link)); } xml.append("\r\n").append("").append("\r\n"); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WAssignmentEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WAssignmentEditor.java index 0af7f0e53d..1fd8fd48a7 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WAssignmentEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WAssignmentEditor.java @@ -7,6 +7,7 @@ import java.text.NumberFormat; import java.util.logging.Level; import org.adempiere.util.Callback; +import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.EditorBox; import org.adempiere.webui.event.ContextMenuEvent; @@ -162,7 +163,8 @@ public class WAssignmentEditor extends WEditor implements ContextMenuListener { processNewValue(oldValue, ma); } }); - AEnv.showWindow(vad); + vad.setTitle(null); + LayoutUtils.openPopupWindow(this.getComponent().getTextbox(), vad); } // Start InfoSchedule directly else diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocationEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocationEditor.java index c4b603c802..d2ca26b81c 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocationEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocationEditor.java @@ -20,6 +20,7 @@ package org.adempiere.webui.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.ValuePreference; import org.adempiere.webui.component.Locationbox; import org.adempiere.webui.event.ContextMenuEvent; @@ -189,10 +190,8 @@ public class WLocationEditor extends WEditor implements EventListener, Pr setValue(ii); } }); - getComponent().appendChild(ld); - ld.setPosition("parent"); ld.setTitle(null); - ld.doPopup(); + LayoutUtils.openPopupWindow(getComponent(), ld); } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocatorEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocatorEditor.java index 7e2803d6d4..31f72186eb 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocatorEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WLocatorEditor.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; +import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.ValuePreference; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.EditorBox; @@ -249,10 +250,8 @@ public class WLocatorEditor extends WEditor implements EventListener, Pro } }); // display - getComponent().appendChild(ld); - ld.setPosition("parent"); ld.setTitle(null); - ld.doPopup(); + LayoutUtils.openPopupWindow(getComponent(), ld); } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java index 2fa4f93843..c70c99f134 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java @@ -18,13 +18,13 @@ package org.adempiere.webui.panel; import java.text.DateFormat; import java.util.Date; -import java.util.TimeZone; import java.util.logging.Level; -import org.adempiere.webui.apps.AEnv; +import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.event.DialogEvents; +import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.window.InfoSchedule; import org.adempiere.webui.window.WAssignmentDialog; import org.compiere.model.MResourceAssignment; @@ -127,7 +127,8 @@ public class WSchedule extends Panel implements EventListener hourBand.setIntervalUnit("hour"); hourBand.setWidth("40%"); hourBand.setIntervalPixels(40); - hourBand.setTimeZone(TimeZone.getDefault()); + hourBand.setTimeZone(SessionManager.getAppDesktop().getClientInfo().timeZone); + hourBand.setId("WScheduleHourBand"); if (dayBand != null) dayBand.detach(); @@ -137,9 +138,10 @@ public class WSchedule extends Panel implements EventListener dayBand.setWidth("35%"); dayBand.setIntervalPixels(100); dayBand.setSyncWith(hourBand.getId()); - dayBand.setTimeZone(TimeZone.getDefault()); + dayBand.setTimeZone(SessionManager.getAppDesktop().getClientInfo().timeZone); // listening band scroll event dayBand.addEventListener("onBandScroll", this); + dayBand.setId("WScheduleDayBand"); if (mthBand != null) mthBand.detach(); @@ -149,7 +151,7 @@ public class WSchedule extends Panel implements EventListener mthBand.setWidth("25%"); mthBand.setIntervalPixels(150); mthBand.setSyncWith(dayBand.getId()); - mthBand.setTimeZone(TimeZone.getDefault()); + mthBand.setTimeZone(SessionManager.getAppDesktop().getClientInfo().timeZone); } /** @@ -166,7 +168,7 @@ public class WSchedule extends Panel implements EventListener // if (m_center == null || date.getTime() != m_center.getTime()) // hourBand.scrollToCenter(date); // - + String feedUrl = "timeline?S_Resource_ID=" + S_Resource_ID + "&date=" + DateFormat.getInstance().format(date) + "&uuid=" + button.getUuid() + "&tlid=" + timeLine.getUuid(); hourBand.setEventSourceUrl(feedUrl); @@ -184,17 +186,19 @@ public class WSchedule extends Panel implements EventListener MouseEvent me = (MouseEvent) event; if (me.getX() > 0) { MResourceAssignment assignment = new MResourceAssignment(Env.getCtx(), me.getX(), null); - final WAssignmentDialog wad = new WAssignmentDialog(assignment, false, infoSchedule.isCreateNew()); - wad.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() { + final WAssignmentDialog assignmentDialog = new WAssignmentDialog(assignment, false, infoSchedule.isCreateNew()); + assignmentDialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() { @Override public void onEvent(Event event) throws Exception { - if (!wad.isCancelled()) { - _assignmentDialogResult = wad.getMResourceAssignment(); + if (!assignmentDialog.isCancelled()) { + _assignmentDialogResult = assignmentDialog.getMResourceAssignment(); Events.echoEvent("onAssignmentCallback", WSchedule.this, null); } } }); - AEnv.showWindow(wad); + assignmentDialog.setTitle(null); + LayoutUtils.openPopupWindow(this, assignmentDialog, "at_pointer"); + Events.postEvent(new Event(Events.ON_CLICK, assignmentDialog.getDateFrom())); } } else if (event instanceof BandScrollEvent){ BandScrollEvent e = (BandScrollEvent) event; @@ -207,5 +211,4 @@ public class WSchedule extends Panel implements EventListener } } } - } // WSchedule diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java index a80b9e4baa..74838ff7c5 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java @@ -27,6 +27,7 @@ import java.util.GregorianCalendar; import java.util.logging.Level; import org.adempiere.util.Callback; +import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Button; import org.adempiere.webui.component.ConfirmPanel; @@ -52,6 +53,7 @@ import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.Msg; import org.compiere.util.TimeUtil; +import org.zkoss.zk.ui.Page; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; @@ -103,10 +105,17 @@ public class InfoSchedule extends Window implements EventListener super(); setTitle(Msg.getMsg(Env.getCtx(), "InfoSchedule")); if (createNew) - setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED); + { + setAttribute(Window.MODE_KEY, Window.MODE_POPUP); + this.setWidth("600px"); + } else - setAttribute(Window.MODE_KEY, Window.MODE_OVERLAPPED); - this.setWidth("600px"); + { + setAttribute(Window.MODE_KEY, Window.MODE_EMBEDDED); + this.setWidth("100%"); + this.setHeight("100%"); + } + // this.setHeight("600px"); this.setClosable(true); this.setBorder("normal"); @@ -138,7 +147,9 @@ public class InfoSchedule extends Window implements EventListener catch(Exception ex) { log.log(Level.SEVERE, "InfoSchedule", ex); - } + } + AEnv.showWindow(this); + displayCalendar(); } // InfoSchedule /** @@ -174,7 +185,8 @@ public class InfoSchedule extends Window implements EventListener // private WSchedule schedulePane = new WSchedule(this); private StatusBarPanel statusBar = new StatusBarPanel(); - private ConfirmPanel confirmPanel = new ConfirmPanel(true); + private ConfirmPanel confirmPanel = null; + private Button btnNew; /** * Static Layout @@ -226,7 +238,11 @@ public class InfoSchedule extends Window implements EventListener schedulePane.setWidth("100%"); schedulePane.setHeight("400px"); Div div = new Div(); - div.appendChild(confirmPanel); + if (m_createNew) + { + confirmPanel = new ConfirmPanel(true); + div.appendChild(confirmPanel); + } div.appendChild(statusBar); mainLayout.appendChild(div); @@ -255,18 +271,17 @@ public class InfoSchedule extends Window implements EventListener bNext.addEventListener(Events.ON_CLICK, this); // - // - confirmPanel.addActionListener(Events.ON_CLICK, this); + // if (createNew) { - Button btnNew = new Button(); + confirmPanel.addActionListener(Events.ON_CLICK, this); + btnNew = new Button(); btnNew.setName("btnNew"); btnNew.setId("New"); btnNew.setSrc("/images/New24.png"); confirmPanel.addComponentsLeft(btnNew); btnNew.addEventListener(Events.ON_CLICK, this); - } - displayCalendar(); + } } // dynInit /** @@ -569,7 +584,8 @@ public class InfoSchedule extends Window implements EventListener mAssignmentCallback(vad.getMResourceAssignment()); } }); - AEnv.showWindow(vad); + vad.setTitle(null); + LayoutUtils.openPopupWindow(btnNew, vad, "before_start"); } else { FDialog.error(0, this, "No available time slot for the selected day."); } @@ -587,6 +603,17 @@ public class InfoSchedule extends Window implements EventListener m_dateFrom = new Timestamp(date.getTime()); fieldDate.setValue(m_dateFrom); // Elaine 2008/12/15 } + + /* (non-Javadoc) + * @see org.zkoss.zk.ui.AbstractComponent#onPageAttached(org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Page) + */ + @Override + public void onPageAttached(Page newpage, Page oldpage) { + super.onPageAttached(newpage, oldpage); + if (newpage != null) { + displayCalendar(); + } + } /** diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WAssignmentDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WAssignmentDialog.java index fc4b8e3af6..438ad54f28 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WAssignmentDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WAssignmentDialog.java @@ -30,7 +30,6 @@ import java.util.logging.Level; import org.adempiere.util.Callback; import org.adempiere.webui.LayoutUtils; -import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Button; import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.Datebox; @@ -114,6 +113,8 @@ public class WAssignmentDialog extends Window implements EventListener log.log(Level.SEVERE, "", e); } setDisplay(); // from mAssignment + setWidth("600px"); + setSizable(true); // } // VAssignmentDialog @@ -377,17 +378,8 @@ public class WAssignmentDialog extends Window implements EventListener // Zoom - InfoResource else if (e.getTarget().getId().equals("Zoom")) { - InfoSchedule is = new InfoSchedule (m_mAssignment, true, new Callback() { - @Override - public void onCallback(MResourceAssignment result) { - if (result != null) - { - m_mAssignment = result; - // setDisplay(); - detach(); - } - } - }); + setVisible(false); + Events.echoEvent("onShowSchedule", this, null); } // cancel - return @@ -417,17 +409,40 @@ public class WAssignmentDialog extends Window implements EventListener } } + public void onShowSchedule() + { + InfoSchedule is = new InfoSchedule (m_mAssignment, true, new Callback() { + @Override + public void onCallback(MResourceAssignment result) { + if (result != null) + { + m_mAssignment = result; + // setDisplay(); + detach(); + } + else + { + setVisible(true); + } + } + }); + } + private void getDateAndTimeFrom(Calendar date) { Date dateFrom = fDateFrom.getValue(); Date timeFrom = fTimeFrom.getValue(); date.setTime(dateFrom); Calendar time = new GregorianCalendar(); time.setTime(timeFrom); - date.set(Calendar.HOUR, time.get(Calendar.HOUR)); + date.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY)); date.set(Calendar.MINUTE, time.get(Calendar.MINUTE)); } public boolean isCancelled() { return m_cancel; } + + public Datebox getDateFrom() { + return fDateFrom; + } } // VAssignmentDialog diff --git a/org.adempiere.ui.zk/js/layout.js b/org.adempiere.ui.zk/js/layout.js index 567965dceb..48aa141cce 100644 --- a/org.adempiere.ui.zk/js/layout.js +++ b/org.adempiere.ui.zk/js/layout.js @@ -10,13 +10,10 @@ function _ad_deferBDL(uuid) { if (cmp) { cmp.resize(); } } -function ad_closeBuble(uuid) { - var cmp = zk.Widget.$(uuid); - if (cmp) { - for(var i=0;i + diff --git a/org.adempiere.ui.zk/theme/default/css/theme.css.dsp b/org.adempiere.ui.zk/theme/default/css/theme.css.dsp index 1d4d35a809..1591fdb867 100644 --- a/org.adempiere.ui.zk/theme/default/css/theme.css.dsp +++ b/org.adempiere.ui.zk/theme/default/css/theme.css.dsp @@ -596,4 +596,8 @@ div.z-vfiletree-body td.menu-tree-cell { <%-- dashlet --%> .z-panel-hl .z-panel-header { padding: 0 0 2px 0; +} + +div.simileAjax-bubble-container { + z-index: 2800 !important; } \ No newline at end of file