package jadex.commons.gui;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.util.Vector;
import java.awt.*;
import javax.swing.tree.*;
import java.util.Enumeration;
public class TreeCombo extends JComboBox {
static final int OFFSET = 16;
public TreeCombo(JTree tree) {
super();
setModel(new TreeToListModel(tree));
setRenderer(new ListEntryRenderer(tree));
}
class TreeToListModel extends AbstractListModel implements
ComboBoxModel,TreeModelListener {
TreeModel source;
boolean invalid = true;
Object currentValue;
Vector cache = new Vector();
public TreeToListModel(JTree tree) {
source = tree.getModel();
source.addTreeModelListener(this);
setRenderer(new ListEntryRenderer(tree));
}
public void setSelectedItem(Object anObject) {
if ( (currentValue != null && !currentValue.equals( anObject )) ||
currentValue == null && anObject != null ) {
currentValue = anObject;
Enumeration en = cache.elements();
while(en.hasMoreElements()) {
ListEntry le = (ListEntry)en.nextElement();
if(le.object().equals(anObject)) {
currentValue = le;
break;
}
}
}
fireContentsChanged(this, -1, -1);
}
public Object getSelectedItem() {
return currentValue;
}
public int getSize() {
validate();
return cache.size();
}
public Object getElementAt(int index) {
return cache.elementAt(index);
}
public void treeNodesChanged(TreeModelEvent e) {
invalid = true;
}
public void treeNodesInserted(TreeModelEvent e) {
invalid = true;
}
public void treeNodesRemoved(TreeModelEvent e) {
invalid = true;
}
public void treeStructureChanged(TreeModelEvent e) {
invalid = true;
}
void validate() {
if(invalid) {
cache = new Vector();
cacheTree(source.getRoot(),0);
if(cache.size() > 0)
currentValue = cache.elementAt(0);
invalid = false;
fireContentsChanged(this, 0, 0);
}
}
void cacheTree(Object anObject,int level) {
if(source.isLeaf(anObject))
addListEntry(anObject,level,false);
else {
int c = source.getChildCount(anObject);
int i;
Object child;
addListEntry(anObject,level,true);
level++;
for(i=0;i<c;i++) {
child = source.getChild(anObject,i);
cacheTree(child,level);
}
level--;
}
}
void addListEntry(Object anObject,int level,boolean isNode) {
cache.addElement(new ListEntry(anObject,level,isNode));
}
}
class ListEntry {
Object object;
int level;
boolean isNode;
public ListEntry(Object anObject,int aLevel,boolean isNode) {
object = anObject;
level = aLevel;
this.isNode = isNode;
}
public Object object() {
return object;
}
public int level() {
return level;
}
public boolean isNode() {
return isNode;
}
}
static Border emptyBorder = new EmptyBorder(0,0,0,0);
class ListEntryRenderer extends JLabel implements ListCellRenderer {
Icon leafIcon = (Icon)UIManager.get( "Tree.expandedIcon"
);//SwingSet.sharedInstance().loadImageIcon("images/document.gif","Document");
Icon nodeIcon = (Icon)UIManager.get( "Tree.collapsedIcon"
);//SwingSet.sharedInstance().loadImageIcon("images/folder.gif","Folder");
JTree tree;
public ListEntryRenderer(JTree tree) {
this.setOpaque(true);
this.tree = tree;
}
public Component getListCellRendererComponent(
JList listbox,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
JComponent ret;
ListEntry listEntry = (ListEntry)value;
if(listEntry != null) {
ret = (JComponent)tree.getCellRenderer().getTreeCellRendererComponent(tree, listEntry.object(), isSelected, true, !listEntry.isNode(), index, cellHasFocus);
Border border;
// setText(listEntry.object().toString());
// setIcon( listEntry.isNode() ? nodeIcon : leafIcon );
if(index != -1)
border = new EmptyBorder(0, OFFSET * listEntry.level(), 0, 0);
else
border = emptyBorder;
//
// if(UIManager.getLookAndFeel().getName().equals("CDE/Motif")) {
// if(index == -1 )
// this.setOpaque(false);
// else
// this.setOpaque(true);
// } else
// this.setOpaque(true);
//
ret.setBorder(border);
// if (isSelected) {
//
//this.setBackground(UIManager.getColor("ComboBox.selectionBackground"));
//
//this.setForeground(UIManager.getColor("ComboBox.selectionForeground"));
// } else {
// this.setBackground(UIManager.getColor("ComboBox.background"));
// this.setForeground(UIManager.getColor("ComboBox.foreground"));
// }
} else {
setText("");
ret = this;
}
return ret;
}
}
// public static void main(String[] args)
// {
// SwingUtilities.invokeLater(new Runnable()
// {
// public void run()
// {
// TreeCombo tc = new TreeCombo(new TreeModel()
// {
// // a
// // +-b
// // | +-c
// // | | +-f
// // | +-d
// // +-e
// public void addTreeModelListener(TreeModelListener l)
// {
// // TODO Auto-generated method stub
//
// }
// public Object getChild(Object parent, int index)
// {
// Object ret = null;
// if(parent.equals("a") && index==0)
// {
// ret = "b";
// }
// else if(parent.equals("b") && index==0)
// {
// ret = "c";
// }
// else if(parent.equals("b") && index==1)
// {
// ret = "d";
// }
// else if(parent.equals("a") && index==1)
// {
// ret = "e";
// }
// else if(parent.equals("c") && index==0)
// {
// ret = "f";
// }
// return ret;
// }
// public int getChildCount(Object parent)
// {
// int ret = 0;
// if(parent.equals("a"))
// {
// ret = 2;
// }
// else if(parent.equals("b"))
// {
// ret = 2;
// }
// else if(parent.equals("c"))
// {
// ret = 1;
// }
// return ret;
// }
// public int getIndexOfChild(Object parent, Object child)
// {
// int ret = -1;
// if(parent.equals("a") && child.equals("b"))
// {
// ret = 0;
// }
// else if(parent.equals("b") && child.equals("c"))
// {
// ret = 0;
// }
// else if(parent.equals("b") && child.equals("d"))
// {
// ret = 1;
// }
// else if(parent.equals("a") && child.equals("e"))
// {
// ret = 1;
// }
// else if(parent.equals("c") && child.equals("f"))
// {
// ret = 0;
// }
// return ret;
// }
// public Object getRoot()
// {
// return "a";
// }
// public boolean isLeaf(Object node)
// {
// return node.equals("f") || node.equals("d") || node.equals("e");
// }
// public void removeTreeModelListener(TreeModelListener l)
// {
// // TODO Auto-generated method stub
//
// }
// public void valueForPathChanged(TreePath path,
// Object newValue)
// {
// // TODO Auto-generated method stub
//
// }
// });
//
// tc.setPreferredSize(new Dimension(300, tc.getPreferredSize().height));
//
// JFrame f = new JFrame("Tree Combo test");
// f.getContentPane().setLayout(new FlowLayout());
// f.getContentPane().add(tc, BorderLayout.CENTER);
// f.setSize(400, 300);
// f.setLocation(SGUI.calculateMiddlePosition(f));
// f.setVisible(true);
// }
// });
// }
}