/******************************************************************************
* 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 *
*****************************************************************************/
package org.adempiere.webui.apps.form;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.logging.Level;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListItem;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Tab;
import org.adempiere.webui.component.Tabbox;
import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.component.Tabpanels;
import org.adempiere.webui.component.Tabs;
import org.adempiere.webui.panel.ADForm;
import org.adempiere.webui.window.FDialog;
import org.compiere.model.MAttribute;
import org.compiere.model.MAttributeValue;
import org.compiere.model.MProduct;
import org.compiere.model.MProductPrice;
import org.compiere.model.MRole;
import org.compiere.model.MStorage;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
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.Div;
import org.zkoss.zul.Vbox;
/**
* Product Attribute Table.
* Select one or two attributes for view/etc.
*
* @author Jorg Janke
* @version $Id: VAttributeGrid.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
*/
public class WAttributeGrid extends ADForm implements EventListener
{
/**
*
*/
private static final long serialVersionUID = 687630618195901592L;
/**
* Init
* @param WindowNo
* @param frame
*/
protected void initForm()
{
m_attributes = MAttribute.getOfClient(Env.getCtx(), true, true);
KeyNamePair[] vector = new KeyNamePair[m_attributes.length+1];
vector[0] = new KeyNamePair(0, "");
for (int i = 0; i < m_attributes.length; i++)
vector[i+1] = m_attributes[i].getKeyNamePair();
attributeCombo1 = new Listbox(vector);
attributeCombo1.setMold("select");
attributeCombo1.setSelectedIndex(0);
attributeCombo2 = new Listbox(vector);
attributeCombo2.setMold("select");
attributeCombo2.setSelectedIndex(0);
pickPriceList.setMold("select");
pickWarehouse.setMold("select");
fillPicks();
for(int i = 0; i < MODES.length; i++)
modeCombo.appendItem(MODES[i], MODES[i]);
modeCombo.setMold("select");
tabbox.setWidth("100%");
tabbox.setHeight("85%");
tabbox.appendChild(tabs);
tabbox.appendChild(tabpanels);
tabbox.addEventListener(Events.ON_SELECT, this);
Grid gridSelection = new Grid();
gridSelection.setWidth("500px");
gridSelection.setStyle("margin:0; padding:0;");
gridSelection.makeNoStrip();
gridSelection.setOddRowSclass("even");
gridView.setWidth("100%");
gridView.setHeight("100%");
gridView.setFixedLayout(true);
Rows rows = new Rows();
gridSelection.appendChild(rows);
Row row = new Row();
rows.appendChild(row);
row.setSpans("1, 2");
Div div = new Div();
div.setAlign("right");
div.appendChild(attributeLabel1);
row.appendChild(div);
row.appendChild(attributeCombo1);
attributeCombo1.setWidth("100%");
row = new Row();
rows.appendChild(row);
row.setSpans("1, 2");
div = new Div();
div.setAlign("right");
div.appendChild(attributeLabel2);
row.appendChild(div);
row.appendChild(attributeCombo2);
attributeCombo2.setWidth("100%");
row = new Row();
rows.appendChild(row);
row.setSpans("1, 2");
div = new Div();
div.setAlign("right");
div.appendChild(labelPriceList);
row.appendChild(div);
row.appendChild(pickPriceList);
pickPriceList.setWidth("100%");
row = new Row();
rows.appendChild(row);
row.setSpans("1, 2");
div = new Div();
div.setAlign("right");
div.appendChild(labelWarehouse);
row.appendChild(div);
row.appendChild(pickWarehouse);
pickWarehouse.setWidth("100%");
div = new Div();
div.setAlign("center");
div.appendChild(gridSelection);
Tabpanel tabSelectionPanel = new Tabpanel();
tabSelectionPanel.appendChild(div);
Tab tabSelection = new Tab(Msg.getMsg(Env.getCtx(), "Selection"));
tabpanels.appendChild(tabSelectionPanel);
tabs.appendChild(tabSelection);
div = new Div();
div.setAlign("center");
div.appendChild(modeLabel);
div.appendChild(modeCombo);
modeCombo.addEventListener(Events.ON_CHANGE, this);
Vbox vbAttributeGrid = new Vbox();
vbAttributeGrid.appendChild(div);
vbAttributeGrid.appendChild(gridView);
Tabpanel tabAttributeGridPanel = new Tabpanel();
tabAttributeGridPanel.appendChild(vbAttributeGrid);
Tab tabAttributeGrid = new Tab(Msg.getMsg(Env.getCtx(), "AttributeGrid"));
tabpanels.appendChild(tabAttributeGridPanel);
tabs.appendChild(tabAttributeGrid);
this.setWidth("100%");
this.setHeight("100%");
this.appendChild(tabbox);
tabbox.addEventListener(Events.ON_SELECT, this);
this.appendChild(confirmPanel);
confirmPanel.addActionListener(this);
} // init
/** Window No */
// private int m_WindowNo = 0;
/** FormFrame */
// private FormFrame m_frame;
/** Product Attributes */
private MAttribute[] m_attributes = null;
/** Setting Grid */
private boolean m_setting = false;
/** Logger */
private static CLogger log = CLogger.getCLogger (WAttributeGrid.class);
/** Modes */
private static String[] MODES = new String[]{
Msg.getMsg(Env.getCtx(), "ModeView")
// ,Msg.getMsg(Env.getCtx(), "ModePO")
// ,Msg.getMsg(Env.getCtx(), "ModePrice")
};
private static final int MODE_VIEW = 0;
private static final int MODE_PO = 0;
private static final int MODE_PRICE = 0;
/** Price List Version */
private int m_M_PriceList_Version_ID = 0;
private DecimalFormat m_price = DisplayType.getNumberFormat(DisplayType.CostPrice);
/** Warehouse */
private int m_M_Warehouse_ID = 0;
private DecimalFormat m_qty = DisplayType.getNumberFormat(DisplayType.Quantity);
/** UI **/
private Tabbox tabbox = new Tabbox();
private Tabs tabs = new Tabs();
private Tabpanels tabpanels = new Tabpanels();
private Label attributeLabel1 = new Label(Msg.getElement(Env.getCtx(), "M_Attribute_ID") + " 1");
private Listbox attributeCombo1 = null;
private Label attributeLabel2 = new Label(Msg.getElement(Env.getCtx(), "M_Attribute_ID") + " 2");
private Listbox attributeCombo2 = null;
private Label labelPriceList = new Label(Msg.getElement(Env.getCtx(), "M_PriceList_ID"));
private Listbox pickPriceList = new Listbox();
private Label labelWarehouse = new Label(Msg.getElement(Env.getCtx(), "M_Warehouse_ID"));
private Listbox pickWarehouse = new Listbox();
private ConfirmPanel confirmPanel = new ConfirmPanel(true);
//
private Grid gridView = new Grid();
// private CPanel gridPanel = new CPanel(new BorderLayout());
// private CPanel modePanel = new CPanel();
private Label modeLabel = new Label(Msg.getMsg(Env.getCtx(), "Mode"));
private Listbox modeCombo = new Listbox();//MODES);
/**
* Dispose
*/
// public void dispose ()
// {
// if (m_frame != null)
// m_frame.dispose();
// m_frame = null;
// } // dispose
/**
* Fill Picks with values
*/
private void fillPicks ()
{
// Price List
String sql = "SELECT M_PriceList_Version.M_PriceList_Version_ID,"
+ " M_PriceList_Version.Name || ' (' || c.Iso_Code || ')' AS ValueName "
+ "FROM M_PriceList_Version, M_PriceList pl, C_Currency c "
+ "WHERE M_PriceList_Version.M_PriceList_ID=pl.M_PriceList_ID"
+ " AND pl.C_Currency_ID=c.C_Currency_ID"
+ " AND M_PriceList_Version.IsActive='Y' AND pl.IsActive='Y'";
// Add Access & Order
sql = MRole.getDefault().addAccessSQL (sql, "M_PriceList_Version", true, false) // fully qualidfied - RO
+ " ORDER BY M_PriceList_Version.Name";
try
{
pickPriceList.appendItem("", 0);
PreparedStatement pstmt = DB.prepareStatement(sql, null);
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
KeyNamePair kn = new KeyNamePair (rs.getInt(1), rs.getString(2));
pickPriceList.appendItem(kn.getName(), kn.getKey());
}
rs.close();
pstmt.close();
// Warehouse
sql = "SELECT M_Warehouse_ID, Value || ' - ' || Name AS ValueName "
+ "FROM M_Warehouse "
+ "WHERE IsActive='Y'";
sql = MRole.getDefault().addAccessSQL (sql,
"M_Warehouse", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO)
+ " ORDER BY Value";
pickWarehouse.appendItem("", 0);
pstmt = DB.prepareStatement(sql, null);
rs = pstmt.executeQuery();
while (rs.next())
{
KeyNamePair kn = new KeyNamePair
(rs.getInt("M_Warehouse_ID"), rs.getString("ValueName"));
pickWarehouse.appendItem(kn.getName(), kn.getKey());
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
}
} // fillPicks
public void onEvent(Event e)
{
if (e.getTarget() instanceof Tab)
{
if(tabbox.getSelectedIndex() == 1)
createGrid();
}
else if(e.getTarget() == modeCombo)
createGrid();
else if (e.getTarget().getId().equals(ConfirmPanel.A_OK))
{
if (tabbox.getSelectedIndex() == 0)
createGrid();
else
gridOK();
}
else if (e.getTarget().getId().equals(ConfirmPanel.A_CANCEL))
onClose();
} // actionPerformed
private void gridOK()
{
int mode = modeCombo.getSelectedIndex();
// Create PO
if (mode == MODE_PO)
{
createPO();
modeCombo.setSelectedIndex(MODE_VIEW);
return;
}
// Update Prices
else if (mode == MODE_PRICE)
{
updatePrices();
modeCombo.setSelectedIndex(MODE_VIEW);
return;
}
else if (mode == MODE_VIEW)
;
onClose();
} // gridOK
private void createPO()
{
}
private void updatePrices()
{
}
/**
* Create Grid
*/
private void createGrid()
{
if (attributeCombo1 == null || m_setting)
return; // init
Object attr1 = attributeCombo1.getSelectedItem().getValue();
Object attr2 = attributeCombo2.getSelectedItem().getValue();
if (attr1.equals(attr2))
{
FDialog.warn(m_WindowNo, "Same Attribute Selected", getTitle());
log.warning("Same Attribute Selected");
tabbox.setSelectedIndex(0);
return;
}
m_setting = true;
m_M_PriceList_Version_ID = 0;
ListItem pl = pickPriceList.getSelectedItem();
if (pl != null)
m_M_PriceList_Version_ID = Integer.valueOf(pl.getValue().toString());
m_M_Warehouse_ID = 0;
ListItem wh = pickWarehouse.getSelectedItem();
if (wh != null)
m_M_Warehouse_ID = Integer.valueOf(wh.getValue().toString());
// x dimension
int noOfCols = 2;
int indexAttr1 = 0;
MAttributeValue[] xValues = null;
if (attr1 != null)
{
int value = Integer.parseInt(attr1.toString());
for(int i = 0; i < m_attributes.length; i++)
{
if(m_attributes[i].getKeyNamePair().getKey() == value)
{
xValues = m_attributes[i].getMAttributeValues();
indexAttr1 = i;
break;
}
}
}
if (xValues != null)
noOfCols = xValues.length;
// y dimension
int noOfRows = 2;
int indexAttr2 = 0;
MAttributeValue[] yValues = null;
if (attr2 != null)
{
int value = Integer.parseInt(attr2.toString());
for(int i = 0; i < m_attributes.length; i++)
{
if(m_attributes[i].getKeyNamePair().getKey() == value)
{
yValues = m_attributes[i].getMAttributeValues();
indexAttr2 = i;
break;
}
}
}
if (yValues != null)
noOfRows = yValues.length;
gridView.getChildren().clear();
Rows rows = new Rows();
gridView.appendChild(rows);
log.info("Rows=" + noOfRows + " - Cols=" + noOfCols);
for (int rowIndex = 0; rowIndex < noOfRows; rowIndex++)
{
Row row = new Row();
row.setWidth("100%");
rows.appendChild(row);
for (int colIndex = 0; colIndex < noOfCols; colIndex++)
{
MAttributeValue xValue = null;
if (xValues != null)
xValue = xValues[colIndex];
MAttributeValue yValue = null;
if (yValues != null)
yValue = yValues[rowIndex];
if (rowIndex == 0 && colIndex == 0)
{
Vbox descr = new Vbox();
descr.setWidth("100%");
if (xValues != null)
{
Div div = new Div();
div.setAlign("right");
div.appendChild(new Label(m_attributes[indexAttr1].getName()));
descr.appendChild(div);
}
if (yValues != null)
descr.appendChild(new Label(m_attributes[indexAttr2].getName()));
row.appendChild(descr);
}
else if (rowIndex == 0) // column labels
{
if (xValue != null)
{
Div div = new Div();
div.setAlign("center");
div.appendChild(new Label(xValue.getName()));
row.appendChild(div);
}
else
row.appendChild(new Label());
}
else if (colIndex == 0) // row labels
{
if (yValue != null)
row.appendChild(new Label(yValue.getName()));
else
row.appendChild(new Label());
}
else
{
row.appendChild(getGridElement (xValue, yValue));
}
}
}
tabbox.setSelectedIndex(1);
m_setting = false;
} // createGrid
/**
* Get Grid Element
* @param xValue X value
* @param yValue Y value
* @return Panel with Info
*/
private Panel getGridElement (MAttributeValue xValue, MAttributeValue yValue)
{
Panel element = new Panel();
element.setStyle("border-width: thin; border-color: black;");
String sql = "SELECT * FROM M_Product WHERE IsActive='Y'";
// Product Attributes
if (xValue != null)
sql += " AND M_AttributeSetInstance_ID IN "
+ "(SELECT M_AttributeSetInstance_ID "
+ "FROM M_AttributeInstance "
+ "WHERE M_Attribute_ID=" + xValue.getM_Attribute_ID()
+ " AND M_AttributeValue_ID=" + xValue.getM_AttributeValue_ID() + ")";
if (yValue != null)
sql += " AND M_AttributeSetInstance_ID IN "
+ "(SELECT M_AttributeSetInstance_ID "
+ "FROM M_AttributeInstance "
+ "WHERE M_Attribute_ID=" + yValue.getM_Attribute_ID()
+ " AND M_AttributeValue_ID=" + yValue.getM_AttributeValue_ID() + ")";
sql = MRole.getDefault().addAccessSQL(sql, "M_Product",
MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
PreparedStatement pstmt = null;
int noProducts = 0;
try
{
pstmt = DB.prepareStatement (sql, null);
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
{
MProduct product = new MProduct(Env.getCtx(), rs, null);
addProduct (element, product);
noProducts++;
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
int mode = modeCombo.getSelectedIndex();
// No Products
if (noProducts == 0 && mode == MODE_VIEW)
{
// CButton button = ConfirmPanel.createNewButton(true);
// button.addActionListener(this);
// element.add(button);
}
else // Additional Elements
{
if (mode == MODE_PRICE)
{
// Price Field
}
else if (mode == MODE_PO)
{
// Qty Field
}
}
return element;
} // getGridElement
/**
* Add Product
* @param element panel
* @param product product
*/
private void addProduct(Panel element, MProduct product)
{
int M_Product_ID = product.getM_Product_ID();
Vbox pe = new Vbox();
pe.setStyle("border-width: thin; border-color: blue;");
// Product Value - Price
pe.appendChild(new Label(product.getValue()));
String formatted = "";
if (m_M_PriceList_Version_ID != 0)
{
MProductPrice pp = MProductPrice.get(Env.getCtx(), m_M_PriceList_Version_ID, M_Product_ID, null);
if (pp != null)
{
BigDecimal price = pp.getPriceStd();
formatted = m_price.format(price);
}
else
formatted = "-";
}
pe.appendChild(new Label(formatted));
// Product Name - Qty
pe.appendChild(new Label(product.getName()));
formatted = "";
if (m_M_Warehouse_ID != 0)
{
BigDecimal qty = MStorage.getQtyAvailable(m_M_Warehouse_ID, M_Product_ID, 0, null);
if (qty == null)
formatted = "-";
else
formatted = m_qty.format(qty);
}
pe.appendChild(new Label(formatted));
//
element.appendChild(pe);
} // addProduct
} // VAttributeTable