diff --git a/org.adempiere.base/src/org/adempiere/base/DefaultLookupFactory.java b/org.adempiere.base/src/org/adempiere/base/DefaultLookupFactory.java index 2570b64379..bc4543614b 100644 --- a/org.adempiere.base/src/org/adempiere/base/DefaultLookupFactory.java +++ b/org.adempiere.base/src/org/adempiere/base/DefaultLookupFactory.java @@ -42,7 +42,7 @@ public class DefaultLookupFactory implements ILookupFactory{ } else if (gridFieldVO.displayType == DisplayType.Locator) { - lookup = new MLocatorLookup (gridFieldVO.ctx, gridFieldVO.WindowNo); + lookup = new MLocatorLookup (gridFieldVO.ctx, gridFieldVO.WindowNo, gridFieldVO.ValidationCode); } else if (gridFieldVO.displayType == Account) // not cached { diff --git a/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java b/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java index 5ea53dbd65..49062d84d6 100644 --- a/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java @@ -29,6 +29,7 @@ import java.util.logging.Level; import org.compiere.util.DB; import org.compiere.util.DisplayType; +import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.NamePair; import org.compiere.util.Util; @@ -57,9 +58,21 @@ public final class MLocatorLookup extends Lookup implements Serializable * @param WindowNo window no */ public MLocatorLookup(Properties ctx, int WindowNo) + { + this(ctx, WindowNo, null); + } + + /** + * Constructor + * @param ctx context + * @param WindowNo window no + * @param validationCode Lookup validation code + */ + public MLocatorLookup(Properties ctx, int WindowNo, String validationCode) { super (DisplayType.TableDir, WindowNo); m_ctx = ctx; + m_validationCode = validationCode; // m_loader = new Loader(); m_loader.start(); @@ -69,6 +82,9 @@ public final class MLocatorLookup extends Lookup implements Serializable private Properties m_ctx; protected int C_Locator_ID; private Loader m_loader; + private String m_validationCode; + private String m_parsedValidation; + private int m_warehouseActiveCount; /** Only Warehouse */ private int m_only_Warehouse_ID = 0; @@ -300,7 +316,36 @@ public final class MLocatorLookup extends Lookup implements Serializable return false; } // isValid - + private boolean isNeedRefresh() + { + if (!Util.isEmpty(m_validationCode)) + { + Properties ctx = new Properties(m_ctx); + Env.setContext(ctx, getWindowNo(), "M_Product_ID", getOnly_Product_ID()); + Env.setContext(ctx, getWindowNo(), "M_Warehouse_ID", getOnly_Warehouse_ID()); + String parseValidation = Env.parseContext(ctx, getWindowNo(), m_validationCode, false, false); + if ((!Util.isEmpty(parseValidation) && !parseValidation.equals(m_parsedValidation)) || (!Util.isEmpty(m_parsedValidation) && !m_parsedValidation.equals(parseValidation))) + return true; + } + else if (!Util.isEmpty(m_parsedValidation)) + { + m_parsedValidation = null; + return true; + } + + if (m_only_Warehouse_ID==0) + { + int activeCount = DB.getSQLValue(null, "SELECT Count(*) FROM M_Warehouse WHERE IsActive='Y' AND AD_Client_ID=?", Env.getAD_Client_ID(m_ctx)); + if (m_warehouseActiveCount != activeCount) + { + m_warehouseActiveCount = activeCount; + return true; + } + } + + return false; + } + /************************************************************************** * Loader */ @@ -336,12 +381,27 @@ public final class MLocatorLookup extends Lookup implements Serializable if (local_only_warehouse_id != 0) sql.append(" AND M_Locator.M_Warehouse_ID=?"); + else + m_warehouseActiveCount = DB.getSQLValue(null, "SELECT Count(*) FROM M_Warehouse WHERE IsActive='Y' AND AD_Client_ID=?", Env.getAD_Client_ID(m_ctx)); if (local_only_product_id != 0) sql.append(" AND (M_Locator.IsDefault='Y' ") // Default Locator .append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator .append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)") .append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator .append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))"); + m_parsedValidation = null; + if (!Util.isEmpty(m_validationCode)) + { + Properties ctx = new Properties(m_ctx); + Env.setContext(ctx, getWindowNo(), "M_Product_ID", getOnly_Product_ID()); + Env.setContext(ctx, getWindowNo(), "M_Warehouse_ID", getOnly_Warehouse_ID()); + String parseValidation = Env.parseContext(ctx, getWindowNo(), m_validationCode, false, false); + m_parsedValidation = parseValidation; + if (!Util.isEmpty(parseValidation)) + { + sql.append(" AND ( ").append(parseValidation).append(" ) "); + } + } sql.append(" ORDER BY "); if (local_only_warehouse_id == 0) sql.append("wh.Name,"); @@ -465,6 +525,16 @@ public final class MLocatorLookup extends Lookup implements Serializable return m_lookup.size(); } // refresh + public int refreshIfNeeded() + { + if (m_loader != null && m_loader.isAlive()) + return m_lookup.size(); + else if (isNeedRefresh()) + return refresh(); + else + return m_lookup.size(); + } + /** * Get underlying fully qualified Table.Column Name * @return Table.ColumnName @@ -474,4 +544,9 @@ public final class MLocatorLookup extends Lookup implements Serializable return "M_Locator.M_Locator_ID"; } // getColumnName + public void dynamicDisplay(Properties ctx) + { + m_ctx = ctx; + m_parsedValidation = null; + } } // MLocatorLookup 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 016b6d50d8..8823509da5 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 @@ -22,6 +22,7 @@ import java.beans.PropertyChangeListener; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Properties; import java.util.logging.Level; import org.adempiere.webui.ClientInfo; @@ -424,6 +425,14 @@ public class WLocatorEditor extends WEditor implements EventListener, Pro pstmt = null; } + if (M_Locator_ID > 0) + { + m_mLocator.refreshIfNeeded(); + boolean valid = m_mLocator.containsKey(M_Locator_ID); + if (!valid) + M_Locator_ID = 0; + } + if (M_Locator_ID == 0) return false; @@ -447,7 +456,11 @@ public class WLocatorEditor extends WEditor implements EventListener, Pro private int getOnly_Warehouse_ID() { - String only_Warehouse = Env.getContext(Env.getCtx(), m_WindowNo, "M_Warehouse_ID", true); + String only_Warehouse = null; + if (gridField != null && gridField.getVO().TabNo > 0) + only_Warehouse = Env.getContext(Env.getCtx(), m_WindowNo, gridField.getVO().TabNo, "M_Warehouse_ID", false, true); + else + only_Warehouse = Env.getContext(Env.getCtx(), m_WindowNo, "M_Warehouse_ID", true); int only_Warehouse_ID = 0; try @@ -472,7 +485,11 @@ public class WLocatorEditor extends WEditor implements EventListener, Pro if (!Env.isSOTrx(Env.getCtx(), m_WindowNo)) return 0; // No product restrictions for PO - String only_Product = Env.getContext(Env.getCtx(), m_WindowNo, "M_Product_ID", true); + String only_Product = null; + if (gridField != null && gridField.getVO().TabNo > 0) + only_Product = Env.getContext(Env.getCtx(), m_WindowNo, gridField.getVO().TabNo, "M_Product_ID", false, true); + else + only_Product = Env.getContext(Env.getCtx(), m_WindowNo, "M_Product_ID", true); int only_Product_ID = 0; try @@ -551,5 +568,9 @@ public class WLocatorEditor extends WEditor implements EventListener, Pro getComponent().setTableEditorMode(b); } - + @Override + public void dynamicDisplay(Properties ctx) { + super.dynamicDisplay(ctx); + m_mLocator.dynamicDisplay(ctx); + } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java index 24ee380bfb..7db54741f0 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java @@ -375,7 +375,7 @@ public class WLocatorDialog extends Window implements EventListener if (log.isLoggable(Level.FINE)) log.fine("LocatorTypes=" + lstLocatorType.getItemCount()); // Load existing Locators - + m_mLocator.refreshIfNeeded(); m_mLocator.fillComboBox(m_mandatory, true, true, false, false); // IDEMPIERE 90 if (log.isLoggable(Level.FINE)) log.fine(m_mLocator.toString()); @@ -393,17 +393,22 @@ public class WLocatorDialog extends Window implements EventListener } } + int selectedIndex = -1; for (int i = 0; i < m_mLocator.getSize(); i++) { - Object obj = m_mLocator.getElementAt(i); + MLocator obj = (MLocator) m_mLocator.getElementAt(i); + if (obj.getM_Locator_ID() == m_M_Locator_ID && m_M_Locator_ID > 0) + selectedIndex = i; lstLocator.appendItem(obj.toString(), obj); } - //lstLocator.setModel(m_mLocator); - //lstLocator.setValue(m_M_Locator_ID); - if (lstLocator.getItemCount() > 0) - lstLocator.setSelectedIndex(0); + if (lstLocator.getItemCount() > 0) { + if (selectedIndex >= 0) + lstLocator.setSelectedIndex(selectedIndex); + else + lstLocator.setSelectedIndex(0); + } lstLocator.addEventListener(Events.ON_SELECT, this); displayLocator();