// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
//DisabledNodeTreeExample2.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.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
/**
* @version 1.0 04/30/99
*/
public class DisabledNodeTreeExample2 extends JFrame {
public DisabledNodeTreeExample2() {
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();
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) {}
DisabledNodeTreeExample2 frame = new DisabledNodeTreeExample2();
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 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);
}
}
}