/* * DSS - Digital Signature Services * * Copyright (C) 2013 European Commission, Directorate-General Internal Market and Services (DG MARKT), B-1049 Bruxelles/Brussel * * Developed by: 2013 ARHS Developments S.A. (rue Nicolas Bové 2B, L-1253 Luxembourg) http://www.arhs-developments.com * * This file is part of the "DSS - Digital Signature Services" project. * * "DSS - Digital Signature Services" 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. * * DSS 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 * "DSS - Digital Signature Services". If not, see <http://www.gnu.org/licenses/>. */ package eu.europa.ec.markt.dss.applet.component.model; import eu.europa.ec.markt.dss.DSSUtils; import org.w3c.dom.*; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import java.util.Vector; /** * TODO * <p/> * <p/> * DISCLAIMER: Project owner DG-MARKT. * * @author <a href="mailto:dgmarkt.Project-DSS@arhs-developments.com">ARHS Developments</a> * @version $Revision: 1016 $ - $Date: 2011-06-17 15:30:45 +0200 (Fri, 17 Jun 2011) $ */ public class XMLTreeModel implements TreeModel { public static class XMLTreeNode { private final Node element; public XMLTreeNode(Node element) { this.element = element; } public Node getElement() { return element; } public String toString() { final String text = getText(); final String nodeName = element.getNodeName(); if (DSSUtils.isNotBlank(text)) { return nodeName + ": " + text; } else { return nodeName; } } public String getText() { NodeList list = element.getChildNodes(); for (int i = 0; i < list.getLength(); i++) { if (list.item(i) instanceof Text) { return ((Text) list.item(i)).getTextContent(); } } return ""; } } private Element document; private Vector<TreeModelListener> listeners = new Vector<TreeModelListener>(); public Element getDocument() { return document; } public void setDocument(Element document) { this.document = document; final TreeModelEvent evt = new TreeModelEvent(this, new TreePath(getRoot())); for (TreeModelListener listener : listeners) { listener.treeStructureChanged(evt); } } public void addTreeModelListener(TreeModelListener listener) { if (!listeners.contains(listener)) { listeners.add(listener); } } public void removeTreeModelListener(TreeModelListener listener) { listeners.remove(listener); } public Object getChild(Object parent, int index) { if (parent instanceof XMLTreeNode) { final Vector<Node> elements = getChildElements(((XMLTreeNode) parent).getElement()); return new XMLTreeNode(elements.get(index)); } else { return null; } } public int getChildCount(Object parent) { if (parent instanceof XMLTreeNode) { final Vector<Node> elements = getChildElements(((XMLTreeNode) parent).getElement()); return elements.size(); } return 0; } public int getIndexOfChild(Object parent, Object child) { if (parent instanceof XMLTreeNode && child instanceof XMLTreeNode) { final Node pElement = ((XMLTreeNode) parent).getElement(); final Node cElement = ((XMLTreeNode) child).getElement(); if (cElement.getParentNode() != pElement) { return -1; } final Vector<Node> elements = getChildElements(pElement); return elements.indexOf(cElement); } return -1; } public Object getRoot() { if (document == null) { return null; } return new XMLTreeNode(document); } public boolean isLeaf(Object node) { if (node instanceof XMLTreeNode) { final Node element = ((XMLTreeNode) node).getElement(); final Vector<Node> elements = getChildElements(element); return elements.size() == 0; } else { return true; } } public void valueForPathChanged(TreePath path, Object newValue) { throw new UnsupportedOperationException(); } private Vector<Node> getChildElements(final Node node) { final Vector<Node> elements = new Vector<Node>(); final NamedNodeMap attributes = node.getAttributes(); if (attributes != null) { for (int i = 0; i < attributes.getLength(); i++) { elements.add(attributes.item(i)); } } final NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) { if (list.item(i).getNodeType() == Node.ELEMENT_NODE) { elements.add(list.item(i)); } } return elements; } }