\r
import javax.swing.*;\r
\r
+import org.biojava.dasobert.eventmodel.*;\r
+\r
\r
/**\r
* DOCUMENT ME!\r
* @version $Revision$\r
*/\r
public class AlignmentPanel extends GAlignmentPanel\r
- implements AdjustmentListener, Printable\r
+ implements AdjustmentListener, Printable, FeatureListener\r
{\r
public AlignViewport av;\r
OverviewPanel overviewPanel;\r
\r
setScrollValues(0, 0);\r
\r
- annotationPanel.adjustPanelHeight();\r
- annotationSpaceFillerHolder.setPreferredSize(annotationPanel.\r
- getPreferredSize());\r
- annotationScroller.setPreferredSize(annotationPanel.\r
- getPreferredSize());\r
+ adjustAnnotationHeight();\r
+\r
setAnnotationVisible(av.getShowAnnotation());\r
\r
hscroll.addAdjustmentListener(this);\r
{\r
public void keyPressed(KeyEvent evt)\r
{\r
+ if(av.cursorMode\r
+ && evt.getKeyCode()>=KeyEvent.VK_0\r
+ && evt.getKeyCode()<=KeyEvent.VK_9)\r
+ {\r
+ seqPanel.numberPressed(evt.getKeyChar());\r
+ }\r
+\r
switch (evt.getKeyCode())\r
{\r
case 27: // escape key\r
break;\r
\r
case KeyEvent.VK_DOWN:\r
- alignFrame.moveSelectedSequences(false);\r
-\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.moveCursor(0,1);\r
+ }\r
+ else\r
+ alignFrame.moveSelectedSequences(false);\r
break;\r
\r
case KeyEvent.VK_UP:\r
- alignFrame.moveSelectedSequences(true);\r
+ if (av.cursorMode)\r
+ {\r
+ seqPanel.moveCursor(0,-1);\r
+ }\r
+ else\r
+ alignFrame.moveSelectedSequences(true);\r
+ break;\r
\r
+ case KeyEvent.VK_LEFT:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.moveCursor(-1,0);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_RIGHT:\r
+ if (av.cursorMode)\r
+ {\r
+ seqPanel.moveCursor(1,0);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_SPACE:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.insertGapAtCursor(evt.isControlDown() || evt.isShiftDown());\r
+ }\r
break;\r
\r
- case KeyEvent.VK_BACK_SPACE:\r
case KeyEvent.VK_DELETE:\r
- alignFrame.cut_actionPerformed(null);\r
+ case KeyEvent.VK_BACK_SPACE:\r
+ if(!av.cursorMode)\r
+ {\r
+ alignFrame.cut_actionPerformed(null);\r
+ seqPanel.seqCanvas.repaint();\r
+ }\r
+ else\r
+ seqPanel.deleteGapAtCursor(evt.isControlDown() || evt.isShiftDown());\r
+\r
break;\r
\r
+ case KeyEvent.VK_S:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.setCursorRow();\r
+ }\r
+ break;\r
+ case KeyEvent.VK_C:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.setCursorColumn();\r
+ }\r
+ break;\r
case KeyEvent.VK_P:\r
- seqPanel.seqCanvas.increaseAARatio();\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.setCursorPosition();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_ENTER:\r
+ case KeyEvent.VK_COMMA:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.setCursorRowAndColumn();\r
+ }\r
break;\r
- case KeyEvent.VK_L:\r
- seqPanel.seqCanvas.decreaseAARation();\r
+\r
+ case KeyEvent.VK_Q:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.setSelectionAreaAtCursor(true);\r
+ }\r
break;\r
+ case KeyEvent.VK_M:\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.setSelectionAreaAtCursor(false);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_F2:\r
+ av.cursorMode = ! av.cursorMode;\r
+ alignFrame.statusBar.setText("Keyboard editing mode is "+\r
+ (av.cursorMode ? "on" : "off"));\r
+ if(av.cursorMode)\r
+ {\r
+ seqPanel.seqCanvas.cursorX = av.startRes;\r
+ seqPanel.seqCanvas.cursorY = av.startSeq;\r
+ }\r
+ seqPanel.seqCanvas.repaint();\r
+ break;\r
+\r
+ case KeyEvent.VK_F1:\r
+ try\r
+ {\r
+ ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();\r
+ java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");\r
+ javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);\r
+\r
+ javax.help.HelpBroker hb = hs.createHelpBroker();\r
+ hb.setCurrentID("home");\r
+ hb.setDisplayed(true);\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+ break;\r
+\r
}\r
}\r
});\r
}\r
\r
+ public void comeBackLater(FeatureEvent evt)\r
+ {}\r
+\r
+ public void newFeatures(FeatureEvent evt)\r
+ {\r
+ seqPanel.seqCanvas.fr.findAllFeatures();\r
+ repaint();\r
+ }\r
+\r
/**\r
* DOCUMENT ME!\r
*/\r
}\r
else\r
{\r
- int cwidth = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
- if( start<av.getStartRes() || start>(av.getStartRes()+cwidth) )\r
- {\r
- vscroll.setValue(start / cwidth);\r
- av.startRes = vscroll.getValue() * cwidth;\r
- }\r
+ scrollToWrappedVisible(start);\r
}\r
}\r
}\r
\r
+ void scrollToWrappedVisible(int res)\r
+ {\r
+ int cwidth = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
+ if( res<=av.getStartRes() || res>=(av.getStartRes()+cwidth) )\r
+ {\r
+ vscroll.setValue(res / cwidth);\r
+ av.startRes = vscroll.getValue() * cwidth;\r
+ }\r
+ }\r
+\r
/**\r
* DOCUMENT ME!\r
*\r
repaint();\r
}\r
\r
+ public void adjustAnnotationHeight()\r
+ {\r
+ javax.swing.SwingUtilities.invokeLater(new Runnable()\r
+ {\r
+ public void run()\r
+ {\r
+ while(alignFrame.getHeight()==0)\r
+ {\r
+ Thread.yield();\r
+ }\r
+\r
+ int height = annotationPanel.adjustPanelHeight();\r
+\r
+ if (height > alignFrame.getHeight() / 2)\r
+ {\r
+ height = alignFrame.getHeight() / 2;\r
+ }\r
+\r
+ annotationScroller.setPreferredSize(\r
+ new Dimension(annotationScroller.getWidth(),\r
+ height));\r
+\r
+ annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
+ annotationSpaceFillerHolder.getWidth(),\r
+ height));\r
+\r
+ annotationPanel.repaint();\r
+ }\r
+ });\r
+ }\r
+\r
/**\r
* DOCUMENT ME!\r
*\r
*/\r
public boolean scrollRight(boolean right)\r
{\r
- if (right)\r
+ if (!right)\r
{\r
if (hscroll.getValue() < 1)\r
{\r
*/\r
public void setScrollValues(int x, int y)\r
{\r
- av.setEndRes( (x + (seqPanel.seqCanvas.getWidth() / av.getCharWidth())) -\r
- 1);\r
+\r
+ int width = av.alignment.getWidth();\r
+ int height = av.alignment.getHeight();\r
+\r
+ if(av.hasHiddenColumns)\r
+ width = av.getColumnSelection().findColumnPosition(width);\r
+\r
+ av.setEndRes( (x + (seqPanel.seqCanvas.getWidth() / av.charWidth)) -1);\r
\r
hextent = seqPanel.seqCanvas.getWidth() / av.charWidth;\r
vextent = seqPanel.seqCanvas.getHeight() / av.charHeight;\r
\r
- if (hextent > av.alignment.getWidth())\r
+ if (hextent > width)\r
{\r
- hextent = av.alignment.getWidth();\r
+ hextent = width;\r
}\r
\r
- if (vextent > av.alignment.getHeight())\r
+ if (vextent > height)\r
{\r
- vextent = av.alignment.getHeight();\r
+ vextent = height;\r
}\r
\r
- if ( (hextent + x) > av.getAlignment().getWidth())\r
+ if ( (hextent + x) > width)\r
{\r
- x = av.getAlignment().getWidth() - hextent;\r
+ x = width - hextent;\r
}\r
\r
- if ( (vextent + y) > av.getAlignment().getHeight())\r
+ if ( (vextent + y) > height)\r
{\r
- y = av.getAlignment().getHeight() - vextent;\r
+ y = height - vextent;\r
}\r
\r
if (y < 0)\r
x = 0;\r
}\r
\r
- hscroll.setValues(x, hextent, 0, av.getAlignment().getWidth());\r
- vscroll.setValues(y, vextent, 0, av.getAlignment().getHeight());\r
+ hscroll.setValues(x, hextent, 0, width);\r
+ vscroll.setValues(y, vextent, 0, height);\r
}\r
\r
/**\r
*/\r
public void adjustmentValueChanged(AdjustmentEvent evt)\r
{\r
-\r
int oldX = av.getStartRes();\r
int oldY = av.getStartSeq();\r
\r
{\r
int max = av.alignment.getWidth() /\r
seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth()) +1;\r
+\r
+\r
vscroll.setMaximum(max);\r
vscroll.setUnitIncrement(1);\r
vscroll.setVisibleAmount(1);\r
setScrollValues(av.getStartRes(), av.getStartSeq());\r
}\r
\r
-\r
- if( this.getVisibleRect().getBounds() == g.getClipBounds() )\r
- {\r
- if (overviewPanel != null)\r
+ if( this.getVisibleRect().getBounds() == g.getClipBounds()\r
+ && overviewPanel != null)\r
overviewPanel.updateOverviewImage();\r
- }\r
+\r
}\r
\r
/**\r
{\r
int height = ( (av.alignment.getHeight() + 1) * av.charHeight) + 30;\r
int width = idPanel.getWidth() + (av.alignment.getWidth() * av.charWidth);\r
-\r
if (idPanel.getWidth() == 0)\r
{\r
width += calculateIdWidth().getWidth() + 4;\r
if (av.getWrapAlignment())\r
{\r
height = getWrappedHeight();\r
- width = seqPanel.getWidth() + idPanel.getWidth();\r
+ if (System.getProperty("java.awt.headless") != null\r
+ && System.getProperty("java.awt.headless").equals("true"))\r
+ {\r
+ width = alignFrame.getWidth() - 22;\r
+ }\r
+ else\r
+\r
+ width = seqPanel.getWidth() + idPanel.getWidth();\r
+\r
}\r
else if (av.getShowAnnotation())\r
{\r
\r
int getWrappedHeight()\r
{\r
+ int seqPanelWidth = seqPanel.seqCanvas.getWidth();\r
+\r
+ //If headless, seqPanel will have 0 width\r
+ if (System.getProperty("java.awt.headless") != null\r
+ && System.getProperty("java.awt.headless").equals("true"))\r
+ {\r
+ int idWidth = calculateIdWidth().width + 4;\r
+ seqPanelWidth = alignFrame.getWidth() - idWidth;\r
+ }\r
\r
int chunkWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(\r
- seqPanel.seqCanvas.getWidth());\r
+ seqPanelWidth\r
+ );\r
\r
int hgap = av.charHeight;\r
if (av.scaleAboveWrapped)\r