home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / inprise / JSAMPLES.Z / TreeCombo.java < prev    next >
Text File  |  1998-05-08  |  6KB  |  201 lines

  1. /*
  2.  * @(#)TreeCombo.java    1.3 98/01/31
  3.  * 
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  */
  20. import com.sun.java.swing.*;
  21. import com.sun.java.swing.border.*;
  22. import com.sun.java.swing.event.*;
  23. import com.sun.java.swing.plaf.basic.*;
  24. import java.util.Vector;
  25. import java.awt.*;
  26. import com.sun.java.swing.plaf.*;
  27. import com.sun.java.swing.tree.*;
  28.  
  29. public class TreeCombo extends JComboBox {
  30.     static final int OFFSET = 16;
  31.  
  32.     public TreeCombo(TreeModel aTreeModel) {
  33.         super();
  34.         setModel(new TreeToListModel(aTreeModel));
  35.         setRenderer(new ListEntryRenderer());
  36.     }
  37.  
  38.     class TreeToListModel extends AbstractListModel implements ComboBoxModel,TreeModelListener {
  39.         TreeModel source;
  40.         boolean invalid = true;
  41.         Object currentValue;
  42.         Vector cache = new Vector();
  43.  
  44.         public TreeToListModel(TreeModel aTreeModel) {
  45.             source = aTreeModel;
  46.             aTreeModel.addTreeModelListener(this);
  47.             setRenderer(new ListEntryRenderer());
  48.         }
  49.  
  50.         public void setSelectedItem(Object anObject) {
  51.             currentValue = anObject;
  52.             fireContentsChanged(this, -1, -1);
  53.         }
  54.  
  55.         public Object getSelectedItem() {
  56.             return currentValue;
  57.         }
  58.  
  59.         public int getSize() {
  60.             validate();
  61.             return cache.size();
  62.         }
  63.  
  64.         public Object getElementAt(int index) {
  65.             return cache.elementAt(index);
  66.         }
  67.  
  68.         public void treeNodesChanged(TreeModelEvent e) {
  69.             invalid = true;
  70.         }
  71.  
  72.         public void treeNodesInserted(TreeModelEvent e) {
  73.             invalid = true;
  74.         }
  75.  
  76.         public void treeNodesRemoved(TreeModelEvent e) {
  77.             invalid = true;
  78.         }
  79.  
  80.         public void treeStructureChanged(TreeModelEvent e) {
  81.             invalid = true;
  82.         }
  83.  
  84.         void validate() {
  85.             if(invalid) {
  86.                 cache = new Vector();
  87.                 cacheTree(source.getRoot(),0);
  88.                 if(cache.size() > 0)
  89.                     currentValue = cache.elementAt(0);
  90.                 invalid = false;             
  91.                 fireContentsChanged(this, 0, 0);
  92.             }
  93.         }
  94.  
  95.         void cacheTree(Object anObject,int level) {
  96.             if(source.isLeaf(anObject))
  97.                 addListEntry(anObject,level,false);
  98.             else {
  99.                 int c = source.getChildCount(anObject);
  100.                 int i;
  101.                 Object child;
  102.  
  103.                 addListEntry(anObject,level,true);
  104.                 level++;
  105.  
  106.                 for(i=0;i<c;i++) {
  107.                     child = source.getChild(anObject,i);
  108.                     cacheTree(child,level);
  109.                 }
  110.  
  111.                 level--;
  112.             }
  113.         }
  114.  
  115.         void addListEntry(Object anObject,int level,boolean isNode) {
  116.             cache.addElement(new ListEntry(anObject,level,isNode));
  117.         }
  118.     }
  119.  
  120.     class ListEntry {
  121.         Object object;
  122.         int    level;
  123.         boolean isNode;
  124.  
  125.         public ListEntry(Object anObject,int aLevel,boolean isNode) {
  126.             object = anObject;
  127.             level = aLevel;
  128.             this.isNode = isNode;
  129.         }
  130.  
  131.         public Object object() {
  132.             return object;
  133.         }
  134.  
  135.         public int level() {
  136.             return level;
  137.         }
  138.  
  139.         public boolean isNode() {
  140.             return isNode;
  141.         }
  142.     }
  143.  
  144.     static Border emptyBorder = new EmptyBorder(0,0,0,0);
  145.  
  146.     class ListEntryRenderer extends JLabel implements ListCellRenderer  {
  147.         ImageIcon leafIcon = SwingSet.sharedInstance().loadImageIcon("images/document.gif","Document");
  148.         ImageIcon nodeIcon = SwingSet.sharedInstance().loadImageIcon("images/folder.gif","Folder");
  149.  
  150.         public ListEntryRenderer() {
  151.             setOpaque(true);
  152.         }
  153.  
  154.         public Component getListCellRendererComponent(
  155.             JList listbox, 
  156.         Object value, 
  157.         int index,
  158.         boolean isSelected,
  159.         boolean cellHasFocus)
  160.     {
  161.             ListEntry listEntry = (ListEntry)value;
  162.             if(listEntry != null) {
  163.                 Border border;
  164.                 setText(listEntry.object().toString());
  165.         setIcon( listEntry.isNode() ? nodeIcon : leafIcon );
  166.                 if(index != -1)
  167.                     border = new EmptyBorder(0, OFFSET * listEntry.level(), 0, 0);
  168.                 else 
  169.                     border = emptyBorder;
  170.  
  171.                 if(UIManager.getLookAndFeel().getName().equals("CDE/Motif")) {
  172.                     if(index == -1 )
  173.                         setOpaque(false);
  174.                     else
  175.                         setOpaque(true);
  176.                 } else 
  177.                     setOpaque(true);
  178.                 
  179.         setBorder(border); 
  180.                 if (isSelected) {
  181.                     setBackground(UIManager.getColor("ComboBox.selectedBackground"));
  182.                     setForeground(UIManager.getColor("ComboBox.selectedForeground"));
  183.                 } else {
  184.                     setBackground(UIManager.getColor("ComboBox.background"));
  185.                     setForeground(UIManager.getColor("ComboBox.foreground"));
  186.                 }
  187.             } else {
  188.                 setText("");
  189.             }
  190.         return this;
  191.     }
  192.     }
  193. }
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.