package org.jabref.gui.groups; import java.awt.Color; import java.awt.Component; import java.util.ArrayList; import java.util.List; import java.util.Objects; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.border.Border; import javax.swing.tree.DefaultTreeCellRenderer; import org.jabref.model.groups.GroupTreeNode; /** * Renders a GroupTreeNode using its group's getName() method, rather that its toString() method. * * @author jzieren */ public class GroupTreeCellRenderer extends DefaultTreeCellRenderer { /** The cell over which the user is currently dragging */ private Object highlight1Cell; private List<GroupTreeNode> overlappingGroups = new ArrayList<>(); private List<GroupTreeNode> matchingGroups = new ArrayList<>(); private Object highlightBorderCell; @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean tmpHasFocus) { // show as selected selected = (Objects.equals(highlight1Cell, value)) || sel; Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, tmpHasFocus); // 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 GroupTreeNodeViewModel)) { return c; } if (!(c instanceof JLabel)) { return c; // sanity check } GroupTreeNodeViewModel viewModel = (GroupTreeNodeViewModel) value; JLabel label = (JLabel) c; Border border; if (Objects.equals(highlightBorderCell, value)) { border = BorderFactory.createLineBorder(Color.BLACK); } else { border = BorderFactory.createEmptyBorder(); } if (label.getBorder() != border) { label.setBorder(border); } Boolean red = printInRed(viewModel) && !selected; // do not print currently selected node in red Boolean underlined = printUnderlined(viewModel); StringBuilder sb = new StringBuilder(60); sb.append("<html>"); if (red) { sb.append("<font color=\"#FF0000\">"); } if (underlined) { sb.append("<u>"); } if (viewModel.printInItalics()) { sb.append("<i>"); } sb.append(viewModel.getName()); if (viewModel.printInItalics()) { sb.append("</i>"); } if (underlined) { sb.append("</u>"); } if (red) { sb.append("</font>"); } sb.append("</html>"); String text = sb.toString(); if (!label.getText().equals(text)) { label.setText(text); } label.setToolTipText(viewModel.getDescription()); return c; } private boolean printInRed(GroupTreeNodeViewModel viewModel) { if (viewModel.isAllEntriesGroup()) { // Do not print all entries group in red return false; } return overlappingGroups.contains(viewModel.getNode()); } private boolean printUnderlined(GroupTreeNodeViewModel viewModel) { if (viewModel.isAllEntriesGroup()) { // Do not underline all entries group return false; } return matchingGroups.contains(viewModel.getNode()); } /** * Highlights the specified cells (by drawing a border around it), or disables highlight if highlightBorderCell == * null. */ public void setHighlightBorderCell(Object highlightBorderCell) { this.highlightBorderCell = highlightBorderCell; } }