home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / J A V A / Java Development Kit V1.2 / jdk12-win32(1).exe / data1.cab / demos / demo / jfc / SwingSet / TreeCombo.java < prev    next >
Encoding:
Java Source  |  1998-12-01  |  5.4 KB  |  195 lines

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