/* * Copyright (C) 2007 SQL Explorer Development Team * http://sourceforge.net/projects/eclipsesql * * 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 library 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 library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.sqlexplorer.preview; import java.io.StringReader; import java.util.List; import net.sourceforge.sqlexplorer.ExplorerException; import net.sourceforge.sqlexplorer.dataset.XmlDataType; import org.dom4j.Attribute; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; /** * Previewer for XmlDataType objects * * @author John Spackman */ public class XmlPreviewer implements Previewer { public void createControls(Composite parent, final Object data) throws ExplorerException { Element rootElem = getXml(data); if (rootElem == null) return; final Object[] root = new Object[] { rootElem }; TreeViewer tree = new TreeViewer(parent, SWT.SINGLE); tree.setContentProvider(new ITreeContentProvider() { public void dispose() { } /** * Called to get the top level items */ public Object[] getChildren(Object parentElement) { return root; } /** * Called to get the item's children */ public Object[] getElements(Object inputElement) { Element elem = (Element)inputElement; return elem.elements().toArray(); } public boolean hasChildren(Object element) { Element elem = (Element)element; List<Element> list = elem.elements(); return list != null && list.size() > 0; } public Object getParent(Object element) { Element elem = (Element)element; return elem.getParent(); } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // Nothing } }); tree.setLabelProvider(new LabelProvider() { public String getText(Object obj) { Element elem = (Element)obj; StringBuffer result = new StringBuffer(); result.append('<'); result.append(elem.getName()); for (Attribute attr : elem.attributes()) { result.append(' ').append(attr.getName()).append('=').append('\"').append(attr.getValue()).append('\"'); } if (!elem.hasContent()) result.append('/'); result.append('>'); return result.toString(); } }); tree.expandToLevel(1); } public void dispose() { } private Element getXml(Object data) throws ExplorerException { try { if (data == null) return null; if (data instanceof XmlDataType) return ((XmlDataType)data).getRootElement(); String text = data.toString(); if (text == null) return null; SAXReader reader = new SAXReader(); return reader.read(new StringReader(text)).getRootElement(); }catch(DocumentException e) { throw new ExplorerException(e); } } /** * Registers this previewer type with the factory */ public static void register() { PreviewerFactory.getInstance().registerClass(new PreviewerFactory.Resolver() { /* (non-JavaDoc) * @see net.sourceforge.sqlexplorer.preview.PreviewerFactory.Resolver#canAcceptMimeType(java.lang.String) */ public boolean canAcceptMimeType(String mimeType) { return mimeType.equals("text/xml"); } /* (non-JavaDoc) * @see net.sourceforge.sqlexplorer.preview.PreviewerFactory.Resolver#canAcceptObject(java.lang.Object) */ public boolean canAcceptObject(Object data) { return data instanceof XmlDataType; } /* (non-JavaDoc) * @see net.sourceforge.sqlexplorer.preview.PreviewerFactory.Resolver#getPreviewerClass() */ public Class<? extends Previewer> getPreviewerClass() { return XmlPreviewer.class; } }); } }