// UML Model Transformation Tool (UMT)
// Copyright (C) 2003, 2004, 2005 SINTEF
// Authors: jon.oldevik at sintef.no | roy.gronmo at sintef.no | tor.neple at sintef.no | fredrik.vraalsen at sintef.no
// Webpage: http://umt.sourceforge.net
// Deloped in the projects: ACEGIS (EU project - IST-2002-37724),
// CAFE (EUREKA/ITEA - ip00004), FAMILIES (ITEA project ip02009)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either version 2.1
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
// 02111-1307 USA
package org.sintef.umt.umtmain;
/**
* @author Jon Oldevik, (jon.oldevik@sintef.no)
* @copyright (c) SINTEF 2002 (www.sintef.no)
*
*/
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.tree.*;
import org.sintef.umt.propertyeditor.PropertyManager;
import org.sintef.umt.transformer.XMLUtility;
import org.w3c.dom.*;
public class XmlTreeViewer extends JPanel
{
private PropertyManager _actionPropertyMgr;
private volatile boolean _isLoading, _indicator;
private int tmp_x, tmp_y;
private JTree _tree;
private XMLEditor _editor;
private OutputListener _listener;
public XmlTreeViewer (OutputListener listener)
{
super (new BorderLayout ());
_listener = listener;
initTree ();
_editor = new XMLEditor ();
add (_editor, BorderLayout.CENTER);
}
public void readXML (File xmlsource) {
try {
XMLUtility util = new XMLUtility (_listener);
Collection coll = util.readXML(new FileReader(xmlsource));
if (coll.size() > 0) {
setModelElements (coll);
Node docnode = (Node)(coll.iterator().next());
_editor.setStyledInput(docnode);
// util.doParseValidate(new FileReader(xmlsource));
}
} catch (Exception ex) {
System.out.println ("XmlTreeViewer::readXML - " + ex);
}
}
public Reader getReader () {
return _editor.getReader();
}
private void initTree () {
if (_tree != null) this.remove(_tree);
_tree = new JTree ();
_tree.setShowsRootHandles (true);
_tree.setRootVisible(false);
_tree.setModel (new XmlTreeModel ());
_tree.setCellRenderer(new XmlTreeCellRenderer ());
_tree.setPreferredSize(new Dimension (200,200));
add (_tree, BorderLayout.WEST);
ToolTipManager ttmanager = ToolTipManager.sharedInstance ();
ttmanager.registerComponent(_tree);
}
public void setModelElements (Collection modelelements)
{
initTree ();
Iterator elements = modelelements.iterator ();
Object root = _tree.getModel().getRoot();
while (elements.hasNext()){
Object obj = elements.next();
addModelElement (obj, (DefaultMutableTreeNode)root);
}
for (Enumeration children = ((DefaultMutableTreeNode)root).children();children.hasMoreElements();)
{
TreeNode child = (TreeNode)children.nextElement ();
TreeNode[] path = ((DefaultMutableTreeNode)child).getPath ();
_tree.makeVisible (new TreePath(path));
}
}
public void addModelElement (Object modelelement, DefaultMutableTreeNode treeparent){
Element e = (Element) modelelement;
NodeList children = e.getChildNodes ();
DefaultMutableTreeNode treechild = new DefaultMutableTreeNode (e);
treeparent.add (treechild);
for (int i = 0; i < children.getLength(); i++){
Node n = children.item(i);
if (n.getNodeType () == org.w3c.dom.Node.ELEMENT_NODE)
addModelElement (n, treechild);
}
}
private class XmlTreeModel extends DefaultTreeModel
{
public XmlTreeModel ()
{
super (new DefaultMutableTreeNode (null));
}
}
private class XmlTreeCellRenderer extends DefaultTreeCellRenderer
{
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus)
{
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
try {
Object userobj = ((DefaultMutableTreeNode)value).getUserObject ();
JLabel l = new JLabel (userobj.toString());
ToolTipManager ttmanager = ToolTipManager.sharedInstance ();
ttmanager.registerComponent(l);
if (userobj instanceof Element) {
Element elem = (Element)userobj;
l.setText(elem.getNodeName());
l.setToolTipText(l.getText());
Node attr;
NamedNodeMap attrs = elem.getAttributes();
for (int i = 0; i < attrs.getLength();i++) {
attr = attrs.item(i);
l.setText (l.getText() + " " + attr.getNodeName() + "='" + attr.getNodeValue() + "'");
l.setToolTipText(l.getToolTipText() + " " + attr.getNodeName() + "='" + attr.getNodeValue()+"'");
}
}
return l;
} catch (Exception ex) {
}
return c;
}
}
}