From 92f7b5ee3bbdb5456d498f1c2780d90420491342 Mon Sep 17 00:00:00 2001 From: jprocter Date: Tue, 24 Apr 2012 16:37:28 +0100 Subject: [PATCH] JAL-1075, JAL-1061, JAL-1064 - introduced second tier of 'fetch database' menu hierarchy for source groups like Ensembl (fetch all or submenu for individual fetch). Also shortened width of menu entries so that user can browse the hierarchy more easily. --- src/jalview/gui/AlignFrame.java | 168 ++++++++++++++++++++++++++++------- src/jalview/ws/SequenceFetcher.java | 80 ++++++++++++++++- 2 files changed, 215 insertions(+), 33 deletions(-) diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 3ca7d05..9b571f2 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -73,9 +73,9 @@ import jalview.schemes.TaylorColourScheme; import jalview.schemes.TurnColourScheme; import jalview.schemes.UserColourScheme; import jalview.schemes.ZappoColourScheme; -import jalview.ws.WSMenuEntryProviderI; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; +import jalview.ws.seqfetcher.DbSourceProxy; import java.awt.BorderLayout; import java.awt.Color; @@ -106,6 +106,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; +import java.util.List; import java.util.Vector; import javax.swing.JButton; @@ -4099,12 +4100,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, wsmenu.add(secstrmenu); wsmenu.add(dismenu); wsmenu.add(analymenu); -// final ArrayList submens=new ArrayList(); -// submens.add(msawsmenu); - // submens.add(secstrmenu); - // submens.add(dismenu); - // submens.add(analymenu); - + // final ArrayList submens=new ArrayList(); + // submens.add(msawsmenu); + // submens.add(secstrmenu); + // submens.add(dismenu); + // submens.add(analymenu); + // No search services yet // wsmenu.add(seqsrchmenu); @@ -4943,31 +4944,45 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { final jalview.ws.SequenceFetcher sf = SequenceFetcher .getSequenceFetcherSingleton(me); - final String[] otherdb = sf.getOrderedSupportedSources(); - // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); - // jalview.util.QuickSort.sort(otherdb, otherdb); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { - + String[] dbclasses = sf.getOrderedSupportedSources(); + // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); + // jalview.util.QuickSort.sort(otherdb, otherdb); + List otherdb; JMenu dfetch = new JMenu(); - JMenuItem fetchr; - rfetch.add(dfetch); - int comp = 0, mcomp = 15; + JMenu ifetch = new JMenu(); + JMenuItem fetchr = null; + int comp = 0, icomp = 0, mcomp = 15; String mname = null; - if (otherdb != null && otherdb.length > 0) + int dbi = 0; + for (String dbclass : dbclasses) { - for (int i = 0; i < otherdb.length; i++) + otherdb = sf.getSourceProxy(dbclass); + // add a single entry for this class, or submenu allowing 'fetch + // all' or pick one + if (otherdb == null || otherdb.size() < 1) { - String dbname = sf.getSourceProxy(otherdb[i]).get(0).getDbName(); - if (mname == null) - { - mname = "from '" + dbname + "'"; - } - fetchr = new JMenuItem(otherdb[i]); - final String[] dassource = new String[] - { otherdb[i] }; + continue; + } + // List dbs=otherdb; + // otherdb=new ArrayList(); + // for (DbSourceProxy db:dbs) + // { + // if (!db.isA(DBRefSource.ALIGNMENTDB) + // } + if (mname == null) + { + mname = "From " + dbclass; + } + if (otherdb.size() == 1) + { + final DbSourceProxy[] dassource = otherdb + .toArray(new DbSourceProxy[0]); + DbSourceProxy src = otherdb.get(0); + fetchr = new JMenuItem(src.getDbSource()); fetchr.addActionListener(new ActionListener() { @@ -4987,17 +5002,108 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } }); - fetchr.setToolTipText("Retrieve from " + dbname); + fetchr.setToolTipText("" + + JvSwingUtils.wrapTooltip("Retrieve from " + + src.getDbName()) + ""); + dfetch.add(fetchr); + comp++; + } + else + { + final DbSourceProxy[] dassource = otherdb + .toArray(new DbSourceProxy[0]); + // fetch all entry + DbSourceProxy src = otherdb.get(0); + fetchr = new JMenuItem("Fetch All '" + src.getDbSource() + + "'"); + fetchr.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + + public void run() + { + new jalview.ws.DBRefFetcher(alignPanel.av + .getSequenceSelection(), + alignPanel.alignFrame, dassource) + .fetchDBRefs(false); + } + }).start(); + } + }); + + fetchr.setToolTipText("" + + JvSwingUtils.wrapTooltip("Retrieve from all " + + otherdb.size() + " sources in " + + src.getDbSource() + "
First is :" + + src.getDbName()) + ""); dfetch.add(fetchr); - if (comp++ == mcomp || i == (otherdb.length - 1)) + comp++; + // and then build the rest of the individual menus + ifetch = new JMenu("Sources from " + src.getDbSource()); + icomp = 0; + String imname = null; + int i = 0; + for (DbSourceProxy sproxy : otherdb) { - dfetch.setText(mname + " to '" + dbname + "'"); - rfetch.add(dfetch); - dfetch = new JMenu(); - mname = null; - comp = 0; + String dbname = sproxy.getDbName(); + String sname = dbname.length() > 5 ? dbname.substring(0, + 5) + "..." : dbname; + String msname = dbname.length() > 10 ? dbname.substring( + 0, 10) + "..." : dbname; + if (imname == null) + { + imname = "from '" + sname + "'"; + } + fetchr = new JMenuItem(msname); + final DbSourceProxy[] dassrc = + { sproxy }; + fetchr.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + + public void run() + { + new jalview.ws.DBRefFetcher(alignPanel.av + .getSequenceSelection(), + alignPanel.alignFrame, dassrc) + .fetchDBRefs(false); + } + }).start(); + } + + }); + fetchr.setToolTipText("" + + JvSwingUtils.wrapTooltip("Retrieve from " + + dbname) + ""); + ifetch.add(fetchr); + ++i; + if (++icomp >= mcomp || i == (otherdb.size())) + { + ifetch.setText(imname + " to '" + sname + "'"); + dfetch.add(ifetch); + ifetch = new JMenu(); + imname = null; + icomp = 0; + comp++; + } } } + ++dbi; + if (comp >= mcomp || dbi >= (dbclasses.length)) + { + dfetch.setText(mname + " to '" + dbclass + "'"); + rfetch.add(dfetch); + dfetch = new JMenu(); + mname = null; + comp = 0; + } } } }); diff --git a/src/jalview/ws/SequenceFetcher.java b/src/jalview/ws/SequenceFetcher.java index 077ce14..b1d3f3c 100644 --- a/src/jalview/ws/SequenceFetcher.java +++ b/src/jalview/ws/SequenceFetcher.java @@ -22,6 +22,7 @@ import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefSource; import jalview.datamodel.SequenceI; import jalview.ws.dbsources.das.api.jalviewSourceI; +import jalview.ws.dbsources.das.datamodel.DasSequenceSource; import jalview.ws.seqfetcher.ASequenceFetcher; import jalview.ws.seqfetcher.DbSourceProxy; @@ -63,12 +64,86 @@ public class SequenceFetcher extends ASequenceFetcher } /** - * return an ordered list of database sources suitable for using in a GUI - * element + * return an ordered list of database sources where non-das database classes + * appear before das database classes */ public String[] getOrderedSupportedSources() { String[] srcs = this.getSupportedDb(); + ArrayList dassrc = new ArrayList(), nondas = new ArrayList(); + for (int i = 0; i < srcs.length; i++) + { + boolean das = false,skip=false; + String nm; + for (DbSourceProxy dbs : getSourceProxy(srcs[i])) + { + // Skip the alignment databases for the moment - they're not useful for verifying a single sequence against its reference source + if (dbs.isA(DBRefSource.ALIGNMENTDB)) + { + skip=true; + } else { + nm = dbs.getDbName(); + if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) + { + if (nm.startsWith("das:")) + { + nm = nm.substring(4); + das = true; + } + break; + } + } + } + if (skip) + { + continue; + } + if (das) + { + dassrc.add(srcs[i]); + } + else + { + nondas.add(srcs[i]); + } + } + String[] tosort = nondas.toArray(new String[0]), sorted = nondas + .toArray(new String[0]); + for (int j = 0, jSize = sorted.length; j < jSize; j++) + { + tosort[j] = tosort[j].toLowerCase(); + } + jalview.util.QuickSort.sort(tosort, sorted); + // construct array with all sources listed + + srcs = new String[sorted.length + dassrc.size()]; + int i = 0; + for (int j = sorted.length - 1; j >= 0; j--, i++) + { + srcs[i] = sorted[j]; + sorted[j] = null; + } + + sorted = dassrc.toArray(new String[0]); + tosort = dassrc.toArray(new String[0]); + for (int j = 0, jSize = sorted.length; j < jSize; j++) + { + tosort[j] = tosort[j].toLowerCase(); + } + jalview.util.QuickSort.sort(tosort, sorted); + for (int j = sorted.length - 1; j >= 0; j--, i++) + { + srcs[i] = sorted[j]; + } + return srcs; + } + + /** + * return plaintext databse list suitable for using in a GUI element + */ + public String[] _getOrderedSupportedSources() + { + String[] srcs = this.getSupportedDb(); ArrayList dassrc = new ArrayList(), nondas = new ArrayList(); for (int i = 0; i < srcs.length; i++) { @@ -347,4 +422,5 @@ public class SequenceFetcher extends ASequenceFetcher } } } + } -- 1.7.10.2