package com.openMap1.mapper.views;
import java.util.ArrayList;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.openMap1.mapper.util.FileUtil;
import com.openMap1.mapper.util.XMLUtil;
/**
* Shows a tree-structured view of the XML instance
* being used to debug a mapping set.
* Highlights the current node.
*
* @author robert
*
*/
public class DebugInstanceView extends ViewPart {
private boolean tracing = false;
private TreeViewer viewer;
private ArrayList<Node> modelRoot = new ArrayList<Node>();
//---------------------------------------------------------------------------------------------
// constructor and initialisation
//---------------------------------------------------------------------------------------------
public DebugInstanceView() {
}
/**
* Callback to create the viewer and initialize it.
*/
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
// this column shows the tree , and gets its label provider from the viewer
TreeViewerColumn tv1 = new TreeViewerColumn(viewer,SWT.LEFT);
tv1.getColumn().setWidth(300);
tv1.getColumn().setText("Node Tree");
TreeViewerColumn tv2 = null;
tv2 = new TreeViewerColumn(viewer,SWT.LEFT);
tv2.getColumn().setWidth(300);
tv2.getColumn().setText("Value");
}
public void setXMLRoot(Element root)
{
trace("Set XML root");
modelRoot = new ArrayList<Node>();
modelRoot.add(root);
/* set up the viewer, and give it the root of the tree. */
setUpViewer();
viewer.setInput(modelRoot);
}
private void setUpViewer()
{
viewer.setContentProvider(new DebugInstanceViewContentProvider());
viewer.setLabelProvider(new DebugInstanceViewLabelProvider());
viewer.getTree().setHeaderVisible(true);
viewer.getTree().setLinesVisible(true);
}
/*
* The provider (= adapter) which adapts the model (in this case an EMF model)
* to the viewer (in this case a TreeViewer).
* There are two parts - a content provider which provides the tree structure
* and a label provider which provides the icons and text
*/
class DebugInstanceViewContentProvider implements IStructuredContentProvider,
ITreeContentProvider {
// called by viewer.setInput(Object) but need do nothing
public void inputChanged(Viewer v, Object oldInput, Object newInput)
{}
public void dispose() {trace("vanilla dispose");}
public Object[] getElements(Object parent) {
// the only child of modelroot is the root node
if (parent.equals(modelRoot)) {
return arrayOf(modelRoot);
}
// for all other objects use getChildren
return getChildren(parent);
}
/**
* child Nodes:
*/
public Object [] getChildren(Object parent) {
ArrayList<Node> result = new ArrayList<Node>();
if (parent instanceof Element)
{
Element el = (Element)parent;
NodeList nl = el.getChildNodes();
for (int i=0; i < nl.getLength();i++)
{
Node n = nl.item(i);
if (n instanceof Element) result.add(n);
}
NamedNodeMap attMap = el.getAttributes();
for (int ia= 0; ia < attMap.getLength(); ia++) result.add(attMap.item(ia));
}
// Attributes have no child nodes
return arrayOf(result);
}
/**
* get the parent object of any node in the tree.
*/
public Object getParent(Object child) {
Node parent = null;
if (child instanceof Node)
{
Node nd = (Node)child;
parent = nd.getParentNode();
}
return parent;
}
public boolean hasChildren(Object parent) {
return(getChildren(parent).length > 0);
}
} // end of class ViewContentProvider
private Node[] arrayOf (ArrayList<Node> aList) {return (Node[])aList.toArray(new Node[aList.size()]);}
class DebugInstanceViewLabelProvider extends LabelProvider implements ITableLabelProvider{
public String getText(Object obj) {
if (obj instanceof Node)
return ((Node)obj).getNodeName();
return "not a Node";
}
public String getColumnText(Object obj, int columnIndex) {
switch(columnIndex){
case 0: return getText(obj);
case 1: {
if (obj instanceof Element)
return XMLUtil.getText((Element)obj);
else if (obj instanceof Attr)
return ((Attr)obj).getValue();
}
}
return ("");
}
public Image getColumnImage(Object obj, int columnIndex) {
switch(columnIndex){
case 0: return getImage(obj);
case 1: return null;
}
return null;
}
public Image getImage(Object obj) {
Image im = null;
// images for XML Elements and Attributes
if (obj instanceof Element)
{im = FileUtil.getImage("Element");}
else if (obj instanceof Attr)
{im = FileUtil.getImage("Attribute");}
return im;
}
}
/**
* Expand the tree to show a selected node
* @param nd
*/
public void showSelectedNode(Node nd)
{
if (nd != null)
{
trace("Showing node " + nd.getNodeName());
viewer.expandToLevel(nd, 1);
viewer.setSelection(new StructuredSelection(nd));
}
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
private void trace(String s) {if (tracing) System.out.println(s);}
}