X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=18ebf0eb64c794816d71bbfe73512ae2f242481c;hb=32a72d077d2371f4566688fbd103103d8505b27f;hp=807b6e3b947aed8410b18e79749698bb15c42131;hpb=174a67aba96e55fdfbd4f33dfe4e658d790fc5c2;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 807b6e3..18ebf0e 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -33,10 +33,11 @@ import jalview.datamodel.*; import jalview.io.*; import jalview.jbgui.*; import jalview.schemes.*; -import jalview.util.ShiftList; +import jalview.commands.*; import jalview.ws.*; import java.awt.dnd.*; -import org.biojava.dasobert.eventmodel.*; +import javax.swing.event.ChangeListener; +import javax.swing.event.ChangeEvent; /** * DOCUMENT ME! @@ -44,113 +45,370 @@ import org.biojava.dasobert.eventmodel.*; * @author $author$ * @version $Revision$ */ -public class AlignFrame - extends GAlignFrame implements DropTargetListener, FeatureListener +public class AlignFrame extends GAlignFrame implements DropTargetListener { /** DOCUMENT ME!! */ - public static final int NEW_WINDOW_WIDTH = 700; + public static final int DEFAULT_WIDTH = 700; /** DOCUMENT ME!! */ - public static final int NEW_WINDOW_HEIGHT = 500; - AlignmentPanel alignPanel; + public static final int DEFAULT_HEIGHT = 500; + public AlignmentPanel alignPanel; + AlignViewport viewport; + Vector alignPanels = new Vector(); + + /** DOCUMENT ME!! */ - public String currentFileFormat = null; - Stack historyList = new Stack(); - Stack redoList = new Stack(); + String currentFileFormat = null; + + String fileName = null; + private int treeCount = 0; /** + * Creates a new AlignFrame object. + * + * @param al DOCUMENT ME! + */ + public AlignFrame(AlignmentI al, int width, int height) + { + this(al, null, width, height); + } + + + /** * new alignment window with hidden columns * @param al AlignmentI * @param hiddenColumns ColumnSelection or null */ - public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns) { - + public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, + int width, int height) + { + this.setSize(width, height); viewport = new AlignViewport(al, hiddenColumns); + alignPanel = new AlignmentPanel(this, viewport); + + if(al.getDataset()==null) + { + al.setDataset(null); + } + + addAlignmentPanel(alignPanel, true); + init(); + } + + /** + * Make a new AlignFrame from exisiting alignmentPanels + * @param ap AlignmentPanel + * @param av AlignViewport + */ + public AlignFrame(AlignmentPanel ap) + { + viewport = ap.av; + alignPanel = ap; + addAlignmentPanel(ap, false); + init(); + } + + void init() + { this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); - if(viewport.vconsensus==null) + if (viewport.conservation == null) { - //Out of memory calculating consensus. BLOSUM62Colour.setEnabled(false); - PIDColour.setEnabled(false); conservationMenuItem.setEnabled(false); modifyConservation.setEnabled(false); - abovePIDThreshold.setEnabled(false); - modifyPID.setEnabled(false); + // PIDColour.setEnabled(false); + // abovePIDThreshold.setEnabled(false); + // modifyPID.setEnabled(false); } - alignPanel = new AlignmentPanel(this, viewport); - String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort"); - if(sortby.equals("Id")) + if (sortby.equals("Id")) sortIDMenuItem_actionPerformed(null); - else if(sortby.equals("Pairwise Identity")) + else if (sortby.equals("Pairwise Identity")) sortPairwiseMenuItem_actionPerformed(null); - // remove(tabbedPane); - getContentPane().add(alignPanel, BorderLayout.CENTER); + if (Desktop.desktop != null) + { + addServiceListeners(); + setGUINucleotide(viewport.alignment.isNucleotide()); + } + setMenusFromViewport(viewport); + if (viewport.wrapAlignment) + { + wrapMenuItem_actionPerformed(null); + } - // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel); + addKeyListener(); - ///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); - ///////////////////////// + } + public void setFileName(String file, String format) + { + fileName = file; + currentFileFormat = format; + reload.setEnabled(true); + } - viewport.addPropertyChangeListener(new PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { - if (evt.getPropertyName().equals("alignment")) - { - alignmentChanged(); - } - } - }); + void addKeyListener() + { + final AlignFrame af = this; + addKeyListener(new KeyAdapter() + { + public void keyPressed(KeyEvent evt) + { + if (viewport.cursorMode + && evt.getKeyCode() >= KeyEvent.VK_0 + && evt.getKeyCode() <= KeyEvent.VK_9) + { + alignPanel.seqPanel.numberPressed(evt.getKeyChar()); + } + switch (evt.getKeyCode()) + { + case KeyEvent.VK_G: + Desktop.instance.gatherViews(af); + break; - if (Desktop.desktop != null) - { - addServiceListeners(); - setGUINucleotide(al.isNucleotide()); - } + case KeyEvent.VK_X: + if (!evt.isControlDown()) + { + Desktop.instance.explodeViews(af); + } + break; - if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false)) - { - wrapMenuItem.setSelected(true); - wrapMenuItem_actionPerformed(null); - } + case 27: // escape key + deselectAllSequenceMenuItem_actionPerformed(null); + break; + + case KeyEvent.VK_DOWN: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor(0, 1); + } + else + moveSelectedSequences(false); + break; + + case KeyEvent.VK_UP: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor(0, -1); + } + else + moveSelectedSequences(true); + break; + + case KeyEvent.VK_LEFT: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor( -1, 0); + } + break; + + case KeyEvent.VK_RIGHT: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor(1, 0); + } + break; + + case KeyEvent.VK_SPACE: + if (viewport.cursorMode) + { + alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown() + || evt.isShiftDown() + || evt.isAltDown()); + } + break; + + case KeyEvent.VK_DELETE: + case KeyEvent.VK_BACK_SPACE: + if (!viewport.cursorMode) + { + cut_actionPerformed(null); + } + else + alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown() + || evt.isShiftDown() + || evt.isAltDown()); + + break; + + case KeyEvent.VK_S: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setCursorRow(); + } + break; + case KeyEvent.VK_C: + if (viewport.cursorMode && !evt.isControlDown()) + { + alignPanel.seqPanel.setCursorColumn(); + } + break; + case KeyEvent.VK_P: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setCursorPosition(); + } + break; + + case KeyEvent.VK_ENTER: + case KeyEvent.VK_COMMA: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setCursorRowAndColumn(); + } + break; + + case KeyEvent.VK_Q: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setSelectionAreaAtCursor(true); + } + break; + case KeyEvent.VK_M: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setSelectionAreaAtCursor(false); + } + break; + + case KeyEvent.VK_F2: + viewport.cursorMode = !viewport.cursorMode; + statusBar.setText("Keyboard editing mode is " + + (viewport.cursorMode ? "on" : "off")); + if (viewport.cursorMode) + { + alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes; + alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq; + } + alignPanel.seqPanel.seqCanvas.repaint(); + break; + + case KeyEvent.VK_F1: + try + { + ClassLoader cl = jalview.gui.Desktop.class.getClassLoader(); + java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help"); + javax.help.HelpSet hs = new javax.help.HelpSet(cl, url); + + javax.help.HelpBroker hb = hs.createHelpBroker(); + hb.setCurrentID("home"); + hb.setDisplayed(true); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + break + ; + case KeyEvent.VK_H: + { + boolean toggleSeqs = !evt.isControlDown(); + boolean toggleCols = !evt.isShiftDown(); + + boolean hide = false; + + SequenceGroup sg = viewport.getSelectionGroup(); + if (toggleSeqs) + { + if (sg != null && sg.getSize(false) != viewport.alignment.getHeight()) + { + hideSelSequences_actionPerformed(null); + hide = true; + } + else if (! (toggleCols && viewport.colSel.getSelected().size() > 0)) + showAllSeqs_actionPerformed(null); + } + + if (toggleCols) + { + if (viewport.colSel.getSelected().size() > 0) + { + hideSelColumns_actionPerformed(null); + if (!toggleSeqs) + viewport.selectionGroup = sg; + } + else if (!hide) + showAllColumns_actionPerformed(null); + } + break; + } + case KeyEvent.VK_PAGE_UP: + if (viewport.wrapAlignment) + alignPanel.scrollUp(true); + else + alignPanel.setScrollValues(viewport.startRes, + viewport.startSeq + - viewport.endSeq + viewport.startSeq); + break; + case KeyEvent.VK_PAGE_DOWN: + if (viewport.wrapAlignment) + alignPanel.scrollUp(false); + else + alignPanel.setScrollValues(viewport.startRes, + viewport.startSeq + + viewport.endSeq - viewport.startSeq); + break; + } + } + }); } - /** - * Creates a new AlignFrame object. - * - * @param al DOCUMENT ME! - */ - public AlignFrame(AlignmentI al) + public void addAlignmentPanel(final AlignmentPanel ap, + boolean newPanel) { - this(al, null); + ap.alignFrame = this; + + alignPanels.addElement(ap); + + PaintRefresher.Register(ap, ap.av.getSequenceSetId()); + + int aSize = alignPanels.size(); + + tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null); + + if (aSize == 1 && ap.av.viewName==null) + { + this.getContentPane().add(ap, BorderLayout.CENTER); + } + else + { + if (aSize == 2) + { + AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement(); + tabbedPane.addTab(first.av.viewName==null?"Original":first.av.viewName,first); + + this.getContentPane().add(tabbedPane, BorderLayout.CENTER); + } + + tabbedPane.addTab(ap.av.viewName==null?"Original":ap.av.viewName, ap); + + ap.setVisible(false); + } + + if(newPanel) + { + if (ap.av.padGaps) + ap.av.alignment.padGaps(); + ap.av.updateConservation(ap); + ap.av.updateConsensus(ap); + } } + public AlignViewport getViewport() { return viewport; @@ -175,6 +433,7 @@ public class AlignFrame } } }); + addInternalFrameListener(new javax.swing.event. InternalFrameAdapter() { @@ -183,7 +442,7 @@ public class AlignFrame { // System.out.println("deregistering discoverer listener"); Desktop.discoverer.removePropertyChangeListener(thisListener); - closeMenuItem_actionPerformed(null); + closeMenuItem_actionPerformed(true); } ; }); @@ -192,10 +451,8 @@ public class AlignFrame public void setGUINucleotide(boolean nucleotide) { showTranslation.setVisible( nucleotide ); - //sequenceFeatures.setVisible(!nucleotide ); - //featureSettings.setVisible( !nucleotide ); - conservationMenuItem.setVisible( !nucleotide ); - modifyConservation.setVisible( !nucleotide ); + conservationMenuItem.setEnabled( !nucleotide ); + modifyConservation.setEnabled( !nucleotide ); //Remember AlignFrame always starts as protein if(!nucleotide) @@ -204,18 +461,36 @@ public class AlignFrame } } - public void comeBackLater(FeatureEvent evt) - {} - - public void newFeatures(FeatureEvent evt) + /** + * Need to call this method when tabs are selected for multiple views, + * or when loading from Jalview2XML.java + * @param av AlignViewport + */ + void setMenusFromViewport(AlignViewport av) { - if (evt.getFeatures().length > 0) - { - alignPanel.seqPanel.seqCanvas.fr.featuresAdded(); - alignPanel.repaint(); - } + padGapsMenuitem.setSelected(av.padGaps); + colourTextMenuItem.setSelected(av.showColourText); + abovePIDThreshold.setSelected(av.getAbovePIDThreshold()); + conservationMenuItem.setSelected(av.getConservationSelected()); + seqLimits.setSelected(av.getShowJVSuffix()); + idRightAlign.setSelected(av.idsAlignRight); + renderGapsMenuItem.setSelected(av.renderGaps); + wrapMenuItem.setSelected(av.wrapAlignment); + annotationPanelMenuItem.setState(av.showAnnotation); + viewBoxesMenuItem.setSelected(av.showBoxes); + viewTextMenuItem.setSelected(av.showText); + + setColourSelected(ColourSchemeProperty. + getColourName(av.getGlobalColourScheme())); + + showSeqFeatures.setSelected(av.showSequenceFeatures); + hiddenMarkers.setState(av.showHiddenMarkers); + applyToAllGroups.setState(av.colourAppliesToAllGroups); + + updateEditMenuBar(); } + Hashtable progressBars; public void setProgressBar(String message, long id) { @@ -255,6 +530,8 @@ public class AlignFrame } + + /* Added so Castor Mapping file can obtain Jalview Version */ @@ -279,6 +556,44 @@ public class AlignFrame Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport); } + public void reload_actionPerformed(ActionEvent e) + { + if(fileName!=null) + { + if(currentFileFormat.equals("Jalview")) + { + this.closeMenuItem_actionPerformed(true); + } + else + { + viewport.alignment.deleteAllGroups(); + viewport.sequenceColours=null; + while (viewport.alignment.getHeight() > 0) + { + viewport.alignment.deleteSequence(0); + } + + viewport.historyList.clear(); + viewport.redoList.clear(); + Alignment dset = viewport.alignment.getDataset(); + while (dset.getHeight() > 0) + { + dset.deleteSequence(0); + } + + firePropertyChange("Alignment", null, null); + + updateEditMenuBar(); + } + + FileLoader loader = new FileLoader(); + String protocol = fileName.startsWith("http:")? "URL":"File"; + loader.LoadFile(viewport, fileName, protocol, currentFileFormat); + + } + } + + public void addFromText_actionPerformed(ActionEvent e) { Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport); @@ -289,12 +604,21 @@ public class AlignFrame Desktop.instance.inputURLMenuItem_actionPerformed(viewport); } + + public void save_actionPerformed(ActionEvent e) + { + if(fileName==null || currentFileFormat==null) + saveAs_actionPerformed(null); + else + saveAlignment(fileName, currentFileFormat); + } + /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ - public void saveAlignmentMenu_actionPerformed(ActionEvent e) + public void saveAs_actionPerformed(ActionEvent e) { JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. getProperty( "LAST_DIRECTORY"), @@ -315,7 +639,6 @@ public class AlignFrame if (value == JalviewFileChooser.APPROVE_OPTION) { currentFileFormat = chooser.getSelectedFormat(); - if (currentFileFormat == null) { JOptionPane.showInternalMessageDialog(Desktop.desktop, @@ -326,13 +649,14 @@ public class AlignFrame return; } + fileName = chooser.getSelectedFile().getPath(); + jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat); - String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); + jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName); - saveAlignment(choice, currentFileFormat); + saveAlignment(fileName, currentFileFormat); } } @@ -350,6 +674,11 @@ public class AlignFrame new Jalview2XML().SaveAlignment(this, file, shortName); + statusBar.setText("Successfully saved to file: " + +fileName+" in " + +format +" format."); + + // USE Jalview2XML to save this file return true; } @@ -388,6 +717,9 @@ public class AlignFrame out.print(output); out.close(); this.setTitle(file); + statusBar.setText("Successfully saved to file: " + +fileName+" in " + +format +" format."); return true; } catch (Exception ex) @@ -422,6 +754,7 @@ public class AlignFrame } CutAndPasteTransfer cap = new CutAndPasteTransfer(); + cap.setForInput(null); Desktop.addInternalFrame(cap, "Alignment output - " + e.getActionCommand(), 600, 500); @@ -518,34 +851,70 @@ public class AlignFrame } + /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ - public void closeMenuItem_actionPerformed(ActionEvent e) + public void closeMenuItem_actionPerformed(boolean closeAllTabs) { + if(alignPanels!=null && alignPanels.size()<2) + closeAllTabs = true; + try { - PaintRefresher.components.remove(viewport.alignment); - this.setClosed(true); + if(alignPanels!=null) + { + if (closeAllTabs) + for (int i = 0; i < alignPanels.size(); i++) + { + AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i); + PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas); + PaintRefresher.RemoveComponent(ap.idPanel.idCanvas); + PaintRefresher.RemoveComponent(ap); + } + else + { + int index = tabbedPane.getSelectedIndex(); + + tabbedPane.removeTabAt(index); + alignPanels.removeElement(alignPanel); + PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas); + PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas); + PaintRefresher.RemoveComponent(alignPanel); + alignPanel = null; + viewport = null; + tabbedPane.validate(); + + if(index==tabbedPane.getTabCount()) + index --; + + this.tabSelectionChanged(index); + } + } + + if (closeAllTabs) + this.setClosed(true); } catch (Exception ex) { + ex.printStackTrace(); } } + /** * DOCUMENT ME! */ void updateEditMenuBar() { - if (historyList.size() > 0) + + if (viewport.historyList.size() > 0) { undoMenuItem.setEnabled(true); - - HistoryItem hi = (HistoryItem) historyList.peek(); - undoMenuItem.setText("Undo " + hi.getDescription()); + CommandI command = (CommandI) viewport.historyList.peek(); + undoMenuItem.setText("Undo " + command.getDescription()); } else { @@ -553,12 +922,12 @@ public class AlignFrame undoMenuItem.setText("Undo"); } - if (redoList.size() > 0) + if (viewport.redoList.size() > 0) { redoMenuItem.setEnabled(true); - HistoryItem hi = (HistoryItem) redoList.peek(); - redoMenuItem.setText("Redo " + hi.getDescription()); + CommandI command = (CommandI) viewport.redoList.peek(); + redoMenuItem.setText("Redo " + command.getDescription()); } else { @@ -567,18 +936,20 @@ public class AlignFrame } } - /** - * DOCUMENT ME! - * - * @param hi DOCUMENT ME! - */ - public void addHistoryItem(HistoryItem hi) + + public void addHistoryItem(CommandI command) { - historyList.push(hi); - redoList.clear(); - updateEditMenuBar(); + if(command.getSize()>0) + { + viewport.historyList.push(command); + viewport.redoList.clear(); + updateEditMenuBar(); + viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + } } + + /** * DOCUMENT ME! * @@ -586,13 +957,14 @@ public class AlignFrame */ protected void undoMenuItem_actionPerformed(ActionEvent e) { - HistoryItem nh,hi = (HistoryItem) historyList.pop(); - redoList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment, - HistoryItem.HIDE)); - if (hi.alColumnChanges!=null) - nh.alColumnChanges = hi.alColumnChanges.getInverse(); - restoreHistoryItem(hi); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + CommandI command = (CommandI)viewport.historyList.pop(); + viewport.redoList.push(command); + command.undoCommand(); + + + viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + updateEditMenuBar(); + viewport.firePropertyChange("alignment", null,null); } /** @@ -602,28 +974,16 @@ public class AlignFrame */ protected void redoMenuItem_actionPerformed(ActionEvent e) { - HistoryItem nh,hi = (HistoryItem) redoList.pop(); - historyList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment, - HistoryItem.HIDE)); - if (hi.alColumnChanges!=null) - nh.alColumnChanges=hi.alColumnChanges.getInverse(); - restoreHistoryItem(hi); - updateEditMenuBar(); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - - // used by undo and redo - void restoreHistoryItem(HistoryItem hi) - { - - hi.restore(viewport.getColumnSelection()); + CommandI command = (CommandI) viewport.redoList.pop(); + viewport.historyList.push(command); + command.doCommand(); + viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns()!=null; updateEditMenuBar(); - - viewport.firePropertyChange("alignment", null, - viewport.getAlignment().getSequences()); + viewport.firePropertyChange("alignment", null, null); } + /** * DOCUMENT ME! * @@ -695,6 +1055,7 @@ public class AlignFrame */ protected void copy_actionPerformed(ActionEvent e) { + System.gc(); if (viewport.getSelectionGroup() == null) { return; @@ -713,9 +1074,36 @@ public class AlignFrame seqs, omitHidden); + StringSelection ss = new StringSelection(output); - Toolkit.getDefaultToolkit().getSystemClipboard() - .setContents(new StringSelection(output), Desktop.instance); + try + { + //Its really worth setting the clipboard contents + //to empty before setting the large StringSelection!! + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(""), null); + + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(ss, Desktop.instance); + } + 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); + } + }); + + return; + } Vector hiddenColumns = null; if(viewport.hasHiddenColumns) @@ -732,9 +1120,12 @@ public class AlignFrame } } + + Desktop.jalviewClipboard = new Object[]{ seqs, viewport.alignment.getDataset(), hiddenColumns}; + statusBar.setText("Copied "+seqs.length+" sequences to clipboard."); } /** @@ -754,8 +1145,6 @@ public class AlignFrame */ protected void pasteThis_actionPerformed(ActionEvent e) { - addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, - HistoryItem.PASTE)); paste(false); } @@ -776,11 +1165,35 @@ public class AlignFrame return; } - String str = (String) contents.getTransferData(DataFlavor.stringFlavor); - if(str.length()<1) + String str, format; + try + { + str = (String) contents.getTransferData(DataFlavor.stringFlavor); + if (str.length() < 1) + return; + + format = new IdentifyFile().Identify(str, "Paste"); + + } + 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); + } + }); + return; + } - String format = new IdentifyFile().Identify(str, "Paste"); SequenceI[] sequences; @@ -799,28 +1212,40 @@ public class AlignFrame if (newAlignment) { - alignment = new Alignment(sequences); - - if(Desktop.jalviewClipboard!=null) - alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] ); - else - alignment.setDataset( null ); + alignment = new Alignment(sequences); + if (Desktop.jalviewClipboard != null) + alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]); + else + alignment.setDataset(null); } else { alignment = viewport.getAlignment(); //!newAlignment + SequenceI [] newseqs = new SequenceI[sequences.length]; for (int i = 0; i < sequences.length; i++) { - Sequence newseq = new Sequence(sequences[i].getName(), + newseqs[i] = new Sequence(sequences[i].getName(), sequences[i].getSequence(), sequences[i].getStart(), sequences[i].getEnd()); - alignment.addSequence(newseq); + alignment.addSequence(newseqs[i]); } + /* + //ADD HISTORY ITEM + */ + addHistoryItem(new EditCommand( + "Add sequences", + EditCommand.PASTE, + newseqs, + 0, + alignment.getWidth(), + alignment) + ); + viewport.setEndSeq(alignment.getHeight()); alignment.getWidth(); @@ -829,8 +1254,6 @@ public class AlignFrame - - // Add any annotations attached to sequences for (int i = 0; i < sequences.length; i++) { @@ -862,7 +1285,7 @@ public class AlignFrame if(newAlignment) { - AlignFrame af = new AlignFrame(alignment); + AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT); String newtitle = new String("Copied sequences"); if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null) @@ -890,8 +1313,8 @@ public class AlignFrame newtitle = newtitle.concat("- from " + title); } - Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, - NEW_WINDOW_HEIGHT); + Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH, + DEFAULT_HEIGHT); } @@ -923,72 +1346,47 @@ public class AlignFrame * * @param e DOCUMENT ME! */ - protected void delete_actionPerformed(ActionEvent e) + protected void delete_actionPerformed(ActionEvent evt) { - if (viewport.getSelectionGroup() == null) + SequenceGroup sg = viewport.getSelectionGroup(); + if (sg == null) { return; } - - SequenceGroup sg = viewport.getSelectionGroup(); - - - - //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) + Vector seqs = new Vector(); + SequenceI seq; + for (int i = 0; i < sg.getSize(false); i++) { - 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()); - } - }*/ + seq = sg.getSequenceAt(i); + seqs.addElement(seq); + } - addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, - HistoryItem.HIDE)); + // If the cut affects all sequences, remove highlighted columns + if (sg.getSize(false) == viewport.alignment.getHeight()) + { + viewport.getColumnSelection().removeElements(sg.getStartRes(), + sg.getEndRes() + 1); + } - for (int i = 0; i < sg.getSize(false); i++) - { - SequenceI seq = sg.getSequenceAt(i); - int index = viewport.getAlignment().findIndex(seq); + SequenceI [] cut = new SequenceI[seqs.size()]; + for(int i=0; i 0) - { - HistoryItem edit; - addHistoryItem(edit=new HistoryItem("Remove Left", viewport.alignment, - HistoryItem.HIDE)); - - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0, min); - edit.addShift(0,min); - if (viewport.getSelectionGroup() != null) - { - viewport.getSelectionGroup().adjustForRemoveLeft(min); - } - - Vector groups = viewport.alignment.getGroups(); - - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.get(i); - - if (!sg.adjustForRemoveLeft(min)) - { - viewport.alignment.deleteGroup(sg); - } - } - - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } + trimAlignment(true); } /** @@ -1142,21 +1511,55 @@ public class AlignFrame */ public void remove2RightMenuItem_actionPerformed(ActionEvent e) { + trimAlignment(false); + } + + void trimAlignment(boolean trimLeft) + { ColumnSelection colSel = viewport.getColumnSelection(); + int column; if (colSel.size() > 0) { - addHistoryItem(new HistoryItem("Remove Right", viewport.alignment, - HistoryItem.HIDE)); + if(trimLeft) + column = colSel.getMin(); + else + column = colSel.getMax(); + + SequenceI [] seqs; + if(viewport.getSelectionGroup()!=null) + seqs = viewport.getSelectionGroup().getSequencesAsArray(true); + else + seqs = viewport.alignment.getSequencesArray(); + - int max = colSel.getMax(); - viewport.getAlignment().trimRight(max); - // TODO: delete hidden column entries in colSel to right of max - // TODO: record hidden columns in history for undo. - if (viewport.getSelectionGroup() != null) + TrimRegionCommand trimRegion; + if(trimLeft) { - viewport.getSelectionGroup().adjustForRemoveRight(max); + trimRegion = new TrimRegionCommand("Remove Left", + TrimRegionCommand.TRIM_LEFT, + seqs, + column, + viewport.alignment, + viewport.colSel, + viewport.selectionGroup); + viewport.setStartRes(0); } + else + { + trimRegion = new TrimRegionCommand("Remove Right", + TrimRegionCommand.TRIM_RIGHT, + seqs, + column, + viewport.alignment, + viewport.colSel, + viewport.selectionGroup); + } + + statusBar.setText("Removed "+trimRegion.getSize()+" columns."); + + + addHistoryItem(trimRegion); Vector groups = viewport.alignment.getGroups(); @@ -1164,13 +1567,15 @@ public class AlignFrame { SequenceGroup sg = (SequenceGroup) groups.get(i); - if (!sg.adjustForRemoveRight(max)) + if ( (trimLeft && !sg.adjustForRemoveLeft(column)) + || (!trimLeft && !sg.adjustForRemoveRight(column))) { viewport.alignment.deleteGroup(sg); } } - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); } } @@ -1181,21 +1586,41 @@ public class AlignFrame */ public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e) { - HistoryItem edit; - addHistoryItem(edit=new HistoryItem("Remove Gapped Columns", - viewport.alignment, HistoryItem.HIDE)); + int start = 0, end = viewport.alignment.getWidth()-1; + + SequenceI[] seqs; + if (viewport.getSelectionGroup() != null) + { + seqs = viewport.getSelectionGroup().getSequencesAsArray(true); + start = viewport.getSelectionGroup().getStartRes(); + end = viewport.getSelectionGroup().getEndRes(); + } + else + seqs = viewport.alignment.getSequencesArray(); + + + RemoveGapColCommand removeGapCols = + new RemoveGapColCommand("Remove Gapped Columns", + seqs, + start, end, + viewport.getGapCharacter()); + + addHistoryItem(removeGapCols); + + statusBar.setText("Removed "+removeGapCols.getSize()+" empty columns."); //This is to maintain viewport position on first residue //of first sequence SequenceI seq = viewport.alignment.getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); - ShiftList shifts; - viewport.getAlignment().removeGaps(shifts=new ShiftList()); - edit.alColumnChanges=shifts.getInverse(); - if (viewport.hasHiddenColumns) - viewport.getColumnSelection().compensateForEdits(shifts); - viewport.setStartRes(seq.findIndex(startRes)-1); + // ShiftList shifts; + // viewport.getAlignment().removeGaps(shifts=new ShiftList()); + // edit.alColumnChanges=shifts.getInverse(); + // if (viewport.hasHiddenColumns) + // viewport.getColumnSelection().compensateForEdits(shifts); + viewport.setStartRes(seq.findIndex(startRes)-1); viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + } /** @@ -1205,139 +1630,32 @@ public class AlignFrame */ public void removeAllGapsMenuItem_actionPerformed(ActionEvent e) { - // TODO: hidden regions should not be touched by removeAllGaps - a minimal number of gaps will remain in alignment segments containing uneven length subsequences - // TODO: columnSelection.compensateforedits should be called (and passed to history item) - addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment, - HistoryItem.HIDE)); + int start = 0, end = viewport.alignment.getWidth()-1; + + SequenceI[] seqs; + if (viewport.getSelectionGroup() != null) + { + seqs = viewport.getSelectionGroup().getSequencesAsArray(true); + start = viewport.getSelectionGroup().getStartRes(); + end = viewport.getSelectionGroup().getEndRes(); + } + else + seqs = viewport.alignment.getSequencesArray(); //This is to maintain viewport position on first residue //of first sequence SequenceI seq = viewport.alignment.getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); - - SequenceI current; - int jSize; - - Vector seqs = null; - - int start = 0; - int end = viewport.alignment.getWidth(); - - if (viewport.getSelectionGroup() != null - && viewport.getSelectionGroup().getSequences(true) != null - && viewport.getSelectionGroup().getSize(true) > 0) - { - seqs = viewport.getSelectionGroup().getSequences(true); - start = viewport.getSelectionGroup().getStartRes(); - end = viewport.getSelectionGroup().getEndRes()+1; - } - else - { - seqs = viewport.alignment.getSequences(); - } - /* Commented out regions below are partial implementation of todo above. - * divide start,end into visible chunks, and for each: - int diff=end-start+1; - int diffmax=0; - int dr[] = new int[seqs.size()]; - */ - for (int i = 0; i < seqs.size(); i++) - { - current = (SequenceI) seqs.elementAt(i); - //dr[i]= - current.removeGaps(start, end); - /*if (d0) { - // record shift for history. - editgaps.addShift(start, diff); - if (viewport.hasHiddenColumns && diffmax>diff) { - // pad sequence - StringBuffer gaps=new StringBuffer(diffmax); - for (int i=0,j=diffmax-diff; i0) { - String sq = current.getSequence(); - current.setSequence(sq.substring(0, hcend-dr[i])+gaps.substring(0, dr[i]-diff)+sq.substring()); - } - } - } - }*/ + addHistoryItem(new RemoveGapsCommand("Remove Gaps", + seqs, + start, end, + viewport.getGapCharacter())); viewport.setStartRes(seq.findIndex(startRes)-1); viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - - public void alignmentChanged() - { - 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(); - - if(alignPanel.overviewPanel!=null) - alignPanel.overviewPanel.updateOverviewImage(); - - alignPanel.repaint(); - } - - void resetAllColourSchemes() - { - ColourSchemeI cs = viewport.globalColourScheme; - if(cs!=null) - { - if (cs instanceof ClustalxColourScheme) - { - ( (ClustalxColourScheme) viewport.getGlobalColourScheme()). - resetClustalX(viewport.alignment.getSequences(), - viewport.alignment.getWidth()); - } - - cs.setConsensus(viewport.vconsensus); - if (cs.conservationApplied()) - { - Alignment al = (Alignment) viewport.alignment; - Conservation c = new Conservation("All", - ResidueProperties.propHash, 3, - al.getSequences(), 0, - al.getWidth() - 1); - c.calculate(); - c.verdict(false, viewport.ConsPercGaps); - - cs.setConservation(c); - } - } - - int s, sSize = viewport.alignment.getGroups().size(); - for(s=0; sSelect a dark and light text colour, then set the threshold to" + +"
switch between colours, based on background colour
"), + BorderLayout.NORTH); + panel.add(col1); + panel.add(slider); + panel.add(col2); + + col1.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + Color col = JColorChooser.showDialog(bigpanel, + "Select Colour for Text", + viewport.textColour); + if (col != null) + { + viewport.textColour = col; + col1.setBackground(col); + col1.setForeground(col); + if(viewport.colourAppliesToAllGroups) + setGroupTextColour(); + } + alignPanel.repaint(); + } + }); + + col2.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + Color col = JColorChooser.showDialog(bigpanel, + "Select Colour for Text", + viewport.textColour); + if (col != null) + { + viewport.textColour2 = col; + col2.setBackground(col); + col2.setForeground(col); + if(viewport.colourAppliesToAllGroups) + setGroupTextColour(); + } + alignPanel.repaint(); + } + }); + + + slider.addChangeListener(new ChangeListener() + { + public void stateChanged(ChangeEvent evt) + { + viewport.thresholdTextColour = slider.getValue(); + if(viewport.colourAppliesToAllGroups) + setGroupTextColour(); + alignPanel.repaint(); + } + }); + + int reply = JOptionPane.showInternalOptionDialog(this, + bigpanel, + "Adjust Foreground Text Colour Threshold", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + null, null); + + if(reply==JOptionPane.CANCEL_OPTION) + { + viewport.textColour = new Color(original1); + viewport.textColour2 = new Color(original2); + viewport.thresholdTextColour = thresh; + } + } + + void setGroupTextColour() + { + if(viewport.alignment.getGroups()==null) + return; + + Vector groups = viewport.alignment.getGroups(); + + for(int i=0; i 3)) - { + if (viewport.getSelectionGroup() != null) { + if (viewport.getSelectionGroup().getSize(false) < 3) { + JOptionPane.showMessageDialog(Desktop.desktop, + "You need to have more than two sequences selected to build a tree!", + "Not enough sequences", + JOptionPane.WARNING_MESSAGE); + return; + } + int s = 0; SequenceGroup sg = viewport.getSelectionGroup(); @@ -2190,7 +2647,7 @@ public class AlignFrame } title = title + " on region"; - tp = new TreePanel(viewport, type, pwType); + tp = new TreePanel(alignPanel, type, pwType); } else { @@ -2210,7 +2667,7 @@ public class AlignFrame if(viewport.alignment.getHeight()<2) return; - tp = new TreePanel(viewport, type, pwType); + tp = new TreePanel(alignPanel, type, pwType); } addTreeMenuItem(tp, title); @@ -2232,11 +2689,13 @@ public class AlignFrame { public void actionPerformed(ActionEvent e) { - addHistoryItem(new HistoryItem("Sort", viewport.alignment, - HistoryItem.SORT)); + SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray(); // TODO: JBPNote - have to map order entries to curent SequenceI pointers AlignmentSorter.sortBy(viewport.getAlignment(), order); + + addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport.alignment)); + alignPanel.repaint(); } }); @@ -2267,10 +2726,15 @@ public class AlignFrame { public void actionPerformed(ActionEvent e) { - addHistoryItem(new HistoryItem("Tree Sort", - viewport.alignment, HistoryItem.SORT)); + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree()); + + addHistoryItem(new OrderCommand("Tree Sort", + oldOrder, + viewport.alignment)); + + alignPanel.repaint(); } }); @@ -2406,16 +2870,26 @@ public class AlignFrame { return ShowNewickTree(nf,title,600,500,4,5); } + public TreePanel ShowNewickTree(NewickFile nf, String title, AlignmentView input) + { + return ShowNewickTree(nf,title, input, 600,500,4,5); + } + public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y) { + return ShowNewickTree(nf, title, null, w, h, x, y); + } /** - * DOCUMENT ME! - * - * @param nf DOCUMENT ME! - * @param title DOCUMENT ME! + * Add a treeviewer for the tree extracted from a newick file object to the current alignment view * - * @return DOCUMENT ME! + * @param nf the tree + * @param title tree viewer title + * @param input Associated alignment input data (or null) + * @param w width + * @param h height + * @param x position + * @param y position + * @return TreePanel handle */ - public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y) - { + public TreePanel ShowNewickTree(NewickFile nf, String title, AlignmentView input, int w,int h,int x, int y) { TreePanel tp = null; try @@ -2424,10 +2898,10 @@ public class AlignFrame if (nf.getTree() != null) { - tp = new TreePanel(viewport, + tp = new TreePanel(alignPanel, "FromFile", title, - nf); + nf, input); tp.setSize(w,h); @@ -2543,7 +3017,7 @@ public class AlignFrame if (msa.getSequences().length == 1) { // Single Sequence prediction - new jalview.ws.JPredClient(sh, title, false, msa, af); + new jalview.ws.JPredClient(sh, title, false, msa, af, true); } else { @@ -2551,7 +3025,7 @@ public class AlignFrame { // Sequence profile based prediction new jalview.ws.JPredClient(sh, - title, true, msa, af); + title, true, msa, af, true); } } } @@ -2678,39 +3152,16 @@ public void showTranslation_actionPerformed(ActionEvent e) } } - AlignFrame af = new AlignFrame(al); + AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); Desktop.addInternalFrame(af, "Translation of "+this.getTitle(), - NEW_WINDOW_WIDTH, - NEW_WINDOW_HEIGHT); - - - // AlignViewport newViewport = new AlignViewport(al); - // AlignmentPanel ap = new AlignmentPanel(this, newViewport); - // tabbedPane.add("Protein", ap); - // viewports.add(newViewport); - // alignPanels.add(ap); + DEFAULT_WIDTH, + DEFAULT_HEIGHT); - ///Dataset tab - ///////////////////////// - // AlignViewport ds = new AlignViewport(al.getDataset()); - // ds.setDataset(true); - // AlignmentPanel dap = new AlignmentPanel(this, ds); - // tabbedPane.add("Dataset", dap); - // viewports.add(ds); - // alignPanels.add(dap); - ///////////////////////// } -/*public void tabSelected() - { - int index = tabbedPane.getSelectedIndex(); - viewport = (AlignViewport)viewports.elementAt(index); - alignPanel = (AlignmentPanel)alignPanels.elementAt(index); - }*/ - /** * DOCUMENT ME! * @@ -2860,4 +3311,37 @@ public void drop(DropTargetDropEvent evt) ex.printStackTrace(); } } + + public void tabSelectionChanged(int index) + { + if (index > -1) + { + alignPanel = (AlignmentPanel) alignPanels.elementAt(index); + viewport = alignPanel.av; + setMenusFromViewport(viewport); + } + } + + public void tabbedPane_mousePressed(MouseEvent e) + { + if(SwingUtilities.isRightMouseButton(e)) + { + String reply = JOptionPane.showInternalInputDialog(this, + "Enter View Name", + "Edit View Name", + JOptionPane.QUESTION_MESSAGE); + + if (reply != null) + { + viewport.viewName = reply; + tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply); + } + } + } + + + public AlignViewport getCurrentView() + { + return viewport; + } }