X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=3c74f4347cc2e129bdea98fff61cc6d43883b9e1;hb=5c57814f95e73a63e012479651b919fdc4099f53;hp=37b95b2baa2bbbbd53d77d5d104095b921a14a34;hpb=4fac6a234220f9867e206207839c628438e66bab;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 37b95b2..3c74f43 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -28,6 +28,7 @@ import java.awt.dnd.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; +import javax.swing.event.MenuEvent; import jalview.analysis.*; import jalview.commands.*; @@ -112,8 +113,6 @@ public class AlignFrame void init() { - this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); - if (viewport.conservation == null) { BLOSUM62Colour.setEnabled(false); @@ -137,12 +136,13 @@ public class AlignFrame if (Desktop.desktop != null) { + this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); addServiceListeners(); setGUINucleotide(viewport.alignment.isNucleotide()); } setMenusFromViewport(viewport); - + buildSortByAnnotationScoresMenu(); if (viewport.wrapAlignment) { wrapMenuItem_actionPerformed(null); @@ -170,12 +170,15 @@ public class AlignFrame { public void keyPressed(KeyEvent evt) { - if (viewport.cursorMode - && evt.getKeyCode() >= KeyEvent.VK_0 - && evt.getKeyCode() <= KeyEvent.VK_9) - { + if (viewport.cursorMode && + ( (evt.getKeyCode() >= KeyEvent.VK_0 && + evt.getKeyCode() <= KeyEvent.VK_9) + || + (evt.getKeyCode() >= KeyEvent.VK_NUMPAD0 && + evt.getKeyCode() <= KeyEvent.VK_NUMPAD9) + ) + && Character.isDigit(evt.getKeyChar())) alignPanel.seqPanel.numberPressed(evt.getKeyChar()); - } switch (evt.getKeyCode()) { @@ -849,7 +852,7 @@ public class AlignFrame */ protected void htmlMenuItem_actionPerformed(ActionEvent e) { - new HTMLOutput(viewport, + new HTMLOutput(alignPanel, alignPanel.seqPanel.seqCanvas.getSequenceRenderer(), alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); } @@ -909,7 +912,8 @@ public class AlignFrame new AnnotationExporter().exportAnnotations( alignPanel, viewport.showAnnotation ? viewport.alignment.getAlignmentAnnotation() : null, - viewport.alignment.getGroups() + viewport.alignment.getGroups(), + ((Alignment)viewport.alignment).alignmentProperties ); } @@ -957,9 +961,12 @@ public class AlignFrame for (int i = 0; i < alignPanels.size(); i++) { AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i); + jalview.structure.StructureSelectionManager.getStructureSelectionManager() + .removeStructureViewerListener(ap.seqPanel, null); PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas); PaintRefresher.RemoveComponent(ap.idPanel.idCanvas); PaintRefresher.RemoveComponent(ap); + ap.av.alignment = null; } } else @@ -970,6 +977,7 @@ public class AlignFrame PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas); PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas); PaintRefresher.RemoveComponent(alignPanel); + viewport.alignment = null; alignPanel = null; viewport = null; @@ -1041,8 +1049,28 @@ public class AlignFrame } } - - + /** + * + * @return alignment objects for all views + */ + AlignmentI[] getViewAlignments() + { + if (alignPanels!=null) + { + Enumeration e = alignPanels.elements(); + AlignmentI[] als = new AlignmentI[alignPanels.size()]; + for (int i=0; e.hasMoreElements(); i++) + { + als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment(); + } + return als; + } + if (viewport!=null) + { + return new AlignmentI[] { viewport.alignment }; + } + return null; + } /** * DOCUMENT ME! * @@ -1050,9 +1078,11 @@ public class AlignFrame */ protected void undoMenuItem_actionPerformed(ActionEvent e) { + if (viewport.historyList.empty()) + return; CommandI command = (CommandI)viewport.historyList.pop(); viewport.redoList.push(command); - command.undoCommand(); + command.undoCommand(getViewAlignments()); AlignViewport originalSource = getOriginatingSource(command); updateEditMenuBar(); @@ -1080,7 +1110,7 @@ public class AlignFrame CommandI command = (CommandI) viewport.redoList.pop(); viewport.historyList.push(command); - command.doCommand(); + command.doCommand(getViewAlignments()); AlignViewport originalSource = getOriginatingSource(command); updateEditMenuBar(); @@ -1303,7 +1333,7 @@ public class AlignFrame { return; } - + // TODO: preserve the ordering of displayed alignment annotation in any internal paste (particularly sequence associated annotation) SequenceI [] seqs = viewport.getSelectionAsNewSequence(); String[] omitHidden = null; @@ -1401,6 +1431,7 @@ public class AlignFrame */ void paste(boolean newAlignment) { + boolean externalPaste=true; try { Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); @@ -1443,102 +1474,174 @@ public class AlignFrame } SequenceI[] sequences; - + boolean annotationAdded = false; + AlignmentI alignment = null; if(Desktop.jalviewClipboard!=null) { // The clipboard was filled from within Jalview, we must use the sequences // And dataset from the copied alignment - sequences = (SequenceI[])Desktop.jalviewClipboard[0]; + SequenceI[] newseq = (SequenceI[])Desktop.jalviewClipboard[0]; + // be doubly sure that we create *new* sequence objects. + sequences = new SequenceI[newseq.length]; + for (int i=0;i"); + + float avg = 0; + int min=Integer.MAX_VALUE, max=0; + for(int i=0; imax) + max = size; + if(sizeSequences: "+ viewport.alignment.getHeight()); + contents.append("
Minimum Sequence Length: "+min); + contents.append("
Maximum Sequence Length: "+max); + contents.append("
Average Length: "+(int)avg); + + if (((Alignment)viewport.alignment).getProperties() != null) + { + Hashtable props = ((Alignment)viewport.alignment).getProperties(); + Enumeration en = props.keys(); + contents.append("

"); + while(en.hasMoreElements()) + { + String key = en.nextElement().toString(); + StringBuffer val = new StringBuffer(); + String vals = props.get(key).toString(); + int pos=0, npos; + do { + npos = vals.indexOf("\n",pos); + if (npos==-1) + { + val.append(vals.substring(pos)); + } else { + val.append(vals.substring(pos, npos)); + val.append("
"); + } + pos = npos+1; + } while (npos!=-1); + contents.append(""); + } + contents.append("
"+key+""+val+"
"); + } + editPane.setText(contents.toString()+""); + JInternalFrame frame = new JInternalFrame(); + frame.getContentPane().add(new JScrollPane(editPane)); + + Desktop.instance.addInternalFrame(frame,"Alignment Properties: "+getTitle(),500,400); + } + + /** * DOCUMENT ME! * @@ -2714,7 +2880,6 @@ public class AlignFrame alignPanel.paintAlignment(true); } - /** * DOCUMENT ME! * @@ -2932,6 +3097,65 @@ public class AlignFrame } }); } + /** + * Add a new sort by annotation score menu item + * @param sort the menu to add the option to + * @param scoreLabel the label used to retrieve scores for each sequence on the alignment + */ + public void addSortByAnnotScoreMenuItem(JMenu sort, final String scoreLabel) + { + final JMenuItem item = new JMenuItem(scoreLabel); + sort.add(item); + item.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray(); + AlignmentSorter.sortByAnnotationScore(scoreLabel, viewport.getAlignment()); + addHistoryItem(new OrderCommand("Sort by "+scoreLabel, oldOrder, viewport.alignment)); + alignPanel.paintAlignment(true); + } + }); + } + /** + * last hash for alignment's annotation array - used to minimise cost of rebuild. + */ + protected int _annotationScoreVectorHash; + /** + * search the alignment and rebuild the sort by annotation score submenu + * the last alignment annotation vector hash is stored to minimize + * cost of rebuilding in subsequence calls. + * + */ + public void buildSortByAnnotationScoresMenu() + { + if (viewport.alignment.getAlignmentAnnotation().hashCode()!=_annotationScoreVectorHash) + { + sortByAnnotScore.removeAll(); + // almost certainly a quicker way to do this - but we keep it simple + Hashtable scoreSorts=new Hashtable(); + AlignmentAnnotation aann[]; + Enumeration sq = viewport.alignment.getSequences().elements(); + while (sq.hasMoreElements()) + { + aann = ((SequenceI) sq.nextElement()).getAnnotation(); + for (int i=0;aann!=null && i0); + scoreSorts.clear(); + } + } /** * Maintain the Order by->Displayed Tree menu. @@ -3261,7 +3485,7 @@ public class AlignFrame } wsmenu.add(secstrmenu); } - this.webService.removeAll(); + resetWebServiceMenu(); for (int i = 0, j = wsmenu.size(); i < j; i++) { webService.add( (JMenu) wsmenu.get(i)); @@ -3269,7 +3493,7 @@ public class AlignFrame } else { - this.webService.removeAll(); + resetWebServiceMenu(); this.webService.add(this.webServiceNoServices); } // TODO: add in rediscovery function @@ -3277,6 +3501,31 @@ public class AlignFrame // TODO: group services by location as well as function. } + + /** + * empty the web service menu and add any ad-hoc functions + * not dynamically discovered. + * + */ + private void resetWebServiceMenu() + { + 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"); + webService.add(rfetch); + rfetch.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) + { + new jalview.io.DBRefFetcher( + alignPanel.av.getSequenceSelection(), + alignPanel.alignFrame).fetchDBRefs(false); + } + + }); + } + /* public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. @@ -3298,13 +3547,12 @@ public class AlignFrame - public void showTranslation_actionPerformed(ActionEvent e) { /////////////////////////////// // Collect Data to be translated/transferred - SequenceI [] selection = viewport.getSelectionAsNewSequence(); + SequenceI [] selection = viewport.getSequenceSelection(); String [] seqstring = viewport.getViewAsString(true); AlignmentI al = null; try { @@ -3478,6 +3726,7 @@ public void drop(DropTargetDropEvent evt) { // (isAnnotation) alignPanel.adjustAnnotationHeight(); + buildSortByAnnotationScoresMenu(); } } @@ -3519,6 +3768,19 @@ public void drop(DropTargetDropEvent evt) { return viewport; } + + + /** + * Open the dialog for regex description parsing. + */ + 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) + { + buildSortByAnnotationScoresMenu(); + } + } } class PrintThread