Key listener works!!
[jalview.git] / src / jalview / gui / AlignmentPanel.java
1 package jalview.gui;\r
2 \r
3 import jalview.jbgui.GAlignmentPanel;\r
4 import jalview.schemes.*;\r
5 import jalview.analysis.*;\r
6 import jalview.datamodel.*;\r
7 import java.awt.*;\r
8 import java.awt.event.*;\r
9 import java.awt.print.*;\r
10 \r
11 public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListener, Printable\r
12 {\r
13 \r
14   AlignViewport     av;\r
15   OverviewPanel overviewPanel;\r
16   SeqPanel   seqPanel;\r
17   IdPanel    idPanel;\r
18   SecondaryStructurePanel ssPanel;\r
19   public AlignFrame alignFrame;\r
20   ScalePanel scalePanel;\r
21   ScorePanel scorePanel;\r
22 \r
23   public AlignmentPanel(AlignFrame af, final AlignViewport av)\r
24   {\r
25     alignFrame = af;\r
26     this.av         = av;\r
27     seqPanel        = new SeqPanel  (av, this);\r
28     idPanel         = new IdPanel   (av, this);\r
29     scalePanel = new ScalePanel(av, this);\r
30     scorePanel = new ScorePanel(av);\r
31     ssPanel = new SecondaryStructurePanel(av);\r
32 \r
33     secondaryPanelHolder.add(ssPanel, BorderLayout.CENTER);\r
34     idPanelHolder.add(idPanel, BorderLayout.CENTER);\r
35     idPanel.addNotify();\r
36     scalePanelHolder.add(scalePanel, BorderLayout.CENTER);\r
37     scorePanelHolder.add(scorePanel, BorderLayout.CENTER);\r
38     seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
39     setScrollValues(0,0);\r
40 \r
41     hscroll.addAdjustmentListener(this);\r
42     vscroll.addAdjustmentListener(this);\r
43 \r
44     addComponentListener(new ComponentAdapter()\r
45    {\r
46      public void componentResized(ComponentEvent evt)\r
47      {\r
48           RefreshPanels();\r
49      }\r
50    });\r
51 \r
52 \r
53    hscroll.setFocusable(false);\r
54    vscroll.setFocusable(false);\r
55    setFocusable(true);\r
56 \r
57    addKeyListener(new KeyAdapter()\r
58    {\r
59      public void keyPressed(KeyEvent evt)\r
60      {\r
61        switch(evt.getKeyCode())\r
62        {\r
63          case 27: // escape key\r
64            av.setRubberbandGroup(null);\r
65            RefreshPanels();\r
66            break;\r
67          case KeyEvent.VK_X:\r
68            alignFrame.cut_actionPerformed(null);\r
69            break;\r
70          case KeyEvent.VK_C:\r
71            alignFrame.copy_actionPerformed(null);\r
72            break;\r
73          case KeyEvent.VK_V:\r
74            alignFrame.paste(true);\r
75            break;\r
76        }\r
77 \r
78       /* public void doKeyPressed(KeyEvent evt)\r
79        {\r
80 \r
81          if (evt.isControlDown() && evt.getKeyChar() == 'f')\r
82            findMenuItem_actionPerformed(null);\r
83        }*/\r
84 \r
85      }\r
86    });\r
87 \r
88 \r
89   }\r
90 \r
91  public void highlightSearchResults(int [] results)\r
92  {\r
93    seqPanel.seqCanvas.highlightSearchResults( results );\r
94 \r
95    // do we need to scroll the panel?\r
96    if(results!=null && (av.getStartSeq()>results[0]\r
97                         || av.getEndSeq()<results[0]\r
98                         || av.getStartRes()>results[1]\r
99                         || av.getEndRes()<results[2]))\r
100        setScrollValues(results[1], results[0]);\r
101 \r
102 \r
103  }\r
104 \r
105 \r
106  public OverviewPanel getOverviewPanel()\r
107  {\r
108    return overviewPanel;\r
109  }\r
110 \r
111  public void setOverviewPanel(OverviewPanel op)\r
112  {\r
113    overviewPanel = op;\r
114  }\r
115 \r
116 \r
117   public void setGraphPanelVisible(boolean b)\r
118   {\r
119     idSpaceFillerPanel.setVisible(b);\r
120     scorePanelHolder.setVisible(b);\r
121 \r
122     RefreshPanels();\r
123     // bit annoying to call this twice, can you do better?\r
124     RefreshPanels();\r
125   }\r
126 \r
127   public void setSecondaryStructureVisible(boolean b)\r
128   {\r
129     secondaryPanelHolder.setVisible(b);\r
130     RefreshPanels();\r
131   }\r
132 \r
133   public void setWrapAlignment(boolean wrap)\r
134   {\r
135     scorePanelHolder.setVisible(!wrap);\r
136     scalePanelHolder.setVisible(!wrap);\r
137     secondaryPanelHolder.setVisible(!wrap);\r
138 \r
139     hscroll.setVisible(!wrap);\r
140 \r
141     idSpaceFillerPanel.setVisible(!wrap);\r
142     idSpaceFillerPanel1.setVisible(!wrap);\r
143 \r
144     RefreshPanels();\r
145 \r
146   }\r
147 \r
148 \r
149   public void setColourScheme()\r
150   {\r
151     ColourSchemeI cs = av.getGlobalColourScheme();\r
152 \r
153     if(av.getConservationSelected())\r
154     {\r
155 \r
156        Alignment al = (Alignment)av.getAlignment();\r
157        Conservation c = new Conservation("All",\r
158                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
159                             al.getWidth() );\r
160 \r
161        c.calculate();\r
162        c.verdict(false, 100);\r
163        ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
164 \r
165        av.setGlobalColourScheme( ccs );\r
166 \r
167     }\r
168 \r
169     RefreshPanels();\r
170   }\r
171 \r
172   public void RefreshPanels()\r
173   {\r
174     requestFocus();\r
175     invalidate();\r
176     seqPanel.seqCanvas.paintFlag = true;\r
177     idPanel.idCanvas.paintFlag = true;\r
178     idPanelHolder.setPreferredSize( idPanel.idCanvas.getPreferredSize() );\r
179 \r
180     if(av.getWrapAlignment())\r
181     {\r
182       int max = av.alignment.getWidth()/ (seqPanel.seqCanvas.getWidth()/av.charWidth)+1;\r
183 \r
184       int h  = (av.alignment.getHeight() + 2)*av.charHeight;\r
185       vextent = seqPanel.seqCanvas.getHeight()/h;\r
186       vscroll.setValues(0,vextent,0,max);\r
187     }\r
188     else\r
189 \r
190     setScrollValues(av.getStartRes(), av.getStartSeq());\r
191     av.getConsensus(true);\r
192     if(overviewPanel!=null)\r
193       overviewPanel.updateOverviewImage();\r
194 \r
195     validate();\r
196     repaint();\r
197 \r
198   }\r
199 \r
200   int hextent = 0;\r
201   int vextent = 0;\r
202 \r
203   public void setScrollValues(int x, int y)\r
204   {\r
205     hextent = seqPanel.seqCanvas.getWidth()/av.getCharWidth();\r
206     vextent = seqPanel.seqCanvas.getHeight()/av.getCharHeight();\r
207 \r
208     if(hextent+x  >  av.getAlignment().getWidth())\r
209       x =  av.getAlignment().getWidth()- hextent;\r
210 \r
211     if(vextent+y > av.getAlignment().getHeight())\r
212       y = av.getAlignment().getHeight() - vextent;\r
213 \r
214     if(y<0)\r
215       y = 0;\r
216 \r
217     if(x<0)\r
218       x=0;\r
219 \r
220     hscroll.setValues(x,hextent,0,av.getAlignment().getWidth());\r
221     vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() );\r
222 \r
223 \r
224     repaint();\r
225 \r
226   }\r
227 \r
228 \r
229   public void adjustmentValueChanged(AdjustmentEvent evt)\r
230   {\r
231 \r
232     if (evt.getSource() == hscroll)\r
233     {\r
234       int x = hscroll.getValue();\r
235       av.setStartRes(x);\r
236       av.setEndRes(x + seqPanel.seqCanvas.getWidth()/av.getCharWidth()-1);\r
237     }\r
238 \r
239     if (evt.getSource() == vscroll)\r
240     {\r
241       int offy = vscroll.getValue();\r
242       if (av.getWrapAlignment())\r
243       {\r
244         av.setStartRes( vscroll.getValue() * av.getChunkWidth());\r
245         // System.out.println(vscroll.getValue()+" "+ av.getChunkWidth());\r
246       //  int resSpan = av.alignment.getWidth()/ (seqPanel.seqCanvas.getWidth()/av.charWidth)+1;\r
247      //   int h  = (av.alignment.getHeight() + 2)*av.charHeight;\r
248       //  vextent = seqPanel.seqCanvas.getHeight()/h;\r
249      //   vscroll.setValues(0,vextent,0,max);\r
250 \r
251 \r
252       // av.setStartSeq(  );\r
253       }\r
254       else\r
255       {\r
256         av.setStartSeq(offy);\r
257         av.setEndSeq(offy + seqPanel.seqCanvas.getHeight() / av.getCharHeight());\r
258       }\r
259     }\r
260 \r
261 \r
262     if(overviewPanel!=null)\r
263       overviewPanel.setBoxPosition();\r
264 \r
265     seqPanel.seqCanvas.paintFlag=true;\r
266     repaint();\r
267   }\r
268 \r
269 \r
270 \r
271   public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException\r
272   {\r
273     if(av.getWrapAlignment())\r
274     {\r
275      return PrintWrappedAlignment(pg, pf, pi);\r
276     }\r
277 \r
278     pg.translate((int)pf.getImageableX(), (int)pf.getImageableY());\r
279 \r
280     int pwidth = (int)pf.getImageableWidth();\r
281     int pheight = (int)pf.getImageableHeight();\r
282     int idWidth = (int)idPanel.idCanvas.getLabelWidth().getWidth();\r
283 \r
284 \r
285     pg.setColor(Color.white);\r
286     pg.fillRect(0,0,pwidth, pheight);\r
287     pg.setFont( av.getFont() );\r
288 \r
289     ////////////////////////////////////\r
290     /// How many sequences and residues can we fit on a printable page?\r
291     int totalRes = (pwidth - idWidth)/av.getCharWidth();\r
292     int totalSeq = (int)((pheight - 30)/av.getCharHeight())-1;\r
293     int pagesWide = av.getAlignment().getWidth() / totalRes +1;\r
294     int pagesHigh = av.getAlignment().getHeight() / totalSeq +1;\r
295 \r
296     if (pi >= pagesWide*pagesHigh)\r
297      return Printable.NO_SUCH_PAGE;\r
298 \r
299     /////////////////////////////\r
300     /// Only print these sequences and residues on this page\r
301     int startRes, endRes, startSeq, endSeq;\r
302     startRes = (pi % pagesWide) * totalRes;\r
303     endRes = startRes + totalRes-1;\r
304     if(endRes>av.getAlignment().getWidth())\r
305       endRes = av.getAlignment().getWidth();\r
306 \r
307      startSeq = (pi / pagesWide) * totalSeq;\r
308      endSeq = startSeq + totalSeq;\r
309      if(endSeq > av.getAlignment().getHeight())\r
310        endSeq = av.getAlignment().getHeight();\r
311 \r
312 \r
313     ////////////////\r
314     //draw Scale\r
315     pg.translate(idWidth,0);\r
316     scalePanel.scaleCanvas.drawScale(pg, startRes, endRes, pwidth-idWidth);\r
317 \r
318     pg.translate(-idWidth, 30);\r
319     ////////////////\r
320     // Draw the ids\r
321     Color currentColor=null;\r
322     Color currentTextColor=null;\r
323     for(int i=startSeq; i<endSeq; i++)\r
324     {\r
325       if (av.getSelection().contains(av.getAlignment().getSequenceAt(i)))\r
326       {\r
327         currentColor = Color.gray;\r
328         currentTextColor = Color.black;\r
329       }\r
330       else\r
331       {\r
332         currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
333         currentTextColor = Color.black;\r
334       }\r
335 \r
336       pg.setColor(currentColor);\r
337       pg.fillRect(0,  jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i, av.getCharHeight()),\r
338                               idWidth,\r
339                               av.getCharHeight());\r
340 \r
341       pg.setColor(currentTextColor);\r
342 \r
343       String string = av.getAlignment().getSequenceAt(i).getDisplayId();\r
344       pg.drawString(string, 0,  jalview.analysis.AlignmentUtil.getPixelHeight\r
345                     (startSeq, i, av.getCharHeight()) + av.getCharHeight() - (av.getCharHeight() / 5));\r
346     }\r
347 \r
348     // draw main sequence panel\r
349     pg.translate(idWidth,0);\r
350     pg.setClip(0,0,pwidth-idWidth, pheight);\r
351     seqPanel.seqCanvas.drawPanel(pg,startRes,endRes,startSeq,endSeq,startRes,startSeq,0);\r
352 \r
353     return Printable.PAGE_EXISTS;\r
354   }\r
355 \r
356   class VPanel extends javax.swing.JPanel\r
357   {\r
358     Image image;\r
359     public VPanel(Image i)\r
360     {\r
361       image = i;\r
362       repaint();\r
363     }\r
364     public void paintComponent(Graphics g)\r
365     {\r
366       if(image!=null)\r
367         g.drawImage(image,0,0,this);\r
368     }\r
369 \r
370   }\r
371 \r
372   public int PrintWrappedAlignment(Graphics pg, PageFormat pf, int pi)\r
373   {\r
374     pg.translate((int)pf.getImageableX(), (int)pf.getImageableY());\r
375 \r
376     int pwidth = (int)pf.getImageableWidth();\r
377     int pheight = (int)pf.getImageableHeight();\r
378     int idWidth = (int)idPanel.idCanvas.getLabelWidth().getWidth();\r
379 \r
380     if( seqPanel.seqCanvas.getWidth() < pwidth-idWidth)\r
381       pwidth = seqPanel.seqCanvas.getWidth() + idWidth;\r
382 \r
383     pg.setColor(Color.white);\r
384     pg.fillRect(0,0,pwidth, pheight);\r
385     pg.setFont( av.getFont() );\r
386 \r
387     ////////////////////////////////////\r
388     /// How many sequences and residues can we fit on a printable page?\r
389     AlignmentI da = av.alignment;\r
390     int endy   = da.getHeight();\r
391     int chunkHeight =  (da.getHeight() + 2)*av.charHeight;\r
392     int chunkWidth  =   (pwidth-idWidth)/av.charWidth;\r
393 \r
394     int noChunksOnPage = pheight / chunkHeight;\r
395     int totalChunks = endy / chunkHeight;\r
396 \r
397     if ( pi*noChunksOnPage > totalChunks )\r
398      return Printable.NO_SUCH_PAGE;\r
399 \r
400     ////////////////\r
401     // Draw the ids\r
402     pg.setClip(0,0,pwidth, noChunksOnPage*chunkHeight);\r
403 \r
404     int row = pi*noChunksOnPage;\r
405     pg.setColor(Color.black);\r
406     for(int ypos=2*av.charHeight;\r
407         ypos <= pheight && row*chunkWidth<da.getWidth();\r
408         ypos += chunkHeight, row++ )\r
409     {\r
410       for (int i = 0; i < endy; i++)\r
411       {\r
412         SequenceI s = da.getSequenceAt(i);\r
413         pg.drawString(s.getDisplayId(), 0,\r
414                       AlignmentUtil.getPixelHeight(0, i, av.charHeight) + ypos +\r
415                       av.charHeight - (av.charHeight / 5));\r
416       }\r
417     }\r
418 \r
419     // draw main sequence panel\r
420     pg.translate(idWidth,0);\r
421     seqPanel.seqCanvas.drawWrappedPanel(pg, pwidth-idWidth, pheight, pi*noChunksOnPage*chunkWidth);\r
422 \r
423 \r
424     return Printable.NO_SUCH_PAGE;//.PAGE_EXISTS;\r
425 \r
426   }\r
427 }\r
428 \r
429 \r
430 \r