X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=3aa69f17b59595c56470aad0a325b44c9ff4b360;hb=a581135c768ce6c60c38bbd47003477f8c557eea;hp=1c488fe5ec722791e505443576a939411eaf2d9f;hpb=198a4921d78d176afc0cb709bdbcb4627afd1e8b;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 1c488fe..3aa69f1 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,19 +1,19 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) + * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * * 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 Softwarechang + * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.gui; @@ -45,7 +45,7 @@ import jalview.ws.*; * @version $Revision$ */ public class AlignFrame - extends GAlignFrame implements DropTargetListener + extends GAlignFrame implements DropTargetListener, IProgressIndicator { /** DOCUMENT ME!! */ public static final int DEFAULT_WIDTH = 700; @@ -68,6 +68,8 @@ public class AlignFrame */ String fileName = null; + + /** * Creates a new AlignFrame object. @@ -160,7 +162,12 @@ public class AlignFrame addKeyListener(); } - + /** + * Change the filename and format for the alignment, and + * enable the 'reload' button functionality. + * @param file valid filename + * @param format format of file + */ public void setFileName(String file, String format) { fileName = file; @@ -508,11 +515,17 @@ public class AlignFrame { calculateMenu.remove(calculateMenu.getItemCount()-2); } - setShowProductsEnabled(); } - + /** + * set up menus for the currently viewport. + * This may be called after any operation that affects the data in the current view (selection changed, etc) to update the menus to reflect the new state. + */ + public void setMenusForViewport() + { + setMenusFromViewport(viewport); + } /** * Need to call this method when tabs are selected for multiple views, * or when loading from Jalview2XML.java @@ -526,6 +539,7 @@ public class AlignFrame conservationMenuItem.setSelected(av.getConservationSelected()); seqLimits.setSelected(av.getShowJVSuffix()); idRightAlign.setSelected(av.rightAlignIds); + centreColumnLabelsMenuItem.setState(av.centreColumnLabels); renderGapsMenuItem.setSelected(av.renderGaps); wrapMenuItem.setSelected(av.wrapAlignment); scaleAbove.setVisible(av.wrapAlignment); @@ -542,11 +556,16 @@ public class AlignFrame hiddenMarkers.setState(av.showHiddenMarkers); applyToAllGroups.setState(av.colourAppliesToAllGroups); + setShowProductsEnabled(); + updateEditMenuBar(); } Hashtable progressBars; + /* (non-Javadoc) + * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long) + */ public void setProgressBar(String message, long id) { if(progressBars == null) @@ -584,7 +603,8 @@ public class AlignFrame progressBars.put(new Long(id), progressPanel); } - + // update GUI + setMenusForViewport(); validate(); } /** @@ -683,7 +703,7 @@ public class AlignFrame public void save_actionPerformed(ActionEvent e) { if(fileName==null - || currentFileFormat==null + || (currentFileFormat==null || jalview.io.AppletFormatAdapter.isValidFormat(currentFileFormat, true)) || fileName.startsWith("http") ) { @@ -765,8 +785,18 @@ public class AlignFrame } else - { - + { + if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true)) + { + // JBPNote need to have a raise_gui flag here + JOptionPane.showInternalMessageDialog( + this, "Cannot save file " + fileName + " using format "+format, + "Alignment output format not supported", + JOptionPane.WARNING_MESSAGE); + saveAs_actionPerformed(null); + return false; + } + String[] omitHidden = null; if (viewport.hasHiddenColumns) @@ -783,7 +813,6 @@ public class AlignFrame } } FormatAdapter f = new FormatAdapter(); - String output = f.formatSequences( format, (Alignment) viewport.alignment, // class cast exceptions will occur in the distant future @@ -1379,20 +1408,7 @@ public class AlignFrame } catch (OutOfMemoryError er) { - er.printStackTrace(); - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - public void run() - { - javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop, - "Out of memory copying region!!" - + - "\nSee help files for increasing Java Virtual Machine memory." - , "Out of memory", - javax.swing.JOptionPane.WARNING_MESSAGE); - } - }); - + new OOMWarning("copying region", er); return; } @@ -1442,9 +1458,9 @@ public class AlignFrame } /** - * DOCUMENT ME! + * Paste contents of Jalview clipboard * - * @param newAlignment DOCUMENT ME! + * @param newAlignment true to paste to a new alignment, otherwise add to this. */ void paste(boolean newAlignment) { @@ -1473,20 +1489,7 @@ public class AlignFrame } catch (OutOfMemoryError er) { - er.printStackTrace(); - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - public void run() - { - javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop, - "Out of memory pasting sequences!!" - + - "\nSee help files for increasing Java Virtual Machine memory." - , "Out of memory", - javax.swing.JOptionPane.WARNING_MESSAGE); - } - }); - + new OOMWarning("Out of memory pasting sequences!!", er); return; } @@ -2173,6 +2176,12 @@ public class AlignFrame alignPanel.paintAlignment(true); } + public void centreColumnLabels_actionPerformed(ActionEvent e) + { + viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState(); + alignPanel.paintAlignment(true); + } + /** @@ -3247,7 +3256,7 @@ public class AlignFrame * or just the selected set will be submitted for multiple alignment. * */ - private jalview.datamodel.AlignmentView gatherSequencesForAlignment() + public jalview.datamodel.AlignmentView gatherSequencesForAlignment() { // Now, check we have enough sequences AlignmentView msa = null; @@ -3285,12 +3294,14 @@ public class AlignFrame } /** - * Decides what is submitted to a secondary structure prediction service, - * the currently selected sequence, or the currently selected alignment + * Decides what is submitted to a secondary structure prediction service: + * the first sequence in the alignment, or in the current selection, + * or, if the alignment is 'aligned' (ie padded with gaps), then the + * currently selected region or the whole alignment. * (where the first sequence in the set is the one that the prediction * will be for). */ - AlignmentView gatherSeqOrMsaForSecStrPrediction() + public AlignmentView gatherSeqOrMsaForSecStrPrediction() { AlignmentView seqs = null; @@ -3431,17 +3442,19 @@ public class AlignFrame public void BuildWebServiceMenu() { // TODO: add support for context dependent disabling of services based on alignment and current selection - // TODO: refactor to allow list of AbstractName/Handler bindings to be stored or retrieved from elsewhere // TODO: add additional serviceHandle parameter to specify abstract handler class independently of AbstractName // TODO: add in rediscovery GUI function to restart discoverer // TODO: group services by location as well as function and/or introduce object broker mechanism. if ( (Discoverer.services != null) && (Discoverer.services.size() > 0)) { + // TODO: refactor to allow list of AbstractName/Handler bindings to be stored or retrieved from elsewhere Vector msaws = (Vector) Discoverer.services.get("MsaWS"); Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred"); + Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch"); + // TODO: move GUI generation code onto service implementation - so a client instance attaches itself to the GUI with method call like jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance, alignframe) Vector wsmenu = new Vector(); - final AlignFrame af = this; + final IProgressIndicator af = this; if (msaws != null) { // Add any Multiple Sequence Alignment Services @@ -3450,42 +3463,9 @@ public class AlignFrame { final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws. get(i); - final JMenuItem method = new JMenuItem(sh.getName()); - method.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AlignmentView msa = gatherSequencesForAlignment(); - new jalview.ws.MsaWSClient(sh, title, msa, - false, true, - viewport.getAlignment().getDataset(), - af); - - } - - }); - msawsmenu.add(method); - // Deal with services that we know accept partial alignments. - if (sh.getName().indexOf("lustal") > -1) - { - // We know that ClustalWS can accept partial alignments for refinement. - final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign"); - methodR.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AlignmentView msa = gatherSequencesForAlignment(); - new jalview.ws.MsaWSClient(sh, title, msa, - true, true, - viewport.getAlignment().getDataset(), - af); - - } - - }); - msawsmenu.add(methodR); - - } + jalview.ws.WSClient impl = jalview.ws.Discoverer.getServiceClient(sh); + impl.attachWSMenuEntry(msawsmenu, this); + } wsmenu.add(msawsmenu); } @@ -3497,32 +3477,25 @@ public class AlignFrame { final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr.get(i); - final JMenuItem method = new JMenuItem(sh.getName()); - method.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AlignmentView msa = gatherSeqOrMsaForSecStrPrediction(); - if (msa.getSequences().length == 1) - { - // Single Sequence prediction - new jalview.ws.JPredClient(sh, title, false, msa, af, true); - } - else - { - if (msa.getSequences().length > 1) - { - // Sequence profile based prediction - new jalview.ws.JPredClient(sh, - title, true, msa, af, true); - } - } - } - }); - secstrmenu.add(method); + jalview.ws.WSClient impl = jalview.ws.Discoverer.getServiceClient(sh); + impl.attachWSMenuEntry(secstrmenu, this); } wsmenu.add(secstrmenu); } + if (seqsrch!=null) + { + // Add any sequence search services + final JMenu seqsrchmenu = new JMenu("Sequence Database Search"); + for (int i = 0, j = seqsrch.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) + seqsrch.elementAt(i); + jalview.ws.WSClient impl = jalview.ws.Discoverer.getServiceClient(sh); + impl.attachWSMenuEntry(seqsrchmenu, this); + } + // finally, add the whole shebang onto the webservices menu + wsmenu.add(seqsrchmenu); + } resetWebServiceMenu(); for (int i = 0, j = wsmenu.size(); i < j; i++) { @@ -3547,15 +3520,22 @@ public class AlignFrame webService.removeAll(); // Temporary hack - DBRef Fetcher always top level ws entry. JMenuItem rfetch = new JMenuItem("Fetch DB References"); - rfetch.setToolTipText("Retrieve and parse uniprot records for the alignment or the currently selected sequences"); + rfetch.setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences"); webService.add(rfetch); rfetch.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - new jalview.ws.DBRefFetcher( - alignPanel.av.getSequenceSelection(), - alignPanel.alignFrame).fetchDBRefs(false); + new Thread(new Runnable() { + + public void run() + { + new jalview.ws.DBRefFetcher( + alignPanel.av.getSequenceSelection(), + alignPanel.alignFrame).fetchDBRefs(false); + } + }).start(); + } }); @@ -3623,7 +3603,7 @@ public class AlignFrame public void actionPerformed(ActionEvent e) { // TODO: new thread for this call with vis-delay - af.showProductsFor(sel, ds, isRegSel, dna, source); + af.showProductsFor(af.viewport.getSequenceSelection(), ds, isRegSel, dna, source); } }); @@ -3685,6 +3665,9 @@ protected void showProductsFor(SequenceI[] sel, Alignment ds, boolean isRegSel, { jalview.bin.Cache.log.error("Exception when finding crossreferences",e); } + catch (OutOfMemoryError e) { + new OOMWarning("whilst fetching crossreferences", e); + } catch (Error e) { jalview.bin.Cache.log.error("Error when finding crossreferences",e); @@ -3924,6 +3907,7 @@ public void drop(DropTargetDropEvent evt) { alignPanel.adjustAnnotationHeight(); + viewport.updateSequenceIdColours(); buildSortByAnnotationScoresMenu(); alignPanel.paintAlignment(true); } @@ -3974,8 +3958,9 @@ public void drop(DropTargetDropEvent evt) protected void extractScores_actionPerformed(ActionEvent e) { ParseProperties pp = new jalview.analysis.ParseProperties(viewport.alignment); - if (pp.getScoresFromDescription("col", "score column ", "\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)")>0) - { + // TODO: verify regex and introduce GUI dialog for version 2.5 + //if (pp.getScoresFromDescription("col", "score column ", "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)", true)>0) + if (pp.getScoresFromDescription("description column", "score in description column ", "\\W*([-+eE0-9.]+)", true)>0) { buildSortByAnnotationScoresMenu(); } }