package com.compomics.util.protein_sequences_manager.gui.sequences_import.taxonomy; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.util.HashMap; import javax.swing.JOptionPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; /** * Taxonomy tree panel. * * @author Kenneth Verheggen */ public class TaxonomyTreePanel extends javax.swing.JPanel { /** * The query. */ private final UniprotTaxonomyProvider query; /** * Constructor. */ public TaxonomyTreePanel() { initComponents(); query = new UniprotTaxonomyProvider((DefaultTreeModel) taxonomyTree.getModel()); taxonomyTree.setExpandsSelectedPaths(true); } /** * Build the tree from a tab file. * * @param tabFile a taxonomy TabFile (as downloaded from UniProt) * @throws IOException if an IOException is thrown * @throws InterruptedException if an InterruptedException is thrown */ public void buildTreeFromTabFile(File tabFile) throws IOException, InterruptedException { // collapseAll(); taxonomyTree.setModel(query.getModelFromFile(tabFile)); expandAll(); } /** * Build the ree after search. * * @param taxonomyName the taxonomy term (ID or name) * @throws IOException if an IOException is thrown * @throws InterruptedException if an InterruptedException is thrown * @throws MalformedURLException if a MalformedURLException is thrown * @throws URISyntaxException if a URISyntaxException is thrown */ public void buildTreeAfterSearch(String taxonomyName) throws IOException, InterruptedException, MalformedURLException, URISyntaxException { // collapseAll(); String taxonomyID = query.getCachedTaxonomyID(taxonomyName); if (taxonomyID == null) { taxonomyID = taxonomyName; } try {//make this a swingworker? DefaultTreeModel modelAfterSearch = query.getModelAfterSearch(taxonomyID); taxonomyTree.setModel(modelAfterSearch); expandAll(); } catch (IllegalArgumentException e) { JOptionPane.showMessageDialog(this, e.getMessage(), "Query overflow", JOptionPane.WARNING_MESSAGE); } } /** * Build tree after click. * * @param taxonomyName the taxonomy term (ID or name) * @throws IOException if an IOException is thrown */ public void buildTreeAfterClick(String taxonomyName) throws IOException { String taxonomyID = (taxonomyName); if (taxonomyID == null) { taxonomyID = taxonomyName; } TreePath[] selectionPaths = taxonomyTree.getSelectionPaths(); taxonomyTree.setModel(query.getModelAfterClick(taxonomyID)); taxonomyTree.setSelectionPaths(selectionPaths); } /** * Returns the selected taxonomy map. * * @return the selected taxonomy map */ public HashMap<String, String> getSelectedTaxonomyMap() { HashMap<String, String> taxIDMap = new HashMap<String, String>(); if (taxonomyTree.getSelectionPaths().length > 0) { for (TreePath path : taxonomyTree.getSelectionPaths()) { String taxonomyName = ((DefaultMutableTreeNode) path.getLastPathComponent()).toString(); taxIDMap.put(query.getCachedTaxonomyID(taxonomyName), taxonomyName); } } return taxIDMap; } /** * Returns the taxonomy tree. * * @return the taxonomy tree */ public JTree getTaxonomyTree() { return taxonomyTree; } /** * Expands all found nodes in the taxonomy tree. */ public void expandAll() { for (int i = 0; i < taxonomyTree.getRowCount(); i++) { taxonomyTree.expandRow(i); } } /** * Collapses all found nodes in the taxonomy tree. */ public void collapseAll() { for (int i = 0; i < taxonomyTree.getRowCount(); i++) { taxonomyTree.collapseRow(i); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { taxonomyTreeScrollPane = new javax.swing.JScrollPane(); taxonomyTree = new javax.swing.JTree(); tfSearchField = new javax.swing.JTextField(); btnSearch = new javax.swing.JButton(); setBackground(new java.awt.Color(255, 255, 255)); taxonomyTreeScrollPane.setBorder(null); javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root"); javax.swing.tree.DefaultMutableTreeNode treeNode2 = new javax.swing.tree.DefaultMutableTreeNode("Eukaryota"); javax.swing.tree.DefaultMutableTreeNode treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Alveolata"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Amoebozoa"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Apusozoa"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Breviatea"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Centroheliozoa"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Cryptophyta"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("environmental samples"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Euglenozoa"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Fornicata"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Glaucocystophyceae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Haptophyceae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Heterolobosea"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Jakobida"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Katablepharidophyta"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Malawimonadidae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Opisthokonta"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Oxymonadida"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Parabasalia"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Rhizaria"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Rhodophyta"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Stramenopiles"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified eukaryotes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Viridiplantae"); treeNode2.add(treeNode3); treeNode1.add(treeNode2); treeNode2 = new javax.swing.tree.DefaultMutableTreeNode("Bacteria"); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Actinobacteria"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Aquificae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Armatimonadetes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Bacteroidetes/Chlorobi group"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Caldiserica"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Chlamydiae/Verrucomicrobia group"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Chloroflexi"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Chrysiogenetes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Cyanobacteria"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Deferribacteres"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Deinococcus-Thermus"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Dictyoglomi"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Elusimicrobia"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("environmental samples"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Fibrobacteres/Acidobacteria group"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Firmicutes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Fusobacteria"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Gemmatimonadetes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Nitrospinae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Nitrospirae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Planctomycetes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Proteobacteria"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Spirochaetes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Synergistetes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Tenericutes"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Thermodesulfobacteria"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Thermotogae"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified Bacteria"); treeNode2.add(treeNode3); treeNode1.add(treeNode2); treeNode2 = new javax.swing.tree.DefaultMutableTreeNode("Archaea"); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Aenigmarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Crenarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Diapherotrites"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("environmental samples"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Euryarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Geoarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Korarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Nanoarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Nanohaloarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Parvarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Thaumarchaeota"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified Archaea"); treeNode2.add(treeNode3); treeNode1.add(treeNode2); treeNode2 = new javax.swing.tree.DefaultMutableTreeNode("Viruses"); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Deltavirus"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("dsDNA viruses, no RNA stage"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("dsRNA viruses"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("environmental samples"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Retro-transcribing viruses"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Satellites"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("ssDNA viruses"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("ssRNA viruses"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unassigned viruses"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified archaeal viruses"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified phages"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified virophages"); treeNode2.add(treeNode3); treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("unclassified viruses"); treeNode2.add(treeNode3); treeNode1.add(treeNode2); taxonomyTree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1)); taxonomyTree.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { taxonomyTreeMouseClicked(evt); } }); taxonomyTreeScrollPane.setViewportView(taxonomyTree); btnSearch.setText("Search"); btnSearch.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnSearchActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(taxonomyTreeScrollPane) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tfSearchField, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnSearch) .addContainerGap(191, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(tfSearchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnSearch)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(taxonomyTreeScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 260, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents /** * Search UniProt. * * @param evt */ private void btnSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSearchActionPerformed try { buildTreeAfterSearch(tfSearchField.getText().replace(" ", "%20")); } catch (IOException ex) { JOptionPane.showMessageDialog(this, "Connection to UniProt failed " + System.lineSeparator() + ex, "Connection error", JOptionPane.ERROR_MESSAGE); } catch (InterruptedException ex) { ex.printStackTrace(); // @TODO: better error handling } catch (URISyntaxException ex) { ex.printStackTrace(); // @TODO: better error handling } }//GEN-LAST:event_btnSearchActionPerformed /** * Taxonomy selection. * * @param evt */ private void taxonomyTreeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_taxonomyTreeMouseClicked TreePath tp = taxonomyTree.getPathForLocation(evt.getX(), evt.getY()); // if (!evt.isControlDown() && !evt.isShiftDown()) { try { if (tp != null) { DefaultMutableTreeNode clickedNode = (DefaultMutableTreeNode) tp.getLastPathComponent(); buildTreeAfterClick(clickedNode.toString()); DefaultMutableTreeNode childAt = (DefaultMutableTreeNode) clickedNode.getChildAt(0); taxonomyTree.addSelectionPath(new TreePath(childAt.getPath())); } } catch (ArrayIndexOutOfBoundsException e) { //just the end of a node reached } catch (IOException ex) { ex.printStackTrace(); // @TODO: better error handling } // } }//GEN-LAST:event_taxonomyTreeMouseClicked // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnSearch; private javax.swing.JTree taxonomyTree; private javax.swing.JScrollPane taxonomyTreeScrollPane; private javax.swing.JTextField tfSearchField; // End of variables declaration//GEN-END:variables }