package jdepend.client.report.ui;
import java.awt.Color;
import java.awt.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLJDependUtil {
public JComponent createResult(StringBuilder strResult) {
JTree tree = getTree(strResult);
return new JScrollPane(tree);
}
private JTree getTree(StringBuilder strResult) {
JTree tree = new JTree(getTreeModel(strResult));
// Steal the default icons from the default renderer...
DefaultTreeCellRenderer rend1 = new DefaultTreeCellRenderer();
IconAndTipRenderer rend2 = new IconAndTipRenderer(rend1.getOpenIcon(), rend1.getClosedIcon(),
rend1.getLeafIcon());
tree.setCellRenderer(rend2);
// TODO Auto-generated method stub
return tree;
}
private TreeModel getTreeModel(StringBuilder strResult) {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLIconTreeHandler handler = new XMLIconTreeHandler();
SAXParser saxParser;
ByteArrayInputStream stream = null;
try {
saxParser = factory.newSAXParser();
stream = new ByteArrayInputStream(strResult.toString().getBytes("UTF-8"));
saxParser.parse(stream, handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return new DefaultTreeModel(handler.getRoot());
}
public class XMLIconTreeHandler extends DefaultHandler {
private DefaultMutableTreeNode root, currentNode;
public DefaultMutableTreeNode getRoot() {
return root;
}
public void startElement(String namespaceURI, String lName, String qName, Attributes attrs) throws SAXException {
String eName = lName;
if ("".equals(eName))
eName = qName;
ITag t = new ITag(eName, attrs);
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(t);
if (currentNode == null) {
root = newNode;
} else {
currentNode.add(newNode);
}
currentNode = newNode;
}
public void endElement(String namespaceURI, String sName, String qName) throws SAXException {
currentNode = (DefaultMutableTreeNode) currentNode.getParent();
}
public void characters(char buf[], int offset, int len) throws SAXException {
String s = new String(buf, offset, len).trim();
((ITag) currentNode.getUserObject()).addData(s);
}
}
public class ITag implements IconAndTipCarrier {
private String name;
private String data;
private Map<String, String> attr = new LinkedHashMap();
private Icon icon;
private String tipText;
public ITag(String n, Attributes a) {
name = n;
for (int i = 0; i < a.getLength(); i++) {
String aname = a.getQName(i);
String value = a.getValue(i);
attr.put(aname, value);
if (aname.equals("icon")) {
tipText = value;
icon = new ImageIcon(value);
}
}
}
public String getName() {
return name;
}
public Map getAttributes() {
return attr;
}
public void setData(String d) {
data = d;
}
public String getData() {
return data;
}
public String getToolTipText() {
return tipText;
}
public Icon getIcon() {
return icon;
}
public void addData(String d) {
if (data == null) {
setData(d);
} else {
data += d;
}
}
public String getAttributesAsString() {
StringBuilder buf = new StringBuilder(256);
Iterator it = this.attr.keySet().iterator();
String key;
while (it.hasNext()) {
key = (String) it.next();
buf.append(" ");
buf.append(key);
buf.append("=\"");
buf.append(this.attr.get(key));
buf.append("\"");
}
return buf.toString();
}
public String toString() {
StringBuilder info = new StringBuilder(50);
info.append(name);
String a = getAttributesAsString();
if (a != null && a.length() != 0) {
info.append(": " + a);
}
if (data != null && data.length() != 0) {
info.append(" (" + data + ")");
}
return info.toString();
}
}
public interface IconAndTipCarrier {
public Icon getIcon();
public String getToolTipText();
}
public class IconAndTipRenderer extends JLabel implements TreeCellRenderer {
Color backColor = new Color(0xFF, 0xCC, 0xFF);
Icon openIcon, closedIcon, leafIcon;
String tipText = "";
public IconAndTipRenderer(Icon open, Icon closed, Icon leaf) {
openIcon = open;
closedIcon = closed;
leafIcon = leaf;
setBackground(backColor);
setForeground(Color.black);
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
setText(value.toString());
if (selected) {
setOpaque(true);
} else {
setOpaque(false);
}
IconAndTipCarrier itc = null;
if (value instanceof DefaultMutableTreeNode) {
Object uo = ((DefaultMutableTreeNode) value).getUserObject();
if (uo instanceof IconAndTipCarrier) {
itc = (IconAndTipCarrier) uo;
}
} else if (value instanceof IconAndTipCarrier) {
itc = (IconAndTipCarrier) value;
}
if ((itc != null) && (itc.getIcon() != null)) {
setIcon(itc.getIcon());
tipText = itc.getToolTipText();
} else {
tipText = " ";
if (expanded) {
setIcon(openIcon);
} else if (leaf) {
setIcon(leafIcon);
} else {
setIcon(closedIcon);
}
}
return this;
}
public String getToolTipText() {
return tipText;
}
}
}