home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 39 / IOPROG_39.ISO / SOFT / sdkjava40.exe / data1.cab / fg_Samples / Samples / Scripting / orgtree / OrgTree.java < prev    next >
Encoding:
Java Source  |  2000-05-04  |  7.0 KB  |  231 lines

  1. /**
  2.  *  OrgTree.java
  3.  *
  4.  *      This component builds a tree control out of a list of employees
  5.  *      and their titles and managers.
  6.  *
  7.  *  (C) Copyright 1995 - 1999 Microsoft Corporation.  All rights reserved.
  8.  *
  9.  */
  10.  
  11. import java.awt.*;                  // standard java
  12. import java.applet.*;               // standard java
  13. import java.util.*;                 // standard java
  14. import com.ms.ui.*;                 // microsoft afc
  15. import com.ms.ui.event.*;
  16. import java.io.*;
  17.  
  18. public class OrgTree extends AwtUIApplet
  19. {
  20.     OrgTreeImpl inner;
  21.  
  22.     public OrgTree()
  23.     {
  24.     super(new OrgTreeImpl());   
  25.         
  26.         inner = (OrgTreeImpl) getUIApplet();
  27.     }
  28.  
  29.     public void addOrgTreeEventListener(OrgTreeEventListener l)
  30.     {
  31.         inner.addOrgTreeEventListener(l);     
  32.     }
  33.  
  34.     public void removeOrgTreeEventListener(OrgTreeEventListener l)
  35.     {
  36.         inner.removeOrgTreeEventListener(l);     
  37.     }
  38.  
  39.     public OrgTreeNode addEmployee( String empName,
  40.                                     String empTitle,
  41.                                     String empManager,
  42.                                     int dbRow)
  43.     {
  44.         return inner.addEmployee(empName, empTitle, empManager, dbRow);
  45.     }
  46.     public void removeEmployee(String empName){
  47.         inner.removeEmployee(empName);
  48.     }
  49. }
  50.  
  51. class OrgTreeImpl extends UIApplet implements IUIItemListener, Serializable
  52. {
  53.  
  54.     // base of the org chart
  55.     private UITree root;
  56.  
  57.     // listeners for node clicks
  58.     transient Vector listeners = new Vector();
  59.  
  60.     public void init() { 
  61.         
  62.         System.out.println("ENTERING INIT");
  63.         // initialize our node class
  64.         OrgTreeNode.oneTimeInit( getApplet() );
  65.         root = new UITree("Organization");
  66.         root.setExpanded(true);
  67.         setLayout(new UIBorderLayout());
  68.         setFont(new Font("Helvetica", 0, 12));
  69.         setSize(400,200);
  70.         root.addItemListener(this);
  71.         add(new UIScrollViewer(root), "center" );
  72.     }
  73.     // done once on applet init
  74.     public OrgTreeImpl()
  75.     {
  76.     }
  77.  
  78.  
  79.     public void itemStateChanged(UIItemEvent evt)
  80.     {
  81.         if ((evt.getStateChange() == UIItemEvent.SELECTED) && (evt.getItem() instanceof OrgTreeNode) )
  82.         {
  83.             System.out.println("Tree node selected" );
  84.             OrgTreeNode emp = (OrgTreeNode)evt.getItem();
  85.             String empName  = emp.getName();
  86.             String empTitle = emp.getTitle();
  87.             String empMgr   = (emp.getManagerNode() == null) ? null : emp.getManagerNode().getName();
  88.             int r           = emp.getRow();
  89.  
  90.             // get a picture of the listeners in an array
  91.             OrgTreeEventListener otl[];
  92.             synchronized(listeners)
  93.             {
  94.                 otl = new OrgTreeEventListener[listeners.size()];
  95.                 listeners.copyInto(otl);
  96.             }
  97.  
  98.             for (int i=0; i<otl.length; i++)
  99.             {
  100.                 System.out.println( "Sending employee "+empName );
  101.  
  102.                 // notify that an employee was selected
  103.                 otl[i].employeeSelected(empName, empTitle, empMgr, r);
  104.             }
  105.         }
  106.         
  107.     }
  108.  
  109.     /**
  110.      *  Adds a listener for org tree selection events
  111.      */
  112.     public void addOrgTreeEventListener(OrgTreeEventListener l)
  113.     {
  114.         System.out.println("Adding an event listener");
  115.         listeners.addElement(l);    
  116.     }
  117.  
  118.     /**
  119.      *  Removes a listener for org tree selection events
  120.      */
  121.     public void removeOrgTreeEventListener(OrgTreeEventListener l)
  122.     {
  123.         listeners.removeElement(l);
  124.     }
  125. /**
  126.  * Removes an employee from the list.
  127.  * 
  128.  * @param String empName - Employee to remove from the tree
  129.  */
  130.     public void removeEmployee(String empName){//tests root nodes
  131.         for (int i=0;i<root.getChildCount();i++)
  132.             if (root.getChild(i) instanceof OrgTreeNode)
  133.                 removeE(empName,(OrgTreeNode)root.getChild(i),root);
  134.         
  135.     }
  136. /**
  137.  * Recursive method to traverse the Org tree for the correct
  138.  * employee to remove
  139.  * 
  140.  * @param String name - Name of the employee to remove
  141.  * @param OrgTreeNode - Tree Node to begin traversing from.
  142.  */
  143.     void removeE(String name, OrgTreeNode o,UITree p){
  144.         if(o.getName().equals(name))
  145.             p.remove(o);        
  146.         else 
  147.             for (int j=0;j<o.getChildCount();j++)
  148.                 if (o.getChild(j) instanceof OrgTreeNode)
  149.                     removeE(name,(OrgTreeNode)o.getChild(j),o);
  150.     }
  151.     /** 
  152.      *  Adds an employee to the org tree
  153.      *  it first finds the employee's manager in the existing tree and then
  154.      *  adds the employee to the tree in the appropriate place.
  155.      */ 
  156.     public OrgTreeNode addEmployee( String empName,
  157.                                     String empTitle,
  158.                                     String empManager,
  159.                                     int dbRow)
  160.     {
  161.         // if the employee has a manager,
  162.         // look for them in the existing tree, also look for any
  163.         // employees in the existing tree with this employee as their
  164.         // manager
  165.  
  166.         System.out.println("Adding "+empName );
  167.  
  168.         // this will hold the parent (root or manager)
  169.         int         i;
  170.         int         c;
  171.         UIComponent   cmp;
  172.  
  173.         // create a node
  174.         OrgTreeNode emp = new OrgTreeNode(empName,empTitle,empManager,dbRow);
  175.  
  176.         // look for any employees which work for this employee &
  177.         // remove them from the root and add them to this one
  178.         // the only possible candidates are nodes on the root which have
  179.         // a manager. We don't synchronize this, but we should. 
  180.         c = root.getChildCount();
  181.  
  182.         // loop through all root components and put this mgr's team members in the node
  183.         for ( i = 0; i < c; i++ )
  184.         {
  185.             String mn;
  186.  
  187.             cmp = (UIComponent) root.getChild(i);
  188.  
  189.             // if we are this employee's manager, add them to our tree
  190.             if ((cmp instanceof OrgTreeNode) &&
  191.                 (mn = ((OrgTreeNode)cmp).getManagerName()) != null &&
  192.                 mn.equalsIgnoreCase( empName ))
  193.             {
  194.                 // remove this one, reduce our count and recalculate our total
  195.                 root.remove( cmp );
  196.                 i--;
  197.         // reset size of chile nodes after call remove()
  198.                 c=root.getChildCount();
  199.                 // add this component to our tree
  200.                 emp.add( cmp );
  201.                 emp.setManager(true);
  202.             }
  203.         }
  204.  
  205.         // look for our team and add us to it
  206.         c = root.getComponentCount();
  207.  
  208.         // loop through all root components and put us in the proper team
  209.         for ( i = 0; i < c; i++ )
  210.         {
  211.             cmp = (UIComponent) root.getComponent(i);
  212.  
  213.             // if we find our team, we're done
  214.             if ((cmp instanceof OrgTreeNode) &&
  215.                 ((OrgTreeNode)(cmp)).addTeamMember( emp ) )
  216.             {
  217.                 break;
  218.             }
  219.         }
  220.  
  221.         // if we didn't find a team, we're a root
  222.         if ( i == c )
  223.         {
  224.             root.add( emp );
  225.         }
  226.  
  227.         setValid(true);
  228.         return (emp);
  229.     }
  230. }
  231.