/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
/**
* 2007, Modified by Posterita Ltd.
*/
package org.adempiere.webui.window;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListItem;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.Textbox;
import org.adempiere.webui.component.Window;
import org.compiere.model.MLocator;
import org.compiere.model.MLocatorLookup;
import org.compiere.model.MRole;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Msg;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Vbox;
/**
* Location Dialog : Based on VLocationDialog
*
* @author Niraj Sohun
* @date Jul 24, 2007
*/
public class WLocatorDialog extends Window implements EventListener
{
/**
*
*/
private static final long serialVersionUID = -1013647722305985723L;
private Vbox mainBox = new Vbox();
private Listbox lstLocator = new Listbox();
private Listbox lstWarehouse = new Listbox();
private Checkbox chkCreateNew = new Checkbox();
private Textbox txtWarehouse = new Textbox();
private Textbox txtAisleX = new Textbox();
private Textbox txtBinY = new Textbox();
private Textbox txtLevelZ = new Textbox();
private Textbox txtKey = new Textbox();
private Label lblLocator = new Label();
private Label lblWarehouse = new Label();
private Label lblAisleX = new Label();
private Label lblBinY = new Label();
private Label lblLevelZ = new Label();
private Label lblKey = new Label();
private Button btnCancel = new Button();
private Button btnOk = new Button();
private MLocatorLookup m_mLocator;
private int m_WindowNo;
private int m_M_Locator_ID;
private int m_AD_Client_ID;
private int m_AD_Org_ID;
private int m_only_Warehouse_ID;
private int m_M_Warehouse_ID;
private boolean m_mandatory;
private String m_M_WarehouseName;
private String m_M_WarehouseValue;
private String m_Separator;
private boolean m_change;
private String title;
private static CLogger log = CLogger.getCLogger(WLocatorDialog.class);
/**
* Constructor
* @param title title
* @param mLocator locator
* @param M_Locator_ID locator id
* @param mandatory mandatory
* @param only_Warehouse_ID of not 0 restrict warehouse
* @param windowNo
*/
public WLocatorDialog ( String title, MLocatorLookup mLocator,
int M_Locator_ID, boolean mandatory, int only_Warehouse_ID,
int windowNo)
{
super();
m_WindowNo = windowNo;
this.title = title;
initComponents();
m_mLocator = mLocator;
m_M_Locator_ID = M_Locator_ID;
m_mandatory = mandatory;
m_only_Warehouse_ID = only_Warehouse_ID;
initLocator();
} // WLocatorDialog
private void initComponents()
{
txtWarehouse.setEnabled(false);
lblLocator.setValue("Locator");
lblWarehouse.setValue("Warehouse");
lblAisleX.setValue("Aisle (X)");
lblBinY.setValue("Bin (Y)");
lblLevelZ.setValue("Level (Z)");
lblKey.setValue("Key");
Hbox boxLocator = new Hbox();
boxLocator.setWidth("100%");
boxLocator.setWidths("30%, 70%");
lstLocator.setWidth("150px"); // Elaine 2009/02/02 - fixed the locator width
lstLocator.setMold("select");
lstLocator.setRows(0);
boxLocator.appendChild(lblLocator);
boxLocator.appendChild(lstLocator);
Hbox boxCheckbox = new Hbox();
boxCheckbox.setWidth("100%");
boxCheckbox.setWidths("30%, 70%");
boxCheckbox.setStyle("text-align:left");
chkCreateNew.setLabel(Msg.getMsg(Env.getCtx(), "Create New Record"));
boxCheckbox.appendChild(new Label());
boxCheckbox.appendChild(chkCreateNew);
Hbox boxWarehouse = new Hbox();
boxWarehouse.setWidth("100%");
boxWarehouse.setWidths("30%, 70%");
lstWarehouse.setWidth("100px");
lstWarehouse.setMold("select");
lstWarehouse.setRows(0);
boxWarehouse.appendChild(lblWarehouse);
boxWarehouse.appendChild(lstWarehouse);
boxWarehouse.appendChild(txtWarehouse);
Hbox boxAisle = new Hbox();
boxAisle.setWidth("100%");
boxAisle.setWidths("30%, 70%");
boxAisle.appendChild(lblAisleX);
boxAisle.appendChild(txtAisleX);
Hbox boxBin = new Hbox();
boxBin.setWidth("100%");
boxBin.setWidths("30%, 70%");
boxBin.appendChild(lblBinY);
boxBin.appendChild(txtBinY);
Hbox boxLevel = new Hbox();
boxLevel.setWidth("100%");
boxLevel.setWidths("30%, 70%");
boxLevel.appendChild(lblLevelZ);
boxLevel.appendChild(txtLevelZ);
Hbox boxKey = new Hbox();
boxKey.setWidth("100%");
boxKey.setWidths("30%, 70%");
boxKey.appendChild(lblKey);
boxKey.appendChild(txtKey);
Hbox boxButtons = new Hbox();
boxButtons.setWidth("100%");
boxButtons.setWidths("80%, 10%, 10%");
boxButtons.setStyle("text-align:right");
btnCancel.setImage("/images/Cancel16.png");
btnCancel.addEventListener(Events.ON_CLICK, this);
btnOk.setImage("/images/Ok16.png");
btnOk.addEventListener(Events.ON_CLICK, this);
boxButtons.appendChild(new Label());
boxButtons.appendChild(btnCancel);
boxButtons.appendChild(btnOk);
mainBox.setWidth("250px");
mainBox.setStyle("text-align:right");
mainBox.appendChild(boxLocator);
mainBox.appendChild(new Separator());
mainBox.appendChild(boxCheckbox);
mainBox.appendChild(new Separator());
mainBox.appendChild(boxWarehouse);
mainBox.appendChild(boxAisle);
mainBox.appendChild(boxBin);
mainBox.appendChild(boxLevel);
mainBox.appendChild(boxKey);
mainBox.appendChild(new Separator());
mainBox.appendChild(boxButtons);
this.appendChild(mainBox);
this.setTitle(title);
this.setClosable(true);
this.setBorder("normal");
this.setWidth("260Px");
this.setAttribute("mode","modal");
this.setSizable(true); // Elaine 2009/02/02 - window set to resizable
}
private void initLocator()
{
log.fine("");
// Load Warehouse
String sql = "SELECT M_Warehouse_ID, Name FROM M_Warehouse";
if (m_only_Warehouse_ID != 0)
sql += " WHERE M_Warehouse_ID=" + m_only_Warehouse_ID;
String SQL = MRole.getDefault().addAccessSQL(
sql, "M_Warehouse", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO)
+ " ORDER BY 2";
try
{
PreparedStatement pstmt = DB.prepareStatement(SQL, null);
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
KeyNamePair key = new KeyNamePair(rs.getInt(1), rs.getString(2));
lstWarehouse.appendItem(key.getName(), key);
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, SQL, e);
}
log.fine("Warehouses=" + lstWarehouse.getItemCount());
// Load existing Locators
m_mLocator.fillComboBox(m_mandatory, true, true, false);
log.fine(m_mLocator.toString());
for (int i = 0; i < m_mLocator.getSize(); i++)
{
Object obj = m_mLocator.getElementAt(i);
lstLocator.appendItem(obj.toString(), obj);
}
//lstLocator.setModel(m_mLocator);
//lstLocator.setValue(m_M_Locator_ID);
lstLocator.setSelectedIndex(0);
lstLocator.addEventListener(Events.ON_SELECT, this);
displayLocator();
chkCreateNew.setChecked(false);
chkCreateNew.addEventListener(Events.ON_CHECK, this);
enableNew();
lstWarehouse.addEventListener(Events.ON_SELECT, this);
txtAisleX.addEventListener(Events.ON_CHANGE, this);
txtBinY.addEventListener(Events.ON_CHANGE, this);
txtLevelZ.addEventListener(Events.ON_CHANGE, this);
// Update UI
//pack();
} // initLocator
private void displayLocator()
{
MLocator l = null;
ListItem listitem = lstLocator.getSelectedItem();
if (listitem != null)
l = (MLocator) listitem.getValue();
if (l == null)
return;
m_M_Locator_ID = l.getM_Locator_ID();
txtWarehouse.setText(l.getWarehouseName());
txtAisleX.setText(l.getX());
txtBinY.setText(l.getY());
txtLevelZ.setText(l.getZ());
txtKey.setText(l.getValue());
getWarehouseInfo(l.getM_Warehouse_ID());
// Set Warehouse
int size = lstWarehouse.getItemCount();
for (int i = 0; i < size; i++)
{
ListItem listItem = lstWarehouse.getItemAtIndex(i);
KeyNamePair pp = (KeyNamePair)listItem.getValue();
if (pp.getKey() == l.getM_Warehouse_ID())
{
lstWarehouse.setSelectedIndex(i);
continue;
}
}
} // displayLocator
/**
* Enable/disable New data entry
*/
private void enableNew()
{
boolean sel = chkCreateNew.isChecked();
//lblWarehouse.setVisible(sel);
lstWarehouse.setVisible(sel);
//lWarehouseInfo.setVisible(!sel);
txtWarehouse.setVisible(!sel);
txtAisleX.setReadonly(!sel);
txtBinY.setReadonly(!sel);
txtLevelZ.setReadonly(!sel);
txtKey.setReadonly(!sel);
//pack();
} // enableNew
/**
* Get Warehouse Info
* @param M_Warehouse_ID warehouse
*/
private void getWarehouseInfo (int M_Warehouse_ID)
{
if (M_Warehouse_ID == m_M_Warehouse_ID)
return;
// Defaults
m_M_Warehouse_ID = 0;
m_M_WarehouseName = "";
m_M_WarehouseValue = "";
m_Separator = ".";
m_AD_Client_ID = 0;
m_AD_Org_ID = 0;
String SQL = "SELECT M_Warehouse_ID, Value, Name, Separator, AD_Client_ID, AD_Org_ID "
+ "FROM M_Warehouse WHERE M_Warehouse_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(SQL, null);
pstmt.setInt(1, M_Warehouse_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
m_M_Warehouse_ID = rs.getInt(1);
m_M_WarehouseValue = rs.getString(2);
m_M_WarehouseName = rs.getString(3);
m_Separator = rs.getString(4);
m_AD_Client_ID = rs.getInt(5);
m_AD_Org_ID = rs.getInt(6);
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, SQL, e);
}
} // getWarehouseInfo
/**
* Create Locator-Value
*/
private void createValue()
{
// Get Warehouse Info
ListItem listitem = lstWarehouse.getSelectedItem();
KeyNamePair pp = (KeyNamePair)listitem.getValue();
if (pp == null)
return;
getWarehouseInfo(pp.getKey());
StringBuffer buf = new StringBuffer(m_M_WarehouseValue);
buf.append(m_Separator).append(txtAisleX.getText());
buf.append(m_Separator).append(txtBinY.getText());
buf.append(m_Separator).append(txtLevelZ.getText());
txtKey.setText(buf.toString());
} // createValue
/**
* OK - check for changes (save them) & Exit
*/
private void actionOK()
{
if (chkCreateNew.isChecked())
{
// Get Warehouse Info
ListItem listitem = lstWarehouse.getSelectedItem();
KeyNamePair pp = (KeyNamePair)listitem.getValue();
if (pp != null)
getWarehouseInfo(pp.getKey());
// Check mandatory values
String mandatoryFields = "";
if (m_M_Warehouse_ID == 0)
mandatoryFields += lblWarehouse.getValue() + " - ";
if (txtKey.getText().length()==0)
mandatoryFields += lblKey.getValue() + " - ";
if (txtAisleX.getText().length()==0)
mandatoryFields += lblAisleX.getValue() + " - ";
if (txtBinY.getText().length()==0)
mandatoryFields += lblBinY.getValue() + " - ";
if (txtLevelZ.getText().length()==0)
mandatoryFields += lblLevelZ.getValue() + " - ";
if (mandatoryFields.length() != 0)
{
FDialog.error(m_WindowNo, this, "FillMandatory", mandatoryFields.substring(0, mandatoryFields.length()-3));
return;
}
MLocator loc = MLocator.get(Env.getCtx(), m_M_Warehouse_ID, txtKey.getText(),
txtAisleX.getText(), txtBinY.getText(), txtLevelZ.getText());
m_M_Locator_ID = loc.getM_Locator_ID();
listitem = new ListItem();
listitem.setValue(loc);
lstLocator.appendItem(loc.get_TableName(), loc);
lstLocator.setSelectedIndex(lstLocator.getItemCount() - 1);
} // createNew
log.config("M_Locator_ID=" + m_M_Locator_ID);
} // actionOK
/**
* Get Selected value
* @return value as Integer
*/
public Integer getValue()
{
ListItem listitem = lstLocator.getSelectedItem();
MLocator l = (MLocator) listitem.getValue();
if (l != null && l.getM_Locator_ID() != 0)
return new Integer (l.getM_Locator_ID());
return null;
} // getValue
/**
* Get result
* @return true if changed
*/
public boolean isChanged()
{
if (m_change)
{
ListItem listitem = lstLocator.getSelectedItem();
MLocator l = (MLocator)listitem.getValue();
if (l != null)
return l.getM_Locator_ID() == m_M_Locator_ID;
}
return m_change;
} // getChange
public void onEvent(Event event) throws Exception
{
if (event == null)
return;
if (event.getTarget() == btnCancel)
{
m_change = false;
this.detach();
}
else if (event.getTarget() == btnOk)
{
actionOK();
m_change = true;
this.detach();
}
else if (event.getTarget() == lstLocator)
displayLocator();
else if (event.getTarget() == chkCreateNew)
enableNew();
// Entered/Changed data for Value
else if (chkCreateNew.isChecked() && event.getTarget() == lstWarehouse)
createValue();
}
}