Bring in Manufacturing Light code from Adaxa / Paul Bowden
Manufacturing Light BOM viewer for ZK. Thanks to Tony Snook. Fixes #325 changeset 6254 3c76468aa116
This commit is contained in:
parent
7775f04a14
commit
af086e3835
|
@ -0,0 +1,76 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||
* 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 *
|
||||
* Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. *
|
||||
* Contributor(s): Victor Perez www.e-evolution.com *
|
||||
*****************************************************************************/
|
||||
|
||||
package org.compiere.apps.form;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.compiere.apps.form.TreeMaintenance;
|
||||
import org.compiere.model.MProduct;
|
||||
import org.compiere.model.MUOM;
|
||||
import org.compiere.model.Query;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.Env;
|
||||
import org.eevolution.model.MPPProductBOM;
|
||||
import org.eevolution.model.MPPProductBOMLine;
|
||||
import org.eevolution.model.X_PP_Product_BOM;
|
||||
|
||||
public class TreeBOM {
|
||||
|
||||
|
||||
public static CLogger log = CLogger.getCLogger(TreeMaintenance.class);
|
||||
|
||||
public Properties getCtx() {
|
||||
return Env.getCtx();
|
||||
}
|
||||
|
||||
/**
|
||||
* get Product Summary
|
||||
* @param product Product
|
||||
* @param isLeaf is Leaf
|
||||
* @return String
|
||||
*/
|
||||
public String productSummary(MProduct product, boolean isLeaf) {
|
||||
MUOM uom = MUOM.get(getCtx(), product.getC_UOM_ID());
|
||||
String value = product.getValue();
|
||||
String name = product.get_Translation(MProduct.COLUMNNAME_Name);
|
||||
//
|
||||
StringBuffer sb = new StringBuffer(value);
|
||||
if (name != null && !value.equals(name))
|
||||
sb.append("_").append(product.getName());
|
||||
sb.append(" [").append(uom.get_Translation(MUOM.COLUMNNAME_UOMSymbol)).append("]");
|
||||
//
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* get Product Summary
|
||||
* @param bom Product BOM
|
||||
* @return String
|
||||
*/
|
||||
public String productSummary(MPPProductBOM bom) {
|
||||
String value = bom.getValue();
|
||||
String name = bom.get_Translation(MPPProductBOM.COLUMNNAME_Name);
|
||||
//
|
||||
StringBuffer sb = new StringBuffer(value);
|
||||
if (name != null && !name.equals(value))
|
||||
sb.append("_").append(name);
|
||||
//
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,3 +1,19 @@
|
|||
/******************************************************************************
|
||||
* 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.compiere.apps.form;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
|
@ -5,22 +21,14 @@ import java.awt.Component;
|
|||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
//import java.awt.PopupMenu;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.KeyListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.VetoableChangeListener;
|
||||
import java.lang.reflect.Array;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Vector;
|
||||
|
@ -32,15 +40,10 @@ import javax.swing.JScrollPane;
|
|||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.event.TableModelEvent;
|
||||
import javax.swing.event.TableModelListener;
|
||||
import javax.swing.event.TreeSelectionEvent;
|
||||
import javax.swing.event.TreeSelectionListener;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
import javax.swing.tree.DefaultTreeSelectionModel;
|
||||
import javax.swing.tree.TreePath;
|
||||
|
||||
import org.adempiere.plaf.AdempierePLAF;
|
||||
|
@ -50,14 +53,12 @@ import org.compiere.apps.StatusBar;
|
|||
import org.compiere.apps.form.FormFrame;
|
||||
import org.compiere.apps.form.FormPanel;
|
||||
import org.compiere.grid.ed.VLookup;
|
||||
//import org.compiere.grid.ed.VLookup.VLookup_mouseAdapter;
|
||||
import org.compiere.minigrid.MiniTable;
|
||||
import org.compiere.model.MColumn;
|
||||
import org.compiere.model.MLookup;
|
||||
import org.compiere.model.MLookupFactory;
|
||||
import org.compiere.model.MProduct;
|
||||
import org.compiere.model.MProductBOM;
|
||||
import org.compiere.model.MTreeNode;
|
||||
import org.compiere.model.MUOM;
|
||||
import org.compiere.model.Query;
|
||||
import org.compiere.swing.CCheckBox;
|
||||
|
@ -71,7 +72,6 @@ import org.compiere.util.Env;
|
|||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.Language;
|
||||
import org.compiere.util.Msg;
|
||||
import org.compiere.util.ValueNamePair;
|
||||
|
||||
/**
|
||||
* BOM Tree Maintenance
|
||||
|
@ -85,12 +85,17 @@ import org.compiere.util.ValueNamePair;
|
|||
*
|
||||
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
|
||||
* @author Paul Bowden, adaxa modified for manufacturing light
|
||||
* @author Tony Snook, enhancements search, right-click bom, where-used
|
||||
*
|
||||
*/
|
||||
public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
||||
ListSelectionListener, PropertyChangeListener, VetoableChangeListener,
|
||||
TreeSelectionListener, TableModelListener
|
||||
public class VTreeBOM extends CPanel implements FormPanel, ActionListener, TreeSelectionListener
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -4045195906352692040L;
|
||||
|
||||
/*****************************************************************************
|
||||
* Mouse Listener for Popup Menu
|
||||
*/
|
||||
|
@ -103,7 +108,7 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
VTreeBOM_mouseAdapter(VTreeBOM adaptee)
|
||||
{
|
||||
m_adaptee = adaptee;
|
||||
} // VLookup_mouseAdapter
|
||||
}
|
||||
|
||||
private VTreeBOM m_adaptee;
|
||||
|
||||
|
@ -113,7 +118,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
*/
|
||||
public void mouseClicked(MouseEvent e)
|
||||
{
|
||||
// System.out.println("mouseClicked " + e.getID() + " " + e.getSource().getClass().toString());
|
||||
// popup menu
|
||||
if (SwingUtilities.isRightMouseButton(e))
|
||||
m_adaptee.popupMenu.show((Component)e.getSource(), e.getX(), e.getY());
|
||||
|
@ -123,7 +127,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
} // mouse Clicked
|
||||
|
||||
} // VTreeBOM_mouseAdapter
|
||||
|
||||
|
||||
/**
|
||||
* Key Pressed
|
||||
|
@ -150,18 +153,12 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
if (e.getKeyCode() == KeyEvent.VK_ENTER)
|
||||
m_adaptee.keyPressed(e);
|
||||
}
|
||||
} // VTreePanel_keyAdapter
|
||||
|
||||
} // VTreeBOM_keyAdapter
|
||||
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Tree Maintenance
|
||||
*/
|
||||
//public VTreeBOM ()
|
||||
// {
|
||||
// } // VTreeMaintenance
|
||||
|
||||
/** Window No */
|
||||
private int m_WindowNo = 0;
|
||||
|
@ -175,15 +172,13 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
private BorderLayout mainLayout = new BorderLayout ();
|
||||
private CPanel northPanel = new CPanel ();
|
||||
|
||||
private FlowLayout northLayout = new FlowLayout ();
|
||||
//private BorderLayout northLayout = new BorderLayout ();
|
||||
private FlowLayout northLayout = new FlowLayout (FlowLayout.RIGHT,20,5);
|
||||
private CPanel southPanel = new CPanel();
|
||||
private CPanel southPanel2 = new CPanel ();
|
||||
private BorderLayout southLayout = new BorderLayout();
|
||||
private FlowLayout southLayout2 = new FlowLayout ();
|
||||
|
||||
private CLabel labelProduct = new CLabel ();
|
||||
// private PopupMenu popMenuTree = new PopupMenu();
|
||||
private VLookup fieldProduct;
|
||||
private CCheckBox implosion = new CCheckBox ();
|
||||
private CLabel treeInfo = new CLabel ();
|
||||
|
@ -192,21 +187,15 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
private JSplitPane splitPane = new JSplitPane ();
|
||||
private JScrollPane dataPane = new JScrollPane();
|
||||
private JScrollPane treePane = new JScrollPane();
|
||||
// private CPanel southPanel = new CPanel();
|
||||
// private BorderLayout southLayout = new BorderLayout();
|
||||
private DefaultTreeSelectionModel treeSelect = new DefaultTreeSelectionModel();
|
||||
private CCheckBox treeExpand = new CCheckBox();
|
||||
private CTextField treeSearch = new CTextField(10);
|
||||
private CLabel treeSearchLabel = new CLabel();
|
||||
private String m_search = "";
|
||||
private Enumeration<?> m_nodeEn;
|
||||
private Enumeration<?> m_childEn;
|
||||
private DefaultMutableTreeNode m_selectedNode; // the selected model node
|
||||
private int m_selected_id = 0;
|
||||
private MouseListener mouseListener = new VTreeBOM_mouseAdapter(this);
|
||||
private KeyListener keyListener = new VTreeBOM_keyAdapter(this);
|
||||
/** Property Listener NodeSelected by Left Click */
|
||||
public static final String NODE_SELECTION = "NodeSelected";
|
||||
private DefaultMutableTreeNode m_root = null;
|
||||
|
||||
private ConfirmPanel confirmPanel = new ConfirmPanel(true);
|
||||
|
@ -239,7 +228,7 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
{
|
||||
m_WindowNo = WindowNo;
|
||||
m_frame = frame;
|
||||
log.info( "VMerge.init - WinNo=" + m_WindowNo);
|
||||
log.info( "VTreeBOM.init - WinNo=" + m_WindowNo);
|
||||
try
|
||||
{
|
||||
preInit();
|
||||
|
@ -254,7 +243,7 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
} // init
|
||||
|
||||
/**
|
||||
* Fill Tree Combo
|
||||
* preInit() - Fill Tree Combo
|
||||
*/
|
||||
private void preInit() throws Exception
|
||||
{
|
||||
|
@ -266,7 +255,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
private static final long serialVersionUID = 1L;
|
||||
public void setValue(Object value) {
|
||||
super.setValue(value);
|
||||
action_loadBOM();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -276,56 +264,39 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
} // preInit
|
||||
|
||||
/**
|
||||
* Static Init.
|
||||
* <pre>
|
||||
* mainPanel
|
||||
* northPanel
|
||||
* centerPanel
|
||||
* xMatched
|
||||
* xPanel
|
||||
* xMathedTo
|
||||
* southPanel
|
||||
* </pre>
|
||||
* @throws Exception
|
||||
* loadTableBOM
|
||||
*
|
||||
*
|
||||
*/
|
||||
private void loadTableBOM()
|
||||
{
|
||||
// Header Info
|
||||
columnNames = new Vector<String>(18);
|
||||
columnNames = new Vector<String>(10);
|
||||
|
||||
columnNames.add(Msg.translate(getCtx(), "Select")); // 0
|
||||
columnNames.add(Msg.translate(getCtx(), "IsActive")); // 1
|
||||
columnNames.add(Msg.translate(getCtx(), "Line")); // 2
|
||||
columnNames.add(Msg.translate(getCtx(), "M_Product_ID")); // 3
|
||||
columnNames.add(Msg.translate(getCtx(), "C_UOM_ID")); // 4
|
||||
columnNames.add(Msg.translate(getCtx(), "QtyBOM")); // 5
|
||||
columnNames.add(Msg.getElement(getCtx(), "IsActive")); // 0
|
||||
columnNames.add(Msg.getElement(getCtx(), "Line")); // 1
|
||||
columnNames.add(Msg.getElement(getCtx(), "M_Product_ID")); // 2
|
||||
columnNames.add(Msg.getElement(getCtx(), "C_UOM_ID")); // 3
|
||||
columnNames.add(Msg.getElement(getCtx(), "QtyBOM")); // 4
|
||||
|
||||
// Remove previous listeners
|
||||
tableBOM.getModel().removeTableModelListener(this);
|
||||
// Remove previous listeners
|
||||
tableBOM.getModel().removeTableModelListener(this);
|
||||
// Set Model
|
||||
DefaultTableModel model = new DefaultTableModel(dataBOM, columnNames);
|
||||
model.addTableModelListener(this);
|
||||
tableBOM.setModel(model);
|
||||
|
||||
tableBOM.setColumnClass( 0, Boolean.class, false); // 0 Select
|
||||
tableBOM.setColumnClass( 1, Boolean.class, false); // 1 IsActive
|
||||
tableBOM.setColumnClass( 2, Integer.class,false); // 2 Line
|
||||
tableBOM.setColumnClass( 3, KeyNamePair.class,false); // 3 M_Product_ID
|
||||
tableBOM.setColumnClass( 4, KeyNamePair.class,false); // 4 C_UOM_ID
|
||||
tableBOM.setColumnClass( 5, BigDecimal.class,false); // 5 QtyBOM
|
||||
tableBOM.setColumnClass( 0, Boolean.class, true); // 0 IsActive
|
||||
tableBOM.setColumnClass( 1, String.class,true); // 1 Line (as string)
|
||||
tableBOM.setColumnClass( 2, KeyNamePair.class,true); // 2 M_Product_ID
|
||||
tableBOM.setColumnClass( 3, KeyNamePair.class,true); // 3 C_UOM_ID
|
||||
tableBOM.setColumnClass( 4, BigDecimal.class,true); // 4 QtyBOM
|
||||
|
||||
tableBOM.setMultiSelection(false);
|
||||
tableBOM.setColumnVisibility(tableBOM.getColumn(0),false);
|
||||
tableBOM.autoSize();
|
||||
|
||||
} // dynInit
|
||||
} // loadTableBOM
|
||||
|
||||
|
||||
/**
|
||||
* Static init
|
||||
* @throws Exception
|
||||
* jbInit
|
||||
*
|
||||
*/
|
||||
private void jbInit ()
|
||||
{
|
||||
|
@ -336,8 +307,8 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
|
||||
labelProduct.setText (Msg.getElement(getCtx(), "M_Product_ID"));
|
||||
implosion.setText (Msg.getElement(getCtx(), "Implosion"));
|
||||
treeInfo.setText (" ");
|
||||
spacer.setText (" ");
|
||||
treeInfo.setText ("Selected Product: ");
|
||||
spacer.setText(" ");
|
||||
northPanel.setLayout (northLayout);
|
||||
northLayout.setAlignment (FlowLayout.LEFT);
|
||||
|
||||
|
@ -375,8 +346,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
southPanel2.add(spacer, null);
|
||||
southPanel2.add(treeSearchLabel, null);//BorderLayout.WEST);
|
||||
southPanel2.add(treeSearch, null);//BorderLayout.CENTER);
|
||||
|
||||
|
||||
|
||||
this.add (splitPane, BorderLayout.CENTER);
|
||||
|
||||
|
@ -391,8 +360,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
mImplosion.addActionListener(this);
|
||||
popupMenu.add(mImplosion);
|
||||
|
||||
|
||||
|
||||
} // jbInit
|
||||
|
||||
/**
|
||||
|
@ -401,23 +368,8 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
*/
|
||||
protected void keyPressed(KeyEvent e)
|
||||
{
|
||||
|
||||
// *** Tree ***
|
||||
if (e.getSource() instanceof myJTree
|
||||
|| (e.getSource() == treeSearch && e.getModifiers() != 0)) // InputEvent.CTRL_MASK
|
||||
{
|
||||
TreePath tp = m_tree.getSelectionPath();
|
||||
if (tp == null)
|
||||
ADialog.beep();
|
||||
else
|
||||
{
|
||||
DefaultMutableTreeNode tn = (DefaultMutableTreeNode)m_tree.getLastSelectedPathComponent();
|
||||
setSelectedNode(tn);
|
||||
}
|
||||
}
|
||||
|
||||
// *** treeSearch ***
|
||||
else if (e.getSource() == treeSearch)
|
||||
if (e.getSource() == treeSearch)
|
||||
{
|
||||
String search = treeSearch.getText();
|
||||
boolean found = false;
|
||||
|
@ -439,7 +391,7 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
{
|
||||
DefaultMutableTreeNode nd = (DefaultMutableTreeNode)m_nodeEn.nextElement();
|
||||
Vector <?> nodeInfo = (Vector <?>)(nd.getUserObject());
|
||||
String uoName = ((KeyNamePair)nodeInfo.elementAt(3)).getName() ;
|
||||
String uoName = ((KeyNamePair)nodeInfo.elementAt(2)).getName() ;
|
||||
// compare in upper case
|
||||
if (uoName.toUpperCase().indexOf(search.toUpperCase()) != -1)
|
||||
{
|
||||
|
@ -456,21 +408,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
|
||||
} // keyPressed
|
||||
|
||||
|
||||
/**
|
||||
* Set the selected node & initiate all listeners
|
||||
* @param nd node
|
||||
*/
|
||||
private void setSelectedNode (DefaultMutableTreeNode nd)
|
||||
{
|
||||
log.config("Node = " + nd);
|
||||
m_selectedNode = nd;
|
||||
//
|
||||
firePropertyChange(NODE_SELECTION, null, nd);
|
||||
} // setSelectedNode
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Dispose
|
||||
*/
|
||||
|
@ -481,22 +418,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
m_frame = null;
|
||||
} // dispose
|
||||
|
||||
public void vetoableChange (PropertyChangeEvent e)
|
||||
{
|
||||
String name = e.getPropertyName();
|
||||
Object value = e.getNewValue();
|
||||
log.info( "VAllocation.vetoableChange - " + name + "=" + value);
|
||||
if (value == null)
|
||||
return;
|
||||
|
||||
// BPartner
|
||||
if (name.equals("M_Product_ID"))
|
||||
{
|
||||
if (fieldProduct != null)
|
||||
action_loadBOM();
|
||||
}
|
||||
} // vetoableChange
|
||||
|
||||
/**
|
||||
* Action Listener
|
||||
* @param e event
|
||||
|
@ -508,23 +429,21 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
fieldProduct.setValue(m_selected_id);
|
||||
if (implosion.isSelected())
|
||||
implosion.doClick();
|
||||
action_loadBOM();
|
||||
}
|
||||
if (e.getSource() == mImplosion)
|
||||
{
|
||||
fieldProduct.setValue(m_selected_id);
|
||||
if (!implosion.isSelected())
|
||||
implosion.doClick();
|
||||
action_loadBOM();
|
||||
}
|
||||
|
||||
if (e.getSource() == implosion)
|
||||
{
|
||||
action_loadBOM();
|
||||
}
|
||||
if (e.getActionCommand().equals(ConfirmPanel.A_OK))
|
||||
{
|
||||
action_loadBOM();
|
||||
if(m_selected_id > 0 || getM_Product_ID() > 0) action_loadBOM();
|
||||
}
|
||||
// 4Layers - Close window when cancel is pressed
|
||||
|
||||
if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL))
|
||||
{
|
||||
dispose();
|
||||
|
@ -534,7 +453,7 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
if (e.getActionCommand().equals("Expand"))
|
||||
expandTree();
|
||||
}
|
||||
// 4Layers - End
|
||||
|
||||
} // actionPerformed
|
||||
|
||||
/**
|
||||
|
@ -542,7 +461,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
*/
|
||||
private void action_loadBOM()
|
||||
{
|
||||
//m_frame.setBusy(true);
|
||||
m_frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
|
||||
reload = false;
|
||||
|
@ -551,24 +469,20 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
if (M_Product_ID == 0)
|
||||
return;
|
||||
MProduct M_Product = MProduct.get(getCtx(), M_Product_ID);
|
||||
treeInfo.setText (" Current Selection: "+M_Product.getValue());
|
||||
|
||||
treeInfo.setText ("Selected Product: "+M_Product.getValue());
|
||||
|
||||
Vector<Object> line = new Vector<Object>(17);
|
||||
line.add( new Boolean(false)); // 0 Select
|
||||
line.add( new Boolean(M_Product.isActive())); // 1 IsActive
|
||||
line.add( new Integer(0)); // 2 Line
|
||||
Vector<Object> line = new Vector<Object>(10);
|
||||
line.add( new Boolean(M_Product.isActive())); // 0 IsActive
|
||||
line.add( new Integer(0).toString()); // 1 Line
|
||||
KeyNamePair pp = new KeyNamePair(M_Product.getM_Product_ID(),M_Product.getValue().concat("_").concat(M_Product.getName()));
|
||||
line.add(pp); // 3 M_Product_ID
|
||||
line.add(pp); // 2 M_Product_ID
|
||||
MUOM u = new MUOM(M_Product.getCtx(), M_Product.getC_UOM_ID(), M_Product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(M_Product.getC_UOM_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 4 C_UOM_ID
|
||||
line.add(Env.ONE); // 5 QtyBOM
|
||||
|
||||
KeyNamePair uom = new KeyNamePair(u.get_ID(), u.getUOMSymbol());
|
||||
line.add(uom); // 3 C_UOM_ID
|
||||
line.add(Env.ONE); // 4 QtyBOM
|
||||
|
||||
DefaultMutableTreeNode parent = new DefaultMutableTreeNode(line);
|
||||
m_root = (DefaultMutableTreeNode)parent.getRoot();
|
||||
|
||||
dataBOM.clear();
|
||||
|
||||
if (isImplosion())
|
||||
|
@ -578,7 +492,6 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
addParent(bomline, parent);
|
||||
}
|
||||
m_tree = new myJTree(parent);
|
||||
|
||||
m_tree.addMouseListener(mouseListener);
|
||||
}
|
||||
else
|
||||
|
@ -591,78 +504,28 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
m_tree.addMouseListener(mouseListener);
|
||||
}
|
||||
|
||||
/* MouseListener ml = new MouseAdapter() {
|
||||
public void mousePressed(MouseEvent e) {
|
||||
int selRow = m_tree.getRowForLocation(e.getX(), e.getY());
|
||||
TreePath selPath = m_tree.getPathForLocation(e.getX(), e.getY());
|
||||
if(selRow != -1) {
|
||||
if(e.getClickCount() == 1) {
|
||||
mySingleClick(selRow, selPath);
|
||||
}
|
||||
// else if(e.getClickCount() == 2) {
|
||||
// myDoubleClick(selRow, selPath);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
private void mySingleClick(int selRow, TreePath selPath) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
};
|
||||
m_tree.addMouseListener(ml);
|
||||
*/
|
||||
|
||||
m_tree.addTreeSelectionListener(this);
|
||||
|
||||
treePane.getViewport().add (m_tree, null);
|
||||
|
||||
loadTableBOM();
|
||||
|
||||
dataPane.getViewport().add(tableBOM, null);
|
||||
// 4Layers - Set divider location
|
||||
splitPane.setDividerLocation(DIVIDER_LOCATION);
|
||||
// 4Layers - end
|
||||
|
||||
// Popup
|
||||
// if (m_selected_id != 0)
|
||||
// {
|
||||
// }
|
||||
|
||||
|
||||
//m_frame.setBusy(false);
|
||||
m_frame.setCursor(Cursor.getDefaultCursor());
|
||||
} // action_fillTree
|
||||
} // action_loadBOM
|
||||
|
||||
private void action_reloadBOM()
|
||||
{
|
||||
//m_frame.setBusy(true);
|
||||
m_frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
|
||||
reload = true;
|
||||
|
||||
//int M_Product_ID = getM_Product_ID();
|
||||
int M_Product_ID = m_selected_id;
|
||||
|
||||
if (M_Product_ID == 0)
|
||||
return;
|
||||
MProduct M_Product = MProduct.get(getCtx(), M_Product_ID);
|
||||
treeInfo.setText (" Current Selection: "+M_Product.getValue());
|
||||
|
||||
|
||||
Vector<Object> line = new Vector<Object>(17);
|
||||
line.add( new Boolean(false)); // 0 Select
|
||||
line.add( new Boolean(M_Product.isActive())); // 1 IsActive
|
||||
line.add( new Integer(0)); // 2 Line
|
||||
KeyNamePair pp = new KeyNamePair(M_Product.getM_Product_ID(),M_Product.getValue().concat("_").concat(M_Product.getName()));
|
||||
line.add(pp); // 3 M_Product_ID
|
||||
MUOM u = new MUOM(M_Product.getCtx(), M_Product.getC_UOM_ID(), M_Product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(M_Product.getC_UOM_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 4 C_UOM_ID
|
||||
line.add(Env.ONE); // 5 QtyBOM
|
||||
|
||||
|
||||
DefaultMutableTreeNode parent = new DefaultMutableTreeNode(line);
|
||||
treeInfo.setText ("Selected Product: "+M_Product.getValue());
|
||||
|
||||
DefaultMutableTreeNode parent = new DefaultMutableTreeNode(productSummary(M_Product, false));
|
||||
dataBOM.clear();
|
||||
|
||||
if (isImplosion())
|
||||
|
@ -671,53 +534,35 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
{
|
||||
addParent(bomline, parent);
|
||||
}
|
||||
//m_tree = new myJTree(parent);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* m_childEn = m_selectedNode.children();
|
||||
Vector<Object> line = new Vector<Object>(17);
|
||||
while (m_childEn != null && m_childEn.hasMoreElements())
|
||||
{
|
||||
DefaultMutableTreeNode nd = (DefaultMutableTreeNode)m_childEn.nextElement();
|
||||
//String[] uo = (String[])nd.getUserObject();
|
||||
line.add(nd.getUserObject());
|
||||
dataBOM.add( line);
|
||||
}
|
||||
*/
|
||||
for (MProductBOM bom : getChildBOMs(M_Product_ID, true))
|
||||
{
|
||||
addChild(bom, parent);
|
||||
}
|
||||
//m_tree = new myJTree(parent);
|
||||
}
|
||||
|
||||
//m_tree.addTreeSelectionListener(this);
|
||||
|
||||
//treePane.getViewport().add (m_tree, null);
|
||||
|
||||
loadTableBOM();
|
||||
|
||||
//m_frame.setBusy(false);
|
||||
m_frame.setCursor(Cursor.getDefaultCursor());
|
||||
} // action_fillTree
|
||||
} // action_reloadBOM
|
||||
|
||||
public void addChild(MProductBOM bomline, DefaultMutableTreeNode parent)
|
||||
{
|
||||
|
||||
//System.out.println("-------------------------Parent:" + bom.getName());
|
||||
MProduct M_Product = MProduct.get(getCtx(), bomline.getM_ProductBOM_ID());
|
||||
|
||||
Vector<Object> line = new Vector<Object>(17);
|
||||
line.add( new Boolean(false)); // 0 Select
|
||||
line.add( new Boolean(bomline.isActive())); // 1 IsActive
|
||||
line.add( new Integer(bomline.getLine())); // 2 Line
|
||||
Vector<Object> line = new Vector<Object>(10);
|
||||
line.add( new Boolean(bomline.isActive())); // 0 IsActive
|
||||
line.add( new Integer(bomline.getLine()).toString()); // 1 Line
|
||||
KeyNamePair pp = new KeyNamePair(M_Product.getM_Product_ID(),M_Product.getValue().concat("_").concat(M_Product.getName()));
|
||||
line.add(pp); // 3 M_Product_ID
|
||||
line.add(pp); // 2 M_Product_ID
|
||||
MUOM u = new MUOM(M_Product.getCtx(), M_Product.getC_UOM_ID(), M_Product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(M_Product.getC_UOM_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 4 C_UOM_ID
|
||||
line.add((BigDecimal) ((bomline.getBOMQty()!=null) ? bomline.getBOMQty() : new BigDecimal(0))); // 5 QtyBOM
|
||||
KeyNamePair uom = new KeyNamePair(u.get_ID(), u.getUOMSymbol());
|
||||
line.add(uom); // 3 C_UOM_ID
|
||||
line.add((BigDecimal) ((bomline.getBOMQty()!=null) ? bomline.getBOMQty() : new BigDecimal(0))); // 4 QtyBOM
|
||||
|
||||
DefaultMutableTreeNode child = new DefaultMutableTreeNode(line);
|
||||
parent.add(child);
|
||||
|
@ -737,18 +582,18 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
{
|
||||
MProduct M_Product = MProduct.get(getCtx(), bom.getM_Product_ID());
|
||||
|
||||
Vector<Object> line = new Vector<Object>(17);
|
||||
line.add( new Boolean(false)); // 0 Select
|
||||
line.add( new Boolean(M_Product.isActive())); // 1 IsActive
|
||||
line.add( new Integer(bom.getLine())); // 2 Line
|
||||
Vector<Object> line = new Vector<Object>(10);
|
||||
line.add( new Boolean(M_Product.isActive())); // 0 IsActive
|
||||
line.add( new Integer(bom.getLine()).toString()); // 1 Line
|
||||
KeyNamePair pp = new KeyNamePair(M_Product.getM_Product_ID(),M_Product.getValue().concat("_").concat(M_Product.getName()));
|
||||
line.add(pp); // 3 M_Product_ID
|
||||
line.add(pp); // 2 M_Product_ID
|
||||
MUOM u = new MUOM(M_Product.getCtx(), M_Product.getC_UOM_ID(), M_Product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(M_Product.getC_UOM_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 6 C_UOM_ID
|
||||
line.add((BigDecimal) ((bom.getBOMQty()!=null) ? bom.getBOMQty() : new BigDecimal(0))); // 9 QtyBOM
|
||||
KeyNamePair uom = new KeyNamePair(u.get_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 3 C_UOM_ID
|
||||
line.add((BigDecimal) ((bom.getBOMQty()!=null) ? bom.getBOMQty() : new BigDecimal(0))); // 4 QtyBOM
|
||||
|
||||
dataBOM.add(line);
|
||||
if(m_selected_id == bom.getM_ProductBOM_ID() || getM_Product_ID() == bom.getM_ProductBOM_ID())
|
||||
dataBOM.add(line);
|
||||
|
||||
DefaultMutableTreeNode child = new DefaultMutableTreeNode(line);
|
||||
parent.add(child);
|
||||
|
@ -759,11 +604,9 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
{
|
||||
addParent(bomline, child);
|
||||
}
|
||||
//dataBOM.add(line);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void valueChanged(TreeSelectionEvent event)
|
||||
{
|
||||
m_selectedNode = (DefaultMutableTreeNode)m_tree.getLastSelectedPathComponent();
|
||||
|
@ -773,22 +616,12 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
|
||||
Vector <?> nodeInfo = (Vector <?>)(m_selectedNode.getUserObject());
|
||||
|
||||
m_selected_id = ((KeyNamePair)nodeInfo.elementAt(3)).getKey() ;
|
||||
m_selected_id = ((KeyNamePair)nodeInfo.elementAt(2)).getKey() ;
|
||||
|
||||
action_reloadBOM();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* List Selection Listener
|
||||
* @param e event
|
||||
*/
|
||||
public void valueChanged (ListSelectionEvent e)
|
||||
{
|
||||
if (e.getValueIsAdjusting())
|
||||
return;
|
||||
} // valueChanged
|
||||
|
||||
/**
|
||||
* Clicked on Expand All
|
||||
*/
|
||||
|
@ -807,69 +640,19 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
}
|
||||
} // expandTree
|
||||
|
||||
|
||||
/**
|
||||
* VTreePanel Changed
|
||||
* @param e event
|
||||
*/
|
||||
public void propertyChange (PropertyChangeEvent e)
|
||||
{
|
||||
} // propertyChange
|
||||
|
||||
public void tableChanged(TableModelEvent e) {
|
||||
}
|
||||
|
||||
|
||||
// action_treeDeleteAll
|
||||
|
||||
/**************************************************************************
|
||||
* Tree Maintenance List Item
|
||||
*/
|
||||
class ListItem
|
||||
{
|
||||
public ListItem (int id, String name, String description, boolean isSummary, String imageIndicator)
|
||||
{
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.isSummary = isSummary;
|
||||
this.imageIndicator = imageIndicator;
|
||||
} // ListItem
|
||||
|
||||
public int id;
|
||||
public String name;
|
||||
public String description;
|
||||
public boolean isSummary;
|
||||
public String imageIndicator; // Menu - Action
|
||||
|
||||
/**
|
||||
* To String
|
||||
* @return String Representation
|
||||
*/
|
||||
public String toString ()
|
||||
{
|
||||
String retValue = name;
|
||||
if (description != null && description.length() > 0)
|
||||
retValue += " (" + description + ")";
|
||||
return retValue;
|
||||
} // toString
|
||||
|
||||
} // ListItem
|
||||
|
||||
/* private String[] productSummary(MProduct product, boolean isLeaf) {
|
||||
MUOM muom = MUOM.get(getCtx(), product.getC_UOM_ID());
|
||||
public String productSummary(MProduct product, boolean isLeaf) {
|
||||
MUOM uom = MUOM.get(getCtx(), product.getC_UOM_ID());
|
||||
String value = product.getValue();
|
||||
String name = product.get_Translation(MProduct.COLUMNNAME_Name);
|
||||
String uom = new StringBuffer(" [")
|
||||
.append(muom.get_Translation(MUOM.COLUMNNAME_UOMSymbol)).append("]").toString();
|
||||
//
|
||||
if (value != null && value.equals(name))
|
||||
name = null;
|
||||
String[] treeObject = {value,name,uom};
|
||||
StringBuffer sb = new StringBuffer(value);
|
||||
if (name != null && !value.equals(name))
|
||||
sb.append("_").append(product.getName());
|
||||
sb.append(" [").append(uom.get_Translation(MUOM.COLUMNNAME_UOMSymbol)).append("]");
|
||||
//
|
||||
return treeObject;
|
||||
return sb.toString();
|
||||
}
|
||||
*/
|
||||
|
||||
private boolean isImplosion() {
|
||||
return implosion.isSelected();
|
||||
}
|
||||
|
@ -887,6 +670,7 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
+(onlyActiveRecords ? " AND IsActive='Y'" : "");
|
||||
return new Query(getCtx(), MProductBOM.Table_Name, filter, null)
|
||||
.setParameters(new Object[]{M_Product_ID})
|
||||
.setOrderBy(MProductBOM.COLUMNNAME_Line)
|
||||
.list();
|
||||
}
|
||||
|
||||
|
@ -895,13 +679,14 @@ public class VTreeBOM extends CPanel implements FormPanel, ActionListener,
|
|||
String filter = MProductBOM.COLUMNNAME_M_ProductBOM_ID+"=?";
|
||||
return new Query(getCtx(), MProductBOM.Table_Name, filter, null)
|
||||
.setParameters(new Object[]{M_Product_ID})
|
||||
.setOrderBy(MProductBOM.COLUMNNAME_M_Product_ID+","+MProductBOM.COLUMNNAME_Line)
|
||||
.list();
|
||||
}
|
||||
} // VTreeMaintenance
|
||||
} // VTreeBOM
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Tree convertValueToText
|
||||
* myJTree - extends convertValueToText method of JTree
|
||||
*/
|
||||
class myJTree extends JTree
|
||||
{
|
||||
|
@ -909,23 +694,26 @@ class myJTree extends JTree
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -6313465838547930491L;
|
||||
private static final long serialVersionUID = -5831338565562378100L;
|
||||
|
||||
public myJTree(DefaultMutableTreeNode parent) {
|
||||
|
||||
super(parent);
|
||||
}
|
||||
|
||||
//mouseAdapter = new VLookup_mouseAdapter(this); // popup
|
||||
|
||||
@Override
|
||||
public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
|
||||
|
||||
DefaultMutableTreeNode nd = (DefaultMutableTreeNode)value;
|
||||
|
||||
Vector <?> userObject = (Vector <?>)nd.getUserObject();
|
||||
|
||||
StringBuffer sb = new StringBuffer(((KeyNamePair)userObject.elementAt(3)).getName());
|
||||
//Product
|
||||
StringBuffer sb = new StringBuffer(((KeyNamePair)userObject.elementAt(2)).getName());
|
||||
//UOM
|
||||
sb.append(" ["+((KeyNamePair) userObject.elementAt(3)).getName().trim()+"]");
|
||||
//BOMQty
|
||||
BigDecimal BOMQty = (BigDecimal)(userObject.elementAt(4));
|
||||
sb.append("x"+BOMQty.setScale(2, BigDecimal.ROUND_HALF_UP).stripTrailingZeros());
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,559 @@
|
|||
/******************************************************************************
|
||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||
* 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 *
|
||||
* Copyright (C) 2003-2010 e-Evolution,SC. All Rights Reserved. *
|
||||
* Contributor(s): victor.perez@e-evolution.com, www.e-evolution.com *
|
||||
*****************************************************************************/
|
||||
package org.adempiere.webui.apps.form;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Vector;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.adempiere.webui.component.Checkbox;
|
||||
import org.adempiere.webui.component.ConfirmPanel;
|
||||
import org.adempiere.webui.component.Grid;
|
||||
import org.adempiere.webui.component.GridFactory;
|
||||
import org.adempiere.webui.component.Label;
|
||||
import org.adempiere.webui.component.ListModelTable;
|
||||
import org.adempiere.webui.component.ListboxFactory;
|
||||
import org.adempiere.webui.component.Panel;
|
||||
import org.adempiere.webui.component.Row;
|
||||
import org.adempiere.webui.component.Rows;
|
||||
import org.adempiere.webui.component.SimpleTreeModel;
|
||||
import org.adempiere.webui.component.WListbox;
|
||||
import org.adempiere.webui.editor.WSearchEditor;
|
||||
import org.adempiere.webui.event.ValueChangeEvent;
|
||||
import org.adempiere.webui.event.ValueChangeListener;
|
||||
import org.adempiere.webui.panel.ADForm;
|
||||
import org.adempiere.webui.panel.CustomForm;
|
||||
import org.adempiere.webui.panel.IFormController;
|
||||
import org.adempiere.webui.session.SessionManager;
|
||||
import org.adempiere.webui.util.TreeUtils;
|
||||
import org.compiere.apps.ADialog;
|
||||
import org.compiere.apps.form.TreeBOM;
|
||||
import org.compiere.model.MColumn;
|
||||
import org.compiere.model.MLookup;
|
||||
import org.compiere.model.MLookupFactory;
|
||||
import org.compiere.model.MProduct;
|
||||
import org.compiere.model.MProductBOM;
|
||||
import org.compiere.model.MUOM;
|
||||
import org.compiere.model.Query;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.Language;
|
||||
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.zkex.zul.Borderlayout;
|
||||
import org.zkoss.zkex.zul.Center;
|
||||
import org.zkoss.zkex.zul.North;
|
||||
import org.zkoss.zkex.zul.South;
|
||||
import org.zkoss.zkex.zul.West;
|
||||
import org.zkoss.zul.Separator;
|
||||
import org.zkoss.zul.SimpleTreeNode;
|
||||
import org.zkoss.zul.Space;
|
||||
import org.zkoss.zul.Tree;
|
||||
import org.zkoss.zul.Treecol;
|
||||
import org.zkoss.zul.Treecols;
|
||||
import org.zkoss.zul.Treeitem;
|
||||
|
||||
public class WTreeBOM extends TreeBOM implements IFormController, EventListener {
|
||||
|
||||
private static final String[] LISTENER_EVENTS = {Events.ON_CLICK, Events.ON_CHANGE, Events.ON_OK, Events.ON_SELECT, Events.ON_SELECTION, Events.ON_DOUBLE_CLICK};
|
||||
private int m_WindowNo = 0;
|
||||
private CustomForm m_frame = new CustomForm();
|
||||
private Tree m_tree = new Tree();
|
||||
private Borderlayout mainLayout = new Borderlayout();
|
||||
private Panel northPanel = new Panel();
|
||||
private Panel southPanel = new Panel();
|
||||
private Label labelProduct = new Label();
|
||||
private WSearchEditor fieldProduct;
|
||||
private West west = new West();
|
||||
private Checkbox implosion = new Checkbox ();
|
||||
private Label treeInfo = new Label ();
|
||||
|
||||
private Panel dataPane = new Panel();
|
||||
private Panel treePane = new Panel();
|
||||
|
||||
protected ArrayList<ValueChangeListener> listeners = new ArrayList<ValueChangeListener>();
|
||||
private mySimpleTreeNode m_selectedNode; // the selected model node
|
||||
private int m_selected_id = 0;
|
||||
private ConfirmPanel confirmPanel = new ConfirmPanel(true);
|
||||
private WListbox tableBOM = ListboxFactory.newDataTable();
|
||||
private Vector<Vector<Object>> dataBOM = new Vector<Vector<Object>>();
|
||||
private Grid northLayout = GridFactory.newGridLayout();
|
||||
private Grid southLayout = GridFactory.newGridLayout();
|
||||
private mySimpleTreeNode m_root = null;
|
||||
private boolean reload = false;
|
||||
private Checkbox treeExpand = new Checkbox();
|
||||
|
||||
public WTreeBOM(){
|
||||
try{
|
||||
preInit();
|
||||
jbInit ();
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
log.log(Level.SEVERE, "VTreeBOM.init", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadTableBOM()
|
||||
{
|
||||
|
||||
// Header Info
|
||||
|
||||
Vector<String> columnNames = new Vector<String>();
|
||||
|
||||
columnNames.add(Msg.translate(Env.getCtx(), "IsActive")); // 0
|
||||
columnNames.add(Msg.getElement(Env.getCtx(), "Line")); // 1
|
||||
columnNames.add(Msg.getElement(Env.getCtx(), "M_Product_ID")); // 2
|
||||
columnNames.add(Msg.getElement(Env.getCtx(), "C_UOM_ID")); // 3
|
||||
columnNames.add(Msg.getElement(Env.getCtx(), "QtyBOM")); // 4
|
||||
|
||||
tableBOM.clear();
|
||||
|
||||
// Set Model
|
||||
ListModelTable model = new ListModelTable(dataBOM);
|
||||
tableBOM.setData(model, columnNames);
|
||||
|
||||
tableBOM.setColumnClass( 0, Boolean.class, true); // 0 IsActive
|
||||
tableBOM.setColumnClass( 1, String.class,true); // 1 Line
|
||||
tableBOM.setColumnClass( 2, KeyNamePair.class,true); // 2 M_Product_ID
|
||||
tableBOM.setColumnClass( 3, KeyNamePair.class,true); // 3 C_UOM_ID
|
||||
tableBOM.setColumnClass( 4, BigDecimal.class,true); // 4 QtyBOM
|
||||
|
||||
} // dynInit
|
||||
|
||||
private void preInit() throws Exception
|
||||
{
|
||||
Properties ctx = Env.getCtx();
|
||||
Language language = Language.getLoginLanguage(); // Base Language
|
||||
MLookup m_fieldProduct = MLookupFactory.get(ctx, m_WindowNo,
|
||||
MColumn.getColumn_ID(MProduct.Table_Name, "M_Product_ID"),
|
||||
DisplayType.Search, language, MProduct.COLUMNNAME_M_Product_ID, 0, false,
|
||||
" M_Product.IsSummary = 'N'");
|
||||
|
||||
fieldProduct = new WSearchEditor("M_Product_ID", true, false, true, m_fieldProduct)
|
||||
{
|
||||
public void setValue(Object value) {
|
||||
super.setValue(value);
|
||||
this.fireValueChange(new ValueChangeEvent(this, this.getColumnName(), getValue(), value));
|
||||
confirmPanel.getOKButton().setFocus(true);
|
||||
}
|
||||
};
|
||||
|
||||
implosion.addActionListener(this);
|
||||
treeExpand.addActionListener(this);
|
||||
|
||||
}
|
||||
|
||||
private void jbInit()
|
||||
{
|
||||
|
||||
m_frame.setWidth("99%");
|
||||
m_frame.setHeight("100%");
|
||||
m_frame.setStyle("position: absolute; padding: 0; margin: 0");
|
||||
m_frame.appendChild (mainLayout);
|
||||
mainLayout.setWidth("100%");
|
||||
mainLayout.setHeight("100%");
|
||||
mainLayout.setStyle("position: absolute");
|
||||
northPanel.appendChild(northLayout);
|
||||
southPanel.appendChild(southLayout);
|
||||
|
||||
labelProduct.setText (Msg.getElement(Env.getCtx(), "M_Product_ID"));
|
||||
implosion.setText (Msg.getElement(Env.getCtx(), "Implosion"));
|
||||
treeInfo.setText (Msg.getElement(Env.getCtx(), "Sel_Product_ID")+": ");
|
||||
|
||||
North north = new North();
|
||||
north.appendChild(northPanel);
|
||||
north.setHeight("6%");
|
||||
northPanel.setWidth("100%");
|
||||
mainLayout.appendChild(north);
|
||||
|
||||
Rows rows = northLayout.newRows();
|
||||
|
||||
Row north_row = rows.newRow();
|
||||
north_row.appendChild(labelProduct.rightAlign());
|
||||
north_row.appendChild(fieldProduct.getComponent());
|
||||
north_row.appendChild(new Separator());
|
||||
north_row.appendChild(implosion);
|
||||
north_row.appendChild(new Space());
|
||||
north_row.appendChild(new Separator());
|
||||
north_row.appendChild(new Space());
|
||||
north_row.appendChild(treeInfo);
|
||||
|
||||
treeExpand.setText(Msg.getMsg(Env.getCtx(), "ExpandTree"));
|
||||
|
||||
South south = new South();
|
||||
south.appendChild(southPanel);
|
||||
south.setHeight("10%");
|
||||
southPanel.setWidth("100%");
|
||||
mainLayout.appendChild(south);
|
||||
|
||||
Rows rows2 = southLayout.newRows();
|
||||
|
||||
Row south_row = rows2.newRow();
|
||||
|
||||
south_row.appendChild(treeExpand);
|
||||
south_row.appendChild(new Space());
|
||||
south_row.appendChild(new Separator());
|
||||
south_row.appendChild(new Space());
|
||||
south_row.appendChild(confirmPanel);
|
||||
confirmPanel.addActionListener(this);
|
||||
|
||||
mainLayout.appendChild(west);
|
||||
west.setSplittable(true);
|
||||
west.appendChild(treePane);
|
||||
treePane.appendChild(m_tree);
|
||||
m_tree.setStyle("border: none;");
|
||||
west.setWidth("33%");
|
||||
west.setAutoscroll(true);
|
||||
|
||||
Center center = new Center();
|
||||
mainLayout.appendChild(center);
|
||||
center.appendChild(dataPane);
|
||||
dataPane.appendChild(tableBOM);
|
||||
center.setFlex(true);
|
||||
center.setAutoscroll(true);
|
||||
}
|
||||
|
||||
public void dispose()
|
||||
{
|
||||
SessionManager.getAppDesktop().closeActiveWindow();
|
||||
} // dispose
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
|
||||
if (event.getTarget().getId().equals(ConfirmPanel.A_OK))
|
||||
{
|
||||
if(m_selected_id > 0 || getM_Product_ID() > 0) action_loadBOM();
|
||||
}
|
||||
if (event.getTarget().getId().equals(ConfirmPanel.A_CANCEL))
|
||||
{
|
||||
dispose();
|
||||
}
|
||||
if (event.getTarget().equals(treeExpand))
|
||||
{
|
||||
if (treeExpand.isChecked())
|
||||
{
|
||||
TreeUtils.expandAll(m_tree);
|
||||
}
|
||||
else
|
||||
{
|
||||
TreeUtils.collapseAll(m_tree);
|
||||
}
|
||||
}
|
||||
// *** Tree ***
|
||||
if (event.getTarget() instanceof Tree )
|
||||
{
|
||||
Treeitem ti = m_tree.getSelectedItem();
|
||||
if (ti == null)
|
||||
ADialog.beep();
|
||||
else
|
||||
{
|
||||
mySimpleTreeNode tn = (mySimpleTreeNode)ti.getValue();
|
||||
setSelectedNode(tn);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the selected node & initiate all listeners
|
||||
* @param nd node
|
||||
* @throws Exception
|
||||
*/
|
||||
private void setSelectedNode (mySimpleTreeNode nd) throws Exception
|
||||
{
|
||||
log.config("Node = " + nd);
|
||||
m_selectedNode = nd;
|
||||
if(m_selectedNode == null)
|
||||
return;
|
||||
|
||||
Vector <?> nodeInfo = (Vector <?>)(m_selectedNode.getData());
|
||||
m_selected_id = ((KeyNamePair)nodeInfo.elementAt(2)).getKey() ;
|
||||
|
||||
if(m_selected_id > 0)
|
||||
action_reloadBOM();
|
||||
|
||||
} // setSelectedNode
|
||||
|
||||
private void action_loadBOM() throws Exception
|
||||
{
|
||||
reload = false;
|
||||
|
||||
int M_Product_ID = getM_Product_ID();
|
||||
if (M_Product_ID == 0)
|
||||
return;
|
||||
MProduct product = MProduct.get(Env.getCtx(), M_Product_ID);
|
||||
treeInfo.setText (Msg.getElement(Env.getCtx(), "Sel_Product_ID")+": "+product.getValue());
|
||||
|
||||
Vector<Object> line = new Vector<Object>(10);
|
||||
line.add( new Boolean(product.isActive())); // 0 IsActive
|
||||
line.add( new Integer(0).toString()); // 1 Line
|
||||
KeyNamePair pp = new KeyNamePair(product.getM_Product_ID(),product.getValue().concat("_").concat(product.getName()));
|
||||
line.add(pp); // 2 M_Product_ID
|
||||
MUOM u = new MUOM(product.getCtx(), product.getC_UOM_ID(), product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(u.get_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 3 C_UOM_ID
|
||||
line.add((BigDecimal) (new BigDecimal(1)).setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros()); // 4 QtyBOM
|
||||
|
||||
// dummy root node, as first node is not displayed in tree
|
||||
mySimpleTreeNode parent = new mySimpleTreeNode("Root",new ArrayList<Object>());
|
||||
//m_root = parent;
|
||||
m_root = new mySimpleTreeNode((Vector<Object>)line,new ArrayList<Object>());
|
||||
parent.getChildren().add(m_root);
|
||||
|
||||
dataBOM.clear();
|
||||
|
||||
if (isImplosion())
|
||||
{
|
||||
try{
|
||||
m_tree.setModel(null);
|
||||
}catch(Exception e)
|
||||
{}
|
||||
|
||||
if (m_tree.getTreecols() != null)
|
||||
m_tree.getTreecols().detach();
|
||||
if (m_tree.getTreefoot() != null)
|
||||
m_tree.getTreefoot().detach();
|
||||
if (m_tree.getTreechildren() != null)
|
||||
m_tree.getTreechildren().detach();
|
||||
|
||||
for (MProductBOM bomline : getParentBOMs(M_Product_ID))
|
||||
{
|
||||
addParent(bomline, m_root);
|
||||
}
|
||||
|
||||
Treecols treeCols = new Treecols();
|
||||
m_tree.appendChild(treeCols);
|
||||
Treecol treeCol = new Treecol();
|
||||
treeCols.appendChild(treeCol);
|
||||
|
||||
SimpleTreeModel model = new SimpleTreeModel(parent);
|
||||
m_tree.setPageSize(-1);
|
||||
m_tree.setTreeitemRenderer(model);
|
||||
m_tree.setModel(model);
|
||||
}
|
||||
else
|
||||
{
|
||||
try{
|
||||
m_tree.setModel(null);
|
||||
}catch(Exception e)
|
||||
{}
|
||||
|
||||
if (m_tree.getTreecols() != null)
|
||||
m_tree.getTreecols().detach();
|
||||
if (m_tree.getTreefoot() != null)
|
||||
m_tree.getTreefoot().detach();
|
||||
if (m_tree.getTreechildren() != null)
|
||||
m_tree.getTreechildren().detach();
|
||||
for (MProductBOM bom : getChildBOMs(M_Product_ID, true))
|
||||
{
|
||||
addChild(bom, m_root);
|
||||
}
|
||||
|
||||
Treecols treeCols = new Treecols();
|
||||
m_tree.appendChild(treeCols);
|
||||
Treecol treeCol = new Treecol();
|
||||
treeCols.appendChild(treeCol);
|
||||
|
||||
SimpleTreeModel model = new SimpleTreeModel(parent);
|
||||
|
||||
m_tree.setPageSize(-1);
|
||||
m_tree.setTreeitemRenderer(model);
|
||||
m_tree.setModel(model);
|
||||
}
|
||||
|
||||
int[] path = m_tree.getModel().getPath(parent, m_root);
|
||||
Treeitem ti = m_tree.renderItemByPath(path);
|
||||
m_tree.setSelectedItem(ti);
|
||||
ti.setOpen(true);
|
||||
|
||||
m_tree.addEventListener(Events.ON_SELECT, this);
|
||||
loadTableBOM();
|
||||
}
|
||||
|
||||
private void action_reloadBOM() throws Exception
|
||||
{
|
||||
reload = true;
|
||||
int M_Product_ID = m_selected_id;
|
||||
|
||||
if (M_Product_ID == 0)
|
||||
return;
|
||||
MProduct product = MProduct.get(Env.getCtx(), M_Product_ID);
|
||||
treeInfo.setText (Msg.getElement(Env.getCtx(), "Sel_Product_ID")+": "+product.getValue());
|
||||
|
||||
dataBOM.clear();
|
||||
|
||||
if (isImplosion())
|
||||
{
|
||||
|
||||
for (MProductBOM bomline : getParentBOMs(M_Product_ID))
|
||||
{
|
||||
addParent(bomline, m_selectedNode);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
for (MProductBOM bom : getChildBOMs(M_Product_ID, true))
|
||||
{
|
||||
addChild(bom, m_selectedNode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
loadTableBOM();
|
||||
}
|
||||
|
||||
|
||||
public void addChild(MProductBOM bomline, mySimpleTreeNode parent) throws Exception
|
||||
{
|
||||
|
||||
MProduct M_Product = MProduct.get(getCtx(), bomline.getM_ProductBOM_ID());
|
||||
|
||||
Vector<Object> line = new Vector<Object>(10);
|
||||
line.add( new Boolean(bomline.isActive())); // 0 IsActive
|
||||
line.add( new Integer(bomline.getLine()).toString()); // 1 Line
|
||||
KeyNamePair pp = new KeyNamePair(M_Product.getM_Product_ID(),M_Product.getValue().concat("_").concat(M_Product.getName()));
|
||||
line.add(pp); // 2 M_Product_ID
|
||||
MUOM u = new MUOM(M_Product.getCtx(), M_Product.getC_UOM_ID(), M_Product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(u.get_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 3 C_UOM_ID
|
||||
line.add((BigDecimal) ((bomline.getBOMQty()!=null) ? bomline.getBOMQty() : new BigDecimal(0)).setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros()); // 4 QtyBOM
|
||||
|
||||
mySimpleTreeNode child = new mySimpleTreeNode(line,new ArrayList<Object>());
|
||||
parent.getChildren().add(child);
|
||||
|
||||
if(m_selected_id == bomline.getM_Product_ID() || getM_Product_ID() == bomline.getM_Product_ID())
|
||||
dataBOM.add(line);
|
||||
|
||||
if(reload) return;
|
||||
|
||||
for (MProductBOM bom : getChildBOMs(bomline.getM_ProductBOM_ID(), false))
|
||||
{
|
||||
addChild(bom, child);
|
||||
}
|
||||
}
|
||||
|
||||
public void addParent(MProductBOM bom, mySimpleTreeNode parent) throws Exception
|
||||
{
|
||||
MProduct M_Product = MProduct.get(getCtx(), bom.getM_Product_ID());
|
||||
|
||||
Vector<Object> line = new Vector<Object>(10);
|
||||
line.add( new Boolean(M_Product.isActive())); // 0 IsActive
|
||||
line.add( new Integer(bom.getLine()).toString()); // 1 Line
|
||||
KeyNamePair pp = new KeyNamePair(M_Product.getM_Product_ID(),M_Product.getValue().concat("_").concat(M_Product.getName()));
|
||||
line.add(pp); // 2 M_Product_ID
|
||||
MUOM u = new MUOM(M_Product.getCtx(), M_Product.getC_UOM_ID(), M_Product.get_TrxName());
|
||||
KeyNamePair uom = new KeyNamePair(u.get_ID(),u.getUOMSymbol());
|
||||
line.add(uom); // 3 C_UOM_ID
|
||||
line.add((BigDecimal) ((bom.getBOMQty()!=null) ? bom.getBOMQty() : new BigDecimal(0)).setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros()); // 4 QtyBOM
|
||||
|
||||
if(m_selected_id == bom.getM_ProductBOM_ID() || getM_Product_ID() == bom.getM_ProductBOM_ID())
|
||||
dataBOM.add(line);
|
||||
|
||||
mySimpleTreeNode child = new mySimpleTreeNode(line,new ArrayList<Object>());
|
||||
parent.getChildren().add(child);
|
||||
|
||||
if(reload) return;
|
||||
|
||||
for (MProductBOM bomline : getParentBOMs(bom.getM_Product_ID()))
|
||||
{
|
||||
addParent(bomline, child);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private int getM_Product_ID() {
|
||||
Integer Product = (Integer)fieldProduct.getValue();
|
||||
if (Product == null)
|
||||
return 0;
|
||||
return Product.intValue();
|
||||
}
|
||||
|
||||
private List<MProductBOM> getChildBOMs(int M_Product_ID, boolean onlyActiveRecords)
|
||||
{
|
||||
String filter = MProductBOM.COLUMNNAME_M_Product_ID+"=?"
|
||||
+(onlyActiveRecords ? " AND IsActive='Y'" : "");
|
||||
return new Query(getCtx(), MProductBOM.Table_Name, filter, null)
|
||||
.setParameters(new Object[]{M_Product_ID})
|
||||
.setOrderBy(MProductBOM.COLUMNNAME_Line)
|
||||
.list();
|
||||
}
|
||||
|
||||
private List<MProductBOM> getParentBOMs(int M_Product_ID)
|
||||
{
|
||||
String filter = MProductBOM.COLUMNNAME_M_ProductBOM_ID+"=?";
|
||||
return new Query(getCtx(), MProductBOM.Table_Name, filter, null)
|
||||
.setParameters(new Object[]{M_Product_ID})
|
||||
.setOrderBy(MProductBOM.COLUMNNAME_M_Product_ID+","+MProductBOM.COLUMNNAME_Line)
|
||||
.list()
|
||||
;
|
||||
}
|
||||
|
||||
private boolean isImplosion() {
|
||||
return implosion.isSelected();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ADForm getForm() {
|
||||
return m_frame;
|
||||
}
|
||||
|
||||
public String[] getEvents()
|
||||
{
|
||||
return LISTENER_EVENTS;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* mySimpleTreeNode
|
||||
* - Override toString method for display
|
||||
*
|
||||
*/
|
||||
class mySimpleTreeNode extends SimpleTreeNode
|
||||
{
|
||||
|
||||
public mySimpleTreeNode(Object data, List<Object> children) {
|
||||
|
||||
super(data, children);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
|
||||
Vector <?> userObject = (Vector <?>)getData();
|
||||
// Product
|
||||
StringBuffer sb = new StringBuffer(((KeyNamePair)userObject.elementAt(2)).getName());
|
||||
// UOM
|
||||
sb.append(" ["+((KeyNamePair) userObject.elementAt(3)).getName().trim()+"]");
|
||||
// BOMQty
|
||||
BigDecimal BOMQty = (BigDecimal)(userObject.elementAt(4));
|
||||
sb.append("x"+BOMQty.setScale(2, BigDecimal.ROUND_HALF_UP).stripTrailingZeros());
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue