From 53a3a38fb82fc4471abd6ddfbb374000ce950360 Mon Sep 17 00:00:00 2001 From: hieplq Date: Thu, 8 Jan 2015 01:36:53 +0700 Subject: [PATCH] IDEMPIERE-2311:bad behavior of info window when after select a record and push enter key --- .../org/adempiere/webui/info/InfoWindow.java | 72 ++++++++++++++++++- .../org/adempiere/webui/panel/InfoPanel.java | 16 ++--- 2 files changed, 79 insertions(+), 9 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java index 4ae7e562d6..7dd425fa5e 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java @@ -23,6 +23,7 @@ import org.adempiere.webui.component.Column; import org.adempiere.webui.component.Columns; import org.adempiere.webui.component.Combobox; import org.adempiere.webui.component.ConfirmPanel; +import org.adempiere.webui.component.EditorBox; import org.adempiere.webui.component.Grid; import org.adempiere.webui.component.GridFactory; import org.adempiere.webui.component.Label; @@ -84,6 +85,7 @@ import org.zkoss.zul.North; import org.zkoss.zul.Separator; import org.zkoss.zul.South; import org.zkoss.zul.Space; +import org.zkoss.zul.Textbox; import org.zkoss.zul.Vbox; /** @@ -810,6 +812,42 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL return null; } + /** + * Check has new parameter is change or new input + * in case first time search, return true + * @return + */ + protected boolean isParameteChangeValue (){ + if (prevParameterValues == null){ + // never process query, because consider as changed value to process current search + return true; + } + + // compare old and new value of parameter input at prev time + for (int parameterIndex = 0; parameterIndex < prevParameterValues.size(); parameterIndex++){ + Object newValue = prevRefParmeterEditor.get(parameterIndex).getValue(); + if (!prevParameterValues.get(parameterIndex).equals(newValue)){ + return true; + } + } + + // in case new field is entered value + for(WEditor editor : editors) { + if (!editor.isVisible() || prevRefParmeterEditor.contains(editor)) + continue; + + if (editor.getGridField() != null && editor.getValue() != null && editor.getValue().toString().trim().length() > 0) { + MInfoColumn mInfoColumn = findInfoColumn(editor.getGridField()); + if (mInfoColumn == null || mInfoColumn.getSelectClause().equals("0")) { + continue; + } + return true; + } + } + + return false; + } + /* (non-Javadoc) * @see org.adempiere.webui.panel.InfoPanel#setParameters(java.sql.PreparedStatement, boolean) */ @@ -828,9 +866,11 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL if (prevParameterValues == null){ prevParameterValues = new ArrayList (); prevQueryOperators = new ArrayList (); + prevRefParmeterEditor = new ArrayList(); }else{ prevParameterValues.clear(); prevQueryOperators.clear(); + prevRefParmeterEditor.clear(); } int parameterIndex = 0; @@ -847,6 +887,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL parameterIndex++; prevParameterValues.add(value); prevQueryOperators.add(mInfoColumn.getQueryOperator()); + prevRefParmeterEditor.add(editor); setParameter (pstmt, parameterIndex, value, mInfoColumn.getQueryOperator()); } } @@ -1439,6 +1480,35 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL SessionManager.getAppDesktop().updateHelpTooltip(selectedValue.get_Translation(MProcess.COLUMNNAME_Name), selectedValue.get_Translation(MProcess.COLUMNNAME_Description), selectedValue.get_Translation(MProcess.COLUMNNAME_Help), null); } + }else if (event.getName().equals(Events.ON_OK) && event.getTarget() != null){ // event when push enter at parameter + Component tagetComponent = event.getTarget(); + boolean isCacheEvent = false;// when event from parameter component, catch it and process at there + for(WEditor editor : editors) { + Component editorComponent = editor.getComponent(); + if (editorComponent instanceof EditorBox){ + editorComponent = ((EditorBox)editorComponent).getTextbox(); + } + if (editorComponent.equals(tagetComponent)){ + isCacheEvent = true; + break; + } + } + + if (isCacheEvent){ + boolean isParameterChange = isParameteChangeValue(); + // when change parameter, also requery + if (isParameterChange){ + onUserQuery(); + }else if (m_lookup && contentPanel.getSelectedIndex() >= 0){ + // do nothing when parameter not change and at window mode, or at dialog mode but select non record + onOk(); + }else { + // parameter not change. do nothing. + } + }else{ + super.onEvent(event); + } + } else { @@ -1510,7 +1580,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL if (dynWhere.length() > 0) sql.append(dynWhere); // includes first AND - + String countSql = Msg.parseTranslation(Env.getCtx(), sql.toString()); // Variables if (countSql.trim().endsWith("WHERE")) { countSql = countSql.trim(); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java index cb9b78b7f7..db8f57b446 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java @@ -325,6 +325,7 @@ public abstract class InfoPanel extends Window implements EventListener, */ protected List prevParameterValues = null; protected List prevQueryOperators = null; + protected List prevRefParmeterEditor = null; private static final String[] lISTENER_EVENTS = {}; /** @@ -1368,6 +1369,11 @@ public abstract class InfoPanel extends Window implements EventListener, if (LayoutUtils.isReallyVisible(this)) { this.onCtrlKeyEvent(keyEvent); } + }else if (event.getName().equals(Events.ON_OK)){// on ok when focus at non parameter component. example grid result + if (m_lookup && contentPanel.getSelectedIndex() >= 0){ + // do nothing when parameter not change and at window mode, or at dialog mode but select non record + onOk(); + } } //when user push enter keyboard at input parameter field else @@ -1388,13 +1394,7 @@ public abstract class InfoPanel extends Window implements EventListener, } } } else if (keyEvent.getKeyCode() == VK_ENTER) { // Enter - // enter in contentpanel to select - //when user push enter keyboard at input parameter field - if (m_lookup && contentPanel.getSelectedIndex() >= 0) { - onOk(); - } else { - onUserQuery(); - } + // do nothing, let on_ok at infoWindo do, at this is too soon to get value from control, it's not bind } else if (keyEvent.getKeyCode() == VK_ESCAPE) { // Escape // Escape for cancel m_cancel = true; @@ -1573,7 +1573,7 @@ public abstract class InfoPanel extends Window implements EventListener, */ protected void bindInfoProcess (){} - private void onOk() + protected void onOk() { if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null) {