package lazybones.gui.recordings;
import java.awt.Component;
import java.awt.Graphics;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.TreeCellRenderer;
import lazybones.LazyBones;
import org.hampelratte.svdrp.responses.highlevel.Recording;
import org.hampelratte.svdrp.responses.highlevel.TreeNode;
public class RecordingTreeRenderer extends JLabel implements TreeCellRenderer {
private final Icon iconNew;
private final Icon iconCut;
private final Icon iconBoth;
private final Icon iconClosed;
private final Icon iconOpened;
public RecordingTreeRenderer() {
iconNew = LazyBones.getInstance().getIcon("lazybones/new.png");
iconCut = LazyBones.getInstance().getIcon("lazybones/edit-cut.png");
List<Icon> combined = Arrays.asList(new Icon[] { iconNew, iconCut });
iconBoth = new CombinedIcon(combined, 2);
iconClosed = UIManager.getIcon("Tree.closedIcon");
iconOpened = UIManager.getIcon("Tree.openIcon");
setOpaque(true);
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
setIcon(value, expanded);
setColors(selected, row);
String title = covertToString(value);
setText(title);
setEnabled(tree.isEnabled());
return this;
}
private void setColors(boolean selected, int row) {
if (selected) {
setBackground(UIManager.getColor("Tree.selectionBackground"));
setForeground(UIManager.getColor("Tree.selectionForeground"));
} else {
setForeground(UIManager.getColor("Tree.textForeground"));
setBackground(UIManager.getColor("Tree.textBackground"));
}
}
private String covertToString(Object value) {
String title = "";
if (value != null) {
title = value.toString();
if (value instanceof TreeNode) {
title = ((TreeNode) value).getDisplayTitle();
if (value instanceof Recording) {
Recording recording = (Recording) value;
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());
title = "<html>" + df.format(recording.getStartTime().getTime()) + " - <b>" + title + "</b>";
if (recording.getShortText() != null && recording.getShortText().trim().length() > 0) {
title += " - " + recording.getShortText();
}
title += "</html>";
}
}
}
return title;
}
private void setIcon(Object value, boolean expanded) {
if (value instanceof Recording) {
Recording recording = (Recording) value;
setHorizontalTextPosition(JLabel.LEADING);
setIconTextGap(10);
if (recording.isNew()) {
if (recording.isCut()) {
setIcon(iconBoth);
setDisabledIcon(iconBoth);
} else {
setIcon(iconNew);
setDisabledIcon(iconNew);
}
} else if (recording.isCut()) {
setIcon(iconCut);
setDisabledIcon(iconCut);
} else {
setIcon(null);
setDisabledIcon(null);
}
} else {
setHorizontalTextPosition(JLabel.TRAILING);
setIconTextGap(5);
if (expanded) {
setIcon(iconOpened);
setDisabledIcon(iconOpened);
} else {
setIcon(iconClosed);
setDisabledIcon(iconClosed);
}
}
}
private class CombinedIcon implements Icon {
private List<Icon> icons = new ArrayList<Icon>();
private int hgap = 2;
public CombinedIcon(List<Icon> icons, int hgap) {
this.icons = icons;
this.hgap = hgap;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
for (int i = 0; i < icons.size(); i++) {
Icon icon = icons.get(i);
icon.paintIcon(c, g, x + (i * 16) + (i * hgap), y);
}
}
@Override
public int getIconWidth() {
return icons.size() * 16 + (icons.size() - 1) * hgap;
}
@Override
public int getIconHeight() {
return 16;
}
}
}