faster tree cell renderer construction

This commit is contained in:
2014-11-08 00:45:16 +01:00
parent c88b30997b
commit eaefcb286a
@@ -128,9 +128,12 @@ import java.awt.event.MouseEvent;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
@@ -163,6 +166,28 @@ public class TagTree extends JTree implements ActionListener {
public class TagTreeCellRenderer extends DefaultTreeCellRenderer { public class TagTreeCellRenderer extends DefaultTreeCellRenderer {
private Font plainFont;
private Font boldFont;
private Map<TreeNodeType, Icon> icons;
public TagTreeCellRenderer() {
setUI(new BasicLabelUI());
setOpaque(false);
//setBackground(Color.green);
setBackgroundNonSelectionColor(Color.white);
//setBackgroundSelectionColor(Color.ORANGE);
icons = new HashMap<>();
for (TreeNodeType treeNodeType : TreeNodeType.values()) {
if (treeNodeType != TreeNodeType.UNKNOWN && treeNodeType != TreeNodeType.SHOW_FRAME) {
String tagTypeStr = treeNodeType.toString().toLowerCase().replace("_", "");
icons.put(treeNodeType, View.getIcon(tagTypeStr + "16"));
}
}
}
@Override @Override
public Component getTreeCellRendererComponent( public Component getTreeCellRendererComponent(
JTree tree, JTree tree,
@@ -179,44 +204,34 @@ public class TagTree extends JTree implements ActionListener {
hasFocus); hasFocus);
TreeItem val = (TreeItem) value; TreeItem val = (TreeItem) value;
TreeNodeType type = getTreeNodeType(val); TreeNodeType type = getTreeNodeType(val);
if (type != null) {
if (type == TreeNodeType.FOLDER && expanded) { if (type == TreeNodeType.FOLDER && expanded) {
type = TreeNodeType.FOLDER_OPEN; type = TreeNodeType.FOLDER_OPEN;
}
String itemName = type.toString();
if (type == TreeNodeType.FOLDER || type == TreeNodeType.FOLDER_OPEN) {
if (val instanceof FolderItem) {
FolderItem si = (FolderItem) val;
if (!TagTreeRoot.FOLDER_ROOT.equals(si.getName())) {
itemName = "folder" + si.getName();
}
}
}
String tagTypeStr = itemName.toLowerCase().replace("_", "");
setIcon(View.getIcon(tagTypeStr + "16"));
} }
Font font = getFont(); if ((type == TreeNodeType.FOLDER || type == TreeNodeType.FOLDER_OPEN) && val instanceof FolderItem) {
boolean isModified = false; FolderItem si = (FolderItem) val;
if (val instanceof Tag) { if (!TagTreeRoot.FOLDER_ROOT.equals(si.getName())) {
Tag tag = (Tag) val; String itemName = "folder" + si.getName();
if (tag.isModified()) { setIcon(View.getIcon(itemName.toLowerCase() + "16"));
isModified = true;
} }
}
if (isModified) {
font = font.deriveFont(Font.BOLD);
} else { } else {
font = font.deriveFont(Font.PLAIN); setIcon(icons.get(type));
} }
setFont(font);
setUI(new BasicLabelUI()); boolean isModified = val instanceof Tag && ((Tag) val).isModified();
setOpaque(false); if (isModified) {
//setBackground(Color.green); if (boldFont == null) {
setBackgroundNonSelectionColor(Color.white); Font font = getFont();
//setBackgroundSelectionColor(Color.ORANGE); boldFont = font.deriveFont(Font.BOLD);
}
} else {
if (plainFont == null) {
Font font = getFont();
plainFont = font.deriveFont(Font.PLAIN);
}
}
setFont(isModified ? boldFont : plainFont);
return this; return this;
} }