/*
* Copyright 2011 Uwe Krueger.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mandelsoft.swing;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.JTree;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
/**
*
* @author Uwe Krüger
*/
public class IJTree extends JTree {
public IJTree(TreeModel newModel)
{
super(newModel);
_setupIJTree();
}
public IJTree(TreeNode root, boolean asksAllowsChildren)
{
super(root, asksAllowsChildren);
_setupIJTree();
}
public IJTree(TreeNode root)
{
super(root);
_setupIJTree();
}
public IJTree(Hashtable<?, ?> value)
{
super(value);
_setupIJTree();
}
public IJTree(Vector<?> value)
{
super(value);
_setupIJTree();
}
public IJTree(Object[] value)
{
super(value);
_setupIJTree();
}
public IJTree()
{
_setupIJTree();
}
private void _setupIJTree()
{
addPropertyChangeListener("ancestor",new ComponentPropertyListener());
}
private TreeModel origModel;
protected void componentBound()
{
if (origModel!=null && treeModel==null) {
treeModel=origModel;
if (treeModelListener!=null)
treeModel.addTreeModelListener(treeModelListener);
if (accessibleContext!=null)
treeModel.addTreeModelListener((TreeModelListener)accessibleContext);
origModel=null;
}
}
protected void componentUnbound()
{
//System.out.println("----- unbound");
origModel=treeModel;
treeModel=null;
if (origModel!=null) {
if (treeModelListener!=null)
origModel.removeTreeModelListener(treeModelListener);
if (accessibleContext!=null)
treeModel.removeTreeModelListener((TreeModelListener)accessibleContext);
}
}
private class ComponentPropertyListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt)
{
if (evt.getNewValue()==null) {
componentUnbound();
}
else {
componentBound();
}
}
}
/////////////////////////////////////////////////////////////////////
// extended model
/////////////////////////////////////////////////////////////////////
@Override
public ITreeModel getModel()
{
return (ITreeModel)super.getModel();
}
@Override
public void setModel(TreeModel newModel)
{
setModel((ITreeModel)newModel);
}
public void setModel(ITreeModel newModel)
{
super.setModel(newModel);
}
@Override
public String convertValueToText(Object value, boolean selected,
boolean expanded, boolean leaf, int row,
boolean hasFocus)
{
ITreeModel m=(ITreeModel)getModel();
if (m==null) return "";
return m.convertValueToText(value, selected, expanded, leaf, row,
hasFocus);
}
@Override
public boolean isPathEditable(TreePath path)
{
return ((ITreeModel)getModel()).isPathEditable(path);
}
/////////////////////////////////////////////////////////////////////
// default model
/////////////////////////////////////////////////////////////////////
public static class DefaultModel extends DefaultTreeModel
implements ITreeModel {
private boolean modifiable=false;
public DefaultModel(TreeNode root, boolean asksAllowsChildren)
{
super(root, asksAllowsChildren);
}
public DefaultModel(TreeNode root)
{
super(root);
}
public boolean isModifiable()
{
return modifiable;
}
public void setModifiable(boolean modifiable)
{
this.modifiable=modifiable;
}
public String convertValueToText(Object value, boolean selected,
boolean expanded, boolean leaf, int row,
boolean hasFocus)
{
return value.toString();
}
public boolean isPathEditable(TreePath path)
{
return isModifiable();
}
}
}