blob: 24ba0eda8d93a1b550f32f97bc0daa200d11429f [file] [log] [blame]
package net.sf.taverna.t2.workbench.views.results.workflow;
import static java.awt.Color.RED;
import java.awt.Component;
import java.nio.file.Path;
import java.util.Enumeration;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;
import uk.org.taverna.databundle.DataBundles;
/**
* @author alanrw
*/
@SuppressWarnings("serial")
public class PortResultCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component result = super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
renderPortResult(result, node, (Path) node.getUserObject());
}
return result;
}
private void renderPortResult(Component result,
DefaultMutableTreeNode node, Path path) {
String text = "";
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
if (path == null)
text = "Waiting for data";
else if (DataBundles.isList(path))
text = describeList(node, parent);
else {
int index = 1;
if (parent != null)
index += parent.getIndex(node);
text = "Value " + index;
}
((JLabel) result).setText(text);
if (containsError(node))
result.setForeground(RED);
}
private String describeList(DefaultMutableTreeNode node, TreeNode parent) {
if (node.getChildCount() == 0)
return "Empty list";
StringBuilder builder = new StringBuilder("List");
if (parent != null)
builder.append(" ").append(parent.getIndex(node) + 1);
int valueCount = node.getLeafCount();
builder.append(" with ").append(valueCount).append(" value");
if (valueCount != 1)
builder.append("s");
int sublistCount = getSublistCount(node);
if (sublistCount > 0) {
builder.append(" in ").append(sublistCount).append(" sublist");
if (sublistCount != 1)
builder.append("s");
}
return builder.toString();
}
public int getSublistCount(TreeNode node) {
int result = 0;
Enumeration<?> children = node.children();
while (children.hasMoreElements()) {
Object nextElement = children.nextElement();
if (nextElement instanceof TreeNode) {
TreeNode childNode = (TreeNode) nextElement;
if (childNode.getChildCount() != 0)
result++;
}
}
return result;
}
private static boolean containsError(TreeNode node) {
boolean result = false;
if (node instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode rtn = (DefaultMutableTreeNode) node;
Path reference = (Path) rtn.getUserObject();
if (reference != null && DataBundles.isError(reference))
result = true;
}
int childCount = node.getChildCount();
for (int i = 0; (i < childCount) && !result; i++)
result |= containsError(node.getChildAt(i));
return result;
}
}