Mega Code Archive

 
Categories / Java / Swing Components
 

Disabled Node Tree Example

// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html //DisabledNodeTreeExample.java /* (swing1.1.1beta2) swing#1331 */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.awt.image.RGBImageFilter; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.border.TitledBorder; import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; /**  * @version 1.1 04/30/99  */ public class DisabledNodeTreeExample extends JFrame {   public DisabledNodeTreeExample() {     super("DisabledNode TreeExample");     String[] strs = { "swing", // 0         "plaf", // 1         "basic", // 2         "metal", // 3         "JTree", // 4         "plaf", // 5         "motif" }; // 6     DisabledNode[] nodes = new DisabledNode[strs.length];     for (int i = 0; i < strs.length; i++) {       nodes[i] = new DisabledNode(strs[i]);     }     nodes[0].add(nodes[1]);     nodes[1].add(nodes[2]);     nodes[1].add(nodes[3]);     nodes[0].add(nodes[4]);     nodes[0].add(nodes[5]);     nodes[5].add(nodes[6]);     nodes[3].setEnabled(false);     nodes[5].setEnabled(false);     final JTree tree = new JTree(nodes[0]) {       public boolean isPathEditable(TreePath path) {         DisabledNode node = (DisabledNode) path.getLastPathComponent();         if (node.isEnabled()) {           return isEditable();         } else {           return false;         }       }     };     DisabledRenderer renderer = new DisabledRenderer();     renderer.setDisabledLeafIcon(new DisabledLeafIcon());     renderer.setDisabledOpenIcon(new DisabledFolderIcon());     renderer.setDisabledClosedIcon(new DisabledFolderIcon());     tree.setCellRenderer(renderer);     tree.setEditable(true);     JScrollPane sp = new JScrollPane(tree);     ButtonPanel bp = new ButtonPanel(tree);     getContentPane().add(sp, BorderLayout.CENTER);     getContentPane().add(bp, BorderLayout.EAST);   }   class ButtonPanel extends JPanel {     JTree tree;     DefaultTreeModel model;     ButtonPanel(JTree tree) {       this.tree = tree;       model = (DefaultTreeModel) tree.getModel();       setLayout(new GridLayout(2, 1));       setBorder(new TitledBorder("Change Node"));       JButton enabledButton = new JButton("Enabled");       JButton disabledButton = new JButton("Disabled");       add(enabledButton);       add(disabledButton);       enabledButton.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           setNodeEnabled(true);         }       });       disabledButton.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           setNodeEnabled(false);         }       });     }     private void setNodeEnabled(boolean enabled) {       TreePath[] path = tree.getSelectionPaths();       if (path == null)         return;       DisabledNode node = null;       for (int i = 0; i < path.length; i++) {         node = (DisabledNode) path[i].getLastPathComponent();         //if (node.isRoot()) {         //  System.out.println("refused: root node");         //} else {         int beforeChildCount = node.getChildCount();         node.setEnabled(enabled);         int afterChildCount = node.getChildCount();         if (beforeChildCount == afterChildCount) {           model.nodeChanged(node);         } else {           model.reload();         }         //}       }     }   }   public static void main(String args[]) {          try {         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");     } catch (Exception evt) {}          DisabledNodeTreeExample frame = new DisabledNodeTreeExample();     frame.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     frame.setSize(300, 180);     frame.setVisible(true);   } } class DisabledRenderer extends DefaultTreeCellRenderer {   protected Icon disabledLeafIcon;   protected Icon disabledOpenIcon;   protected Icon disabledClosedIcon;   public DisabledRenderer() {     this(new GraydIcon(UIManager.getIcon("Tree.leafIcon")), new GraydIcon(         UIManager.getIcon("Tree.openIcon")), new GraydIcon(UIManager         .getIcon("Tree.closedIcon")));   }   public DisabledRenderer(Icon leafIcon, Icon openIcon, Icon closedIcon) {     setDisabledLeafIcon(leafIcon);     setDisabledOpenIcon(openIcon);     setDisabledClosedIcon(closedIcon);   }   public Component getTreeCellRendererComponent(JTree tree, Object value,       boolean sel, boolean expanded, boolean leaf, int row,       boolean hasFocus) {     String stringValue = tree.convertValueToText(value, sel, expanded,         leaf, row, hasFocus);     setText(stringValue);     if (sel) {       setForeground(getTextSelectionColor());     } else {       setForeground(getTextNonSelectionColor());     }     boolean treeIsEnabled = tree.isEnabled();     boolean nodeIsEnabled = ((DisabledNode) value).isEnabled();     boolean isEnabled = (treeIsEnabled && nodeIsEnabled);     setEnabled(isEnabled);     if (isEnabled) {       selected = sel;       if (leaf) {         setIcon(getLeafIcon());       } else if (expanded) {         setIcon(getOpenIcon());       } else {         setIcon(getClosedIcon());       }     } else {       selected = false;       if (leaf) {         if (nodeIsEnabled) {           setDisabledIcon(getLeafIcon());         } else {           setDisabledIcon(disabledLeafIcon);         }       } else if (expanded) {         if (nodeIsEnabled) {           setDisabledIcon(getOpenIcon());         } else {           setDisabledIcon(disabledOpenIcon);         }       } else {         if (nodeIsEnabled) {           setDisabledIcon(getClosedIcon());         } else {           setDisabledIcon(disabledClosedIcon);         }       }     }     return this;   }   public void setDisabledLeafIcon(Icon icon) {     disabledLeafIcon = icon;   }   public void setDisabledOpenIcon(Icon icon) {     disabledOpenIcon = icon;   }   public void setDisabledClosedIcon(Icon icon) {     disabledClosedIcon = icon;   } } class DisabledNode extends DefaultMutableTreeNode {   protected boolean enabled;   public DisabledNode() {     this(null, true, true);   }   public DisabledNode(Object userObject) {     this(userObject, true, true);   }   public DisabledNode(Object userObject, boolean allowsChildren) {     this(userObject, allowsChildren, true);   }   public DisabledNode(Object userObject, boolean allowsChildren,       boolean enabled) {     super(userObject, allowsChildren);     this.enabled = enabled;   }   public int getChildCount() {     if (enabled) {       return super.getChildCount();     } else {       return 0;     }   }   public boolean isLeaf() {     return (super.getChildCount() == 0);   }   public void setEnabled(boolean enabled) {     this.enabled = enabled;   }   public boolean isEnabled() {     return enabled;   } } class DisabledLeafIcon implements Icon {   int width = 16;   int height = 16;   int additionalHeight = 4;   public void paintIcon(Component c, Graphics g, int x, int y) {     int right = width - 1;     int bottom = height + 1;     g.setColor(c.getBackground());     g.fillRect(0, 0, width, getIconHeight());     // Draw frame     g.setColor(MetalLookAndFeel.getControlDisabled());     g.drawLine(2, 2, 2, bottom); // left     g.drawLine(2, 2, right - 4, 2); // top     g.drawLine(2, bottom, right - 1, bottom); // bottom     g.drawLine(right - 1, 8, right - 1, bottom); // right     g.drawLine(right - 6, 4, right - 2, 8); // slant 1     g.drawLine(right - 5, 3, right - 4, 3); // part of slant 2     g.drawLine(right - 3, 4, right - 3, 5); // part of slant 2     g.drawLine(right - 2, 6, right - 2, 7); // part of slant 2   }   public int getIconWidth() {     return width;   }   public int getIconHeight() {     return height + additionalHeight;   } } class DisabledFolderIcon implements Icon {   int width = 16;   int height = 16;   int additionalHeight = 2;   public void paintIcon(Component c, Graphics g, int x, int y) {     int right = width - 1;     int bottom = height - 2;     g.setColor(c.getBackground());     g.fillRect(0, 0, width, getIconHeight());     // Draw tab     g.setColor(MetalLookAndFeel.getControlDisabled());     g.drawLine(right - 5, 2, right, 2);     g.drawLine(right - 6, 3, right - 6, 4);     g.drawLine(right, 3, right, 4);     // Draw outline     g.setColor(MetalLookAndFeel.getControlDisabled());     g.drawLine(0, 5, 0, bottom); // left side     g.drawLine(1, 4, right - 7, 4); // first part of top     g.drawLine(right - 6, 5, right - 1, 5); // second part of top     g.drawLine(right, 4, right, bottom); // right side     g.drawLine(0, bottom, right, bottom); // bottom   }   public int getIconWidth() {     return width;   }   public int getIconHeight() {     return height + additionalHeight;   } } class GraydIcon implements Icon {   Icon icon;   Image image;   public GraydIcon(Icon icon) {     this.icon = icon;   }   public void paintIcon(Component c, Graphics g, int x, int y) {     if (image == null) {       Image orgImage = c.createImage(getIconWidth(), getIconHeight());       Graphics imageG = orgImage.getGraphics();       Color background = c.getBackground();       imageG.setColor(background);       imageG.fillRect(0, 0, getIconWidth(), getIconHeight());       icon.paintIcon(c, imageG, x, y);       ImageFilter colorfilter = new GrayFilter();       image = c.createImage(new FilteredImageSource(orgImage.getSource(),           colorfilter));     }     g.drawImage(image, x, y, null);   }   public int getIconWidth() {     return icon.getIconWidth();   }   public int getIconHeight() {     return icon.getIconHeight();   }   class GrayFilter extends RGBImageFilter {     public GrayFilter() {       // If I set ture, black is gone?!       //canFilterIndexColorModel = true;     }     public int filterRGB(int x, int y, int rgb) {       int r = (rgb & 0xff0000) >> 16;       int g = (rgb & 0x00ff00) >> 8;       int b = (rgb & 0x0000ff);       int iy = (int) (r + g + b) / 3;       iy = Math.min(255, iy);       return ((rgb & 0xff000000) | (iy << 16) | (iy << 8) | iy);     }   } }