/*
All programs in this directory and subdirectories are published under the
GNU General Public License as described below.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc., 59
Temple Place, Suite 330, Boston, MA 02111-1307 USA
Further information about the GNU GPL is available at:
http://www.gnu.org/copyleft/gpl.ja.html
*/
package net.sf.jabref.groups;
import java.awt.*;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.Globals;
import net.sf.jabref.Util;
/**
* Renders a GroupTreeNode using its group's getName() method, rather that its
* toString() method.
*
* @author jzieren
*/
public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
public static final int MAX_DISPLAYED_LETTERS = 35;
/** The cell over which the user is currently dragging */
protected Object highlight1Cell = null;
protected Object[] highlight2Cells = null;
protected Object[] highlight3Cells = null;
protected Object highlightBorderCell = null;
public static ImageIcon
groupRefiningIcon = GUIGlobals.getImage("groupRefining"),
groupIncludingIcon = GUIGlobals.getImage("groupIncluding"),
groupRegularIcon = null;
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
if (value == highlight1Cell)
selected = true; // show as selected
Component c = super.getTreeCellRendererComponent(tree, value, selected,
expanded, leaf, row, hasFocus);
// this is sometimes called from deep within somewhere, with a dummy
// value (probably for layout etc.), so we've got to check here!
if (!(value instanceof GroupTreeNode))
return c;
AbstractGroup group = ((GroupTreeNode) value).getGroup();
if (group == null || !(c instanceof JLabel))
return c; // sanity check
JLabel label = (JLabel) c;
if (highlightBorderCell != null && highlightBorderCell == value)
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
else
label.setBorder(BorderFactory.createEmptyBorder());
boolean italics = Globals.prefs.getBoolean("groupShowDynamic")
&& group.isDynamic();
boolean red = false;
if (highlight2Cells != null) {
for (int i = 0; i < highlight2Cells.length; ++i) {
if (highlight2Cells[i] == value) {
// label.setForeground(Color.RED);
red = true;
break;
}
}
}
boolean underline = false;
if (highlight3Cells != null) {
for (int i = 0; i < highlight3Cells.length; ++i) {
if (highlight3Cells[i] == value) {
underline = true;
break;
}
}
}
String name = group.getName();
if (name.length() > MAX_DISPLAYED_LETTERS)
name = name.substring(0, MAX_DISPLAYED_LETTERS-2)+"...";
StringBuffer sb = new StringBuffer();
sb.append("<html>");
if (red)
sb.append("<font color=\"#FF0000\">");
if (underline)
sb.append("<u>");
if (italics)
sb.append("<i>");
sb.append(Util.quoteForHTML(name));
if (italics)
sb.append("</i>");
if (underline)
sb.append("</u>");
if (red)
sb.append("</font>");
sb.append("</html>");
final String text = sb.toString();
if (!label.getText().equals(text))
label.setText(text);
label.setToolTipText("<html>" + group.getShortDescription() + "</html>");
if (Globals.prefs.getBoolean("groupShowIcons")) {
switch (group.getHierarchicalContext()) {
case AbstractGroup.REFINING:
if (label.getIcon() != groupRefiningIcon)
label.setIcon(groupRefiningIcon);
break;
case AbstractGroup.INCLUDING:
if (label.getIcon() != groupIncludingIcon)
label.setIcon(groupIncludingIcon);
break;
default:
if (label.getIcon() != groupRegularIcon)
label.setIcon(groupRegularIcon);
break;
}
} else {
label.setIcon(null);
}
return c;
}
/**
* For use when dragging: The sepcified cell is always rendered as selected.
*
* @param cell
* The cell over which the user is currently dragging.
*/
void setHighlight1Cell(Object cell) {
this.highlight1Cell = cell;
}
/**
* Highlights the specified cells (in red), or disables highlight if cells ==
* null.
*/
void setHighlight2Cells(Object[] cells) {
this.highlight2Cells = cells;
}
/**
* Highlights the specified cells (by unterlining), or disables highlight if
* cells == null.
*/
void setHighlight3Cells(Object[] cells) {
this.highlight3Cells = cells;
}
/**
* Highlights the specified cells (by drawing a border around it),
* or disables highlight if highlightBorderCell == null.
*/
void setHighlightBorderCell(Object highlightBorderCell) {
this.highlightBorderCell = highlightBorderCell;
}
}