X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=cc57961160589c5068f7df08939f9a45573cb9ef;hb=3f8dab9bfe7202a4a83a86052bcfe18f12f138a2;hp=4b28166e395d450b8cf487c8085a3315a8915d30;hpb=8da7acff9214ddaf0e6d28e76219ab51bd38e62d;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 4b28166..cc57961 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -27,7 +27,6 @@ import java.awt.datatransfer.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; -import javax.swing.event.*; import jalview.analysis.*; import jalview.datamodel.*; @@ -35,6 +34,8 @@ import jalview.io.*; import jalview.jbgui.*; import jalview.schemes.*; import jalview.ws.*; +import java.awt.dnd.*; +import org.biojava.dasobert.eventmodel.*; /** * DOCUMENT ME! @@ -43,15 +44,15 @@ import jalview.ws.*; * @version $Revision$ */ public class AlignFrame - extends GAlignFrame + extends GAlignFrame implements DropTargetListener, FeatureListener { /** DOCUMENT ME!! */ public static final int NEW_WINDOW_WIDTH = 700; /** DOCUMENT ME!! */ public static final int NEW_WINDOW_HEIGHT = 500; - final AlignmentPanel alignPanel; - final AlignViewport viewport; + AlignmentPanel alignPanel; + AlignViewport viewport; /** DOCUMENT ME!! */ public String currentFileFormat = null; @@ -59,6 +60,7 @@ public class AlignFrame Stack redoList = new Stack(); private int treeCount = 0; + /** * Creates a new AlignFrame object. * @@ -66,15 +68,23 @@ public class AlignFrame */ public AlignFrame(AlignmentI al) { + viewport = new AlignViewport(al); + this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); + + if(viewport.vconsensus==null) + { + //Out of memory calculating consensus. + BLOSUM62Colour.setEnabled(false); + PIDColour.setEnabled(false); + conservationMenuItem.setEnabled(false); + modifyConservation.setEnabled(false); + abovePIDThreshold.setEnabled(false); + modifyPID.setEnabled(false); + } + alignPanel = new AlignmentPanel(this, viewport); - alignPanel.annotationPanel.adjustPanelHeight(); - alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel. - annotationPanel.getPreferredSize()); - alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel. - getPreferredSize()); - alignPanel.setAnnotationVisible(viewport.getShowAnnotation()); String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort"); @@ -83,7 +93,26 @@ public class AlignFrame else if(sortby.equals("Pairwise Identity")) sortPairwiseMenuItem_actionPerformed(null); - getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER); + // remove(tabbedPane); + getContentPane().add(alignPanel, BorderLayout.CENTER); + + + + // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel); + + ///Dataset tab + ///////////////////////// + if(al.getDataset()==null) + { + al.setDataset(null); + } + // AlignViewport ds = new AlignViewport(al.getDataset(), true); + // AlignmentPanel dap = new AlignmentPanel(this, ds); + // tabbedPane.add("Dataset", dap); + // viewports.add(ds); + // alignPanels.add(dap); + ///////////////////////// + viewport.addPropertyChangeListener(new PropertyChangeListener() { @@ -96,7 +125,25 @@ public class AlignFrame } }); - addServiceListeners(); + + if (Desktop.desktop != null) + { + addServiceListeners(); + setGUINucleotide(al.isNucleotide()); + } + + + if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false)) + { + wrapMenuItem.setSelected(true); + wrapMenuItem_actionPerformed(null); + } + + } + + public AlignViewport getViewport() + { + return viewport; } /* Set up intrinsic listeners for dynamically generated GUI bits. */ @@ -130,71 +177,108 @@ public class AlignFrame } ; }); + } + public void setGUINucleotide(boolean nucleotide) + { + showTranslation.setVisible( nucleotide ); + //sequenceFeatures.setVisible(!nucleotide ); + //featureSettings.setVisible( !nucleotide ); + conservationMenuItem.setVisible( !nucleotide ); + modifyConservation.setVisible( !nucleotide ); + + //Remember AlignFrame always starts as protein + if(!nucleotide) + { + calculateMenu.remove(calculateMenu.getItemCount()-2); + } } - /** - * DOCUMENT ME! - * - * @param String DOCUMENT ME! - */ + public void comeBackLater(FeatureEvent evt) + {} - public void parseGroupsFile(String file) + public void newFeatures(FeatureEvent evt) { - try + if (evt.getFeatures().length > 0) { - BufferedReader in = new BufferedReader(new FileReader(file)); - SequenceI seq = null; - String line, text, token; - UserColourScheme ucs; - int index, start, end; - StringTokenizer st; - SequenceGroup sg; - while ( (line = in.readLine()) != null) - { - st = new StringTokenizer(line, "\t"); - if (st.countTokens() != 6) - { - System.out.println("Groups file " + file + - " is invalid. Read help file."); - System.exit(1); - } + alignPanel.seqPanel.seqCanvas.fr.featuresAdded(); + alignPanel.repaint(); + if(featureSettings!=null) + featureSettings.setTableData(); + } + } - while (st.hasMoreElements()) - { - text = st.nextToken(); - token = st.nextToken(); - if (!token.equals("ID_NOT_SPECIFIED")) - { - index = viewport.alignment.findIndex(viewport.alignment.findName( - token)); - st.nextToken(); - } - else - { - index = Integer.parseInt(st.nextToken()); - } + Hashtable progressBars; + public void setProgressBar(String message, long id) + { + if(progressBars == null) + progressBars = new Hashtable(); - start = Integer.parseInt(st.nextToken()); - end = Integer.parseInt(st.nextToken()); - ucs = new UserColourScheme(st.nextToken()); + JPanel progressPanel; + GridLayout layout = (GridLayout) statusPanel.getLayout(); + if(progressBars.get( new Long(id) )!=null) + { + progressPanel = (JPanel)progressBars.get( new Long(id) ); + statusPanel.remove(progressPanel); + progressBars.remove( progressPanel ); + progressPanel = null; + if(message!=null) + statusBar.setText(message); + + layout.setRows(layout.getRows() - 1); + } + else + { + progressPanel = new JPanel(new BorderLayout(10, 5)); - seq = viewport.alignment.getSequenceAt(index); - start = seq.findIndex(start) - 1; - end = seq.findIndex(end) - 1; + JProgressBar progressBar = new JProgressBar(); + progressBar.setIndeterminate(true); - sg = new SequenceGroup(text, ucs, true, true, false, start, end); - sg.addSequence(seq, true); + progressPanel.add(new JLabel(message), BorderLayout.WEST); + progressPanel.add(progressBar, BorderLayout.CENTER); - viewport.alignment.addGroup(sg); - } - } + layout.setRows(layout.getRows() + 1); + statusPanel.add(progressPanel); + progressBars.put(new Long(id), progressPanel); } - catch (Exception ex) - { - System.out.println("Error parsing groups file: " + ex); - } + + validate(); + } + + + /* + Added so Castor Mapping file can obtain Jalview Version + */ + public String getVersion() + { + return jalview.bin.Cache.getProperty("VERSION"); + } + + public FeatureRenderer getFeatureRenderer() + { + return alignPanel.seqPanel.seqCanvas.getFeatureRenderer(); + } + + + public void fetchSequence_actionPerformed(ActionEvent e) + { + new SequenceFetcher(this); + } + + public void addFromFile_actionPerformed(ActionEvent e) + { + Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport); + } + + public void addFromText_actionPerformed(ActionEvent e) + { + Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport); + } + + public void addFromURL_actionPerformed(ActionEvent e) + { + Desktop.instance.inputURLMenuItem_actionPerformed(viewport); } /** @@ -205,19 +289,15 @@ public class AlignFrame public void saveAlignmentMenu_actionPerformed(ActionEvent e) { JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. - getProperty( - "LAST_DIRECTORY"), + getProperty( "LAST_DIRECTORY"), new String[] - { - "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc", - "jar" - }, + { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" }, new String[] - { - "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" - }, currentFileFormat); + { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" }, + currentFileFormat, + false); + - chooser.setAcceptAllFileFilterUsed(false); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Save Alignment to file"); chooser.setToolTipText("Save"); @@ -226,7 +306,18 @@ public class AlignFrame if (value == JalviewFileChooser.APPROVE_OPTION) { - currentFileFormat = chooser.getSelectedFormat(); + currentFileFormat = chooser.getSelectedFormat(); + + if (currentFileFormat == null) + { + JOptionPane.showInternalMessageDialog(Desktop.desktop, + "You must select a file format before saving!", + "File format not specified", + JOptionPane.WARNING_MESSAGE); + value = chooser.showSaveDialog(this); + return; + } + jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat); @@ -249,16 +340,33 @@ public class AlignFrame java.io.File.separatorChar) + 1); } - Jalview2XML.SaveAlignment(this, file, shortName); + new Jalview2XML().SaveAlignment(this, file, shortName); // USE Jalview2XML to save this file return true; } else { - String output = FormatAdapter.formatSequences(format, - viewport.getAlignment(). - getSequences()); + + String[] omitHidden = null; + + if (viewport.hasHiddenColumns) + { + int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, + "The Alignment contains hidden columns." + + "\nDo you want to save only the visible alignment?", + "Save / Omit Hidden Columns", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + + if (reply == JOptionPane.YES_OPTION) + omitHidden = viewport.getViewAsString(false); + } + + String output = new FormatAdapter().formatSequences( + format, + viewport.alignment.getSequencesArray(), + omitHidden); + if (output == null) { return false; @@ -271,6 +379,7 @@ public class AlignFrame out.print(output); out.close(); + this.setTitle(file); return true; } catch (Exception ex) @@ -288,13 +397,32 @@ public class AlignFrame */ protected void outputText_actionPerformed(ActionEvent e) { + String [] omitHidden = null; + + if(viewport.hasHiddenColumns) + { + int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, + "The Alignment contains hidden columns." + +"\nDo you want to output only the visible alignment?", + "Save / Omit Hidden Columns", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + + if(reply==JOptionPane.YES_OPTION) + { + omitHidden = viewport.getViewAsString(false); + } + } + CutAndPasteTransfer cap = new CutAndPasteTransfer(); Desktop.addInternalFrame(cap, "Alignment output - " + e.getActionCommand(), 600, 500); - cap.setText(FormatAdapter.formatSequences(e.getActionCommand(), - viewport.getAlignment(). - getSequences())); + + + cap.setText(new FormatAdapter().formatSequences( + e.getActionCommand(), + viewport.alignment.getSequencesArray(), + omitHidden)); } /** @@ -304,7 +432,9 @@ public class AlignFrame */ protected void htmlMenuItem_actionPerformed(ActionEvent e) { - new HTMLOutput(viewport); + new HTMLOutput(viewport, + alignPanel.seqPanel.seqCanvas.getSequenceRenderer(), + alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); } public void createImageMap(File file, String image) @@ -344,6 +474,42 @@ public class AlignFrame thread.start(); } + public void exportFeatures_actionPerformed(ActionEvent e) + { + new AnnotationExporter().exportFeatures(alignPanel); + } + + + public void exportAnnotations_actionPerformed(ActionEvent e) + { + new AnnotationExporter().exportAnnotations( + alignPanel, + viewport.alignment.getAlignmentAnnotation() + ); + } + + + public void associatedData_actionPerformed(ActionEvent e) + { + // Pick the tree file + JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. + getProperty( + "LAST_DIRECTORY")); + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle("Load Jalview Annotations or Features File"); + chooser.setToolTipText("Load Jalview Annotations / Features file"); + + int value = chooser.showOpenDialog(null); + + if (value == JalviewFileChooser.APPROVE_OPTION) + { + String choice = chooser.getSelectedFile().getPath(); + jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); + loadJalviewDataFile(choice); + } + + } + /** * DOCUMENT ME! * @@ -434,42 +600,8 @@ public class AlignFrame // used by undo and redo void restoreHistoryItem(HistoryItem hi) { - if (hi.getType() == HistoryItem.SORT) - { - for (int i = 0; i < hi.getSequences().size(); i++) - { - viewport.alignment.getSequences().setElementAt(hi.getSequences() - .elementAt(i), - i); - } - } - else - { - for (int i = 0; i < hi.getSequences().size(); i++) - { - SequenceI restore = (SequenceI) hi.getSequences().elementAt(i); - - if (restore.getLength() == 0) - { - restore.setSequence(hi.getHidden().elementAt(i).toString()); - viewport.alignment.getSequences().insertElementAt(restore, - hi.getAlignIndex(i)); - } - else - { - restore.setSequence(hi.getHidden().elementAt(i).toString()); - } - } - if (hi.getType() == HistoryItem.PASTE) - { - for (int i = viewport.alignment.getHeight() - 1; - i > (hi.getSequences().size() - 1); i--) - { - viewport.alignment.deleteSequence(i); - } - } - } + hi.restore(); updateEditMenuBar(); @@ -497,14 +629,14 @@ public class AlignFrame { SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.sequences.contains(seq)) + if (!sg.getSequences(false).contains(seq)) { continue; } SequenceI temp = viewport.alignment.getSequenceAt(i - 1); - if (sg.sequences.contains(temp)) + if (sg.getSequences(false).contains(temp)) { continue; } @@ -519,14 +651,14 @@ public class AlignFrame { SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.sequences.contains(seq)) + if (!sg.getSequences(false).contains(seq)) { continue; } SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - if (sg.sequences.contains(temp)) + if (sg.getSequences(false).contains(temp)) { continue; } @@ -539,6 +671,8 @@ public class AlignFrame alignPanel.repaint(); } + + /** * DOCUMENT ME! * @@ -551,71 +685,41 @@ public class AlignFrame return; } - SequenceGroup sg = viewport.getSelectionGroup(); - - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringBuffer buffer = new StringBuffer(); + SequenceI [] seqs = viewport.getSelectionAsNewSequence(); + String[] omitHidden = null; - Hashtable orderedSeqs = new Hashtable(); - - for (int i = 0; i < sg.getSize(); i++) + if (viewport.hasHiddenColumns) { - SequenceI seq = sg.getSequenceAt(i); - int index = viewport.alignment.findIndex(seq); - orderedSeqs.put(index + "", seq); + omitHidden = viewport.getViewAsString(true); } - int index = 0, startRes, endRes; - char ch; - - for (int i = 0; i < sg.getSize(); i++) - { - SequenceI seq = null; - - while (seq == null) - { - if (orderedSeqs.containsKey(index + "")) - { - seq = (SequenceI) orderedSeqs.get(index + ""); - index++; + String output = new FormatAdapter().formatSequences( + "Fasta", + seqs, + omitHidden); - break; - } - else - { - index++; - } - } - //FIND START RES - //Returns residue following index if gap - startRes = seq.findPosition(sg.getStartRes()); - //FIND END RES - //Need to find the residue preceeding index if gap - endRes = 0; + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(output), Desktop.instance); - for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++) + Vector hiddenColumns = null; + if(viewport.hasHiddenColumns && viewport.getSelectionGroup()!=null) + { + hiddenColumns =new Vector(); + int hiddenOffset = viewport.getSelectionGroup().getStartRes(); + for(int i=0; i 0) - { - endRes += seq.getStart() - 1; + hiddenColumns.addElement(new int[]{region[0]-hiddenOffset, + region[1]-hiddenOffset}); } - - buffer.append(seq.getName() + "\t" + - startRes + "\t" + - endRes + "\t" + - seq.getSequence(sg.getStartRes(), - sg.getEndRes() + 1) + "\n"); } - c.setContents(new StringSelection(buffer.toString()), null); + Desktop.jalviewClipboard = new Object[]{ seqs, + viewport.alignment.getDataset(), + hiddenColumns}; } /** @@ -658,56 +762,132 @@ public class AlignFrame } String str = (String) contents.getTransferData(DataFlavor.stringFlavor); - StringTokenizer st = new StringTokenizer(str); - ArrayList seqs = new ArrayList(); + if(str.length()<1) + return; - while (st.hasMoreElements()) - { - String name = st.nextToken(); - int start = Integer.parseInt(st.nextToken()); - int end = Integer.parseInt(st.nextToken()); - Sequence sequence = new Sequence(name, st.nextToken(), start, - end); + String format = new IdentifyFile().Identify(str, "Paste"); + SequenceI[] sequences; - if (!newAlignment) - { - viewport.alignment.addSequence(sequence); - } - else - { - seqs.add(sequence); - } - } + + 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]; + } + else + { + sequences = new FormatAdapter().readFile(str, "Paste", format); + } + + AlignmentI alignment = null; if (newAlignment) { - SequenceI[] newSeqs = new SequenceI[seqs.size()]; - seqs.toArray(newSeqs); + System.out.println(format +" 2"); + alignment = new Alignment(sequences); - AlignFrame af = new AlignFrame(new Alignment(newSeqs)); - String newtitle = new String("Copied sequences"); - - if (title.startsWith("Copied sequences")) - { - newtitle = title; - } + if(Desktop.jalviewClipboard!=null) + alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] ); else - { - newtitle = newtitle.concat("- from " + title); - } + alignment.setDataset( null ); - Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, - NEW_WINDOW_HEIGHT); } else { - viewport.setEndSeq(viewport.alignment.getHeight()); - viewport.alignment.getWidth(); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + System.out.println(format +" 24"); + alignment = viewport.getAlignment(); + + //!newAlignment + for (int i = 0; i < sequences.length; i++) + { + Sequence newseq = new Sequence(sequences[i].getName(), + sequences[i].getSequence(), sequences[i].getStart(), + sequences[i].getEnd()); + + alignment.addSequence(newseq); + } + + + viewport.setEndSeq(alignment.getHeight()); + alignment.getWidth(); + viewport.firePropertyChange("alignment", null, alignment.getSequences()); } + + + + + + // Add any annotations attached to sequences + for (int i = 0; i < sequences.length; i++) + { + if (sequences[i].getAnnotation() != null) + { + for (int a = 0; a < sequences[i].getAnnotation().length; a++) + { + AlignmentAnnotation newAnnot = + new AlignmentAnnotation( + sequences[i].getAnnotation()[a].label, + sequences[i].getAnnotation()[a].description, + sequences[i].getAnnotation()[a].annotations, + sequences[i].getAnnotation()[a].graphMin, + sequences[i].getAnnotation()[a].graphMax, + sequences[i].getAnnotation()[a].graph); + + sequences[i].getAnnotation()[a] = newAnnot; + newAnnot.sequenceMapping = sequences[i].getAnnotation()[a]. + sequenceMapping; + newAnnot.sequenceRef = sequences[i]; + newAnnot.adjustForAlignment(); + alignment.addAnnotation(newAnnot); + alignment.setAnnotationIndex(newAnnot, a); + } + + alignPanel.annotationPanel.adjustPanelHeight(); + } + } + + if(newAlignment) + { + AlignFrame af = new AlignFrame(alignment); + String newtitle = new String("Copied sequences"); + + if(Desktop.jalviewClipboard[2]!=null) + { + Vector hc = (Vector)Desktop.jalviewClipboard[2]; + for(int i=0; i>>This is a fix for the moment, until a better solution is found!!<<< + af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings( + alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); + + + if (title.startsWith("Copied sequences")) + { + newtitle = title; + } + else + { + newtitle = newtitle.concat("- from " + title); + } + + Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, + NEW_WINDOW_HEIGHT); + + } + + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Exception whilst pasting: "+ex); // could be anything being pasted in here } @@ -732,31 +912,56 @@ public class AlignFrame */ protected void delete_actionPerformed(ActionEvent e) { - boolean seqsdeleted = false; if (viewport.getSelectionGroup() == null) { return; } - addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, - HistoryItem.HIDE)); SequenceGroup sg = viewport.getSelectionGroup(); - boolean allSequences = false; - if (sg.sequences.size() == viewport.alignment.getHeight()) + + + + //Jalview no longer allows deletion of residues. + //Check here whether any residues are in selection area + /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1) { - allSequences = true; - } + for (int i = 0; i < sg.sequences.size(); i++) + { + SequenceI seq = sg.getSequenceAt(i); + int j = sg.getStartRes(); + do + { + if (!jalview.util.Comparison.isGap(seq.getCharAt(j))) + { + JOptionPane.showInternalMessageDialog( + Desktop.desktop, "Cannot delete residues from alignment!\n" + + "Try hiding columns instead.", + "Deletion of residues not permitted", + JOptionPane.WARNING_MESSAGE); + + return; + } + j++; + }while(j<=sg.getEndRes()); + } + }*/ + + + addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, + HistoryItem.HIDE)); + - for (int i = 0; i < sg.sequences.size(); i++) + for (int i = 0; i < sg.getSize(false); i++) { SequenceI seq = sg.getSequenceAt(i); int index = viewport.getAlignment().findIndex(seq); + seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1); // If the cut affects all sequences, remove highlighted columns - if (allSequences) + if (sg.getSize(false) == viewport.alignment.getHeight()) { viewport.getColumnSelection().removeElements(sg.getStartRes(), sg.getEndRes() + 1); @@ -764,7 +969,6 @@ public class AlignFrame if (seq.getSequence().length() < 1) { - seqsdeleted = true; viewport.getAlignment().deleteSequence(seq); } else @@ -776,11 +980,9 @@ public class AlignFrame viewport.setSelectionGroup(null); viewport.alignment.deleteGroup(sg); - if (seqsdeleted) - { - viewport.firePropertyChange("alignment", null, + viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } + if (viewport.getAlignment().getHeight() < 1) @@ -834,10 +1036,17 @@ public class AlignFrame */ public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e) { + if(viewport.cursorMode) + { + alignPanel.seqPanel.keyboardNo1 = null; + alignPanel.seqPanel.keyboardNo2 = null; + } viewport.setSelectionGroup(null); viewport.getColumnSelection().clear(); viewport.setSelectionGroup(null); - alignPanel.annotationPanel.activeRes = null; + alignPanel.seqPanel.seqCanvas.highlightSearchResults(null); + alignPanel.idPanel.idCanvas.searchResults = null; + alignPanel.repaint(); PaintRefresher.Refresh(null, viewport.alignment); } @@ -990,12 +1199,12 @@ public class AlignFrame int end = viewport.alignment.getWidth(); if (viewport.getSelectionGroup() != null - && viewport.getSelectionGroup().sequences != null - && viewport.getSelectionGroup().sequences.size() > 0) + && viewport.getSelectionGroup().getSequences(true) != null + && viewport.getSelectionGroup().getSize(true) > 0) { - seqs = viewport.getSelectionGroup().sequences; + seqs = viewport.getSelectionGroup().getSequences(true); start = viewport.getSelectionGroup().getStartRes(); - end = viewport.getSelectionGroup().getEndRes(); + end = viewport.getSelectionGroup().getEndRes()+1; } else { @@ -1007,32 +1216,68 @@ public class AlignFrame current = (SequenceI) seqs.elementAt(i); jSize = current.getLength(); + // Removing a range is much quicker than removing gaps + // one by one for long sequences int j = start; + int rangeStart=-1, rangeEnd=-1; do { if (jalview.util.Comparison.isGap(current.getCharAt(j))) { - current.deleteCharAt(j); - j--; - jSize--; + if(rangeStart==-1) + { + rangeStart = j; + rangeEnd = j+1; + } + else + { + rangeEnd++; + } + j++; + } + else + { + if(rangeStart>-1) + { + current.deleteChars(rangeStart, rangeEnd); + j-=rangeEnd-rangeStart; + jSize-=rangeEnd-rangeStart; + rangeStart = -1; + rangeEnd = -1; + } + else + j++; } - j++; } while (j < end && j < jSize); + if(rangeStart>-1) + { + current.deleteChars(rangeStart, rangeEnd); + } } viewport.setStartRes(seq.findIndex(startRes)-1); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); } public void alignmentChanged() { - viewport.updateConsensus(); - viewport.updateConservation(); + if(viewport.padGaps) + viewport.getAlignment().padGaps(); + + if(viewport.vconsensus!=null && viewport.autoCalculateConsensus) + { + viewport.updateConsensus(); + viewport.updateConservation(); + } resetAllColourSchemes(); + if(alignPanel.overviewPanel!=null) + alignPanel.overviewPanel.updateOverviewImage(); + + viewport.alignment.adjustSequenceAnnotations(); + alignPanel.repaint(); } @@ -1069,7 +1314,8 @@ public class AlignFrame SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s); if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme) { - ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth()); + ((ClustalxColourScheme)sg.cs).resetClustalX( + sg.getSequences(true), sg.getWidth()); } sg.recalcConservation(); } @@ -1085,20 +1331,9 @@ public class AlignFrame addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment, HistoryItem.HIDE)); - SequenceI current; - int Width = viewport.getAlignment().getWidth(); - - for (int i = 0; i < viewport.getAlignment().getSequences().size(); - i++) - { - current = viewport.getAlignment().getSequenceAt(i); - - if (current.getLength() < Width) - { - current.insertCharAt(Width - 1, viewport.getGapCharacter()); - } - } + viewport.padGaps = padGapsMenuitem.isSelected(); + // if (viewport.padGaps) alignmentChanged(); } @@ -1112,8 +1347,8 @@ public class AlignFrame JInternalFrame frame = new JInternalFrame(); Finder finder = new Finder(viewport, alignPanel, frame); frame.setContentPane(finder); - Desktop.addInternalFrame(frame, "Find", 340, 110); frame.setLayer(JLayeredPane.PALETTE_LAYER); + Desktop.addInternalFrame(frame, "Find", 340, 110); } /** @@ -1123,22 +1358,31 @@ public class AlignFrame */ public void font_actionPerformed(ActionEvent e) { - FontChooser fc = new FontChooser(alignPanel); + new FontChooser(alignPanel); + } + + public void smoothFont_actionPerformed(ActionEvent e) + { + viewport.antiAlias = smoothFont.isSelected(); + alignPanel.annotationPanel.image = null; + alignPanel.repaint(); } + /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ - protected void fullSeqId_actionPerformed(ActionEvent e) + protected void seqLimit_actionPerformed(ActionEvent e) { - viewport.setShowFullId(fullSeqId.isSelected()); + viewport.setShowJVSuffix(seqLimits.isSelected()); alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth()); alignPanel.repaint(); } + /** * DOCUMENT ME! * @@ -1155,16 +1399,55 @@ public class AlignFrame * * @param e DOCUMENT ME! */ - protected void wrapMenuItem_actionPerformed(ActionEvent e) + public void wrapMenuItem_actionPerformed(ActionEvent e) { - viewport.setWrapAlignment(wrapMenuItem.isSelected()); - alignPanel.setWrapAlignment(wrapMenuItem.isSelected()); scaleAbove.setVisible(wrapMenuItem.isSelected()); scaleLeft.setVisible(wrapMenuItem.isSelected()); scaleRight.setVisible(wrapMenuItem.isSelected()); + viewport.setWrapAlignment(wrapMenuItem.isSelected()); + alignPanel.setWrapAlignment(wrapMenuItem.isSelected()); + } + + public void showAllSeqs_actionPerformed(ActionEvent e) + { + viewport.showAllHiddenSeqs(); + repaint(); + } + + public void showAllColumns_actionPerformed(ActionEvent e) + { + viewport.showAllHiddenColumns(); + } + + public void hideSelSequences_actionPerformed(ActionEvent e) + { + if(viewport.getSelectionGroup()==null) + return; + + SequenceI [] seqs = viewport.getSelectionGroup().getSequencesInOrder( + viewport.alignment + ); + + for(int i=0; i 0)) || + (viewport.getSelectionGroup().getSize(false) < 4) && + (viewport.getSelectionGroup().getSize(false) > 0)) || (viewport.getAlignment().getHeight() < 4)) { JOptionPane.showInternalMessageDialog(this, @@ -1810,23 +2094,20 @@ public class AlignFrame return; } - try - { - PCAPanel pcaPanel = new PCAPanel(viewport, null); - JInternalFrame frame = new JInternalFrame(); - frame.setContentPane(pcaPanel); - Desktop.addInternalFrame(frame, "Principal component analysis", - 400, 400); - } - catch (java.lang.OutOfMemoryError ex) + new PCAPanel(viewport); + } + + + public void autoCalculate_actionPerformed(ActionEvent e) + { + viewport.autoCalculateConsensus = autoCalculate.isSelected(); + if(viewport.autoCalculateConsensus) { - JOptionPane.showInternalMessageDialog(this, - "Too many sequences selected\nfor Principal Component Analysis!!", - "Out of memory", - JOptionPane.WARNING_MESSAGE); + alignmentChanged(); } } + /** * DOCUMENT ME! * @@ -1876,18 +2157,18 @@ public class AlignFrame */ void NewTreePanel(String type, String pwType, String title) { - final TreePanel tp; + TreePanel tp; if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize() > 3)) + (viewport.getSelectionGroup().getSize(false) > 3)) { int s = 0; SequenceGroup sg = viewport.getSelectionGroup(); /* Decide if the selection is a column region */ - while (s < sg.sequences.size()) + while (s < sg.getSize(false)) { - if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() < + if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() < sg.getEndRes()) { JOptionPane.showMessageDialog(Desktop.desktop, @@ -1902,9 +2183,7 @@ public class AlignFrame } title = title + " on region"; - tp = new TreePanel(viewport, - viewport.getSelectionGroup().sequences, type, pwType, - sg.getStartRes(), sg.getEndRes()); + tp = new TreePanel(viewport, type, pwType); } else { @@ -1921,14 +2200,10 @@ public class AlignFrame return; } - tp = new TreePanel(viewport, - viewport.getAlignment().getSequences(), type, pwType, - 0, - viewport.alignment.getWidth()); + tp = new TreePanel(viewport, type, pwType); } addTreeMenuItem(tp, title); - viewport.setCurrentTree(tp.getTree()); Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500); } @@ -2006,17 +2281,6 @@ public class AlignFrame } ; }); - viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { - if (evt.getPropertyName().equals("alignment")) - { - treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue()); - treePanel.repaint(); - } - } - }); } /** @@ -2030,12 +2294,12 @@ public class AlignFrame SequenceI[] msa = null; if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize() > 1)) + (viewport.getSelectionGroup().getSize(false) > 1)) { // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface! SequenceGroup seqs = viewport.getSelectionGroup(); int sz; - msa = new SequenceI[sz = seqs.getSize()]; + msa = new SequenceI[sz = seqs.getSize(false)]; for (int i = 0; i < sz; i++) { @@ -2071,19 +2335,19 @@ public class AlignFrame SequenceI[] msa = null; if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize() > 0)) + (viewport.getSelectionGroup().getSize(false) > 0)) { // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface! SequenceGroup seqs = viewport.getSelectionGroup(); - if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned()) + if ( (seqs.getSize(false) == 1) || !viewport.alignment.isAligned()) { seq = (SequenceI) seqs.getSequenceAt(0); } else { int sz; - msa = new SequenceI[sz = seqs.getSize()]; + msa = new SequenceI[sz = seqs.getSize(false)]; for (int i = 0; i < sz; i++) { @@ -2187,9 +2451,9 @@ public class AlignFrame if (nf.getTree() != null) { tp = new TreePanel(viewport, - viewport.getAlignment().getSequences(), nf, "FromFile", - title); + title, + nf); tp.setSize(w,h); @@ -2238,16 +2502,17 @@ public class AlignFrame */ public void BuildWebServiceMenu() { - if ( (Desktop.discoverer.services != null) - && (Desktop.discoverer.services.size() > 0)) + if ( (Discoverer.services != null) + && (Discoverer.services.size() > 0)) { - Vector msaws = (Vector) Desktop.discoverer.services.get("MsaWS"); - Vector secstrpr = (Vector) Desktop.discoverer.services.get("SecStrPred"); + Vector msaws = (Vector) Discoverer.services.get("MsaWS"); + Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred"); Vector wsmenu = new Vector(); if (msaws != null) { // Add any Multiple Sequence Alignment Services final JMenu msawsmenu = new JMenu("Alignment"); + final AlignFrame af = this; for (int i = 0, j = msaws.size(); i < j; i++) { final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws. @@ -2258,8 +2523,8 @@ public class AlignFrame public void actionPerformed(ActionEvent e) { SequenceI[] msa = gatherSequencesForAlignment(); - MsaWSClient ct = new jalview.ws.MsaWSClient(sh, title, msa, - false, true); + new jalview.ws.MsaWSClient(sh, title, msa, + false, true, viewport.getAlignment().getDataset(), af); } @@ -2275,8 +2540,8 @@ public class AlignFrame public void actionPerformed(ActionEvent e) { SequenceI[] msa = gatherSequencesForAlignment(); - MsaWSClient ct = new jalview.ws.MsaWSClient(sh, title, msa, - true, true); + new jalview.ws.MsaWSClient(sh, title, msa, + true, true, viewport.getAlignment().getDataset(), af); } @@ -2304,8 +2569,7 @@ public class AlignFrame if (msa.length == 1) { // Single Sequence prediction - jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh, - title, msa[0]); + new jalview.ws.JPredClient(sh,title, msa[0]); } else { @@ -2338,4 +2602,270 @@ public class AlignFrame // TODO: group services by location as well as function. } + /* public void vamsasStore_actionPerformed(ActionEvent e) + { + JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. + getProperty("LAST_DIRECTORY")); + + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle("Export to Vamsas file"); + chooser.setToolTipText("Export"); + + int value = chooser.showSaveDialog(this); + + if (value == JalviewFileChooser.APPROVE_OPTION) + { + jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport); + //vs.store(chooser.getSelectedFile().getAbsolutePath() ); + vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this); + } + }*/ + + + + +public void showTranslation_actionPerformed(ActionEvent e) +{ + SequenceI [] selection = viewport.getSelectionAsNewSequence(); + String [] seqstring = viewport.getViewAsString(true); + + int s, sSize = selection.length; + SequenceI [] newSeq = new SequenceI[sSize]; + + int res, resSize; + StringBuffer protein; + String seq; + for(s=0; s