X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignFrame.java;h=4d9a419b6d4aba8b640b5f5fe8ea8992a6879961;hb=97de0d0525d1b7a81a7d8164fae39e6538a583e5;hp=0a771e132f4c1caabf9735ecc57602277773dbca;hpb=2718d85fac1aef21e2d927d81a1a1b92492975ae;p=jalview.git diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java index 0a771e1..4d9a419 100755 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/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) 2006 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 @@ -23,6 +23,7 @@ import jalview.schemes.*; import jalview.datamodel.*; import jalview.analysis.*; import jalview.io.*; +import jalview.commands.*; import java.awt.*; import java.awt.event.*; import java.util.*; @@ -36,8 +37,8 @@ public class AlignFrame extends Frame implements ActionListener, { public AlignmentPanel alignPanel; public AlignViewport viewport; - int NEW_WINDOW_WIDTH = 700; - int NEW_WINDOW_HEIGHT = 500; + int DEFAULT_WIDTH = 700; + int DEFAULT_HEIGHT = 500; String jalviewServletURL; @@ -60,6 +61,9 @@ public class AlignFrame extends Frame implements ActionListener, viewport = new AlignViewport(al, applet); alignPanel = new AlignmentPanel(this, viewport); + viewport.updateConservation(alignPanel); + viewport.updateConsensus(alignPanel); + annotationPanelMenuItem.setState(viewport.showAnnotation); seqLimits.setState(viewport.showJVSuffix); @@ -91,13 +95,13 @@ public class AlignFrame extends Frame implements ActionListener, if (param != null) { int width = Integer.parseInt(param); - NEW_WINDOW_WIDTH = width; + DEFAULT_WIDTH = width; } param = applet.getParameter("windowHeight"); if (param != null) { int height = Integer.parseInt(param); - NEW_WINDOW_HEIGHT = height; + DEFAULT_HEIGHT = height; } } catch (Exception ex) @@ -113,17 +117,6 @@ public class AlignFrame extends Frame implements ActionListener, alignPanel.scalePanel.addKeyListener(this); alignPanel.annotationPanel.addKeyListener(this); - viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() - { - public void propertyChange(java.beans.PropertyChangeEvent evt) - { - if (evt.getPropertyName().equals("alignment")) - { - alignmentChanged(); - } - } - }); - if(embedded) { @@ -132,8 +125,8 @@ public class AlignFrame extends Frame implements ActionListener, else { add(alignPanel, BorderLayout.CENTER); - jalview.bin.JalviewLite.addFrame(this, title, NEW_WINDOW_WIDTH, - NEW_WINDOW_HEIGHT); + jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH, + DEFAULT_HEIGHT); } alignPanel.validate(); alignPanel.repaint(); @@ -215,9 +208,9 @@ public class AlignFrame extends Frame implements ActionListener, } break; case KeyEvent.VK_V: - if (evt.isControlDown() || evt.isMetaDown()) + if (evt.isControlDown()) { - paste(true); + paste(evt.isShiftDown()); } break; case KeyEvent.VK_A: @@ -260,7 +253,10 @@ public class AlignFrame extends Frame implements ActionListener, case KeyEvent.VK_SPACE: if(viewport.cursorMode) { - alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()); + alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown() + || evt.isShiftDown() + || evt.isAltDown() + ); } break; @@ -268,7 +264,9 @@ public class AlignFrame extends Frame implements ActionListener, case KeyEvent.VK_BACK_SPACE: if(viewport.cursorMode) { - alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()); + alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown() + || evt.isShiftDown() + || evt.isAltDown()); } else { @@ -320,7 +318,6 @@ public class AlignFrame extends Frame implements ActionListener, alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes; alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq; } - alignPanel.seqPanel.seqCanvas.repaint(); break; case KeyEvent.VK_F: @@ -329,6 +326,7 @@ public class AlignFrame extends Frame implements ActionListener, findMenuItem_actionPerformed(); } break; + case KeyEvent.VK_H: { boolean toggleSeqs = !evt.isControlDown(); @@ -343,7 +341,7 @@ public class AlignFrame extends Frame implements ActionListener, hide = true; viewport.hideAllSelectedSeqs(); } - else + else if (!(toggleCols && viewport.colSel.getSelected().size() > 0)) viewport.showAllHiddenSeqs(); } @@ -358,12 +356,84 @@ public class AlignFrame extends Frame implements ActionListener, else if (!hide) viewport.showAllHiddenColumns(); } + break; + } - alignPanel.repaint(); + 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; + + case KeyEvent.VK_Z: + if (evt.isControlDown()) + { + undoMenuItem_actionPerformed(); + } + break; + + case KeyEvent.VK_Y: + if (evt.isControlDown()) + { + redoMenuItem_actionPerformed(); + } + break; + + case KeyEvent.VK_L: + if (evt.isControlDown()) + { + trimAlignment(true); + } + break; + + case KeyEvent.VK_R: + if (evt.isControlDown()) + { + trimAlignment(false); + } + break; + + case KeyEvent.VK_E: + if (evt.isControlDown()) + { + if (evt.isShiftDown()) + this.removeAllGapsMenuItem_actionPerformed(); + else + removeGappedColumnMenuItem_actionPerformed(); + } break; + case KeyEvent.VK_I: + if (evt.isControlDown()) + { + if (evt.isAltDown()) + viewport.invertColumnSelection(); + else + this.invertSequenceMenuItem_actionPerformed(); + } + break; + + case KeyEvent.VK_U: + if (evt.isControlDown()) + { + this.deleteGroups_actionPerformed(); } + break; - } + + } + alignPanel.repaint(); } public void keyReleased(KeyEvent evt) {} @@ -453,9 +523,9 @@ public void itemStateChanged(ItemEvent evt) else if(source==invertColSel) { viewport.invertColumnSelection(); alignPanel.repaint(); } else if(source==remove2LeftMenuItem) - remove2LeftMenuItem_actionPerformed(); + trimAlignment(true); else if(source==remove2RightMenuItem) - remove2RightMenuItem_actionPerformed(); + trimAlignment(false); else if(source==removeGappedColumnMenuItem) removeGappedColumnMenuItem_actionPerformed(); else if(source==removeAllGapsMenuItem) @@ -553,7 +623,7 @@ public void itemStateChanged(ItemEvent evt) protected void outputText_actionPerformed(ActionEvent e) { - CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); + CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); Frame frame = new Frame(); frame.add(cap); jalview.bin.JalviewLite.addFrame(frame, @@ -583,6 +653,12 @@ public void itemStateChanged(ItemEvent evt) url.append( appendProtocol( viewport.applet.getParameter("annotations") ) ); } + if(viewport.applet.getParameter("jnetfile")!=null) + { + url.append( "&annotations=" ); + url.append( appendProtocol( viewport.applet.getParameter("jnetfile") ) ); + } + if(viewport.applet.getParameter("defaultColour")!=null) { url.append("&colour=" + @@ -636,16 +712,18 @@ public void itemStateChanged(ItemEvent evt) this.dispose(); } - Stack historyList = new Stack(); - Stack redoList = new Stack(); + /** + * DOCUMENT ME! + */ void updateEditMenuBar() { - if (historyList.size() > 0) + + if (viewport.historyList.size() > 0) { undoMenuItem.setEnabled(true); - HistoryItem hi = (HistoryItem) historyList.peek(); - undoMenuItem.setLabel("Undo " + hi.getDescription()); + CommandI command = (CommandI) viewport.historyList.peek(); + undoMenuItem.setLabel("Undo " + command.getDescription()); } else { @@ -653,11 +731,12 @@ public void itemStateChanged(ItemEvent evt) undoMenuItem.setLabel("Undo"); } - if (redoList.size() > 0) + if (viewport.redoList.size() > 0) { redoMenuItem.setEnabled(true); - HistoryItem hi = (HistoryItem) redoList.peek(); - redoMenuItem.setLabel("Redo " + hi.getDescription()); + + CommandI command = (CommandI) viewport.redoList.peek(); + redoMenuItem.setLabel("Redo " + command.getDescription()); } else { @@ -666,37 +745,81 @@ public void itemStateChanged(ItemEvent evt) } } - public void addHistoryItem(HistoryItem hi) + public void addHistoryItem(CommandI command) { - historyList.push(hi); - updateEditMenuBar(); + if(command.getSize()>0) + { + viewport.historyList.push(command); + viewport.redoList.removeAllElements(); + updateEditMenuBar(); + viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + } } + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ protected void undoMenuItem_actionPerformed() { - HistoryItem hi = (HistoryItem) historyList.pop(); - redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, - HistoryItem.HIDE)); - restoreHistoryItem(hi); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } + if(viewport.historyList.size()<1) + return; - protected void redoMenuItem_actionPerformed() - { - HistoryItem hi = (HistoryItem) redoList.pop(); - restoreHistoryItem(hi); + CommandI command = (CommandI)viewport.historyList.pop(); + viewport.redoList.push(command); + command.undoCommand(); + + AlignViewport originalSource = getOriginatingSource(command); + + originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; updateEditMenuBar(); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + originalSource.firePropertyChange("alignment", null,null); } - // used by undo and redo - void restoreHistoryItem(HistoryItem hi) + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + protected void redoMenuItem_actionPerformed() { - hi.restore(); + CommandI command = (CommandI) viewport.redoList.pop(); + viewport.historyList.push(command); + command.doCommand(); + + AlignViewport originalSource = getOriginatingSource(command); + originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns()!=null; updateEditMenuBar(); + originalSource.firePropertyChange("alignment", null, null); + } - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); + AlignViewport getOriginatingSource(CommandI command) + { + AlignViewport originalSource = viewport; + //For sequence removal and addition, we need to fire + //the property change event FROM the viewport where the + //original alignment was altered + if (command instanceof EditCommand) + { + EditCommand editCommand = (EditCommand) command; + AlignmentI al = editCommand.getAlignment(); + Vector comps = (Vector) PaintRefresher.components + .get(viewport.getSequenceSetId()); + 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; + } + } + } + } + return originalSource; } public void moveSelectedSequences(boolean up) @@ -849,8 +972,6 @@ public void itemStateChanged(ItemEvent evt) protected void pasteThis_actionPerformed() { - addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, - HistoryItem.PASTE)); paste(false); } @@ -870,26 +991,16 @@ public void itemStateChanged(ItemEvent evt) 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); - - if (!newAlignment) - { - viewport.alignment.addSequence(sequence); - } - else - { - seqs.addElement(sequence); - } + seqs.addElement(new Sequence(name, st.nextToken(), start, end)); + } + SequenceI[] newSeqs = new SequenceI[seqs.size()]; + for (int i = 0; i < seqs.size(); i++) + { + newSeqs[i] = (SequenceI) seqs.elementAt(i); } if (newAlignment) { - SequenceI[] newSeqs = new SequenceI[seqs.size()]; - for (int i = 0; i < seqs.size(); i++) - { - newSeqs[i] = (SequenceI) seqs.elementAt(i); - } - String newtitle = new String("Copied sequences"); if (getTitle().startsWith("Copied sequences")) { @@ -913,11 +1024,21 @@ public void itemStateChanged(ItemEvent evt) } - jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH, - NEW_WINDOW_HEIGHT); + jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH, + DEFAULT_HEIGHT); } else { + //!newAlignment + addHistoryItem(new EditCommand( + "Add sequences", + EditCommand.PASTE, + newSeqs, + 0, + viewport.alignment.getWidth(), + viewport.alignment) + ); + viewport.setEndSeq(viewport.alignment.getHeight()); viewport.alignment.getWidth(); viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); @@ -937,62 +1058,62 @@ public void itemStateChanged(ItemEvent evt) protected void delete_actionPerformed() { - addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, - HistoryItem.HIDE)); - if (viewport.getSelectionGroup() == null) + + SequenceGroup sg = viewport.getSelectionGroup(); + if (sg == null) { return; } - - SequenceGroup sg = viewport.getSelectionGroup(); - boolean allSequences = false; - if(sg.getSize(false)==viewport.alignment.getHeight()) - allSequences = true; - + Vector seqs = new Vector(); + SequenceI seq; 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); + seq = sg.getSequenceAt(i); + seqs.addElement(seq); + } - // If the cut affects all sequences, remove highlighted columns - if (allSequences) - { - viewport.getColumnSelection().removeElements(sg.getStartRes(), - sg.getEndRes() + 1); - } + // If the cut affects all sequences, remove highlighted columns + if (sg.getSize(false) == viewport.alignment.getHeight()) + { + viewport.getColumnSelection().removeElements(sg.getStartRes(), + sg.getEndRes() + 1); + } + + + SequenceI [] cut = new SequenceI[seqs.size()]; + for(int i=0; i 0) { - addHistoryItem(new HistoryItem("Remove Left", viewport.alignment, - HistoryItem.HIDE)); - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0, min); + if(trimLeft) + column = colSel.getMin(); + else + column = colSel.getMax(); - if (viewport.getSelectionGroup() != null) - { - viewport.getSelectionGroup().adjustForRemoveLeft(min); - } + SequenceI [] seqs; + if(viewport.getSelectionGroup()!=null) + seqs = viewport.getSelectionGroup().getSequencesAsArray(true); + else + seqs = viewport.alignment.getSequencesArray(); - Vector groups = viewport.alignment.getGroups(); - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.elementAt(i); - if (!sg.adjustForRemoveLeft(min)) - { - viewport.alignment.deleteGroup(sg); - } - } - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } - } - public void remove2RightMenuItem_actionPerformed() - { - ColumnSelection colSel = viewport.getColumnSelection(); - if (colSel.size() > 0) - { - addHistoryItem(new HistoryItem("Remove Right", viewport.alignment, - HistoryItem.HIDE)); - int max = colSel.getMax(); - viewport.getAlignment().trimRight(max); - 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(); + for (int i = 0; i < groups.size(); i++) { SequenceGroup sg = (SequenceGroup) groups.elementAt(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()); + } } + public void removeGappedColumnMenuItem_actionPerformed() { - addHistoryItem(new HistoryItem("Remove Gapped Columns", - viewport.alignment, - HistoryItem.HIDE)); + int start = 0, end = viewport.alignment.getWidth()-1; - //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[] seqs; + if (viewport.getSelectionGroup() != null) + { + seqs = viewport.getSelectionGroup().getSequencesAsArray(true); + start = viewport.getSelectionGroup().getStartRes(); + end = viewport.getSelectionGroup().getEndRes(); + } + else + seqs = viewport.alignment.getSequencesArray(); - viewport.getAlignment().removeGaps(); - viewport.setStartRes(seq.findIndex(startRes)-1); + RemoveGapColCommand removeGapCols = + new RemoveGapColCommand("Remove Gapped Columns", + seqs, + start, end, + viewport.getGapCharacter()); - viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - } + addHistoryItem(removeGapCols); - public void removeAllGapsMenuItem_actionPerformed() - { - addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment, - HistoryItem.HIDE)); + 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()); - SequenceI current; - int jSize; - - Vector seqs=null; + } - int start=0, end = viewport.alignment.getWidth(); + public void removeAllGapsMenuItem_actionPerformed() + { + int start = 0, end = viewport.alignment.getWidth()-1; - if (viewport.getSelectionGroup() != null - && viewport.getSelectionGroup().getSequences(false) != null - && viewport.getSelectionGroup().getSize(false)>0) + SequenceI[] seqs; + if (viewport.getSelectionGroup() != null) { - seqs = viewport.getSelectionGroup().getSequences(true); + seqs = viewport.getSelectionGroup().getSequencesAsArray(true); start = viewport.getSelectionGroup().getStartRes(); - end = viewport.getSelectionGroup().getEndRes()+1; + end = viewport.getSelectionGroup().getEndRes(); } else - seqs = viewport.alignment.getSequences(); + seqs = viewport.alignment.getSequencesArray(); - for (int i = 0; i < seqs.size(); i++) - { - current = (SequenceI) seqs.elementAt(i); - jSize = current.getLength(); + //This is to maintain viewport position on first residue + //of first sequence + SequenceI seq = viewport.alignment.getSequenceAt(0); + int startRes = seq.findPosition(viewport.startRes); - // Removing a range is much quicker than removing gaps - // one by one for long sequences - int j = start; - int rangeStart=-1, rangeEnd=-1; + addHistoryItem(new RemoveGapsCommand("Remove Gaps", + seqs, + start, end, + viewport.getGapCharacter())); - do - { - if (jalview.util.Comparison.isGap(current.getCharAt(j))) - { - 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++; - } - } - 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.alignment.padGaps(); - if(viewport.autocalculateConsensus) - { - viewport.updateConsensus(); - viewport.updateConservation(); - } - - resetAllColourSchemes(); - if(alignPanel.overviewPanel!=null) - alignPanel.overviewPanel.updateOverviewImage(); - - viewport.alignment.adjustSequenceAnnotations(); - 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); - } - } + viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences()); - int s, sSize = viewport.alignment.getGroups().size(); - for(s=0; s