X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=9052413245c00b90607583422ea579adef03fa6b;hb=a1984b1c8c273ed33c7ce9283039f4027dcae2de;hp=118d87774b6b781ab996c803c7b271fc9bdc59b4;hpb=3516fc4a1037ffc86d51f900850ed7a04a0174cb;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index 118d877..9052413 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -20,21 +20,6 @@ */ package jalview.gui; -import jalview.api.FeatureSettingsModelI; -import jalview.bin.Cache; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.SequenceI; -import jalview.fts.core.GFTSPanel; -import jalview.fts.service.pdb.PDBFTSPanel; -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.seqfetcher.DbSourceProxy; - import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; @@ -43,59 +28,101 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; +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.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingConstants; -import javax.swing.tree.DefaultMutableTreeNode; +import jalview.api.FeatureSettingsModelI; +import jalview.bin.Cache; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.DBRefEntry; +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.seqfetcher.DbSourceProxy; + +/** + * 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; + private class StringPair + { + private String key; - JLabel jLabel1 = new JLabel(); + private String display; - JCheckBox replacePunctuation = new JCheckBox(); + public StringPair(String s1, String s2) + { + key = s1; + display = s2; + } - JButton ok = new JButton(); + public StringPair(String s) + { + this(s, s); + } - JButton clear = new JButton(); + public String getKey() + { + return key; + } - JButton example = new JButton(); + public String getDisplay() + { + return display; + } - JButton close = new JButton(); + @Override + public String toString() + { + return display; + } - JButton back = new JButton(); + public boolean equals(StringPair other) + { + return other.key == this.key; + } + } - 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; @@ -103,265 +130,63 @@ public class SequenceFetcher extends JPanel implements Runnable AlignFrame alignFrame; - StringBuffer result; + GFTSPanel parentSearchPanel; - final String noDbSelected = "-- Select Database --"; + IProgressIndicator progressIndicator; - private static jalview.ws.SequenceFetcher sfetch = null; - - private static boolean _initingFetcher = false; - - private static Thread initingThread = null; - - 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) { - _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()); - } - - jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher(); - if (guiWindow != null) - { - guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); - } - sfetch = sf; - _initingFetcher = false; - initingThread = null; + sfetch = new jalview.ws.SequenceFetcher(); } return sfetch; } - private IProgressIndicator progressIndicator; - - private volatile boolean _isConstructing = false; - - private List newAlframes = null; - - public SequenceFetcher(IProgressIndicator guiIndic) - { - this(guiIndic, null, null); - } - - public SequenceFetcher(IProgressIndicator guiIndic, - final String selectedDb, final String queryString) - { - this._isConstructing = true; - 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, selectedDb, queryString); - us._isConstructing = false; - } - else - { - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, - MessageManager.getString( - "warn.couldnt_create_sequence_fetcher_client"), - MessageManager.getString( - "label.couldnt_create_sequence_fetcher"), - JvOptionPane.ERROR_MESSAGE); - } - }); - - // raise warning dialog - } - } - }); - sf.start(); - } - /** - * blocking call which creates a new sequence fetcher panel, configures it and - * presses the OK button with the given database and query. + * Constructor given a client to receive any status or progress messages + * (currently either the Desktop, or an AlignFrame panel) * - * @param database - * @param query + * @param guiIndic */ - public static List fetchAndShow(String database, String query) + public SequenceFetcher(IProgressIndicator guiIndic) { - final SequenceFetcher sf = new SequenceFetcher(Desktop.instance, - database, query); - while (sf._isConstructing) - { - try - { - Thread.sleep(50); - } catch (Exception q) - { - return Collections.emptyList(); - } - } - sf.newAlframes = new ArrayList<>(); - sf.run(); - return sf.newAlframes; + this(guiIndic, null, null); } - private class DatabaseAuthority extends DefaultMutableTreeNode - { - - }; - - private class DatabaseSource extends DefaultMutableTreeNode - { - - }; - /** - * initialise the database and query for this fetcher panel + * Constructor with specified database and accession(s) to retrieve * + * @param guiIndic * @param selectedDb - * - string that should correspond to a sequence fetcher * @param queryString - * - string that will be entered in the query dialog - * @return true if UI was configured with valid database and query string */ - protected boolean setInitialQuery(String selectedDb, String queryString) + public SequenceFetcher(IProgressIndicator guiIndic, + final String selectedDb, final String queryString) { - if (selectedDb == null || selectedDb.trim().length() == 0) - { - return false; - } - try - { - List sp = sfetch.getSourceProxy(selectedDb); - for (DbSourceProxy sourcep : sp) - { - if (sourcep.getTier() == 0) - { - database.selection = Arrays - .asList(new DbSourceProxy[] - { sourcep }); - break; - } - } - if (database.selection == null || database.selection.size() == 0) - { - System.err.println( - "Ignoring fetch parameter db='" + selectedDb + "'"); - return false; - } - textArea.setText(queryString); - } catch (Exception q) - { - System.err.println("Ignoring fetch parameter db='" + selectedDb - + "' and query='" + queryString + "'"); - return false; - } - return true; - } + this.progressIndicator = guiIndic; + getSequenceFetcherSingleton(); + this.guiWindow = progressIndicator; - /** - * called by thread spawned by constructor - * - * @param guiWindow - * @param queryString - * @param selectedDb - */ - private void initGui(IProgressIndicator guiWindow, String selectedDb, - String queryString) - { - this.guiWindow = guiWindow; - if (guiWindow instanceof AlignFrame) - { - alignFrame = (AlignFrame) guiWindow; - } - database = new JDatabaseTree(sfetch); - try + if (progressIndicator instanceof AlignFrame) { - jbInit(); - /* - * configure the UI with any query parameters we were called with - */ - if (!setInitialQuery(selectedDb, queryString)) - { - /* - * none provided, so show the database chooser - */ - database.waitForInput(); - } - } catch (Exception ex) - { - 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() @@ -372,33 +197,80 @@ public class SequenceFetcher extends JPanel implements Runnable .getString("label.additional_sequence_fetcher")); } - GFTSPanel parentFTSframe = null; - /** - * change the buttons so they fit with the FTS panel. - */ - public void embedWithFTSPanel(GFTSPanel toClose) - { - back.setVisible(true); - parentFTSframe = toClose; - } - 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 + StringPair instructionItem = new StringPair( + MessageManager.getString("action.select_ddbb")); + database.setPrototypeDisplayValue(instructionItem); + String[] sources = new jalview.ws.SequenceFetcher().getSupportedDb(); + Arrays.sort(sources, String.CASE_INSENSITIVE_ORDER); + database.addItem(instructionItem); + for (String source : sources) + { + List slist = sfetch.getSourceProxy(source); + if (slist.size() == 1 && slist.get(0) != null) + { + database.addItem(new StringPair(source, slist.get(0).getDbName())); + } + else + { + database.addItem(new StringPair(source)); + } + } + setDatabaseSelectedItem(selectedDb); + if (database.getSelectedIndex() == -1) + { + database.setSelectedIndex(0); + } + database.setMaximumRowCount(database.getItemCount()); + database.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + String currentSelection = ((StringPair) database.getSelectedItem()) + .getKey(); + 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( + replacePunctuation = new JCheckBox( MessageManager.getString("label.replace_commas_semicolons")); - ok.setText(MessageManager.getString("action.ok")); - ok.addActionListener(new ActionListener() + 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) @@ -406,7 +278,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 @@ -416,8 +288,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) @@ -425,8 +297,8 @@ public class SequenceFetcher extends JPanel implements Runnable example_actionPerformed(); } }); - close.setText(MessageManager.getString("action.cancel")); - close.addActionListener(new ActionListener() + closeBtn = new JButton(MessageManager.getString("action.cancel")); + closeBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -434,17 +306,19 @@ public class SequenceFetcher extends JPanel implements Runnable close_actionPerformed(e); } }); - back.setText(MessageManager.getString("action.back")); - back.addActionListener(new ActionListener() + backBtn = new JButton(MessageManager.getString("action.back")); + backBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - parentFTSframe.btn_back_ActionPerformed(); + parentSearchPanel.btn_back_ActionPerformed(); } }); // back not visible unless embedded - back.setVisible(false); + backBtn.setVisible(false); + + textArea = new JTextArea(); textArea.setFont(JvSwingUtils.getLabelFont()); textArea.setLineWrap(true); textArea.addKeyListener(new KeyAdapter() @@ -458,212 +332,220 @@ public class SequenceFetcher extends JPanel implements Runnable } } }); - jPanel3.setLayout(borderLayout1); - borderLayout1.setVgap(5); - jPanel1.add(back); - jPanel1.add(example); - jPanel1.add(clear); - jPanel1.add(ok); - jPanel1.add(close); - jPanel2.setLayout(borderLayout3); - databaseButt = /*database.getDatabaseSelectorButton(); - final JButton viewdbs =*/new JButton( - MessageManager.getString("action.select_ddbb")); - databaseButt.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent arg0) - { - hidePanel(); - database.showDialog(); - } - }); - databaseButt.setFont(JvSwingUtils.getLabelFont()); - database.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - String currentSelection = database.getSelectedItem(); - if (currentSelection == null) - { - close_actionPerformed(null); - } - - showPanel(); - - if ("pdb".equalsIgnoreCase(currentSelection)) - { - pdbSourceAction(); - } - else if ("uniprot".equalsIgnoreCase(currentSelection)) - { - uniprotSourceAction(); - } - else - { - otherSourceAction(); - } - 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); + + this.add(actionPanel, BorderLayout.SOUTH); + this.add(idsPanel, BorderLayout.CENTER); + this.add(databasePanel, BorderLayout.NORTH); } - private void pdbSourceAction() + private void setDatabaseSelectedItem(String db) { - databaseButt.setText(database.getSelectedItem()); - new PDBFTSPanel(this); - frame.dispose(); + for (int i = 0; i < database.getItemCount(); i++) + { + StringPair sp = database.getItemAt(i); + if (sp != null && db != null && db.equals(sp.getKey())) + { + database.setSelectedIndex(i); + return; + } + } } - private void uniprotSourceAction() + /** + * Answers a semi-colon-delimited string with the example query or queries for + * the selected database + * + * @param db + * @return + */ + protected String getExampleQueries(String db) { - databaseButt.setText(database.getSelectedItem()); - new UniprotFTSPanel(this); - frame.dispose(); + StringBuilder sb = new StringBuilder(); + HashSet hs = new HashSet<>(); + for (DbSourceProxy dbs : sfetch.getSourceProxy(db)) + { + String tq = dbs.getTestQuery(); + if (hs.add(tq)) // not a duplicate source + { + if (sb.length() > 0) + { + sb.append(";"); + } + sb.append(tq); + } + } + return sb.toString(); } - private void otherSourceAction() + /** + * 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 { - 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 })); - // TODO this should be a property of the SequenceFetcher whether commas are and - // colons are allowed in the IDs... + 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( + ((StringPair) database.getSelectedItem()).getKey()); + 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 (parentFTSframe!=null) + if (parentSearchPanel != null) { - parentFTSframe.btn_cancel_ActionPerformed(); + 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); - back.setEnabled(false); + okBtn.setEnabled(false); + closeBtn.setEnabled(false); + backBtn.setEnabled(false); + Thread worker = new Thread(this); worker.start(); } private void resetDialog() { - databaseButt.setEnabled(true); - example.setEnabled(true); + exampleBtn.setEnabled(true); textArea.setEnabled(true); - ok.setEnabled(true); - close.setEnabled(true); - back.setEnabled(parentFTSframe != null); + 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 sources = sfetch.getSourceProxy( + ((StringPair) database.getSelectedItem()).getKey()); + 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; @@ -712,23 +594,25 @@ public class SequenceFetcher extends JPanel implements Runnable } catch (Exception e) { showErrorMessage("Error retrieving " + textArea.getText() + " from " - + database.getSelectedItem()); + + ((StringPair) database.getSelectedItem()).getDisplay()); // error // +="Couldn't retrieve sequences from "+database.getSelectedItem(); System.err.println("Retrieval failed for source ='" - + database.getSelectedItem() + "' and query\n'" - + textArea.getText() + "'\n"); + + ((StringPair) database.getSelectedItem()).getDisplay() + + "' and query\n'" + textArea.getText() + "'\n"); e.printStackTrace(); } catch (OutOfMemoryError e) { showErrorMessage("Out of Memory when retrieving " - + textArea.getText() + " from " + database.getSelectedItem() + + textArea.getText() + " from " + + ((StringPair) database.getSelectedItem()).getDisplay() + "\nPlease see the Jalview FAQ for instructions for increasing the memory available to Jalview.\n"); e.printStackTrace(); } catch (Error e) { showErrorMessage("Serious Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); + + " from " + + ((StringPair) database.getSelectedItem()).getDisplay()); e.printStackTrace(); } @@ -875,7 +759,8 @@ public class SequenceFetcher extends JPanel implements Runnable } catch (OutOfMemoryError oome) { new OOMWarning("fetching " + multiacc + " from " - + database.getSelectedItem(), oome, this); + + ((StringPair) database.getSelectedItem()).getDisplay(), + oome, this); } } @@ -926,7 +811,7 @@ public class SequenceFetcher extends JPanel implements Runnable } } catch (Exception e) { - Cache.log.info("Error retrieving " + accession + " from " + Cache.info("Error retrieving " + accession + " from " + proxy.getDbName(), e); } return success; @@ -949,13 +834,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) { @@ -982,10 +868,20 @@ public class SequenceFetcher extends JPanel implements Runnable */ public String getDefaultRetrievalTitle() { - return "Retrieved from " + database.getSelectedItem(); + return "Retrieved from " + + ((StringPair) database.getSelectedItem()).getDisplay(); } - AlignmentI parseResult(AlignmentI al, String title, + /** + * 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) { @@ -1002,10 +898,7 @@ 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; } List alsqs = al.getSequences(); @@ -1021,18 +914,11 @@ public class SequenceFetcher extends JPanel implements Runnable } } - if (preferredFeatureColours != null) - { - af.getViewport().applyFeaturesStyle(preferredFeatureColours); - } + af.getViewport().applyFeaturesStyle(preferredFeatureColours); if (Cache.getDefault("HIDE_INTRONS", true)) { af.hideFeatureColumns(SequenceOntologyI.EXON, false); } - if (newAlframes != null) - { - newAlframes.add(af); - } Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); @@ -1080,15 +966,6 @@ public class SequenceFetcher extends JPanel implements Runnable } /** - * Make this panel visible (after a selection has been made in the database - * chooser) - */ - void showPanel() - { - frame.setVisible(true); - } - - /** * Hide this panel (on clicking the database button to open the database * chooser) */ @@ -1097,8 +974,23 @@ public class SequenceFetcher extends JPanel implements Runnable frame.setVisible(false); } - public void setDatabaseChooserVisible(boolean b) + public void setQuery(String ids) + { + textArea.setText(ids); + } + + /** + * 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 + */ + public void embedIn(GFTSPanel parentPanel) { - databaseButt.setVisible(b); + database.setVisible(false); + backBtn.setVisible(true); + parentSearchPanel = parentPanel; } }