package org.freeplane.plugin.workspace.components;
import java.awt.Color;
import java.awt.Component;
import java.awt.datatransfer.ClipboardOwner;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.freeplane.core.util.LogUtils;
import org.freeplane.plugin.workspace.dnd.DnDController;
import org.freeplane.plugin.workspace.dnd.IWorspaceClipboardOwner;
import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.nodes.AFolderNode;
public class WorkspaceNodeRenderer extends DefaultTreeCellRenderer {
private int highlightedRow = -1;
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Icon DEFAULT_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/text-x-preview.png"));
private static final Icon DEFAULT_FOLDER_CLOSED_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/folder-blue.png"));
private static final Icon DEFAULT_FOLDER_OPEN_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/folder-blue_open.png"));
public WorkspaceNodeRenderer() {
}
public Component getTreeCellRendererComponent(JTree tree, Object treeNode, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
if(treeNode != null && treeNode instanceof AWorkspaceTreeNode ) {
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
AWorkspaceTreeNode node = (AWorkspaceTreeNode) treeNode;
setNodeIcon(renderer, node);
setToolTip(renderer, node);
JLabel label = (JLabel) renderer.getTreeCellRendererComponent(tree, treeNode, sel, expanded, leaf, row, hasFocus);
if(row == this.highlightedRow) {
try {
label.setBorder(BorderFactory.createLineBorder(UIManager.getColor(borderSelectionColor), 1));
}
catch (Exception e) {
label.setBorder(BorderFactory.createLineBorder(label.getForeground(), 1));
}
}
label.setText(node.getName());
if(isCut(node)) {
//WORKSPACE - ToDo: make the item transparent (including the icon?)
int alpha = new Double(255 * 0.5).intValue();
label.setForeground(new Color(label.getForeground().getRed(), label.getForeground().getGreen(), label.getForeground().getBlue(), alpha));
}
return label;
}
return super.getTreeCellRendererComponent(tree, treeNode, sel, expanded, leaf, row, hasFocus);
}
private boolean isCut(AWorkspaceTreeNode node) {
ClipboardOwner owner = DnDController.getSystemClipboardController().getClipboardOwner();
if(owner != null && owner instanceof IWorspaceClipboardOwner) {
if(!((IWorspaceClipboardOwner) owner).getTransferable().isCopy() && ((IWorspaceClipboardOwner) owner).getTransferable().contains(node)) {
return true;
}
}
return false;
}
private void setToolTip(DefaultTreeCellRenderer renderer, AWorkspaceTreeNode node) {
if(node instanceof IFileSystemRepresentation) {
try {
renderer.setToolTipText(((IFileSystemRepresentation) node).getFile().getPath());
}
catch (Exception e) {
LogUtils.warn(e);
}
}
}
/**
* @param value
*/
protected void setNodeIcon(DefaultTreeCellRenderer renderer, AWorkspaceTreeNode wsNode) {
renderer.setOpenIcon(DEFAULT_FOLDER_OPEN_ICON);
renderer.setClosedIcon(DEFAULT_FOLDER_CLOSED_ICON);
if(wsNode.setIcons(renderer)) {
return;
}
if(!wsNode.isLeaf() || wsNode instanceof AFolderNode) {
renderer.setLeafIcon(DEFAULT_FOLDER_CLOSED_ICON);
}
else {
renderer.setLeafIcon(DEFAULT_ICON);
}
}
public void highlightRow(int row) {
this.highlightedRow = row;
}
}