X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=7db8f01805fec6f67eb2650b1b925eb7e018c4ef;hb=1146ae7f678127be7796772b228d5fc6823435d4;hp=2d391082f83ee5299c771d6b6c9d90c4eec7c786;hpb=998f8c437ca6ea5f76e261ef544e90ebee632f78;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 2d39108..7db8f01 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,6 +1,6 @@ /* * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,19 +24,18 @@ import java.util.*; import java.awt.*; import java.awt.datatransfer.*; +import java.awt.dnd.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; import jalview.analysis.*; +import jalview.commands.*; import jalview.datamodel.*; import jalview.io.*; import jalview.jbgui.*; import jalview.schemes.*; -import jalview.util.ShiftList; import jalview.ws.*; -import java.awt.dnd.*; -import org.biojava.dasobert.eventmodel.*; /** * DOCUMENT ME! @@ -45,112 +44,413 @@ import org.biojava.dasobert.eventmodel.*; * @version $Revision$ */ public class AlignFrame - extends GAlignFrame implements DropTargetListener, FeatureListener + 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(); - private int treeCount = 0; + String currentFileFormat = null; + + String fileName = null; + + + /** + * 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); - // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel); + if (viewport.wrapAlignment) + { + wrapMenuItem_actionPerformed(null); + } - ///Dataset tab - ///////////////////////// - if(al.getDataset()==null) + if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW",false)) { - al.setDataset(null); + this.overviewMenuItem_actionPerformed(null); } - // AlignViewport ds = new AlignViewport(al.getDataset(), true); - // AlignmentPanel dap = new AlignmentPanel(this, ds); - // tabbedPane.add("Dataset", dap); - // viewports.add(ds); - // alignPanels.add(dap); - ///////////////////////// + addKeyListener(); - viewport.addPropertyChangeListener(new PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { - if (evt.getPropertyName().equals("alignment")) - { - alignmentChanged(); - } - } - }); + } + public void setFileName(String file, String format) + { + fileName = file; + currentFileFormat = format; + reload.setEnabled(true); + } - if (Desktop.desktop != null) + void addKeyListener() + { + 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 27: // escape key + deselectAllSequenceMenuItem_actionPerformed(null); + + break; + + case KeyEvent.VK_DOWN: + if (evt.isAltDown() || !viewport.cursorMode) + moveSelectedSequences(false); + if (viewport.cursorMode) + alignPanel.seqPanel.moveCursor(0, 1); + break; + + case KeyEvent.VK_UP: + if (evt.isAltDown() || !viewport.cursorMode) + moveSelectedSequences(true); + if (viewport.cursorMode) + alignPanel.seqPanel.moveCursor(0, -1); + + break; + + case KeyEvent.VK_LEFT: + if (evt.isAltDown() || !viewport.cursorMode) + slideSequences(false, + alignPanel.seqPanel.getKeyboardNo1()); + else + alignPanel.seqPanel.moveCursor( -1, 0); + + + break; + + case KeyEvent.VK_RIGHT: + if (evt.isAltDown() || !viewport.cursorMode) + slideSequences(true, + alignPanel.seqPanel.getKeyboardNo1()); + else + 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() != 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; + } + } + + public void keyReleased(KeyEvent evt) + { + switch(evt.getKeyCode()) + { + case KeyEvent.VK_LEFT: + if (evt.isAltDown() || !viewport.cursorMode) + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); + break; + + case KeyEvent.VK_RIGHT: + if (evt.isAltDown() || !viewport.cursorMode) + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); + break; + } + } + }); + } + + + public void addAlignmentPanel(final AlignmentPanel ap, + boolean newPanel) + { + 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) { - addServiceListeners(); - setGUINucleotide(al.isNucleotide()); + this.getContentPane().add(ap, BorderLayout.CENTER); } + else + { + if (aSize == 2) + { + setInitialTabVisible(); + } + expandViews.setEnabled(true); + gatherViews.setEnabled(true); + tabbedPane.addTab(ap.av.viewName, ap); - if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false)) - { - wrapMenuItem.setSelected(true); - wrapMenuItem_actionPerformed(null); + ap.setVisible(false); } + if(newPanel) + { + if (ap.av.padGaps) + { + ap.av.alignment.padGaps(); + } + ap.av.updateConservation(ap); + ap.av.updateConsensus(ap); + } } - - /** - * Creates a new AlignFrame object. - * - * @param al DOCUMENT ME! - */ - public AlignFrame(AlignmentI al) + public void setInitialTabVisible() { - this(al, null); + expandViews.setEnabled(true); + gatherViews.setEnabled(true); + tabbedPane.setVisible(true); + AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement(); + tabbedPane.addTab(first.av.viewName,first); + this.getContentPane().add(tabbedPane, BorderLayout.CENTER); } + public AlignViewport getViewport() { return viewport; @@ -175,6 +475,7 @@ public class AlignFrame } } }); + addInternalFrameListener(new javax.swing.event. InternalFrameAdapter() { @@ -183,7 +484,7 @@ public class AlignFrame { // System.out.println("deregistering discoverer listener"); Desktop.discoverer.removePropertyChangeListener(thisListener); - closeMenuItem_actionPerformed(null); + closeMenuItem_actionPerformed(true); } ; }); @@ -192,10 +493,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,23 +503,46 @@ 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.rightAlignIds); + renderGapsMenuItem.setSelected(av.renderGaps); + wrapMenuItem.setSelected(av.wrapAlignment); + scaleAbove.setVisible(av.wrapAlignment); + scaleLeft.setVisible(av.wrapAlignment); + scaleRight.setVisible(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) { if(progressBars == null) + { progressBars = new Hashtable(); + } JPanel progressPanel; GridLayout layout = (GridLayout) statusPanel.getLayout(); @@ -231,7 +553,9 @@ public class AlignFrame progressBars.remove( progressPanel ); progressPanel = null; if(message!=null) + { statusBar.setText(message); + } layout.setRows(layout.getRows() - 1); } @@ -255,6 +579,8 @@ public class AlignFrame } + + /* Added so Castor Mapping file can obtain Jalview Version */ @@ -279,6 +605,52 @@ public class AlignFrame Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport); } + public void reload_actionPerformed(ActionEvent e) + { + if(fileName!=null) + { + if(currentFileFormat.equals("Jalview")) + { + JInternalFrame [] frames = Desktop.desktop.getAllFrames(); + for(int i=0; i 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 +1019,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 +1033,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 +1054,20 @@ 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(); + + AlignViewport originalSource = getOriginatingSource(command); + updateEditMenuBar(); + + if(originalSource!=null) + { + originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + originalSource.firePropertyChange("alignment", + null, + originalSource.alignment.getSequences()); + } } /** @@ -602,26 +1077,67 @@ 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); + if(viewport.redoList.size()<1) + { + return; + } + + CommandI command = (CommandI) viewport.redoList.pop(); + viewport.historyList.push(command); + command.doCommand(); + + AlignViewport originalSource = getOriginatingSource(command); updateEditMenuBar(); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + + if(originalSource!=null) + { + originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + originalSource.firePropertyChange("alignment", + null, + originalSource.alignment.getSequences()); + } } - // used by undo and redo - void restoreHistoryItem(HistoryItem hi) + AlignViewport getOriginatingSource(CommandI command) { + AlignViewport originalSource = null; + //For sequence removal and addition, we need to fire + //the property change event FROM the viewport where the + //original alignment was altered + AlignmentI al=null; + if (command instanceof EditCommand) + { + EditCommand editCommand = (EditCommand) command; + al = editCommand.getAlignment(); + Vector comps = (Vector) PaintRefresher.components + .get(viewport.getSequenceSetId()); - hi.restore(viewport.getColumnSelection()); + for (int i = 0; i < comps.size(); i++) + { + if (comps.elementAt(i) instanceof AlignmentPanel) + { + if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment) + { + originalSource = ( (AlignmentPanel) comps.elementAt(i)).av; + break; + } + } + } + } - updateEditMenuBar(); + if (originalSource == null) + { + //The original view is closed, we must validate + //the current view against the closed view first + if (al != null) + { + PaintRefresher.validateSequences(al, viewport.alignment); + } - viewport.firePropertyChange("alignment", null, - viewport.getAlignment().getSequences()); + originalSource = viewport; + } + + return originalSource; } /** @@ -644,14 +1160,14 @@ public class AlignFrame { SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.getSequences(false).contains(seq)) + if (!sg.getSequences(null).contains(seq)) { continue; } SequenceI temp = viewport.alignment.getSequenceAt(i - 1); - if (sg.getSequences(false).contains(temp)) + if (sg.getSequences(null).contains(temp)) { continue; } @@ -666,14 +1182,14 @@ public class AlignFrame { SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.getSequences(false).contains(seq)) + if (!sg.getSequences(null).contains(seq)) { continue; } SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - if (sg.getSequences(false).contains(temp)) + if (sg.getSequences(null).contains(temp)) { continue; } @@ -683,11 +1199,102 @@ public class AlignFrame } } - alignPanel.repaint(); + alignPanel.paintAlignment(true); } + + synchronized void slideSequences(boolean right, int size) + { + Vector sg = new Vector(); + if(viewport.cursorMode) + { + sg.addElement(viewport.alignment.getSequenceAt( + alignPanel.seqPanel.seqCanvas.cursorY)); + } + else if(viewport.getSelectionGroup()!=null + && viewport.getSelectionGroup().getSize()!=viewport.alignment.getHeight()) + { + sg = viewport.getSelectionGroup().getSequences( + viewport.hiddenRepSequences); + } + + if(sg.size()<1) + { + return; + } + + Vector invertGroup = new Vector(); + + for (int i = 0; i < viewport.alignment.getHeight(); i++) + { + if(!sg.contains(viewport.alignment.getSequenceAt(i))) + invertGroup.add(viewport.alignment.getSequenceAt(i)); + } + + SequenceI[] seqs1 = new SequenceI[sg.size()]; + for (int i = 0; i < sg.size(); i++) + seqs1[i] = (SequenceI) sg.elementAt(i); + + SequenceI[] seqs2 = new SequenceI[invertGroup.size()]; + for (int i = 0; i < invertGroup.size(); i++) + seqs2[i] = (SequenceI) invertGroup.elementAt(i); + + SlideSequencesCommand ssc; + if (right) + ssc = new SlideSequencesCommand("Slide Sequences", + seqs2, seqs1, size, + viewport.getGapCharacter() + ); + else + ssc = new SlideSequencesCommand("Slide Sequences", + seqs1, seqs2, size, + viewport.getGapCharacter() + ); + + int groupAdjustment = 0; + if (ssc.getGapsInsertedBegin() && right) + { + if (viewport.cursorMode) + alignPanel.seqPanel.moveCursor(size, 0); + else + groupAdjustment = size; + } + else if (!ssc.getGapsInsertedBegin() && !right) + { + if (viewport.cursorMode) + alignPanel.seqPanel.moveCursor( -size, 0); + else + groupAdjustment = -size; + } + + if (groupAdjustment != 0) + { + viewport.getSelectionGroup().setStartRes( + viewport.getSelectionGroup().getStartRes() + groupAdjustment); + viewport.getSelectionGroup().setEndRes( + viewport.getSelectionGroup().getEndRes() + groupAdjustment); + } + + + boolean appendHistoryItem = false; + if(viewport.historyList!=null + && viewport.historyList.size()>0 + && viewport.historyList.peek() instanceof SlideSequencesCommand) + { + appendHistoryItem = ssc.appendSlideCommand( + (SlideSequencesCommand)viewport.historyList.peek()) + ; + } + + if(!appendHistoryItem) + addHistoryItem(ssc); + + repaint(); + } + + /** * DOCUMENT ME! * @@ -695,6 +1302,7 @@ public class AlignFrame */ protected void copy_actionPerformed(ActionEvent e) { + System.gc(); if (viewport.getSelectionGroup() == null) { return; @@ -713,28 +1321,61 @@ public class AlignFrame seqs, omitHidden); + StringSelection ss = new StringSelection(output); + + try + { + jalview.gui.Desktop.internalCopy = true; + //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(new StringSelection(output), Desktop.instance); + 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) { hiddenColumns =new Vector(); int hiddenOffset = viewport.getSelectionGroup().getStartRes(); - for(int i=0; i 0) { - HistoryItem edit; - addHistoryItem(edit=new HistoryItem("Remove Left", viewport.alignment, - HistoryItem.HIDE)); + if(trimLeft) + { + column = colSel.getMin(); + } + else + { + column = colSel.getMax(); + } + + SequenceI [] seqs; + if(viewport.getSelectionGroup()!=null) + { + seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport. + hiddenRepSequences); + } + else + { + seqs = viewport.alignment.getSequencesArray(); + } + - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0, min); - edit.addShift(0,min); - if (viewport.getSelectionGroup() != null) + TrimRegionCommand trimRegion; + if(trimLeft) { - viewport.getSelectionGroup().adjustForRemoveLeft(min); + 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(); @@ -1125,13 +1838,15 @@ public class AlignFrame { SequenceGroup sg = (SequenceGroup) groups.get(i); - if (!sg.adjustForRemoveLeft(min)) + 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()); } } @@ -1140,38 +1855,86 @@ public class AlignFrame * * @param e DOCUMENT ME! */ - public void remove2RightMenuItem_actionPerformed(ActionEvent e) + public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e) { - ColumnSelection colSel = viewport.getColumnSelection(); + int start = 0, end = viewport.alignment.getWidth()-1; - if (colSel.size() > 0) + SequenceI[] seqs; + if (viewport.getSelectionGroup() != null) + { + seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport. + hiddenRepSequences); + start = viewport.getSelectionGroup().getStartRes(); + end = viewport.getSelectionGroup().getEndRes(); + } + else { - addHistoryItem(new HistoryItem("Remove Right", viewport.alignment, - HistoryItem.HIDE)); + 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) - { - viewport.getSelectionGroup().adjustForRemoveRight(max); - } - Vector groups = viewport.alignment.getGroups(); + RemoveGapColCommand removeGapCols = + new RemoveGapColCommand("Remove Gapped Columns", + seqs, + start, end, + viewport.alignment); - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.get(i); + addHistoryItem(removeGapCols); - if (!sg.adjustForRemoveRight(max)) - { - viewport.alignment.deleteGroup(sg); - } - } + 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); + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); + + } + + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void removeAllGapsMenuItem_actionPerformed(ActionEvent e) + { + int start = 0, end = viewport.alignment.getWidth()-1; + + SequenceI[] seqs; + if (viewport.getSelectionGroup() != null) + { + seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport. + hiddenRepSequences); + 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); + + addHistoryItem(new RemoveGapsCommand("Remove Gaps", + seqs, + start, end, + viewport.alignment)); + + viewport.setStartRes(seq.findIndex(startRes)-1); + + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } } /** @@ -1179,23 +1942,13 @@ public class AlignFrame * * @param e DOCUMENT ME! */ - public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e) + public void padGapsMenuitem_actionPerformed(ActionEvent e) { - HistoryItem edit; - addHistoryItem(edit=new HistoryItem("Remove Gapped Columns", - viewport.alignment, HistoryItem.HIDE)); + viewport.padGaps = padGapsMenuitem.isSelected(); - //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); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + viewport.firePropertyChange("alignment", + null, + viewport.getAlignment().getSequences()); } /** @@ -1203,173 +1956,72 @@ public class AlignFrame * * @param e DOCUMENT ME! */ - public void removeAllGapsMenuItem_actionPerformed(ActionEvent e) + public void findMenuItem_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)); - - //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; + new Finder(); + } - Vector seqs = null; + public void newView_actionPerformed(ActionEvent e) + { + AlignmentPanel newap = + new Jalview2XML().copyAlignPanel(alignPanel, true); - int start = 0; - int end = viewport.alignment.getWidth(); + newap.av.gatherViewsHere = false; - 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 + if (viewport.viewName == null) { - seqs = viewport.alignment.getSequences(); + viewport.viewName = "Original"; } - /* 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()); - } - } - } - }*/ - - 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(); + newap.av.historyList = viewport.historyList; + newap.av.redoList = viewport.redoList; - if(alignPanel.overviewPanel!=null) - alignPanel.overviewPanel.updateOverviewImage(); + int index = Desktop.getViewCount(viewport.getSequenceSetId()); + String newViewName = "View " +index; - alignPanel.repaint(); - } - - void resetAllColourSchemes() - { - ColourSchemeI cs = viewport.globalColourScheme; - if(cs!=null) + Vector comps = (Vector) PaintRefresher.components.get(viewport. + getSequenceSetId()); + Vector existingNames = new Vector(); + for(int i=0; i 0)) || + (viewport.getSelectionGroup().getSize() < 4) && + (viewport.getSelectionGroup().getSize() > 0)) || (viewport.getAlignment().getHeight() < 4)) { JOptionPane.showInternalMessageDialog(this, @@ -2101,7 +2774,7 @@ public class AlignFrame return; } - new PCAPanel(viewport); + new PCAPanel(alignPanel); } @@ -2110,7 +2783,9 @@ public class AlignFrame viewport.autoCalculateConsensus = autoCalculate.isSelected(); if(viewport.autoCalculateConsensus) { - alignmentChanged(); + viewport.firePropertyChange("alignment", + null, + viewport.getAlignment().getSequences()); } } @@ -2166,16 +2841,24 @@ public class AlignFrame { TreePanel tp; - if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize(false) > 3)) + if (viewport.getSelectionGroup() != null) { + if (viewport.getSelectionGroup().getSize() < 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(); /* Decide if the selection is a column region */ - while (s < sg.getSize(false)) + while (s < sg.getSize()) { - if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() < + if ( ( (SequenceI) sg.getSequences(null).elementAt(s++)).getLength() < sg.getEndRes()) { JOptionPane.showMessageDialog(Desktop.desktop, @@ -2190,7 +2873,7 @@ public class AlignFrame } title = title + " on region"; - tp = new TreePanel(viewport, type, pwType); + tp = new TreePanel(alignPanel, type, pwType); } else { @@ -2208,14 +2891,23 @@ public class AlignFrame } if(viewport.alignment.getHeight()<2) + { return; + } - tp = new TreePanel(viewport, type, pwType); + tp = new TreePanel(alignPanel, type, pwType); + } + + title += " from "; + + if(viewport.viewName!=null) + { + title+= viewport.viewName+" of "; } - addTreeMenuItem(tp, title); + title += this.title; - Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500); + Desktop.addInternalFrame(tp, title, 600, 500); } /** @@ -2232,12 +2924,15 @@ 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); - alignPanel.repaint(); + + addHistoryItem(new OrderCommand(order.getName(), oldOrder, + viewport.alignment)); + + alignPanel.paintAlignment(true); } }); } @@ -2251,46 +2946,54 @@ public class AlignFrame * @param treePanel Displayed tree window. * @param title SortBy menu item title. */ - void addTreeMenuItem(final TreePanel treePanel, String title) + public void buildTreeMenu() { - final JMenuItem item = new JMenuItem(title); + sortByTreeMenu.removeAll(); - treeCount++; - - if (treeCount == 1) + Vector comps = (Vector) PaintRefresher.components.get(viewport. + getSequenceSetId()); + Vector treePanels = new Vector(); + int i, iSize = comps.size(); + for(i=0; i 1)) + (viewport.getSelectionGroup().getSize() > 1)) { // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface! /*SequenceGroup seqs = viewport.getSelectionGroup(); @@ -2346,7 +3049,7 @@ public class AlignFrame AlignmentView seqs = null; if ( (viewport.getSelectionGroup() != null) && - (viewport.getSelectionGroup().getSize(false) > 0)) + (viewport.getSelectionGroup().getSize() > 0)) { seqs = viewport.getAlignmentView(true); } @@ -2358,7 +3061,8 @@ public class AlignFrame // TODO: viewport.alignment.isAligned is a global state - the local selection may well be aligned - we preserve 2.0.8 behaviour for moment. if (!viewport.alignment.isAligned()) { - seqs.setSequences(new SeqCigar[] { seqs.getSequences()[0] } ); + seqs.setSequences(new SeqCigar[] + {seqs.getSequences()[0]}); } return seqs; } @@ -2406,15 +3110,33 @@ 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; @@ -2424,19 +3146,20 @@ public class AlignFrame if (nf.getTree() != null) { - tp = new TreePanel(viewport, + tp = new TreePanel(alignPanel, "FromFile", title, - nf); + nf, input); tp.setSize(w,h); if(x>0 && y>0) + { tp.setLocation(x,y); + } Desktop.addInternalFrame(tp, title, w, h); - addTreeMenuItem(tp, title); } } catch (Exception ex) @@ -2447,28 +3170,6 @@ public class AlignFrame return tp; } - class PrintThread - extends Thread - { - public void run() - { - PrinterJob printJob = PrinterJob.getPrinterJob(); - PageFormat pf = printJob.pageDialog(printJob.defaultPage()); - printJob.setPrintable(alignPanel, pf); - - if (printJob.printDialog()) - { - try - { - printJob.print(); - } - catch (Exception PrintException) - { - PrintException.printStackTrace(); - } - } - } - } /** * Generates menu items and listener event actions for web service clients @@ -2498,7 +3199,9 @@ public class AlignFrame { AlignmentView msa = gatherSequencesForAlignment(); new jalview.ws.MsaWSClient(sh, title, msa, - false, true, viewport.getAlignment().getDataset(), af); + false, true, + viewport.getAlignment().getDataset(), + af); } @@ -2515,7 +3218,9 @@ public class AlignFrame { AlignmentView msa = gatherSequencesForAlignment(); new jalview.ws.MsaWSClient(sh, title, msa, - true, true, viewport.getAlignment().getDataset(), af); + true, true, + viewport.getAlignment().getDataset(), + af); } @@ -2543,7 +3248,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 +3256,7 @@ public class AlignFrame { // Sequence profile based prediction new jalview.ws.JPredClient(sh, - title, true, msa, af); + title, true, msa, af, true); } } } @@ -2600,117 +3305,34 @@ public class AlignFrame public void showTranslation_actionPerformed(ActionEvent e) { + /////////////////////////////// + // Collect Data to be translated/transferred + 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 -1 || file.indexOf("file:") > -1) + { + protocol = "URL"; + } + boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport. - alignment, file); + alignment, file, protocol); if (!isAnnotation) { - boolean isGroupsFile = parseFeaturesFile(file, - AppletFormatAdapter.FILE); + boolean isGroupsFile = parseFeaturesFile(file,protocol); if (!isGroupsFile) { - String format = new IdentifyFile().Identify(file, FormatAdapter.FILE); - new FileLoader().LoadFile(viewport, file, FormatAdapter.FILE, format); + String format = new IdentifyFile().Identify(file, protocol); + + if(format.equalsIgnoreCase("JnetFile")) + { + jalview.io.JPredFile predictions = new jalview.io.JPredFile( + file, protocol); + new JnetAnnotationMaker().add_annotation(predictions, + viewport.getAlignment(), + 0, false); + alignPanel.adjustAnnotationHeight(); + alignPanel.paintAlignment(true); + } + else + { + new FileLoader().LoadFile(viewport, file, protocol, format); } } + } else { // (isAnnotation) alignPanel.adjustAnnotationHeight(); } - }catch(Exception ex) + } + catch (Exception ex) { 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; + } +} + +class PrintThread + extends Thread +{ + AlignmentPanel ap; + public PrintThread(AlignmentPanel ap) + { + this.ap = ap; + } + static PageFormat pf; + public void run() + { + PrinterJob printJob = PrinterJob.getPrinterJob(); + + if (pf != null) + { + printJob.setPrintable(ap, pf); + } + else + { + printJob.setPrintable(ap); + } + + if (printJob.printDialog()) + { + try + { + printJob.print(); + } + catch (Exception PrintException) + { + PrintException.printStackTrace(); + } + } + } }