From 68eef9fc8878d27d9902f273251d770cfa43d492 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Tue, 8 Feb 2011 18:59:03 +0800 Subject: [PATCH] Fixed current record could disappear after save. --- .../src/org/compiere/model/GridTab.java | 11 +++- .../src/org/compiere/model/GridTable.java | 56 ++++++++++++++++++- .../webui/panel/AbstractADWindowPanel.java | 9 ++- .../adempiere/webui/panel/StatusBarPanel.java | 12 +++- 4 files changed, 81 insertions(+), 7 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/GridTab.java b/org.adempiere.base/src/org/compiere/model/GridTab.java index 81e402d276..d5a6d7f3ef 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTab.java +++ b/org.adempiere.base/src/org/compiere/model/GridTab.java @@ -887,11 +887,20 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable * @param fireEvent */ public void dataRefreshAll (boolean fireEvent) + { + dataRefreshAll(fireEvent, false); + } + + /************************************************************************** + * Refresh all data + * @param fireEvent + */ + public void dataRefreshAll (boolean fireEvent, boolean retainedCurrentRow) { log.fine("#" + m_vo.TabNo); /** @todo does not work with alpha key */ int keyNo = m_mTable.getKeyID(m_currentRow); - m_mTable.dataRefreshAll(fireEvent); + m_mTable.dataRefreshAll(fireEvent, retainedCurrentRow ? m_currentRow : -1); // Should use RowID - not working for tables with multiple keys if (keyNo != -1) { diff --git a/org.adempiere.base/src/org/compiere/model/GridTable.java b/org.adempiere.base/src/org/compiere/model/GridTable.java index c0f43ecb50..c323805b5d 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTable.java +++ b/org.adempiere.base/src/org/compiere/model/GridTable.java @@ -593,6 +593,11 @@ public class GridTable extends AbstractTableModel return false; } + if (!m_open) + { + m_open = true; + } + // Start Loading m_loader = new Loader(); m_rowCount = m_loader.open(maxRows); @@ -618,7 +623,6 @@ public class GridTable extends AbstractTableModel } else m_loader.close(); - m_open = true; // m_changed = false; m_rowChanged = -1; @@ -2505,6 +2509,7 @@ public class GridTable extends AbstractTableModel // Bug [ 1807947 ] || ( columnName.equals("C_DocType_ID") && hasDocTypeTargetField ) || ( columnName.equals("Line") ) + || ( columnName.equals("C_Location_ID")) ) { rowData[i] = field.getDefault(); @@ -2744,6 +2749,22 @@ public class GridTable extends AbstractTableModel dataRefresh(row, true); } + /** + * get where clause for row + * @param row + * @return where clause + */ + public String getWhereClause(int row) + { + if (row < 0 || m_sort.size() == 0 || m_inserting) + return null; + + Object[] rowData = getDataAtRow(row); + String where = getWhereClause(rowData); + + return where; + } + /** * Refresh Row - ignore changes * @param row row @@ -2819,12 +2840,43 @@ public class GridTable extends AbstractTableModel * @param fireStatusEvent */ public void dataRefreshAll(boolean fireStatusEvent) + { + dataRefreshAll(fireStatusEvent, -1); + } + + /** + * Refresh all Rows - ignore changes + * @param fireStatusEvent + */ + public void dataRefreshAll(boolean fireStatusEvent, int rowToRetained) { log.info(""); m_inserting = false; // should not happen dataIgnore(); + String retainedWhere = null; + if (rowToRetained >= 0) + { + retainedWhere = getWhereClause(rowToRetained); + } close(false); - open(m_maxRows); + if (retainedWhere != null) + { + String whereClause = m_whereClause; + if (m_whereClause == null || m_whereClause.trim().length() == 0) + { + m_whereClause = retainedWhere; + } + else + { + m_whereClause = "(" + m_whereClause + ") OR (" + retainedWhere + ") "; + } + open(m_maxRows); + m_whereClause = whereClause; + } + else + { + open(m_maxRows); + } // Info m_rowData = null; m_changed = false; 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 a87b8283fb..1ad038a9e8 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 @@ -1490,7 +1490,12 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To */ public void onSave() { - onSave(true); + if(onSave(true)) + { + String statusLine = statusBar.getStatusLine(); + curTab.dataRefreshAll(true, true); + statusBar.setStatusLine(statusLine); + } focusToActivePanel(); } @@ -1549,7 +1554,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To boolean retValue = onSave(true); if(retValue) { - curTab.dataRefreshAll(true); + curTab.dataRefreshAll(true, true); onNew(); } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/StatusBarPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/StatusBarPanel.java index 62b7a57bbc..02e98562ee 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/StatusBarPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/StatusBarPanel.java @@ -51,10 +51,10 @@ import org.zkoss.zul.Vbox; public class StatusBarPanel extends Panel implements EventListener, IStatusBar { /** - * + * */ private static final long serialVersionUID = -3262889055635240201L; - + private static final String POPUP_INFO_BACKGROUND_STYLE = "background-color: #262626; -moz-border-radius: 3px; -webkit-border-radius: 3px; border: 1px solid #262626; border-radius: 3px; "; private static final String POPUP_ERROR_BACKGROUND_STYLE = "background-color: #8B0000; -moz-border-radius: 3px; -webkit-border-radius: 3px; border: 1px solid #8B0000; border-radius: 3px; "; private static final String POPUP_POSITION_STYLE = "position: absolute; z-index: 99; display: block; visibility: visible;"; @@ -236,6 +236,14 @@ public class StatusBarPanel extends Panel implements EventListener, IStatusBar } } + /** + * + * @return current status line text + */ + public String getStatusLine() { + return statusLine.getValue(); + } + private void createPopup() { popupContent = new Div();