Advertisement
Guest User

VTreePanel

a guest
Oct 16th, 2012
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 30.48 KB | None | 0 0
  1.  /******************************************************************************
  2.  * Product: Adempiere ERP & CRM Smart Business Solution                        *
  3.  * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved.                *
  4.  * This program is free software; you can redistribute it and/or modify it    *
  5.  * under the terms version 2 of the GNU General Public License as published   *
  6.  * by the Free Software Foundation. This program is distributed in the hope   *
  7.  * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
  8.  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.           *
  9.  * See the GNU General Public License for more details.                       *
  10.  * You should have received a copy of the GNU General Public License along    *
  11.  * with this program; if not, write to the Free Software Foundation, Inc.,    *
  12.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.                     *
  13.  * For the text or an alternative of this public license, you may reach us    *
  14.  * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA        *
  15.  * or via info@compiere.org or http://www.compiere.org/license.html           *
  16.  *****************************************************************************/
  17. package org.compiere.grid.tree;
  18.  
  19.  
  20. import java.awt.BorderLayout;
  21. import java.awt.Container;
  22. import java.awt.Cursor;
  23. import java.awt.Dimension;
  24. import java.awt.Graphics;
  25. import java.awt.Insets;
  26. import java.awt.Rectangle;
  27. import java.awt.event.ActionEvent;
  28. import java.awt.event.ActionListener;
  29. import java.awt.event.KeyEvent;
  30. import java.awt.event.KeyListener;
  31. import java.awt.event.MouseEvent;
  32. import java.awt.event.MouseListener;
  33. import java.beans.PropertyChangeEvent;
  34. import java.beans.PropertyChangeListener;
  35. import java.util.ArrayList;
  36. import java.util.Enumeration;
  37. import java.util.HashMap;
  38. import java.util.Map;
  39. import java.util.logging.Level;
  40.  
  41. import javax.swing.Action;
  42. import javax.swing.ActionMap;
  43. import javax.swing.BorderFactory;
  44. import javax.swing.DropMode;
  45. import javax.swing.JButton;
  46. import javax.swing.JCheckBox;
  47. import javax.swing.JComponent;
  48. import javax.swing.JFrame;
  49. import javax.swing.JLabel;
  50. import javax.swing.JMenuItem;
  51. import javax.swing.JPopupMenu;
  52. import javax.swing.JScrollPane;
  53. import javax.swing.JSplitPane;
  54. import javax.swing.JToolBar;
  55. import javax.swing.JTree;
  56. import javax.swing.KeyStroke;
  57. import javax.swing.SwingUtilities;
  58. import javax.swing.TransferHandler;
  59. import javax.swing.UIManager;
  60. import javax.swing.plaf.SplitPaneUI;
  61. import javax.swing.plaf.basic.BasicSplitPaneUI;
  62. import javax.swing.tree.DefaultTreeSelectionModel;
  63. import javax.swing.tree.TreePath;
  64.  
  65. import org.adempiere.exceptions.DBException;
  66. import org.adempiere.plaf.AdempierePLAF;
  67. import org.adempiere.plaf.AdempiereTaskPaneUI;
  68. import org.compiere.apps.ADialog;
  69. import org.compiere.model.MTree;
  70. import org.compiere.model.MTreeNode;
  71. import org.compiere.swing.CButton;
  72. import org.compiere.swing.CCheckBox;
  73. import org.compiere.swing.CLabel;
  74. import org.compiere.swing.CMenuItem;
  75. import org.compiere.swing.CPanel;
  76. import org.compiere.swing.CTextField;
  77. import org.compiere.swing.ShadowBorder;
  78. import org.compiere.util.CLogger;
  79. import org.compiere.util.DB;
  80. import org.compiere.util.Env;
  81. import org.compiere.util.Msg;
  82. import org.compiere.util.Trx;
  83. import org.compiere.util.TrxRunnable;
  84. import org.jdesktop.swingx.JXTaskPane;
  85. import org.jdesktop.swingx.JXTaskPaneContainer;
  86.  
  87. import de.schaeffer.compiere.tools.DocumentSearch;
  88.  
  89. /**
  90.  *  Tree Panel displays trees.
  91.  *  <br>
  92.  *  When a node is selected by Left Click, a propertyChange (NODE_SELECTION) event is fired
  93.  *  <pre>
  94.  *      PropertyChangeListener -
  95.  *          treePanel.addPropertyChangeListener(VTreePanel.NODE_SELECTION, this);
  96.  *          calls: public void propertyChange(PropertyChangeEvent e)
  97.  *  </pre>
  98.  *  To select a specific node call
  99.  *      setSelectedNode(NodeID);
  100.  *
  101.  *  @author     Jorg Janke
  102.  *  @version    $Id: VTreePanel.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $
  103.  *
  104.  * @author kthiemann / Carlos Ruiz
  105.  *          <li>2761420 - Advanced Search
  106.  *  
  107.  * @author Teo Sarca
  108.  *          <li>BF [ 2866493 ] VTreePanel is not saving who did the node move
  109.  *          https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2866493&group_id=176962
  110.  *
  111.  * @author Paul Bowden
  112.  *          <li>FR [ 2032092 ] Java 6 improvements to tree drag and drop
  113.  *          https://sourceforge.net/tracker/index.php?func=detail&aid=2032092&group_id=176962&atid=879335
  114.  */
  115. public final class VTreePanel extends CPanel
  116.     implements ActionListener
  117. {
  118. /******************************************************************************
  119.      *  Mouse Clicked
  120.      */
  121.     class VTreePanel_mouseAdapter extends java.awt.event.MouseAdapter
  122.     {
  123.         VTreePanel m_adaptee;
  124.  
  125.         /**
  126.          *  VTreePanel_mouseAdapter
  127.          *  @param adaptee
  128.          */
  129.         VTreePanel_mouseAdapter(VTreePanel adaptee)
  130.         {
  131.             m_adaptee = adaptee;
  132.         }
  133.  
  134.         /**
  135.          *  Mouse Clicked
  136.          *  @param e
  137.          */
  138.         public void mouseClicked(MouseEvent e)
  139.         {
  140.             m_adaptee.mouseClicked(e);
  141.         }
  142.  
  143.  
  144.     }   //  VTreePanel_mouseAdapter
  145.  
  146.     /**
  147.      *  Key Pressed
  148.      */
  149.     class VTreePanel_keyAdapter extends java.awt.event.KeyAdapter
  150.     {
  151.         VTreePanel m_adaptee;
  152.  
  153.         /**
  154.          *  VTreePanel_keyAdapter
  155.          *  @param adaptee
  156.          */
  157.         VTreePanel_keyAdapter(VTreePanel adaptee)
  158.         {
  159.             m_adaptee = adaptee;
  160.         }
  161.  
  162.         /**
  163.          *  Key Pressed
  164.          *  @param e
  165.          */
  166.         public void keyPressed(KeyEvent e)
  167.         {
  168.             if (e.getKeyCode() == KeyEvent.VK_ENTER)
  169.                 m_adaptee.keyPressed(e);
  170.         }
  171.     }   //  VTreePanel_keyAdapter
  172.    
  173.    
  174.     /**
  175.      *
  176.      */
  177.     private static final long serialVersionUID = -6798614427038652192L;
  178.  
  179.     private static final String PREFIX_DOCUMENT_SEARCH = "/";
  180.  
  181.     protected boolean m_lookAndFeelChanged = false;
  182.  
  183.     private VTreeTransferHandler handler = new VTreeTransferHandler();
  184.  
  185.     /**
  186.      *  Tree Panel for browsing and editing of a tree.
  187.      *  Need to call initTree
  188.      *  @param  WindowNo    WindowNo
  189.      *  @param  editable    if true you can edit it
  190.      *  @param  hasBar      has OutlookBar
  191.      */
  192.     public VTreePanel(int WindowNo, boolean hasBar, boolean editable)
  193.     {
  194.         super();
  195.         toolbar = new ArrayList<JToolBar>();
  196.         log.config("Bar=" + hasBar + ", Editable=" + editable);
  197.         m_WindowNo = WindowNo;
  198.         m_hasBar = hasBar;
  199.         m_editable = editable;
  200.  
  201.         //  static init
  202.         jbInit();
  203.         if (!hasBar)
  204.         {
  205.             barScrollPane.setPreferredSize(new Dimension(0,0));
  206.             barScrollPane.setMaximumSize(new Dimension(0,0));
  207.             barScrollPane.setMinimumSize(new Dimension(0,0));
  208.             //Begin - [FR 1953769]
  209.             bar.setBackground(AdempierePLAF.getFormBackground());
  210.             //End - [FR 1953769]
  211.             centerSplitPane.setDividerLocation(0);
  212.             centerSplitPane.setDividerSize(0);
  213.             popMenuTree.remove(mBarAdd);
  214.         }
  215.         else {
  216.             centerSplitPane.setDividerLocation(80);
  217.             UIManager.addPropertyChangeListener(new PropertyChangeListener() {
  218.                 public void propertyChange(PropertyChangeEvent evt) {
  219.                     if ("lookAndFeel".equals(evt.getPropertyName()))
  220.                         m_lookAndFeelChanged = true;
  221.                 }
  222.                
  223.             });
  224.         }
  225.         //  base settings
  226.         if (editable) {
  227.             tree.setDragEnabled(true);
  228.             tree.setTransferHandler(handler);
  229.             tree.setDropMode(DropMode.INSERT);
  230.             setMappings(tree);
  231.         }
  232.         else
  233.         {
  234.             popMenuTree.remove(mFrom);
  235.             popMenuTree.remove(mTo);
  236.         }
  237.     }   //  VTreePanel
  238.  
  239.     /**
  240.      *  Tree initialization.
  241.      *  May be called several times
  242.      *  @param  AD_Tree_ID  tree to load
  243.      *  @return true if loaded ok
  244.      */
  245.     public boolean initTree (int AD_Tree_ID)
  246.     {
  247.         log.config("AD_Tree_ID=" + AD_Tree_ID);
  248.         //
  249.         m_AD_Tree_ID = AD_Tree_ID;
  250.  
  251.         //  Get Tree
  252.         MTree vTree = new MTree (Env.getCtx(), AD_Tree_ID, m_editable, true, null);
  253.         m_root = vTree.getRoot();
  254.         m_root.setName(Msg.getMsg(Env.getCtx(), vTree.getName() ) ); // translate name of menu.
  255.         // m_root.setName(Msg.getMsg(Env.getCtx(), "Menu") ); // @Trifon; this is the hardcoded way.
  256.  
  257.         log.config("root=" + m_root);
  258.         m_nodeTableName = vTree.getNodeTableName();
  259.         treeModel = new AdempiereTreeModel(m_root, true);
  260.         treeModel.setMTree(vTree);
  261.         tree.setModel(treeModel);
  262.  
  263.         //  Shortcut Bar
  264.         if (m_hasBar)
  265.         {
  266.             for (JToolBar jt : toolbar)
  267.                 jt.removeAll();
  268.             toolbarMap = new HashMap<Integer, JToolBar>();
  269.             Enumeration<?> enTop = m_root.children();
  270.             JToolBar jt = null;
  271.             Map<JToolBar,String> titleMap = new HashMap<JToolBar, String>();
  272.             while (enTop.hasMoreElements())
  273.             {
  274.                 MTreeNode ndTop = (MTreeNode)enTop.nextElement();
  275.                 Enumeration<?> en = ndTop.preorderEnumeration();
  276.                 boolean labelDrawn=false;
  277.                 while (en.hasMoreElements())
  278.                 {
  279.                     MTreeNode nd = (MTreeNode)en.nextElement();
  280.                     if (nd.isOnBar()) {
  281.                         if (!labelDrawn) {
  282.                             jt = new JToolBar(JToolBar.VERTICAL);
  283.                             titleMap.put(jt, ndTop.toString().trim());
  284.                             labelDrawn=true;
  285.                             toolbarMap.put(ndTop.getNode_ID(), jt);
  286.                         }
  287.                         addToBar(nd, jt, false);
  288.                     }
  289.                 }
  290.                 if (jt!=null)
  291.                     toolbar.add(jt);
  292.                 jt=null;
  293.             }
  294.             //jbInit();
  295.             for (JToolBar jt2 : toolbar) {
  296.                 jt2.setOpaque(false);
  297.                 //jt2.setLayout(new GridBagLayout());
  298.                 jt2.setFloatable(false);
  299.                 jt2.setRollover(true);
  300.                 jt2.setBorder(BorderFactory.createEmptyBorder());
  301.                
  302.                 JXTaskPane barPart = new JXTaskPane();
  303.                 //Begin - [FR 1953769]
  304.                 barPart.setUI(new AdempiereTaskPaneUI());
  305.                 barPart.getContentPane().setBackground(AdempierePLAF.getFormBackground());
  306.                 //End - [FR 1953769]
  307.                 barPart.setAnimated(true);
  308.                 barPart.setLayout(new BorderLayout());
  309.                 barPart.add(jt2, BorderLayout.NORTH);
  310.                 barPart.setTitle(titleMap.get(jt2));
  311.                
  312.                 bar.add(barPart);
  313.                 //Begin - [FR 1953769]
  314.                 bar.setBackground(AdempierePLAF.getFormBackground());
  315.                 //End - [FR 1953769]
  316.             }
  317.         }
  318.         return true;
  319.     }   //  initTree
  320.  
  321.     /** Logger          */
  322.     private static CLogger log = CLogger.getCLogger(VTreePanel.class);
  323.  
  324.     private BorderLayout mainLayout = new BorderLayout();
  325.     private JTree tree = new JTree();
  326.     private AdempiereTreeModel treeModel;
  327.     private DefaultTreeSelectionModel treeSelect = new DefaultTreeSelectionModel();
  328.     private CPanel southPanel = new CPanel();
  329.     private CCheckBox treeExpand = new CCheckBox();
  330.     private CTextField treeSearch = new CTextField(10);
  331.     private CLabel treeSearchLabel = new CLabel();
  332.     private JPopupMenu popMenuTree = new JPopupMenu();
  333.     private JPopupMenu popMenuBar = new JPopupMenu();
  334.     private CMenuItem mFrom = new CMenuItem();
  335.     private CMenuItem mTo = new CMenuItem();
  336.     private JXTaskPaneContainer bar = new JXTaskPaneContainer();
  337.     private java.util.List<JToolBar> toolbar;
  338.     private HashMap<Integer, JToolBar> toolbarMap;
  339.     private int toolBarCols=3;
  340.     private CMenuItem mBarAdd = new CMenuItem();
  341.     private CMenuItem mBarRemove = new CMenuItem();
  342.     private BorderLayout southLayout = new BorderLayout();
  343.     private JSplitPane centerSplitPane = new JSplitPane();
  344.     private JScrollPane treePane = new JScrollPane();
  345.     private MouseListener mouseListener = new VTreePanel_mouseAdapter(this);
  346.     private KeyListener keyListener = new VTreePanel_keyAdapter(this);
  347.  
  348.     //
  349.     private int         m_WindowNo;
  350.     /** Tree ID                     */
  351.     private int         m_AD_Tree_ID = 0;
  352.     /** Table Name for TreeNode     */
  353.     private String      m_nodeTableName = null;
  354.     /** Tree is editable (can move nodes) - also not active shown   */
  355.     private boolean     m_editable;
  356.     /** Tree has a shortcut Bar     */
  357.     private boolean     m_hasBar;
  358.     /** The root node               */
  359.     private MTreeNode   m_root = null;
  360.  
  361.  
  362.     private String      m_search = "";
  363.     private Enumeration<?> m_nodeEn;
  364.     private MTreeNode   m_selectedNode; //  the selected model node
  365.     private CButton     m_buttonSelected;
  366.  
  367.     private JScrollPane barScrollPane;
  368.  
  369.     /** Property Listener NodeSelected  by Left Click       */
  370.     public static final String NODE_SELECTION = "NodeSelected";
  371.  
  372.     /**
  373.      *  Static Component initialization.
  374.      *  <pre>
  375.      *  - centerSplitPane
  376.      *      - treePane
  377.      *          - tree
  378.      *      - bar
  379.      *  - southPanel
  380.      *  </pre>
  381.      */
  382.     private void jbInit()
  383.     {
  384.         this.setLayout(mainLayout);
  385.         mainLayout.setVgap(5);
  386.         //
  387.         //  only one node to be selected
  388.         treeSelect.setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
  389.         tree.setSelectionModel(treeSelect);
  390.         //
  391.         tree.setEditable(false);                    //  allows to change the text
  392.         tree.addMouseListener(mouseListener);
  393.         tree.addKeyListener(keyListener);
  394.         tree.setCellRenderer(new VTreeCellRenderer());
  395.         treePane.getViewport().add(tree, null);
  396.         treePane.setBorder(new ShadowBorder());
  397.         tree.setBorder(BorderFactory.createEmptyBorder());
  398.        
  399.         CPanel treePart = new CPanel();
  400.         treePart.setLayout(new BorderLayout());
  401.         treePart.add(treePane, BorderLayout.CENTER);
  402.         treePart.setBorder(BorderFactory.createEmptyBorder());
  403.        
  404.         //
  405.         treeExpand.setText(Msg.getMsg(Env.getCtx(), "ExpandTree"));
  406.         treeExpand.setActionCommand("Expand");
  407.         treeExpand.addMouseListener(mouseListener);
  408.         treeExpand.addActionListener(this);
  409.         //
  410.         treeSearchLabel.setText(Msg.getMsg(Env.getCtx(), "TreeSearch") + " ");
  411.         treeSearchLabel.setLabelFor(treeSearch);
  412.         treeSearchLabel.setToolTipText(Msg.getMsg(Env.getCtx(), "TreeSearchText"));
  413.  
  414.         treeSearch.setBackground(AdempierePLAF.getInfoBackground());
  415.         treeSearch.addKeyListener(keyListener);
  416.         southPanel.setLayout(southLayout);
  417.         southPanel.add(treeExpand, BorderLayout.WEST);
  418.         southPanel.add(treeSearchLabel, BorderLayout.CENTER);
  419.         southPanel.add(treeSearch, BorderLayout.EAST);
  420.         treePart.add(southPanel, BorderLayout.SOUTH);
  421.         //
  422.         centerSplitPane.setOpaque(false);
  423.         barScrollPane = new JScrollPane();
  424.         barScrollPane.getViewport().add(bar);
  425.         centerSplitPane.add(barScrollPane, JSplitPane.LEFT); //hengsin, jxtaskpane
  426.         centerSplitPane.add(treePart, JSplitPane.RIGHT);
  427.         centerSplitPane.setBorder(BorderFactory.createEmptyBorder());
  428.         removeSplitPaneBorder();
  429.  
  430.         this.add(centerSplitPane, BorderLayout.CENTER);
  431.        
  432.         //
  433.         mFrom.setText(Msg.getMsg(Env.getCtx(), "ItemMove"));
  434.         mFrom.setActionCommand((String)TransferHandler.getCutAction().
  435.                  getValue(Action.NAME));
  436.         mFrom.addActionListener(this);
  437.         mFrom.setAccelerator(
  438.                   KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
  439.         mTo.setText(Msg.getMsg(Env.getCtx(), "ItemInsert"));
  440.         mTo.setActionCommand((String)TransferHandler.getPasteAction().
  441.                  getValue(Action.NAME));
  442.         mTo.setAccelerator(
  443.                   KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));
  444.         mTo.setMnemonic(KeyEvent.VK_V);
  445.         mTo.addActionListener(this);
  446.        
  447.         mBarAdd.setText(Msg.getMsg(Env.getCtx(), "BarAdd"));
  448.         mBarAdd.setActionCommand("BarAdd");
  449.         mBarAdd.addActionListener(this);
  450.         mBarRemove.setText(Msg.getMsg(Env.getCtx(), "BarRemove"));
  451.         mBarRemove.setActionCommand("BarRemove");
  452.         mBarRemove.addActionListener(this);
  453.         //
  454.         popMenuTree.setLightWeightPopupEnabled(false);
  455.         popMenuTree.add(mBarAdd);
  456.         popMenuTree.add(mFrom);
  457.         if(!m_hasBar){
  458.         popMenuTree.addSeparator();
  459.         }
  460.         popMenuTree.add(mTo);
  461.         popMenuBar.setLightWeightPopupEnabled(false);
  462.         popMenuBar.add(mBarRemove);
  463.     }   //  jbInit
  464.  
  465.  
  466.     private void removeSplitPaneBorder() {
  467.         if (centerSplitPane != null) {
  468.             SplitPaneUI splitPaneUI = centerSplitPane.getUI();
  469.             if (splitPaneUI instanceof BasicSplitPaneUI) {
  470.                 BasicSplitPaneUI basicUI = (BasicSplitPaneUI) splitPaneUI;
  471.                 basicUI.getDivider().setBorder(BorderFactory.createEmptyBorder());
  472.             }
  473.         }
  474.     }
  475.    
  476.     /**
  477.      *  Set Divider Location
  478.      *  @param location location (80 default)
  479.      */
  480.     public void setDividerLocation(int location)
  481.     {
  482.         centerSplitPane.setDividerLocation(location);
  483.     }   //  setDividerLocation
  484.    
  485.     /**
  486.      *  Get Divider Location
  487.      *  @return divider location
  488.      */
  489.     public int getDividerLocation()
  490.     {
  491.         return centerSplitPane.getDividerLocation();
  492.     }   //  getDividerLocation
  493.    
  494.  
  495.     /**
  496.      *  Enter Key
  497.      *  @param e event
  498.      */
  499.     protected void keyPressed(KeyEvent e)
  500.     {
  501.  
  502.         //CHANGED - document search
  503.         if (e.getSource() == treeSearch && treeSearch.getText() != null
  504.                 && treeSearch.getText().length() > 0
  505.                 && treeSearch.getText().substring(0, 1).equals(PREFIX_DOCUMENT_SEARCH)) {
  506.             setBusy(true);
  507.             DocumentSearch search = new DocumentSearch();
  508.             if (search.openDocumentsByDocumentNo(treeSearch.getText().substring(1)))
  509.                 treeSearch.setText(null);
  510.             setBusy(false);
  511.             return;
  512.         }
  513.  
  514.         //  *** Tree ***
  515.         if (e.getSource() instanceof JTree
  516.             || (e.getSource() == treeSearch && e.getModifiers() != 0))  //  InputEvent.CTRL_MASK
  517.         {
  518.             TreePath tp = tree.getSelectionPath();
  519.             if (tp == null)
  520.                 ADialog.beep();
  521.             else
  522.             {
  523.                 MTreeNode tn = (MTreeNode)tp.getLastPathComponent();
  524.                 setSelectedNode(tn);
  525.             }
  526.         }
  527.  
  528.         //  *** treeSearch ***
  529.         else if (e.getSource() == treeSearch)
  530.         {
  531.             String search = treeSearch.getText();
  532.             boolean found = false;
  533.  
  534.             //  at the end - try from top
  535.             if (m_nodeEn != null && !m_nodeEn.hasMoreElements())
  536.                 m_search = "";
  537.  
  538.             //  this is the first time
  539.             if (!search.equals(m_search))
  540.             {
  541.                 //  get enumeration of all nodes
  542.                 m_nodeEn = m_root.preorderEnumeration();
  543.                 m_search = search;
  544.             }
  545.  
  546.             //  search the nodes
  547.             while(!found && m_nodeEn != null && m_nodeEn.hasMoreElements())
  548.             {
  549.                 MTreeNode nd = (MTreeNode)m_nodeEn.nextElement();
  550.                 //  compare in upper case
  551.                 if (nd.toString().toUpperCase().indexOf(search.toUpperCase()) != -1)
  552.                 {
  553.                     found = true;
  554.                     TreePath treePath = new TreePath(nd.getPath());
  555.                     tree.setSelectionPath(treePath);
  556.                     tree.makeVisible(treePath);         //  expand it
  557.                     tree.scrollPathToVisible(treePath);
  558.                 }
  559.             }
  560.             if (!found)
  561.                 ADialog.beep();
  562.         }   //  treeSearch
  563.  
  564.     }   //  keyPressed
  565.  
  566.  
  567.     /*************************************************************************/
  568.  
  569.     /**
  570.      *  Mouse clicked
  571.      *  @param e event
  572.      */
  573.     protected void mouseClicked(MouseEvent e)
  574.     {
  575.         //  *** JTree ***
  576.         if (e.getSource() instanceof JTree)
  577.         {
  578.             //  Left Double Click
  579.             if (SwingUtilities.isLeftMouseButton(e)
  580.                 && e.getClickCount() > 0)
  581.             {
  582.                 int selRow = tree.getRowForLocation(e.getX(), e.getY());
  583.                 if(selRow != -1)
  584.                 {
  585.                     MTreeNode tn = (MTreeNode)tree.getPathForLocation
  586.                         (e.getX(), e.getY()).getLastPathComponent();
  587.                     setSelectedNode(tn);
  588.                 }
  589.             }
  590.  
  591.             //  Right Click for PopUp
  592.             else if ((m_editable || m_hasBar)
  593.                 && SwingUtilities.isRightMouseButton(e) )
  594.             {
  595.                 int selRow = tree.getRowForLocation(e.getX(), e.getY());
  596.                 if(selRow != -1)
  597.                 {
  598.                     tree.setSelectionRow(selRow);
  599.                 }
  600.                 if (tree.getSelectionPath() != null)         //  need select first
  601.                 {
  602.                     MTreeNode nd = (MTreeNode)tree.getSelectionPath().getLastPathComponent();
  603.                     if (nd.isLeaf())                    //  only add leaves to bar
  604.                         mBarAdd.setEnabled(true);
  605.                     else
  606.                         mBarAdd.setEnabled(false);
  607.                     Rectangle r = tree.getPathBounds(tree.getSelectionPath());
  608.                     popMenuTree.show(tree, (int)r.getMaxX(), (int)r.getY());
  609.                 }
  610.             }
  611.         }   //  JTree
  612.  
  613.         //  *** JButton ***
  614.         else if (e.getSource() instanceof JButton)
  615.         {
  616.             if (SwingUtilities.isRightMouseButton(e))
  617.             {
  618.                 m_buttonSelected = (CButton)e.getSource();
  619.                 popMenuBar.show(m_buttonSelected, e.getX(), e.getY());
  620.             }
  621.         }   //  JButton
  622.  
  623.     }   //  mouseClicked
  624.  
  625.  
  626.     /**
  627.      *  Get currently selected node
  628.      *  @return MTreeNode
  629.      */
  630.     public MTreeNode getSelectedNode()
  631.     {
  632.         return m_selectedNode;
  633.     }   //  getSelectedNode
  634.  
  635.     /**
  636.      *  Search Field
  637.      *  @return Search Field
  638.      */
  639.     public JComponent getSearchField()
  640.     {
  641.         return treeSearch;
  642.     }   //  getSearchField
  643.  
  644.     /**
  645.      *  Set Selection to Node in Event
  646.      *  @param nodeID Node ID
  647.      *  @return true if selected
  648.      */
  649.     public boolean setSelectedNode (int nodeID)
  650.     {
  651.         log.config("ID=" + nodeID);
  652.         if (nodeID != -1)               //  new is -1
  653.             return selectID(nodeID, true);     //  show selection
  654.         return false;
  655.     }   //  setSelectedNode
  656.  
  657.     /**
  658.      *  Select ID in Tree
  659.      *  @param nodeID   Node ID
  660.      *  @param show scroll to node
  661.      *  @return true if selected
  662.      */
  663.     private boolean selectID (int nodeID, boolean show)
  664.     {
  665.         if (m_root == null)
  666.             return false;
  667.         log.config("NodeID=" + nodeID
  668.             + ", Show=" + show + ", root=" + m_root);
  669.         //  try to find the node
  670.         MTreeNode node = m_root.findNode (nodeID);
  671.         if (node != null)
  672.         {
  673.             TreePath treePath = new TreePath(node.getPath());
  674.             log.config("Node=" + node
  675.                 + ", Path=" + treePath.toString());
  676.             tree.setSelectionPath(treePath);
  677.             if (show)
  678.             {
  679.                 tree.makeVisible(treePath);         //  expand it
  680.                 tree.scrollPathToVisible(treePath);
  681.             }
  682.             return true;
  683.         }
  684.         log.info("Node not found; ID=" + nodeID);
  685.         return false;
  686.     }   //  selectID
  687.  
  688.  
  689.     /**
  690.      *  Set the selected node & initiate all listeners
  691.      *  @param nd node
  692.      */
  693.     private void setSelectedNode (MTreeNode nd)
  694.     {
  695.         log.config("Node = " + nd);
  696.         m_selectedNode = nd;
  697.         //
  698.         firePropertyChange(NODE_SELECTION, null, nd);
  699.     }   //  setSelectedNode
  700.  
  701.    
  702.     /**************************************************************************
  703.      *  Node Changed - synchronize Node
  704.      *
  705.      *  @param  save    true the node was saved (changed/added), false if the row was deleted
  706.      *  @param  keyID   the ID of the row changed
  707.      *  @param  name    name
  708.      *  @param  description description
  709.      *  @param  isSummary   summary node
  710.      *  @param  imageIndicator image indicator
  711.      */
  712.     public void nodeChanged (boolean save, int keyID,
  713.         String name, String description, boolean isSummary, String imageIndicator)
  714.     {
  715.         log.config("Save=" + save + ", KeyID=" + keyID
  716.             + ", Name=" + name + ", Description=" + description
  717.             + ", IsSummary=" + isSummary + ", ImageInd=" + imageIndicator
  718.             + ", root=" + m_root);
  719.         //  if ID==0=root - don't update it
  720.         if (keyID == 0)
  721.             return;
  722.            
  723.         //  try to find the node
  724.         MTreeNode node = m_root.findNode(keyID);
  725.  
  726.         //  Node not found and saved -> new
  727.         if (node == null && save)
  728.         {
  729.             node = new MTreeNode (keyID, 0, name, description,
  730.                 m_root.getNode_ID(), isSummary, imageIndicator, false, null);
  731.             m_root.add (node);
  732.         }
  733.  
  734.         //  Node found and saved -> change
  735.         else if (node != null && save)
  736.         {
  737.             node.setName (name);
  738.             node.setAllowsChildren(isSummary);
  739.         }
  740.  
  741.         //  Node found and not saved -> delete
  742.         else if (node != null && !save)
  743.         {
  744.             MTreeNode parent = (MTreeNode)node.getParent();
  745.             node.removeFromParent();
  746.             node = parent;  //  select Parent
  747.         }
  748.  
  749.         //  Error
  750.         else
  751.         {
  752.             log.log(Level.SEVERE, "Save=" + save + ", KeyID=" + keyID + ", Node=" + node);
  753.             node = null;
  754.         }
  755.  
  756.         //  Nothing to display
  757.         if (node == null)
  758.             return;
  759.  
  760.         //  (Re) Display Node
  761.         tree.updateUI();
  762.         TreePath treePath = new TreePath(node.getPath());
  763.         tree.setSelectionPath(treePath);
  764.         tree.makeVisible(treePath);         //  expand it
  765.         tree.scrollPathToVisible(treePath);
  766.     }   //  nodeChanged
  767.  
  768.  
  769.     /**************************************************************************
  770.      *  ActionListener
  771.      *  @param e event
  772.      */
  773.     public void actionPerformed(ActionEvent e)
  774.     {
  775.         //  bar button pressed
  776.         if (e.getSource() instanceof JButton)
  777.         {
  778.             //  Find Node - don't show
  779.             selectID(Integer.parseInt(e.getActionCommand()), false);
  780.             //  Select it
  781.             MTreeNode tn = (MTreeNode)tree.getSelectionPath().getLastPathComponent();
  782.             setSelectedNode(tn);
  783.         }
  784.  
  785.         //  popup menu commands
  786.         else if (e.getSource() instanceof JMenuItem)
  787.         {
  788.             String action = (String)e.getActionCommand();
  789.             Action a = tree.getActionMap().get(action);
  790.             if (a != null) {
  791.                 a.actionPerformed(new ActionEvent(tree,
  792.                                                   ActionEvent.ACTION_PERFORMED,
  793.                                                   null));
  794.             }
  795.             else if (action.equals("BarAdd"))
  796.                 barAdd();
  797.             else if (action.equals("BarRemove"))
  798.                 barRemove();
  799.         }
  800.  
  801.         else if (e.getSource() instanceof JCheckBox)
  802.         {
  803.             if (e.getActionCommand().equals("Expand"))
  804.                 expandTree();
  805.         }
  806.     }   //  actionPerformed
  807.  
  808.     /**
  809.      *  Add selected TreeNode to Bar
  810.      */
  811.     private void barAdd()
  812.     {
  813.         MTreeNode nd = (MTreeNode)tree.getSelectionPath().getLastPathComponent();
  814.         if (barDBupdate(true, nd.getNode_ID()))
  815.             addToBar(nd,getParentToolBar(nd), false);
  816.         else if (DBException.isUniqueContraintError(CLogger.retrieveException()))
  817.             ADialog.error(0, this, "BookmarkExist", null);
  818.     }   //  barAdd
  819.    
  820.     /**
  821.      * Returns the top level parent JToolBar for the given MTreenode. If the parent is not on
  822.      * the CPanel yet a new one is created and added.
  823.      * @param nd
  824.      * @return top level parent JToolBar for the given MTreenode
  825.      */
  826.     private JToolBar getParentToolBar(MTreeNode nd){
  827.         int topParentId = getTopParentId(nd);
  828.         JToolBar parent = toolbarMap.get(topParentId);
  829.         if(parent==null){
  830.             Enumeration<?> enTop =m_root.children();
  831.             while (enTop.hasMoreElements()) {
  832.                 MTreeNode ndTop = (MTreeNode)enTop.nextElement();
  833.                 if(ndTop.getNode_ID()==topParentId){
  834.                     log.fine("add new category: " + ndTop);
  835.                     parent = new JToolBar(JToolBar.VERTICAL);
  836.  
  837.                     toolbarMap.put(ndTop.getNode_ID(), parent);
  838.                     toolbar.add(parent);
  839.                     parent.setOpaque(false);
  840.                     parent.setFloatable(false);
  841.                     parent.setRollover(true);
  842.                     parent.setBorder(BorderFactory.createEmptyBorder());
  843.  
  844.                     JXTaskPane barPart = new JXTaskPane();
  845.                     //Begin - [FR 1953769]
  846.                     barPart.setUI(new AdempiereTaskPaneUI());
  847.                     barPart.getContentPane().setBackground(AdempierePLAF.getFormBackground());
  848.                     //End - [FR 1953769]
  849.                     barPart.setTitle(ndTop.toString().trim());
  850.                     barPart.setAnimated(true);
  851.                     barPart.setLayout(new BorderLayout());
  852.                     barPart.add(parent, BorderLayout.NORTH);
  853.  
  854.                     bar.add(barPart);
  855.                     return parent;
  856.                 }
  857.             }
  858.         } else {
  859.             log.fine("parent found: " + parent);
  860.         }
  861.         return parent;
  862.     }
  863.  
  864.     /**
  865.      * Returns the id of the top level parent of the given MTreenode
  866.      * @param nd
  867.      * @return
  868.      */
  869.     private int getTopParentId(MTreeNode nd) {
  870.         MTreeNode parent = (MTreeNode) nd.getParent();
  871.         if(parent!=null && parent.getNode_ID()!=0){
  872.             return getTopParentId(parent);
  873.         }
  874.         return nd.getNode_ID();
  875.     }
  876.  
  877.     /**
  878.      *  Add TreeNode to Bar
  879.      *  @param nd node
  880.      */
  881.     private void addToBar(MTreeNode nd, JToolBar currentToolBar, boolean isLabel)
  882.     {
  883.         //  Only first word of Label
  884.         String label = nd.toString().trim();
  885.     //  int space = label.indexOf(' ');
  886.     //  if (space != -1)
  887.     //      label = label.substring(0, space);
  888.  
  889.         if (!isLabel) {
  890.             CButton button = new CButton(label);
  891.             button.setOpaque(false);
  892.             button.setHorizontalAlignment(JButton.LEFT);
  893.             button.setMargin(new Insets(0, 0, 0, 0));
  894.             button.setIcon(nd.getIcon());
  895.             button.setRequestFocusEnabled(false);
  896.             button.setToolTipText(nd.getDescription());
  897.             button.setActionCommand(String.valueOf(nd.getNode_ID()));
  898.             button.addActionListener(this);
  899.             button.addMouseListener(mouseListener);
  900.             currentToolBar.add(button);
  901.         } else {
  902.             currentToolBar.add(new JLabel("<html><u><b>" +label+"</b></u></html>"));
  903.         }
  904.         bar.validate();
  905.         //if (centerSplitPane.getDividerLocation() == -1)
  906.         //  centerSplitPane.setDividerLocation(button.getPreferredSize().width);
  907.         bar.repaint();
  908.     }   //  addToBar
  909.  
  910.     /**
  911.      *  Remove from Bar
  912.      */
  913.     private void barRemove()
  914.     {
  915.         //the button in on a JToolBar which is on a CPanel
  916.         JToolBar parentBar = (JToolBar) m_buttonSelected.getParent();
  917.         Container parentPanel = null;
  918.         if(parentBar!=null){
  919.             parentPanel = parentBar.getParent();
  920.         }
  921.         for (JToolBar jt : toolbar) {
  922.             jt.remove(m_buttonSelected);
  923.         }
  924.  
  925.         if(parentPanel != null && parentBar.getComponentCount()==1){
  926.             //only label left
  927.             bar.remove(parentPanel);
  928.             //remove from toolBarMap..
  929.             toolbarMap.values().remove(parentBar);
  930.            
  931.         }
  932.         bar.validate();
  933.         bar.repaint();
  934.         barDBupdate(false, Integer.parseInt(m_buttonSelected.getActionCommand()));
  935.     }   //  barRemove
  936.  
  937.     /**
  938.      *  Make Bar add/remove persistent
  939.      *  @param add true if add - otherwise remove
  940.      *  @param Node_ID Node ID
  941.      *  @return true if updated
  942.      */
  943.     private boolean barDBupdate (boolean add, int Node_ID)
  944.     {
  945.         int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx());
  946.         int AD_Org_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Org_ID");
  947.         int AD_User_ID = Env.getContextAsInt(Env.getCtx(), "#AD_User_ID");
  948.         StringBuffer sql = new StringBuffer();
  949.         if (add)
  950.             sql.append("INSERT INTO AD_TreeBar "
  951.                 + "(AD_Tree_ID,AD_User_ID,Node_ID, "
  952.                 + "AD_Client_ID,AD_Org_ID, "
  953.                 + "IsActive,Created,CreatedBy,Updated,UpdatedBy)VALUES (")
  954.                 .append(m_AD_Tree_ID).append(",").append(AD_User_ID).append(",").append(Node_ID).append(",")
  955.                 .append(AD_Client_ID).append(",").append(AD_Org_ID).append(",")
  956.                 .append("'Y',SysDate,").append(AD_User_ID).append(",SysDate,").append(AD_User_ID).append(")");
  957.             //  if already exist, will result in ORA-00001: unique constraint (ADEMPIERE.AD_TREEBAR_KEY)
  958.         else
  959.             sql.append("DELETE AD_TreeBar WHERE AD_Tree_ID=").append(m_AD_Tree_ID)
  960.                 .append(" AND AD_User_ID=").append(AD_User_ID)
  961.                 .append(" AND Node_ID=").append(Node_ID);
  962.         int no = DB.executeUpdate(sql.toString(), false, null);
  963.         return no == 1;
  964.     }   //  barDBupdate
  965.  
  966.  
  967.     /**
  968.      *  Clicked on Expand All
  969.      */
  970.     private void expandTree()
  971.     {
  972.         if (treeExpand.isSelected())
  973.         {
  974.             for (int row = 0; row < tree.getRowCount(); row++)
  975.                 tree.expandRow(row);
  976.         }
  977.         else
  978.         {
  979. //          patch: 1654055 +jgubo Changed direction of collapsing the tree nodes
  980.             for (int row = tree.getRowCount(); row > 0; row--)
  981.                 tree.collapseRow(row);
  982.         }
  983.     }   //  expandTree
  984.  
  985.     @Override
  986.     public void paint(Graphics g) {
  987.         if (m_lookAndFeelChanged) {
  988.             m_lookAndFeelChanged = false;
  989.             if (m_hasBar) removeSplitPaneBorder();
  990.         }
  991.         super.paint(g);
  992.     }
  993.    
  994.     private void setMappings(JTree tree) {
  995.         ActionMap map = tree.getActionMap();
  996.         map.put(TransferHandler.getCutAction().getValue(Action.NAME),
  997.                 TransferHandler.getCutAction());
  998.         map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
  999.                 TransferHandler.getPasteAction());
  1000.     }
  1001.    
  1002.     //CHANGED - SET BUSY ADDED
  1003.     /**
  1004.      *  Indicate Busy
  1005.      *  @param busy busy
  1006.      */
  1007.     private void setBusy (boolean busy)
  1008.     {
  1009.         JFrame frame = Env.getFrame(this);
  1010.         log.info("frame: " + frame);
  1011.         if (frame == null)  //  during init
  1012.             return;
  1013.         if (busy)
  1014.         {
  1015.             this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  1016.             frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  1017.             treeSearch.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  1018.         }
  1019.         else
  1020.         {
  1021.             this.setCursor(Cursor.getDefaultCursor());
  1022.             frame.setCursor(Cursor.getDefaultCursor());
  1023.             treeSearch.setCursor(Cursor.getDefaultCursor());
  1024.         }
  1025.     }   //  set Busy
  1026.    
  1027. }   //  VTreePanel
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement