diff --git a/org.adempiere.base/src/org/compiere/util/Trx.java b/org.adempiere.base/src/org/compiere/util/Trx.java index 74eb4f2d9d..35f6d47d5b 100644 --- a/org.adempiere.base/src/org/compiere/util/Trx.java +++ b/org.adempiere.base/src/org/compiere/util/Trx.java @@ -112,6 +112,8 @@ public class Trx protected Exception trace; private String m_displayName; + + private boolean m_changesMadeByEventListener = false; public static void startTrxMonitor() { @@ -274,6 +276,7 @@ public class Trx } m_active = true; m_startTime = System.currentTimeMillis(); + m_changesMadeByEventListener = false; return true; } // startTrx @@ -362,6 +365,7 @@ public class Trx { m_connection.rollback(savepoint); if (log.isLoggable(Level.INFO)) log.info ("**** " + m_trxName); + m_changesMadeByEventListener = false; return true; } } @@ -730,6 +734,24 @@ public class Trx m_displayName = displayName; } + /** + * Indicate additional db changes have been made by event listener + * @param changesMade + */ + public void setChangesMadeByEventListener(boolean changesMade) + { + m_changesMadeByEventListener = changesMade; + } + + /** + * + * @return true if event listener(s) has flag that additional db changes have been made + */ + public boolean hasChangesMadeByEventListener() + { + return m_changesMadeByEventListener; + } + static class TrxMonitor implements Runnable { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java index 7e89955bcd..d62d1de7b9 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java @@ -1479,9 +1479,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer } else if (ON_DEFER_SET_SELECTED_NODE.equals(event.getName())) { removeAttribute(ON_DEFER_SET_SELECTED_NODE_ATTR); - if (gridTab.getRecord_ID() >= 0 && gridTab.isTreeTab() && treePanel != null) { - setSelectedNode(gridTab.getRecord_ID()); - } + setSelectedNode(); } else if (WPaymentEditor.ON_SAVE_PAYMENT.equals(event.getName())) { windowPanel.onSavePayment(); @@ -1528,6 +1526,15 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer } } + /** + * set selected tree node for current row (if there's tree) + */ + public void setSelectedNode() { + if (gridTab.getRecord_ID() >= 0 && gridTab.isTreeTab() && treePanel != null) { + setSelectedNode(gridTab.getRecord_ID()); + } + } + private void onSouthEvent(SouthEvent event) { if (event == SouthEvent.OPEN || event == SouthEvent.CLOSE) { boolean open = event == SouthEvent.OPEN ? true : false; diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java index 577e2ee95c..9b476a8f16 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java @@ -290,7 +290,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements protected abstract void switchEditStatus(boolean editStatus); - private void focusToActivePanel() { + /** + * set focus to active panel + */ + public void focusToActivePanel() { IADTabpanel adTabPanel = adTabbox.getSelectedTabpanel(); focusToTabpanel(adTabPanel); } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ADTreeOnDropListener.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ADTreeOnDropListener.java index 2d20f5fcd2..d7f2b6af74 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ADTreeOnDropListener.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ADTreeOnDropListener.java @@ -14,6 +14,11 @@ package org.adempiere.webui.component; import java.util.logging.Level; +import org.adempiere.webui.adwindow.ADTabpanel; +import org.adempiere.webui.adwindow.ADWindow; +import org.adempiere.webui.adwindow.ADWindowContent; +import org.adempiere.webui.adwindow.IADTabpanel; +import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.util.TreeUtils; import org.adempiere.webui.window.FDialog; import org.compiere.model.MTree; @@ -24,10 +29,13 @@ import org.compiere.util.CLogger; import org.compiere.util.Env; import org.compiere.util.Msg; import org.compiere.util.Trx; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.DropEvent; 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.DefaultTreeNode; import org.zkoss.zul.Menuitem; import org.zkoss.zul.Menupopup; @@ -183,6 +191,25 @@ public class ADTreeOnDropListener implements EventListener { } // COMMIT ********************* trx.commit(true); + + Component c = SessionManager.getAppDesktop().getActiveWindow(); + ADWindow adwindow = ADWindow.findADWindow(c); + if (adwindow != null) { + ADWindowContent adwindowContent = adwindow.getADWindowContent(); + if (trx.hasChangesMadeByEventListener()) { + Clients.showBusy(null); + Executions.schedule(c.getDesktop(), e -> { + adwindowContent.onRefresh(); + Executions.schedule(c.getDesktop(), e1 -> Clients.clearBusy(), new Event("onEchangeIndicatorchoClearBusy")); + }, new Event("onPostTreeOnDrop")); + } else { + adwindowContent.focusToActivePanel(); + IADTabpanel selected = adwindowContent.getADTab().getSelectedTabpanel(); + if (selected instanceof ADTabpanel) { + ((ADTabpanel)selected).setSelectedNode(); + } + } + } } catch (Exception e) {