X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=58650cbc3768d7d7545c8b615cb820b3c7c6befc;hb=27f51f19a31e2d2cb3543ae858b248c91c1e9428;hp=c60355c6554497a5e37407297d1167d75f078c1a;hpb=d3fb461d66f67625686387cb75f6e9589510a577;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index c60355c..58650cb 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.*; @@ -141,7 +142,7 @@ public class AlignFrame } setMenusFromViewport(viewport); - + buildSortByAnnotationScoresMenu(); if (viewport.wrapAlignment) { wrapMenuItem_actionPerformed(null); @@ -911,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 ); } @@ -1310,7 +1312,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(); + SequenceI [] seqs = viewport.getSelectionAsNewSequence(); String[] omitHidden = null; if (viewport.hasHiddenColumns) @@ -1477,7 +1479,7 @@ public class AlignFrame if (newAlignment) { - + if (Desktop.jalviewClipboard != null) { // dataset is inherited @@ -1503,10 +1505,10 @@ public class AlignFrame // an existing alignment Vector newDs = (importDs) ? new Vector() : null; // used to create // minimum dataset set - + for (int i = 0; i < sequences.length; i++) { - if (importDs) + if (importDs) { newDs.addElement(null); } @@ -1516,7 +1518,7 @@ public class AlignFrame { if (!newDs.contains(ds)) { - newDs.setElementAt(ds, i); + newDs.setElementAt(ds, i); ds = new Sequence(ds); // update with new dataset sequence sequences[i].setDatasetSequence(ds); @@ -1581,7 +1583,7 @@ public class AlignFrame alignment.setAnnotationIndex(sequences[i].getAnnotation()[a], a); } - + } } if (!newAlignment) { @@ -1590,6 +1592,7 @@ public class AlignFrame if (annotationAdded) { alignPanel.annotationPanel.adjustPanelHeight(); + buildSortByAnnotationScoresMenu(); } viewport.firePropertyChange("alignment", null, alignment.getSequences()); } else { @@ -1610,7 +1613,7 @@ public class AlignFrame //>>>This is a fix for the moment, until a better solution is found!!<<< af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings( alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); - + // TODO: maintain provenance of an alignment, rather than just make the title a concatenation of operations. if (!externalPaste) { if (title.startsWith("Copied sequences")) @@ -2266,6 +2269,65 @@ public class AlignFrame alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected()); } + public void alignmentProperties() + { + JEditorPane editPane = new JEditorPane("text/html",""); + editPane.setEditable(false); + StringBuffer contents = new StringBuffer(""); + + 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! * @@ -2772,7 +2834,6 @@ public class AlignFrame alignPanel.paintAlignment(true); } - /** * DOCUMENT ME! * @@ -2990,6 +3051,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. @@ -3356,7 +3476,7 @@ public class AlignFrame alignPanel.av.getSequenceSelection(), alignPanel.alignFrame).fetchDBRefs(false); } - + }); } @@ -3560,6 +3680,7 @@ public void drop(DropTargetDropEvent evt) { // (isAnnotation) alignPanel.adjustAnnotationHeight(); + buildSortByAnnotationScoresMenu(); } } @@ -3601,6 +3722,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