X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=caecbbad5934b7f2c831239ae3a9f55a207d0012;hb=a395b6d73484b2827f3e80295631e69dd8841c47;hp=0f3e2f4ac9624bc141b0238500626d3806d98a1a;hpb=0305216f7e9413a20bcca8acba1c8cece34d2cf4;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index 0f3e2f4..caecbba 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -24,15 +24,16 @@ import jalview.api.FeatureSettingsModelI; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; -import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; +import jalview.fts.core.GFTSPanel; import jalview.fts.service.pdb.PDBFTSPanel; +import jalview.fts.service.threedbeacons.TDBeaconsFTSPanel; import jalview.fts.service.uniprot.UniprotFTSPanel; +import jalview.io.FileFormatI; import jalview.io.gff.SequenceOntologyI; import jalview.util.DBRefUtils; import jalview.util.MessageManager; import jalview.util.Platform; -import jalview.ws.dbsources.das.api.DasSourceRegistryI; import jalview.ws.seqfetcher.DbSourceProxy; import java.awt.BorderLayout; @@ -43,57 +44,46 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JInternalFrame; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingConstants; -import javax.swing.tree.DefaultMutableTreeNode; +/** + * A panel where the use may choose a database source, and enter one or more + * accessions, to retrieve entries from the database. + *

+ * If the selected source is Uniprot or PDB, a free text search panel is opened + * instead to perform the search and selection. + */ public class SequenceFetcher extends JPanel implements Runnable { - JLabel dbeg = new JLabel(); - - JDatabaseTree database; - - JButton databaseButt; - - JLabel jLabel1 = new JLabel(); - - JCheckBox replacePunctuation = new JCheckBox(); - - JButton ok = new JButton(); - - JButton clear = new JButton(); - - JButton example = new JButton(); - - JButton close = new JButton(); - - JPanel jPanel1 = new JPanel(); + private static jalview.ws.SequenceFetcher sfetch = null; - JTextArea textArea = new JTextArea(); + JLabel exampleAccession; - JScrollPane jScrollPane1 = new JScrollPane(); + JComboBox database; - JPanel jPanel2 = new JPanel(); + JCheckBox replacePunctuation; - JPanel jPanel3 = new JPanel(); + JButton okBtn; - JPanel jPanel4 = new JPanel(); + JButton exampleBtn; - BorderLayout borderLayout1 = new BorderLayout(); + JButton closeBtn; - BorderLayout borderLayout2 = new BorderLayout(); + JButton backBtn; - BorderLayout borderLayout3 = new BorderLayout(); + JTextArea textArea; JInternalFrame frame; @@ -101,216 +91,136 @@ public class SequenceFetcher extends JPanel implements Runnable AlignFrame alignFrame; - StringBuffer result; - - final String noDbSelected = "-- Select Database --"; - - private static jalview.ws.SequenceFetcher sfetch = null; - - private static long lastDasSourceRegistry = -3; - - private static DasSourceRegistryI dasRegistry = null; + GFTSPanel parentSearchPanel; - private static boolean _initingFetcher = false; + IProgressIndicator progressIndicator; - private static Thread initingThread = null; - - int debounceTrap = 0; - - public JTextArea getTextArea() - { - return textArea; - } + volatile boolean _isConstructing = false; /** - * Blocking method that initialises and returns the shared instance of the - * SequenceFetcher client + * Returns the shared instance of the SequenceFetcher client * - * @param guiWindow - * - where the initialisation delay message should be shown - * @return the singleton instance of the sequence fetcher client + * @return */ - public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton( - final IProgressIndicator guiWindow) + public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton() { - if (_initingFetcher && initingThread != null && initingThread.isAlive()) - { - if (guiWindow != null) - { - guiWindow - .setProgressBar( - MessageManager - .getString("status.waiting_sequence_database_fetchers_init"), - Thread.currentThread().hashCode()); - } - // initting happening on another thread - so wait around to see if it - // finishes. - while (_initingFetcher && initingThread != null - && initingThread.isAlive()) - { - try - { - Thread.sleep(10); - } catch (Exception e) - { - } - ; - } - if (guiWindow != null) - { - guiWindow - .setProgressBar( - MessageManager - .getString("status.waiting_sequence_database_fetchers_init"), - Thread.currentThread().hashCode()); - } - } - if (sfetch == null - || dasRegistry != Cache.getDasSourceRegistry() - || lastDasSourceRegistry != (Cache.getDasSourceRegistry() - .getDasRegistryURL() + Cache - .getDasSourceRegistry().getLocalSourceString()) - .hashCode()) + if (sfetch == null) { - _initingFetcher = true; - initingThread = Thread.currentThread(); - /** - * give a visual indication that sequence fetcher construction is occuring - */ - if (guiWindow != null) - { - guiWindow.setProgressBar(MessageManager - .getString("status.init_sequence_database_fetchers"), - Thread.currentThread().hashCode()); - } - dasRegistry = Cache.getDasSourceRegistry(); - dasRegistry.refreshSources(); - - jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher(); - if (guiWindow != null) - { - guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); - } - lastDasSourceRegistry = (dasRegistry.getDasRegistryURL() + dasRegistry - .getLocalSourceString()).hashCode(); - sfetch = sf; - _initingFetcher = false; - initingThread = null; + sfetch = new jalview.ws.SequenceFetcher(); } return sfetch; } - private IProgressIndicator progressIndicator; - + /** + * Constructor given a client to receive any status or progress messages + * (currently either the Desktop, or an AlignFrame panel) + * + * @param guiIndic + */ public SequenceFetcher(IProgressIndicator guiIndic) { - this.progressIndicator = guiIndic; - final SequenceFetcher us = this; - // launch initialiser thread - Thread sf = new Thread(new Runnable() - { - - @Override - public void run() - { - if (getSequenceFetcherSingleton(progressIndicator) != null) - { - us.initGui(progressIndicator); - } - else - { - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - JOptionPane - .showInternalMessageDialog( - Desktop.desktop, - MessageManager - .getString("warn.couldnt_create_sequence_fetcher_client"), - MessageManager - .getString("label.couldnt_create_sequence_fetcher"), - JOptionPane.ERROR_MESSAGE); - } - }); - - // raise warning dialog - } - } - }); - sf.start(); + this(guiIndic, null, null); } - private class DatabaseAuthority extends DefaultMutableTreeNode - { - - }; - - private class DatabaseSource extends DefaultMutableTreeNode - { - - }; - /** - * called by thread spawned by constructor + * Constructor with specified database and accession(s) to retrieve * - * @param guiWindow + * @param guiIndic + * @param selectedDb + * @param queryString */ - private void initGui(IProgressIndicator guiWindow) + public SequenceFetcher(IProgressIndicator guiIndic, + final String selectedDb, final String queryString) { - this.guiWindow = guiWindow; - if (guiWindow instanceof AlignFrame) - { - alignFrame = (AlignFrame) guiWindow; - } - database = new JDatabaseTree(sfetch); - try - { - jbInit(); - database.waitForInput(); - } catch (Exception ex) + this.progressIndicator = guiIndic; + getSequenceFetcherSingleton(); + this.guiWindow = progressIndicator; + + if (progressIndicator instanceof AlignFrame) { - ex.printStackTrace(); + alignFrame = (AlignFrame) progressIndicator; } + jbInit(selectedDb); + textArea.setText(queryString); + frame = new JInternalFrame(); frame.setContentPane(this); - if (Platform.isAMac()) - { - Desktop.addInternalFrame(frame, getFrameTitle(), false, 400, 240); - } - else - { - Desktop.addInternalFrame(frame, getFrameTitle(), false, 400, 180); - } + Desktop.addInternalFrame(frame, getFrameTitle(), true, 400, + Platform.isAMacAndNotJS() ? 240 : 180); } private String getFrameTitle() { - return ((alignFrame == null) ? MessageManager - .getString("label.new_sequence_fetcher") : MessageManager - .getString("label.additional_sequence_fetcher")); + return ((alignFrame == null) + ? MessageManager.getString("label.new_sequence_fetcher") + : MessageManager + .getString("label.additional_sequence_fetcher")); } - private void jbInit() throws Exception + private void jbInit(String selectedDb) { - this.setLayout(borderLayout2); + this.setLayout(new BorderLayout()); + database = new JComboBox<>(); database.setFont(JvSwingUtils.getLabelFont()); - dbeg.setFont(new java.awt.Font("Verdana", Font.BOLD, 11)); - jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); - jLabel1.setHorizontalAlignment(SwingConstants.CENTER); - jLabel1.setText(MessageManager + database.setPrototypeDisplayValue("ENSEMBLGENOMES "); + String[] sources = new jalview.ws.SequenceFetcher().getSupportedDb(); + Arrays.sort(sources, String.CASE_INSENSITIVE_ORDER); + database.addItem(MessageManager.getString("action.select_ddbb")); + for (String source : sources) + { + database.addItem(source); + } + database.setSelectedItem(selectedDb); + if (database.getSelectedIndex() == -1) + { + database.setSelectedIndex(0); + } + database.setMaximumRowCount(database.getItemCount()); + database.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + String currentSelection = (String) database.getSelectedItem(); + updateExampleQuery(currentSelection); + + if ("pdb".equalsIgnoreCase(currentSelection)) + { + frame.dispose(); + new PDBFTSPanel(SequenceFetcher.this); + } + else if ("uniprot".equalsIgnoreCase(currentSelection)) + { + frame.dispose(); + new UniprotFTSPanel(SequenceFetcher.this); + } + else if ("3d-beacons".equalsIgnoreCase(currentSelection)) + { + frame.dispose(); + new TDBeaconsFTSPanel(SequenceFetcher.this); + } + else + { + otherSourceAction(); + } + } + }); + + exampleAccession = new JLabel(""); + exampleAccession.setFont(new Font("Verdana", Font.BOLD, 11)); + JLabel jLabel1 = new JLabel(MessageManager .getString("label.separate_multiple_accession_ids")); + jLabel1.setFont(new Font("Verdana", Font.ITALIC, 11)); + jLabel1.setHorizontalAlignment(SwingConstants.LEFT); - replacePunctuation.setHorizontalAlignment(SwingConstants.CENTER); - replacePunctuation - .setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); - replacePunctuation.setText(MessageManager - .getString("label.replace_commas_semicolons")); - ok.setText(MessageManager.getString("action.ok")); - ok.addActionListener(new ActionListener() + replacePunctuation = new JCheckBox( + MessageManager.getString("label.replace_commas_semicolons")); + replacePunctuation.setHorizontalAlignment(SwingConstants.LEFT); + replacePunctuation.setFont(new Font("Verdana", Font.ITALIC, 11)); + okBtn = new JButton(MessageManager.getString("action.ok")); + okBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -318,7 +228,7 @@ public class SequenceFetcher extends JPanel implements Runnable ok_actionPerformed(); } }); - clear.setText(MessageManager.getString("action.clear")); + JButton clear = new JButton(MessageManager.getString("action.clear")); clear.addActionListener(new ActionListener() { @Override @@ -328,8 +238,8 @@ public class SequenceFetcher extends JPanel implements Runnable } }); - example.setText(MessageManager.getString("label.example")); - example.addActionListener(new ActionListener() + exampleBtn = new JButton(MessageManager.getString("label.example")); + exampleBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -337,8 +247,8 @@ public class SequenceFetcher extends JPanel implements Runnable example_actionPerformed(); } }); - close.setText(MessageManager.getString("action.close")); - close.addActionListener(new ActionListener() + closeBtn = new JButton(MessageManager.getString("action.cancel")); + closeBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -346,166 +256,205 @@ public class SequenceFetcher extends JPanel implements Runnable close_actionPerformed(e); } }); - textArea.setFont(JvSwingUtils.getLabelFont()); - textArea.setLineWrap(true); - textArea.addKeyListener(new KeyAdapter() + backBtn = new JButton(MessageManager.getString("action.back")); + backBtn.addActionListener(new ActionListener() { @Override - public void keyPressed(KeyEvent e) + public void actionPerformed(ActionEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ENTER) - { - ok_actionPerformed(); - } + parentSearchPanel.btn_back_ActionPerformed(); } }); - jPanel3.setLayout(borderLayout1); - borderLayout1.setVgap(5); - jPanel1.add(ok); - jPanel1.add(example); - jPanel1.add(clear); - jPanel1.add(close); - jPanel3.add(jPanel2, java.awt.BorderLayout.CENTER); - jPanel2.setLayout(borderLayout3); - databaseButt = /*database.getDatabaseSelectorButton(); - final JButton viewdbs =*/new JButton( - MessageManager.getString("action.select_ddbb")); - databaseButt.addActionListener(new ActionListener() - { + // back not visible unless embedded + backBtn.setVisible(false); - @Override - public void actionPerformed(ActionEvent arg0) - { - hidePanel(); - database.showDialog(); - } - }); - databaseButt.setFont(JvSwingUtils.getLabelFont()); - database.addActionListener(new ActionListener() + textArea = new JTextArea(); + textArea.setFont(JvSwingUtils.getLabelFont()); + textArea.setLineWrap(true); + textArea.addKeyListener(new KeyAdapter() { @Override - public void actionPerformed(ActionEvent e) + public void keyPressed(KeyEvent e) { - debounceTrap++; - String currentSelection = database.getSelectedItem(); - if (currentSelection == null) - { - close_actionPerformed(null); - } - - showPanel(); - - if (currentSelection.equalsIgnoreCase("pdb") - && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0))) - { - pdbSourceAction(); - } - else if (currentSelection.equalsIgnoreCase("uniprot") - && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0))) - { - uniprotSourceAction(); - } - else + if (e.getKeyCode() == KeyEvent.VK_ENTER) { - otherSourceAction(); + ok_actionPerformed(); } - database.action = -1; } }); - dbeg.setText(""); - jPanel2.add(databaseButt, java.awt.BorderLayout.NORTH); - jPanel2.add(dbeg, java.awt.BorderLayout.CENTER); + JPanel actionPanel = new JPanel(); + actionPanel.add(backBtn); + actionPanel.add(exampleBtn); + actionPanel.add(clear); + actionPanel.add(okBtn); + actionPanel.add(closeBtn); + + JPanel databasePanel = new JPanel(); + databasePanel.setLayout(new BorderLayout()); + databasePanel.add(database, BorderLayout.NORTH); + databasePanel.add(exampleAccession, BorderLayout.CENTER); JPanel jPanel2a = new JPanel(new BorderLayout()); - jPanel2a.add(jLabel1, java.awt.BorderLayout.NORTH); - jPanel2a.add(replacePunctuation, java.awt.BorderLayout.SOUTH); - jPanel2.add(jPanel2a, java.awt.BorderLayout.SOUTH); - // jPanel2.setPreferredSize(new Dimension()) - jPanel3.add(jScrollPane1, java.awt.BorderLayout.CENTER); - this.add(jPanel1, java.awt.BorderLayout.SOUTH); - this.add(jPanel3, java.awt.BorderLayout.CENTER); - this.add(jPanel2, java.awt.BorderLayout.NORTH); + jPanel2a.add(jLabel1, BorderLayout.NORTH); + jPanel2a.add(replacePunctuation, BorderLayout.SOUTH); + databasePanel.add(jPanel2a, BorderLayout.SOUTH); + + JPanel idsPanel = new JPanel(); + idsPanel.setLayout(new BorderLayout(0, 5)); + JScrollPane jScrollPane1 = new JScrollPane(); jScrollPane1.getViewport().add(textArea); - } + idsPanel.add(jScrollPane1, BorderLayout.CENTER); - private void pdbSourceAction() - { - databaseButt.setText(database.getSelectedItem()); - new PDBFTSPanel(this); - frame.dispose(); + this.add(actionPanel, BorderLayout.SOUTH); + this.add(idsPanel, BorderLayout.CENTER); + this.add(databasePanel, BorderLayout.NORTH); } - private void uniprotSourceAction() - { - databaseButt.setText(database.getSelectedItem()); - new UniprotFTSPanel(this); - frame.dispose(); - } - private void otherSourceAction() + /** + * Answers a semi-colon-delimited string with the example query or queries for + * the selected database + * + * @param db + * @return + */ + protected String getExampleQueries(String db) { - try + StringBuilder sb = new StringBuilder(); + HashSet hs = new HashSet<>(); + for (DbSourceProxy dbs : sfetch.getSourceProxy(db)) { - databaseButt.setText(database.getSelectedItem() - + (database.getSelectedSources().size() > 1 ? " (and " - + database.getSelectedSources().size() + " others)" - : "")); - String eq = database.getExampleQueries(); - dbeg.setText(MessageManager.formatMessage( - "label.example_query_param", new String[] { eq })); - boolean enablePunct = !(eq != null && eq.indexOf(",") > -1); - for (DbSourceProxy dbs : database.getSelectedSources()) + String tq = dbs.getTestQuery(); + if (hs.add(tq)) // not a duplicate source { - if (dbs instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) + if (sb.length() > 0) { - enablePunct = false; - break; + sb.append(";"); } + sb.append(tq); } + } + return sb.toString(); + } + + /** + * Action on selecting a database other than Uniprot or PDB is to enable or + * disable 'Replace commas', and await input in the query field + */ + protected void otherSourceAction() + { + try + { + String eq = exampleAccession.getText(); + // TODO this should be a property of the SequenceFetcher whether commas + // are allowed in the IDs... + + boolean enablePunct = !(eq != null && eq.indexOf(",") > -1); replacePunctuation.setEnabled(enablePunct); } catch (Exception ex) { - dbeg.setText(""); + exampleAccession.setText(""); replacePunctuation.setEnabled(true); } - jPanel2.repaint(); + repaint(); } + /** + * Sets the text of the example query to incorporate the example accession + * provided by the selected database source + * + * @param selectedDatabase + * @return + */ + protected String updateExampleQuery(String selectedDatabase) + { + String eq = getExampleQueries(selectedDatabase); + exampleAccession.setText(MessageManager + .formatMessage("label.example_query_param", new String[] + { eq })); + return eq; + } + + /** + * Action on clicking the 'Example' button is to write the example accession + * as the query text field value + */ protected void example_actionPerformed() { - DbSourceProxy db = null; - try - { - textArea.setText(database.getExampleQueries()); - } catch (Exception ex) - { - } - jPanel3.repaint(); + String eq = getExampleQueries((String) database.getSelectedItem()); + textArea.setText(eq); + repaint(); } + /** + * Clears the query input field + */ protected void clear_actionPerformed() { textArea.setText(""); - jPanel3.repaint(); + repaint(); } - public void close_actionPerformed(ActionEvent e) + /** + * Action on Close button is to close this frame, and also (if it is embedded + * in a search panel) to close the search panel + * + * @param e + */ + protected void close_actionPerformed(ActionEvent e) { try { frame.setClosed(true); + if (parentSearchPanel != null) + { + parentSearchPanel.btn_cancel_ActionPerformed(); + } } catch (Exception ex) { } } + /** + * Action on OK is to start the fetch for entered accession(s) + */ public void ok_actionPerformed() { - databaseButt.setEnabled(false); - example.setEnabled(false); + /* + * tidy inputs and check there is something to search for + */ + String t0 = textArea.getText(); + String text = t0.trim(); + if (replacePunctuation.isEnabled() && replacePunctuation.isSelected()) + { + text = text.replace(",", ";"); + } + text = text.replaceAll("(\\s|[; ])+", ";"); + if (!t0.equals(text)) + { + textArea.setText(text); + } + if (text.isEmpty()) + { + // todo i18n + showErrorMessage( + "Please enter a (semi-colon separated list of) database id(s)"); + resetDialog(); + return; + } + if (database.getSelectedIndex() == 0) + { + // todo i18n + showErrorMessage("Please choose a database"); + resetDialog(); + return; + } + + exampleBtn.setEnabled(false); textArea.setEnabled(false); - ok.setEnabled(false); - close.setEnabled(false); + okBtn.setEnabled(false); + closeBtn.setEnabled(false); + backBtn.setEnabled(false); Thread worker = new Thread(this); worker.start(); @@ -513,59 +462,26 @@ public class SequenceFetcher extends JPanel implements Runnable private void resetDialog() { - databaseButt.setEnabled(true); - example.setEnabled(true); + exampleBtn.setEnabled(true); textArea.setEnabled(true); - ok.setEnabled(true); - close.setEnabled(true); + okBtn.setEnabled(true); + closeBtn.setEnabled(true); + backBtn.setEnabled(parentSearchPanel != null); } @Override public void run() { - String error = ""; - if (!database.hasSelection()) - { - error += "Please select the source database\n"; - } - // TODO: make this transformation more configurable - com.stevesoft.pat.Regex empty; - if (replacePunctuation.isEnabled() && replacePunctuation.isSelected()) - { - empty = new com.stevesoft.pat.Regex( - // replace commas and spaces with a semicolon - "(\\s|[,; ])+", ";"); - } - else - { - // just turn spaces and semicolons into single semicolons - empty = new com.stevesoft.pat.Regex("(\\s|[; ])+", ";"); - } - textArea.setText(empty.replaceAll(textArea.getText())); - // see if there's anthing to search with - if (!new com.stevesoft.pat.Regex("[A-Za-z0-9_.]").search(textArea - .getText())) - { - error += "Please enter a (semi-colon separated list of) database id(s)"; - } - if (error.length() > 0) - { - showErrorMessage(error); - resetDialog(); - return; - } - // TODO: Refactor to GUI independent code and write tests. - // indicate if successive sources should be merged into one alignment. boolean addToLast = false; - List aresultq = new ArrayList(); - List presultTitle = new ArrayList(); - List presult = new ArrayList(); - List aresult = new ArrayList(); - Iterator proxies = database.getSelectedSources() - .iterator(); - String[] qries; - List nextFetch = Arrays.asList(qries = textArea.getText() - .split(";")); + List aresultq = new ArrayList<>(); + List presultTitle = new ArrayList<>(); + List presult = new ArrayList<>(); + List aresult = new ArrayList<>(); + List sources = sfetch + .getSourceProxy((String) database.getSelectedItem()); + Iterator proxies = sources.iterator(); + String[] qries = textArea.getText().trim().split(";"); + List nextFetch = Arrays.asList(qries); Iterator en = Arrays.asList(new String[0]).iterator(); int nqueries = qries.length; @@ -578,20 +494,18 @@ public class SequenceFetcher extends JPanel implements Runnable nqueries = nextFetch.size(); // save the remaining queries in the original array qries = nextFetch.toArray(new String[nqueries]); - nextFetch = new ArrayList(); + nextFetch = new ArrayList<>(); } DbSourceProxy proxy = proxies.next(); try { // update status - guiWindow - .setProgressBar(MessageManager.formatMessage( - "status.fetching_sequence_queries_from", - new String[] { - Integer.valueOf(nqueries).toString(), - proxy.getDbName() }), Thread.currentThread() - .hashCode()); + guiWindow.setProgressBar(MessageManager.formatMessage( + "status.fetching_sequence_queries_from", new String[] + { Integer.valueOf(nqueries).toString(), + proxy.getDbName() }), + Thread.currentThread().hashCode()); if (proxy.getMaximumQueryCount() == 1) { /* @@ -615,8 +529,8 @@ public class SequenceFetcher extends JPanel implements Runnable } } catch (Exception e) { - showErrorMessage("Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); + showErrorMessage("Error retrieving " + textArea.getText() + " from " + + database.getSelectedItem()); // error // +="Couldn't retrieve sequences from "+database.getSelectedItem(); System.err.println("Retrieval failed for source ='" @@ -626,9 +540,7 @@ public class SequenceFetcher extends JPanel implements Runnable } catch (OutOfMemoryError e) { showErrorMessage("Out of Memory when retrieving " - + textArea.getText() - + " from " - + database.getSelectedItem() + + textArea.getText() + " from " + database.getSelectedItem() + "\nPlease see the Jalview FAQ for instructions for increasing the memory available to Jalview.\n"); e.printStackTrace(); } catch (Error e) @@ -656,8 +568,8 @@ public class SequenceFetcher extends JPanel implements Runnable while (aresult.size() > 0) { presult.add(aresult.remove(0)); - presultTitle.add(aresultq.remove(0) + " " - + getDefaultRetrievalTitle()); + presultTitle.add( + aresultq.remove(0) + " " + getDefaultRetrievalTitle()); } } else @@ -685,15 +597,17 @@ public class SequenceFetcher extends JPanel implements Runnable presultTitle.add(titl); } } - guiWindow.setProgressBar(MessageManager - .getString("status.finshed_querying"), Thread.currentThread() - .hashCode()); + guiWindow.setProgressBar( + MessageManager.getString("status.finshed_querying"), + Thread.currentThread().hashCode()); } - guiWindow.setProgressBar( - (presult.size() > 0) ? MessageManager - .getString("status.parsing_results") : MessageManager - .getString("status.processing"), Thread.currentThread() - .hashCode()); + guiWindow + .setProgressBar( + (presult.size() > 0) + ? MessageManager + .getString("status.parsing_results") + : MessageManager.getString("status.processing"), + Thread.currentThread().hashCode()); // process results while (presult.size() > 0) { @@ -706,8 +620,9 @@ public class SequenceFetcher extends JPanel implements Runnable { StringBuffer sb = new StringBuffer(); sb.append("Didn't retrieve the following " - + (nextFetch.size() == 1 ? "query" : nextFetch.size() - + " queries") + ": \n"); + + (nextFetch.size() == 1 ? "query" + : nextFetch.size() + " queries") + + ": \n"); int l = sb.length(), lr = 0; for (String s : nextFetch) { @@ -742,11 +657,10 @@ public class SequenceFetcher extends JPanel implements Runnable */ void fetchMultipleAccessions(DbSourceProxy proxy, Iterator accessions, List aresultq, - List aresult, List nextFetch) - throws Exception + List aresult, List nextFetch) throws Exception { StringBuilder multiacc = new StringBuilder(); - List tosend = new ArrayList(); + List tosend = new ArrayList<>(); while (accessions.hasNext()) { String nel = accessions.next(); @@ -818,8 +732,9 @@ public class SequenceFetcher extends JPanel implements Runnable indres = proxy.getSequenceRecords(accession); } catch (OutOfMemoryError oome) { - new OOMWarning("fetching " + accession + " from " - + proxy.getDbName(), oome, this); + new OOMWarning( + "fetching " + accession + " from " + proxy.getDbName(), + oome, this); } if (indres != null) { @@ -829,9 +744,8 @@ public class SequenceFetcher extends JPanel implements Runnable } } catch (Exception e) { - Cache.log.info( - "Error retrieving " + accession - + " from " + proxy.getDbName(), e); + Cache.log.info("Error retrieving " + accession + " from " + + proxy.getDbName(), e); } return success; } @@ -853,13 +767,14 @@ public class SequenceFetcher extends JPanel implements Runnable for (String q : queries) { - DBRefEntry dbr = new DBRefEntry(); - dbr.setSource(proxy.getDbSource()); - dbr.setVersion(null); + // BH 2019.01.25 dbr is never used. +// DBRefEntry dbr = new DBRefEntry(); +// dbr.setSource(proxy.getDbSource()); +// dbr.setVersion(null); String accId = proxy.getAccessionIdFromQuery(q); - dbr.setAccessionId(accId); +// dbr.setAccessionId(accId); boolean rfound = false; - for (int r = 0; r < rs.length; r++) + for (int r = 0, nr = rs.length; r < nr; r++) { if (rs[r] != null) { @@ -888,9 +803,16 @@ public class SequenceFetcher extends JPanel implements Runnable { return "Retrieved from " + database.getSelectedItem(); } - - AlignmentI parseResult(AlignmentI al, String title, - String currentFileFormat, + /** + * constructs an alignment frame given the data and metadata + * @param al + * @param title + * @param currentFileFormat + * @param preferredFeatureColours + * @return the alignment + */ + public AlignmentI parseResult(AlignmentI al, String title, + FileFormatI currentFileFormat, FeatureSettingsModelI preferredFeatureColours) { @@ -906,49 +828,36 @@ public class SequenceFetcher extends JPanel implements Runnable AlignFrame.DEFAULT_HEIGHT); if (currentFileFormat != null) { - af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT - // FORMAT FOR - // NON-FormatAdapter Sourced - // Alignments? + af.currentFileFormat = currentFileFormat; } - SequenceFeature[] sfs = null; - List alsqs; - synchronized (alsqs = al.getSequences()) + List alsqs = al.getSequences(); + synchronized (alsqs) { for (SequenceI sq : alsqs) { - if ((sfs = sq.getSequenceFeatures()) != null) + if (sq.getFeatures().hasFeatures()) { - if (sfs.length > 0) - { - af.setShowSeqFeatures(true); - break; - } + af.setShowSeqFeatures(true); + break; } - } } - if (preferredFeatureColours != null) - { - af.getViewport().applyFeaturesStyle(preferredFeatureColours); - } + af.getViewport().applyFeaturesStyle(preferredFeatureColours); if (Cache.getDefault("HIDE_INTRONS", true)) { af.hideFeatureColumns(SequenceOntologyI.EXON, false); } - Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); - af.statusBar.setText(MessageManager + af.setStatus(MessageManager .getString("label.successfully_pasted_alignment_file")); try { - af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN", - false)); + af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN", false)); } catch (Exception ex) { } @@ -969,9 +878,9 @@ public class SequenceFetcher extends JPanel implements Runnable @Override public void run() { - JOptionPane.showInternalMessageDialog(Desktop.desktop, error, + JvOptionPane.showInternalMessageDialog(Desktop.desktop, error, MessageManager.getString("label.error_retrieving_data"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); } }); } @@ -987,20 +896,31 @@ public class SequenceFetcher extends JPanel implements Runnable } /** - * Make this panel visible (after a selection has been made in the database + * Hide this panel (on clicking the database button to open the database * chooser) */ - void showPanel() + void hidePanel() { - frame.setVisible(true); + frame.setVisible(false); + } + + public void setQuery(String ids) + { + textArea.setText(ids); } /** - * Hide this panel (on clicking the database button to open the database - * chooser) + * Called to modify the search panel for embedding as an alternative tab of a + * free text search panel. The database choice list is hidden (since the + * choice has been made), and a Back button is made visible (which reopens the + * Sequence Fetcher panel). + * + * @param parentPanel */ - void hidePanel() + public void embedIn(GFTSPanel parentPanel) { - frame.setVisible(false); + database.setVisible(false); + backBtn.setVisible(true); + parentSearchPanel = parentPanel; } }