/*
* FigTreeApplet.java
*
* Copyright (C) 2006-2014 Andrew Rambaut
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package figtree.applet;
import jebl.evolution.trees.Tree;
import jebl.evolution.io.NewickImporter;
import jebl.evolution.io.ImportException;
import jam.controlpalettes.ControlPalette;
import jam.panels.SearchPanel;
import jam.panels.SearchPanelListener;
import jam.panels.StatusBar;
import figtree.application.FigTreeNexusImporter;
import figtree.treeviewer.*;
import figtree.panel.SimpleTreeViewer;
import figtree.panel.FigTreePanel;
import figtree.panel.SimpleControlPalette;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.net.URL;
import java.net.MalformedURLException;
/**
* @author Andrew Rambaut
* @author Alexei Drummond
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class FigTreeApplet extends JApplet {
private SimpleTreeViewer treeViewer;
private ControlPalette controlPalette1;
private ControlPalette controlPalette2;
private FigTreePanel figTreePanel;
private StatusBar statusBar;
private SearchPanel filterPanel;
private JPopupMenu filterPopup;
public void init() {
FigTreePanel.Style style = FigTreePanel.Style.DEFAULT;
String styleParam = getParameter("style");
if (styleParam != null) {
style = FigTreePanel.Style.valueOf(styleParam.trim().toUpperCase());
}
treeViewer = new SimpleTreeViewer();
controlPalette1 = new SimpleControlPalette();
controlPalette2 = new SimpleControlPalette();
figTreePanel = new FigTreePanel(treeViewer, controlPalette1, controlPalette2, style);
filterPopup = new JPopupMenu();
for (TreeViewer.TextSearchType searchType : TreeViewer.TextSearchType.values()) {
filterPopup.add(searchType.toString());
}
filterPanel = new SearchPanel("Filter", filterPopup, true);
filterPanel.setOpaque(false);
filterPanel.addSearchPanelListener(new SearchPanelListener() {
/**
* Called when the user requests a search by pressing return having
* typed a search string into the text field. If the continuousUpdate
* flag is true then this method is called when the user types into
* the text field.
*
* @param searchString the user's search string
*/
public void searchStarted(String searchString) {
int index = filterPopup.getSelectionModel().getSelectedIndex();
if (index == -1) index = 0;
TreeViewer.TextSearchType searchType = TreeViewer.TextSearchType.values()[index];
treeViewer.selectTaxa("!name", searchType, searchString, false);
}
/**
* Called when the user presses the cancel search button or presses
* escape while the search is in focus.
*/
public void searchStopped() {
treeViewer.clearSelectedTaxa();
}
});
statusBar = new StatusBar("");
statusBar.setStatusProvider(treeViewer);
statusBar.add(filterPanel, BorderLayout.EAST);
if (style != FigTreePanel.Style.ICARUS_SMALL) {
getContentPane().add(statusBar, BorderLayout.NORTH);
}
getContentPane().add(figTreePanel, BorderLayout.CENTER);
}
public void start() {
String tree = getParameter("tree");
String treefile = getParameter("treefile");
if (tree != null && tree.length() > 0) {
URL fileURL = null;
try {
fileURL = new URL(tree);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileURL.openStream()));
readData(bufferedReader, true);
} catch (MalformedURLException e) {
treeViewer.setStatusText(e.getMessage());
} catch (IOException e) {
treeViewer.setStatusText(e.getMessage());
}
} else if (treefile != null && treefile.length() > 0) {
try {
BufferedReader bufferedReader = new BufferedReader(new StringReader(treefile));
readData(bufferedReader, true);
} catch (IOException e) {
treeViewer.setStatusText(e.getMessage());
}
} else {
treeViewer.setStatusText("Tree not specified");
}
}
public void stop() {
}
protected boolean readData(Reader reader, boolean isNexus) throws IOException {
java.util.List<Tree> trees = new ArrayList<Tree>();
try {
Map<String, Object> settings = new HashMap<String, Object>();
// First of all, fully populate the settings map so that
// all the settings have defaults
controlPalette1.getSettings(settings);
controlPalette2.getSettings(settings);
if (isNexus) {
FigTreeNexusImporter importer = new FigTreeNexusImporter(reader);
while (importer.hasTree()) {
Tree tree = importer.importNextTree();
trees.add(tree);
}
// Try to find a figtree block and if found, parse the settings
while (true) {
try {
importer.findNextBlock();
if (importer.getNextBlockName().equalsIgnoreCase("FIGTREE")) {
importer.parseFigTreeBlock(settings);
}
} catch (EOFException ex) {
break;
}
}
} else {
NewickImporter importer = new NewickImporter(reader, true);
while (importer.hasTree()) {
Tree tree = importer.importNextTree();
trees.add(tree);
}
}
if (trees.size() == 0) {
throw new ImportException("This file contained no trees.");
}
treeViewer.setTrees(trees);
controlPalette1.setSettings(settings);
controlPalette2.setSettings(settings);
} catch (ImportException ie) {
JOptionPane.showMessageDialog(this, "Error reading tree file: " + ie,
"Import Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}