/*
* XMLViewer.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST 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
* of the License, or (at your option) any later version.
*
* BEAST 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 BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.app.bfe;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
/**
* Package: XMLViewer
* Description:
* <p/>
* <p/>
* Created by
*
* @author Alexander V. Alekseyenko (alexander.alekseyenko@gmail.com)
* Date: Apr 14, 2009
* Time: 5:59:52 PM
*/
public class XMLViewer implements ActionListener, ListSelectionListener, TreeSelectionListener {
private JPanel panel;
private JTextField filenameField;
private JButton browseButton;
private JButton viewButton;
private JTree xmlTree;
private JButton expandButton;
private JButton contractButton;
private JList idElementList;
public JFrame getFrame() {
return frame;
}
private JFrame frame;
JFileChooser fc;
public XMLViewer() {
fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
browseButton.addActionListener(this);
viewButton.addActionListener(this);
expandButton.addActionListener(this);
contractButton.addActionListener(this);
xmlTree.setModel(new XMLTreeModel(""));
idElementList.addListSelectionListener(this);
xmlTree.addTreeSelectionListener(this);
}
public XMLViewer(boolean standalone) {
/* setup file browser */
//super();
fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
browseButton.addActionListener(this);
viewButton.addActionListener(this);
expandButton.addActionListener(this);
contractButton.addActionListener(this);
xmlTree.setModel(new XMLTreeModel(""));
idElementList.addListSelectionListener(this);
xmlTree.addTreeSelectionListener(this);
if (standalone) {
frame = new JFrame("XML Structure Viewer");
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
protected void view(String filename) {
xmlTree.setModel(new XMLTreeModel(filename));
idElementList.setModel(((XMLTreeModel) xmlTree.getModel()).getXmlModel());
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == browseButton) {
int returnVal = fc.showOpenDialog(this.panel);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String z = null;
try {
z = file.getCanonicalPath();
filenameField.setText(z);
view(filenameField.getText());
} catch (IOException fe) {
System.err.println("something went wrong with: " + z);
}
}
} else if (e.getSource() == viewButton) {
view(filenameField.getText());
} else if (e.getSource() == expandButton) {
for (int i = 0; i < xmlTree.getRowCount(); i++) {
xmlTree.expandRow(i);
}
} else if (e.getSource() == contractButton) {
for (int i = xmlTree.getRowCount(); i > 0; i--) {
xmlTree.collapseRow(i);
}
}
}
public void valueChanged(ListSelectionEvent e) {
if (e.getSource() == idElementList && !e.getValueIsAdjusting()) {
int index = idElementList.getSelectedIndex();
if (index >= 0) {
String selectedID = (String) idElementList.getModel().getElementAt(index);
System.err.println("Element with id: " + selectedID + " selected");
//TODO: add code to highlight the elements refering to this id in the XMLTree
highlightID(selectedID);
}
}
}
public void highlightID(String id) {
xmlTree.clearSelection();
if (id == null || id.equals("")) {
return;
}
for (int i = xmlTree.getRowCount(); i > 0; i--) {
xmlTree.collapseRow(i);
}
TreePath rootPath = xmlTree.getPathForRow(0);
highlightID(id, rootPath);
}
public void highlightID(String id, TreePath node) {
if (((XMLTreeModel.ElementObject) node.getLastPathComponent()).getId().equals(id)) {
xmlTree.expandPath(node);
xmlTree.addSelectionPath(node);
} else {
XMLTreeModel.ElementObject parent = (XMLTreeModel.ElementObject) node.getLastPathComponent();
for (XMLTreeModel.ElementObject child : parent.getChildren()) {
highlightID(id, node.pathByAddingChild(child));
}
}
}
public void valueChanged(TreeSelectionEvent e) {
idElementList.clearSelection();
}
public JList getIdElementList() {
return idElementList;
}
public static void main(String[] args) {
XMLViewer z = new XMLViewer(true);
}
}