/*\r
* Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
*\r
* This program is free software; you can redistribute it and/or\r
* modify it under the terms of the GNU General Public License\r
{\r
public AlignmentPanel alignPanel;\r
public AlignViewport viewport;\r
- int NEW_WINDOW_WIDTH = 700;\r
- int NEW_WINDOW_HEIGHT = 500;\r
+ int DEFAULT_WIDTH = 700;\r
+ int DEFAULT_HEIGHT = 500;\r
\r
String jalviewServletURL;\r
\r
if (param != null)\r
{\r
int width = Integer.parseInt(param);\r
- NEW_WINDOW_WIDTH = width;\r
+ DEFAULT_WIDTH = width;\r
}\r
param = applet.getParameter("windowHeight");\r
if (param != null)\r
{\r
int height = Integer.parseInt(param);\r
- NEW_WINDOW_HEIGHT = height;\r
+ DEFAULT_HEIGHT = height;\r
}\r
}\r
catch (Exception ex)\r
this.addKeyListener(this);\r
alignPanel.seqPanel.seqCanvas.addKeyListener(this);\r
alignPanel.idPanel.idCanvas.addKeyListener(this);\r
+ alignPanel.scalePanel.addKeyListener(this);\r
+ alignPanel.annotationPanel.addKeyListener(this);\r
\r
viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
{\r
else\r
{\r
add(alignPanel, BorderLayout.CENTER);\r
- jalview.bin.JalviewLite.addFrame(this, title, NEW_WINDOW_WIDTH,\r
- NEW_WINDOW_HEIGHT);\r
+ jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,\r
+ DEFAULT_HEIGHT);\r
}\r
alignPanel.validate();\r
alignPanel.repaint();\r
case KeyEvent.VK_SPACE:\r
if(viewport.cursorMode)\r
{\r
- alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown());\r
+ alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()\r
+ || evt.isShiftDown()\r
+ || evt.isAltDown()\r
+ );\r
}\r
break;\r
\r
case KeyEvent.VK_BACK_SPACE:\r
if(viewport.cursorMode)\r
{\r
- alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown());\r
+ alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()\r
+ || evt.isShiftDown()\r
+ || evt.isAltDown()\r
+ );\r
}\r
else\r
{\r
findMenuItem_actionPerformed();\r
}\r
break;\r
- }\r
+ case KeyEvent.VK_H:\r
+ {\r
+ boolean toggleSeqs = !evt.isControlDown();\r
+ boolean toggleCols = !evt.isShiftDown();\r
+ boolean hide = false;\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+\r
+ if(toggleSeqs)\r
+ {\r
+ if (sg != null && sg.getSize(false) != viewport.alignment.getHeight())\r
+ {\r
+ hide = true;\r
+ viewport.hideAllSelectedSeqs();\r
+ }\r
+ else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))\r
+ viewport.showAllHiddenSeqs();\r
+ }\r
+\r
+ if(toggleCols)\r
+ {\r
+ if (viewport.colSel.getSelected().size() > 0)\r
+ {\r
+ viewport.hideSelectedColumns();\r
+ if(!toggleSeqs)\r
+ viewport.selectionGroup = sg;\r
+ }\r
+ else if (!hide)\r
+ viewport.showAllHiddenColumns();\r
+ }\r
+\r
+ alignPanel.repaint();\r
+ break;\r
+ }\r
+ case KeyEvent.VK_PAGE_UP:\r
+ if (viewport.wrapAlignment)\r
+ alignPanel.scrollUp(true);\r
+ else\r
+ alignPanel.setScrollValues(viewport.startRes,\r
+ viewport.startSeq\r
+ - viewport.endSeq + viewport.startSeq);\r
+ break;\r
+ case KeyEvent.VK_PAGE_DOWN:\r
+ if (viewport.wrapAlignment)\r
+ alignPanel.scrollUp(false);\r
+ else\r
+ alignPanel.setScrollValues(viewport.startRes,\r
+ viewport.startSeq\r
+ + viewport.endSeq - viewport.startSeq);\r
+ break;\r
+ }\r
}\r
public void keyReleased(KeyEvent evt)\r
{}\r
}\r
else if(source==showSeqs)\r
{\r
- viewport.showAllHiddenSeqs(); alignPanel.repaint();\r
+ viewport.showAllHiddenSeqs();\r
}\r
else if(source == hideColumns)\r
{\r
}\r
else if(source == hideSequences && viewport.getSelectionGroup()!=null)\r
{\r
- SequenceI[] seqs = viewport.getSelectionGroup().getSequencesInOrder(\r
- viewport.alignment\r
- );\r
-\r
- for (int i = 0; i < seqs.length; i++)\r
- {\r
- viewport.hideSequence(seqs[i]);\r
- }\r
-\r
- alignPanel.repaint();\r
+ viewport.hideAllSelectedSeqs();\r
}\r
else if(source==featureSettings)\r
featureSettings_actionPerformed();\r
url.append( appendProtocol( viewport.applet.getParameter("annotations") ) );\r
}\r
\r
+ if(viewport.applet.getParameter("jnetfile")!=null)\r
+ {\r
+ url.append( "&annotations=" );\r
+ url.append( appendProtocol( viewport.applet.getParameter("jnetfile") ) );\r
+ }\r
+\r
if(viewport.applet.getParameter("defaultColour")!=null)\r
{\r
url.append("&colour=" +\r
public void addHistoryItem(HistoryItem hi)\r
{\r
historyList.push(hi);\r
+ redoList.removeAllElements();\r
updateEditMenuBar();\r
}\r
\r
protected void undoMenuItem_actionPerformed()\r
{\r
- HistoryItem hi = (HistoryItem) historyList.pop();\r
- redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
+ HistoryItem nh,hi = (HistoryItem) historyList.pop();\r
+ redoList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,\r
HistoryItem.HIDE));\r
+ if (hi.alColumnChanges!=null)\r
+ nh.alColumnChanges=hi.alColumnChanges.getInverse();\r
restoreHistoryItem(hi);\r
viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
}\r
\r
protected void redoMenuItem_actionPerformed()\r
{\r
- HistoryItem hi = (HistoryItem) redoList.pop();\r
+ HistoryItem nh,hi = (HistoryItem) redoList.pop();\r
+ historyList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,\r
+ HistoryItem.HIDE));\r
+ if (hi.alColumnChanges!=null)\r
+ nh.alColumnChanges=hi.alColumnChanges.getInverse();\r
restoreHistoryItem(hi);\r
updateEditMenuBar();\r
viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
// used by undo and redo\r
void restoreHistoryItem(HistoryItem hi)\r
{\r
- hi.restore();\r
-\r
+ hi.restore(viewport.getColumnSelection());\r
updateEditMenuBar();\r
\r
viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
}\r
\r
\r
- jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
- NEW_WINDOW_HEIGHT);\r
+ jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,\r
+ DEFAULT_HEIGHT);\r
}\r
else\r
{\r
ColumnSelection colSel = viewport.getColumnSelection();\r
if (colSel.size() > 0)\r
{\r
- addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
+ HistoryItem edit;\r
+ addHistoryItem(edit=new HistoryItem("Remove Left", viewport.alignment,\r
HistoryItem.HIDE));\r
int min = colSel.getMin();\r
viewport.getAlignment().trimLeft(min);\r
colSel.compensateForEdit(0, min);\r
-\r
+ edit.addShift(0, min);\r
if (viewport.getSelectionGroup() != null)\r
{\r
viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
HistoryItem.HIDE));\r
int max = colSel.getMax();\r
viewport.getAlignment().trimRight(max);\r
+\r
if (viewport.getSelectionGroup() != null)\r
{\r
viewport.getSelectionGroup().adjustForRemoveRight(max);\r
\r
public void removeGappedColumnMenuItem_actionPerformed()\r
{\r
- addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
+ HistoryItem edit;\r
+ addHistoryItem(edit=new HistoryItem("Remove Gapped Columns",\r
viewport.alignment,\r
HistoryItem.HIDE));\r
\r
\r
public void removeAllGapsMenuItem_actionPerformed()\r
{\r
- addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
+ // TODO: hidden regions should not be touched by removeAllGaps - a minimal number of gaps will remain in alignment segments containing uneven length subsequences\r
+ // TODO: columnSelection.compensateforedits should be called (and passed to history item)\r
+ HistoryItem editgaps;\r
+ addHistoryItem(editgaps=new HistoryItem("Remove Gaps", viewport.alignment,\r
HistoryItem.HIDE));\r
\r
//This is to maintain viewport position on first residue\r
int startRes = seq.findPosition(viewport.startRes);\r
\r
SequenceI current;\r
- int jSize;\r
-\r
Vector seqs=null;\r
\r
int start=0, end = viewport.alignment.getWidth();\r
else\r
seqs = viewport.alignment.getSequences();\r
\r
+ /* Commented out regions below are partial implementation of todo above.\r
+ * divide start,end into visible chunks, and for each:\r
+ int diff=end-start+1;\r
+ int diffmax=0;\r
+ int dr[] = new int[seqs.size()];\r
+ */\r
for (int i = 0; i < seqs.size(); i++)\r
{\r
current = (SequenceI) seqs.elementAt(i);\r
- jSize = current.getLength();\r
-\r
- // Removing a range is much quicker than removing gaps\r
- // one by one for long sequences\r
- int j = start;\r
- int rangeStart=-1, rangeEnd=-1;\r
-\r
- do\r
- {\r
- if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
- {\r
- if(rangeStart==-1)\r
- {\r
- rangeStart = j;\r
- rangeEnd = j+1;\r
- }\r
- else\r
- {\r
- rangeEnd++;\r
- }\r
- j++;\r
- }\r
- else\r
- {\r
- if(rangeStart>-1)\r
- {\r
- current.deleteChars(rangeStart, rangeEnd);\r
- j-=rangeEnd-rangeStart;\r
- jSize-=rangeEnd-rangeStart;\r
- rangeStart = -1;\r
- rangeEnd = -1;\r
- }\r
- else\r
- j++;\r
- }\r
- }\r
- while (j < end && j < jSize);\r
- if(rangeStart>-1)\r
- {\r
- current.deleteChars(rangeStart, rangeEnd);\r
+ //dr[i]=\r
+ current.removeGaps(start, end);\r
+ /*if (d<diff) // can only shift\r
+ diff=d;\r
+ if (diffmax<d)\r
+ diffmax=d;\r
+ */\r
+ }\r
+ /* // after the end of each chunk -\r
+ * if (diff>0) {\r
+ // record shift for history.\r
+ editgaps.addShift(start, diff);\r
+ if (viewport.hasHiddenColumns && diffmax>diff) {\r
+ // pad sequence\r
+ StringBuffer gaps=new StringBuffer(diffmax);\r
+ for (int i=0,j=diffmax-diff; i<j; i++)\r
+ gaps.append(viewport.getGapCharacter());\r
+ for (int i=0, j=seqs.size(); i<j; i++) {\r
+ current = (SequenceI) seqs.elementAt(i);\r
+ if (dr[i]-diff>0) {\r
+ String sq = current.getSequence();\r
+ current.setSequence(sq.substring(0, hcend-dr[i])+gaps.substring(0, dr[i]-diff)+sq.substring());\r
+ }\r
+ }\r
}\r
- }\r
+ }*/\r
+\r
viewport.setStartRes(seq.findIndex(startRes)-1);\r
viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
}\r
viewport.alignment.getWidth());\r
}\r
\r
- cs.setConsensus(viewport.vconsensus);\r
+ cs.setConsensus(viewport.hconsensus);\r
if (cs.conservationApplied())\r
{\r
Alignment al = (Alignment) viewport.alignment;\r
alignPanel.repaint();\r
}\r
\r
+\r
protected void scaleAbove_actionPerformed()\r
{\r
viewport.setScaleAboveWrapped(scaleAbove.getState());\r
cs.setConservation(null);\r
}\r
\r
- cs.setConsensus(viewport.vconsensus);\r
+ cs.setConsensus(viewport.hconsensus);\r
\r
}\r
viewport.setGlobalColourScheme(cs);\r
MenuItem item;\r
\r
// dynamically fill save as menu with available formats\r
- for (int i = 0; i < jalview.io.AppletFormatAdapter.formats.size(); i++)\r
+ for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)\r
{\r
\r
- item = new MenuItem( (String) jalview.io.AppletFormatAdapter.formats.\r
- elementAt(\r
- i));\r
+ item = new MenuItem( jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);\r
+\r
item.addActionListener(new java.awt.event.ActionListener()\r
{\r
public void actionPerformed(ActionEvent e)\r