package net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.properties.SessionProperties;
import net.sourceforge.squirrel_sql.client.resources.SquirrelResources;
import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.*;
import org.apache.commons.lang.StringUtils;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class ObjectTreeCellRenderer extends DefaultTreeCellRenderer
{
private ObjectTreeModel _model;
private ISession _session;
private JPanel _pnlFilterRootNodeRendererComponent;
private JLabel _filterHint;
GridBagConstraints _gbcLeft = new GridBagConstraints(0,0,1,1,1,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0);
GridBagConstraints _gbcRight = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0);
public ObjectTreeCellRenderer(ObjectTreeModel model, ISession session)
{
_model = model;
_session = session;
_session.getProperties().addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent evt)
{
onPropertyChanged(evt);
}
});
initFilter();
_pnlFilterRootNodeRendererComponent = new JPanel(new GridBagLayout());
}
private void onPropertyChanged(PropertyChangeEvent evt)
{
if(
SessionProperties.IPropertyNames.OBJECT_FILTER_INCLUDE.equals(evt.getPropertyName()) ||
SessionProperties.IPropertyNames.OBJECT_FILTER_EXCLUDE.equals(evt.getPropertyName())
)
{
initFilter();
}
}
private void initFilter()
{
String objectFilterInclude = _session.getProperties().getObjectFilterInclude();
String objectFilterExclude = _session.getProperties().getObjectFilterExclude();
String filterhint = "";
if(false == StringUtils.isEmpty(objectFilterInclude))
{
filterhint += "Inc:" + objectFilterInclude;
}
if(false == StringUtils.isEmpty(objectFilterExclude))
{
if(0 == filterhint.length())
{
filterhint += "Exc:" + objectFilterExclude;
}
else
{
filterhint += "; Exc:" + objectFilterExclude;
}
}
if(0 < filterhint.length())
{
_filterHint = new JLabel(filterhint);
final SquirrelResources rsrc = _session.getApplication().getResources();
final ImageIcon icon = rsrc.getIcon(SquirrelResources.IImageNames.FILTER);
_filterHint.setIcon(icon);
}
else
{
_filterHint = null;
}
_model.nodeChanged(_model.getRootObjectTreeNode());
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)
{
JLabel ret = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
if(null != _filterHint && _model.isRootNode(value))
{
_pnlFilterRootNodeRendererComponent.removeAll();
_pnlFilterRootNodeRendererComponent.setBackground(new Color(255,204,204));
_pnlFilterRootNodeRendererComponent.add(ret, _gbcLeft);
_pnlFilterRootNodeRendererComponent.add(ret);
_pnlFilterRootNodeRendererComponent.add(_filterHint, _gbcRight);
_pnlFilterRootNodeRendererComponent.add(_filterHint);
return _pnlFilterRootNodeRendererComponent;
}
else
{
if(value instanceof ObjectTreeNode)
{
ObjectTreeNode otn = (ObjectTreeNode) value;
if (null != otn.getIcon())
{
ret.setIcon(otn.getIcon());
}
else
{
setDefaultIcon(expanded, leaf, ret);
}
}
else
{
setDefaultIcon(expanded, leaf, ret);
}
return ret;
}
}
private void setDefaultIcon(boolean expanded, boolean leaf, JLabel lbl)
{
if (leaf)
{
lbl.setIcon(getLeafIcon());
}
else if (expanded)
{
lbl.setIcon(getDefaultOpenIcon());
}
else
{
lbl.setIcon(getDefaultClosedIcon());
}
}
}