diff --git a/org.adempiere.base/src/org/compiere/model/GridField.java b/org.adempiere.base/src/org/compiere/model/GridField.java index 6e9a5eae0a..1e9eb87d40 100644 --- a/org.adempiere.base/src/org/compiere/model/GridField.java +++ b/org.adempiere.base/src/org/compiere/model/GridField.java @@ -2361,54 +2361,42 @@ public class GridField /** * Returns a list containing all existing entries of this field - * with the actual AD_Org_ID and AD_Client_ID. + * with the actual AD_Client_ID. * @return List of existing entries for this field */ public List getEntries() { + /* TODO: consider caching the list to avoid repeating queries on every window open (twice, for find and for field) */ + MColumn column = MColumn.get(Env.getCtx(), getAD_Column_ID()); + MTable table = MTable.get(Env.getCtx(), column.getAD_Table_ID()); + String tableName = table.getTableName(); + String columnName = column.getColumnName(); ArrayList list = new ArrayList(); - PreparedStatement pstmt1; - PreparedStatement pstmt2; - String sql = ""; - - try - { - String tableName = null; - String columnName = null; - int AD_Org_ID = Env.getAD_Org_ID(Env.getCtx()); + if (tableName != null && columnName != null) { int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx()); - sql = "SELECT t.TableName, c.ColumnName " + - " FROM AD_COLUMN c INNER JOIN AD_Table t ON (c.AD_Table_ID=t.AD_Table_ID)" + - " WHERE AD_Column_ID=?"; - pstmt1 = DB.prepareStatement(sql, null); - pstmt1.setInt(1, getAD_Column_ID()); - ResultSet rs1 = pstmt1.executeQuery(); - if (rs1.next()) - { - tableName = rs1.getString(1); - columnName = rs1.getString(2); - } - DB.close(rs1, pstmt1); - - if (tableName != null && columnName != null) { - sql = "SELECT DISTINCT " + columnName + " FROM " + tableName + " WHERE AD_Client_ID=? " - + " AND AD_Org_ID=?"; - pstmt2 = DB.prepareStatement(sql, null); - pstmt2.setInt(1, AD_Client_ID); - pstmt2.setInt(2, AD_Org_ID); - - ResultSet rs2 = pstmt2.executeQuery(); - while (rs2.next()) - { - list.add(rs2.getString(1)); + PreparedStatement pstmt = null; + ResultSet rs = null; + StringBuilder sql = new StringBuilder() + .append("SELECT DISTINCT ") + .append(columnName) + .append(" FROM ") + .append(tableName) + .append(" WHERE AD_Client_ID=? AND ") + .append(columnName) + .append(" IS NOT NULL ORDER BY 1"); + try { + pstmt = DB.prepareStatement(sql.toString(), null); + pstmt.setInt(1, AD_Client_ID); + + rs = pstmt.executeQuery(); + while (rs.next()) { + list.add(rs.getString(1)); } - DB.close(rs2, pstmt2); + } catch (Exception e) { + log.log(Level.SEVERE, sql.toString(), e); + } finally { + DB.close(rs, pstmt); } } - catch (Exception e) - { - log.log(Level.SEVERE, sql, e); - } - return list; } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java index d54e5dc7dc..d89e1efea2 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java @@ -145,7 +145,8 @@ public class WStringEditor extends WEditor implements ContextMenuListener } else getComponent().setMultiline(false); - getComponent().setRows(gridField.getNumLines() <= 0 || tableEditor ? 1 : gridField.getNumLines()); + if (! gridField.isAutocomplete()) // avoid -> Combobox doesn't support multiple rows + getComponent().setRows(gridField.getNumLines() <= 0 || tableEditor ? 1 : gridField.getNumLines()); if (getComponent().getRows() > 1) ZKUpdateUtil.setHeight(getComponent(), "100%"); @@ -154,7 +155,7 @@ public class WStringEditor extends WEditor implements ContextMenuListener if(!(this instanceof WPasswordEditor)){ // check password field - popupMenu = new WEditorPopupMenu(false, false, isShowPreference()); + popupMenu = new WEditorPopupMenu(false, gridField.isAutocomplete(), isShowPreference()); addTextEditorMenu(popupMenu); addChangeLogMenu(popupMenu); } @@ -289,23 +290,28 @@ public class WStringEditor extends WEditor implements ContextMenuListener { WFieldRecordInfo.start(gridField); } + else if (WEditorPopupMenu.REQUERY_EVENT.equals(evt.getContextEvent())) + { + actionRefresh(); + } } - + @Override public void dynamicDisplay() { super.dynamicDisplay(); - //referesh auto complete list + actionRefresh(); + } + + public void actionRefresh() { + //refresh auto complete list if (gridField.isAutocomplete()) { - Combobox combo = (Combobox)getComponent(); - List items = gridField.getEntries(); - if (items.size() != combo.getItemCount()) - { - combo.removeAllItems(); - for(String s : items) { - combo.appendItem(s); - } - } - } + Combobox combo = (Combobox)getComponent(); + List items = gridField.getEntries(); + combo.removeAllItems(); + for(String s : items) { + combo.appendItem(s); + } + } } private AbstractADWindowContent findADWindowContent() {