now has key listener
[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    hscroll.setFocusable(false);\r
53    vscroll.setFocusable(false);\r
54    setFocusable(true);\r
55 \r
56    addKeyListener(new KeyAdapter()\r
57    {\r
58      public void keyPressed(KeyEvent evt)\r
59      {\r
60        if(evt.getKeyCode()==27)\r
61        {\r
62          av.setRubberbandGroup(null);\r
63          RefreshPanels();\r
64        }\r
65      }\r
66    });\r
67 \r
68 \r
69   }\r
70 \r
71  public void highlightSearchResults(int [] results)\r
72  {\r
73    seqPanel.seqCanvas.highlightSearchResults( results );\r
74 \r
75    // do we need to scroll the panel?\r
76    if(results!=null && (av.getStartSeq()>results[0]\r
77                         || av.getEndSeq()<results[0]\r
78                         || av.getStartRes()>results[1]\r
79                         || av.getEndRes()<results[2]))\r
80        setScrollValues(results[1], results[0]);\r
81 \r
82 \r
83  }\r
84 \r
85 \r
86  public OverviewPanel getOverviewPanel()\r
87  {\r
88    return overviewPanel;\r
89  }\r
90 \r
91  public void setOverviewPanel(OverviewPanel op)\r
92  {\r
93    overviewPanel = op;\r
94  }\r
95 \r
96 \r
97   public void setGraphPanelVisible(boolean b)\r
98   {\r
99     idSpaceFillerPanel.setVisible(b);\r
100     scorePanelHolder.setVisible(b);\r
101 \r
102     RefreshPanels();\r
103     // bit annoying to call this twice, can you do better?\r
104     RefreshPanels();\r
105   }\r
106 \r
107   public void setSecondaryStructureVisible(boolean b)\r
108   {\r
109     secondaryPanelHolder.setVisible(b);\r
110     RefreshPanels();\r
111   }\r
112 \r
113   public void setWrapAlignment(boolean wrap)\r
114   {\r
115       scalePanelHolder.setVisible(!wrap);\r
116       scorePanelHolder.setVisible(!wrap);\r
117 \r
118       hscroll.setVisible(!wrap);\r
119       idSpaceFillerPanel.setVisible(!wrap);\r
120       idSpaceFillerPanel1.setVisible(!wrap);\r
121   }\r
122 \r
123 \r
124   public void setColourScheme()\r
125   {\r
126     ColourSchemeI cs = av.getGlobalColourScheme();\r
127 \r
128     if(av.getConservationSelected())\r
129     {\r
130 \r
131        Alignment al = (Alignment)av.getAlignment();\r
132        Conservation c = new Conservation("All",\r
133                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
134                             al.getWidth() );\r
135 \r
136        c.calculate();\r
137        c.verdict(false, 100);\r
138        ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
139 \r
140        av.setGlobalColourScheme( ccs );\r
141 \r
142     }\r
143 \r
144     RefreshPanels();\r
145   }\r
146 \r
147   public void RefreshPanels()\r
148   {\r
149     requestFocus();\r
150     invalidate();\r
151     seqPanel.seqCanvas.paintFlag = true;\r
152     idPanel.idCanvas.paintFlag = true;\r
153     idPanelHolder.setPreferredSize( idPanel.idCanvas.getPreferredSize() );\r
154     setScrollValues(av.getStartRes(), av.getStartSeq());\r
155     av.getConsensus(true);\r
156     if(overviewPanel!=null)\r
157       overviewPanel.updateOverviewImage();\r
158 \r
159     validate();\r
160     repaint();\r
161 \r
162   }\r
163 \r
164   int hextent = 0;\r
165   int vextent = 0;\r
166 \r
167   public void setScrollValues(int x, int y)\r
168   {\r
169     hextent = seqPanel.seqCanvas.getWidth()/av.getCharWidth();\r
170     vextent = seqPanel.seqCanvas.getHeight()/av.getCharHeight();\r
171 \r
172     if(hextent+x  >  av.getAlignment().getWidth())\r
173       x =  av.getAlignment().getWidth()- hextent;\r
174 \r
175     if(vextent+y > av.getAlignment().getHeight())\r
176       y = av.getAlignment().getHeight() - vextent;\r
177 \r
178     if(y<0)\r
179       y = 0;\r
180 \r
181     if(x<0)\r
182       x=0;\r
183 \r
184     hscroll.setValues(x,hextent,0,av.getAlignment().getWidth());\r
185     vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() );\r
186 \r
187 \r
188     repaint();\r
189 \r
190   }\r
191 \r
192 \r
193   public void adjustmentValueChanged(AdjustmentEvent evt)\r
194   {\r
195 \r
196     if (evt.getSource() == hscroll)\r
197     {\r
198       int x = hscroll.getValue();\r
199       av.setStartRes(x);\r
200       av.setEndRes(x + seqPanel.seqCanvas.getWidth()/av.getCharWidth()-1);\r
201     }\r
202 \r
203     if (evt.getSource() == vscroll)\r
204     {\r
205         int offy = vscroll.getValue();\r
206         av.setStartSeq(offy);\r
207         av.setEndSeq(offy + seqPanel.seqCanvas.getHeight()/av.getCharHeight());\r
208     }\r
209 \r
210 \r
211     if(overviewPanel!=null)\r
212       overviewPanel.setBoxPosition();\r
213 \r
214     seqPanel.seqCanvas.paintFlag=true;\r
215     repaint();\r
216   }\r
217 \r
218 \r
219   public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException\r
220   {\r
221 \r
222     pg.translate((int)pf.getImageableX(), (int)pf.getImageableY());\r
223 \r
224     int pwidth = (int)pf.getImageableWidth();\r
225     int pheight = (int)pf.getImageableHeight();\r
226     int idWidth = (int)idPanel.idCanvas.getLabelWidth().getWidth();\r
227 \r
228     pg.setColor(Color.white);\r
229     pg.fillRect(0,0,pwidth, pheight);\r
230     pg.setFont( av.getFont() );\r
231 \r
232     ////////////////////////////////////\r
233     /// How many sequences and residues can we fit on a printable page?\r
234     int totalRes = (pwidth - idWidth)/av.getCharWidth();\r
235     int totalSeq = (int)((pheight - 30)/av.getCharHeight())-1;\r
236     int pagesWide = av.getAlignment().getWidth() / totalRes +1;\r
237     int pagesHigh = av.getAlignment().getHeight() / totalSeq +1;\r
238 \r
239     if (pi >= pagesWide*pagesHigh)\r
240      return Printable.NO_SUCH_PAGE;\r
241 \r
242     /////////////////////////////\r
243     /// Only print these sequences and residues on this page\r
244     int startRes, endRes, startSeq, endSeq;\r
245     startRes = (pi % pagesWide) * totalRes;\r
246     endRes = startRes + totalRes-1;\r
247     if(endRes>av.getAlignment().getWidth())\r
248       endRes = av.getAlignment().getWidth();\r
249 \r
250      startSeq = (pi / pagesWide) * totalSeq;\r
251      endSeq = startSeq + totalSeq;\r
252      if(endSeq > av.getAlignment().getHeight())\r
253        endSeq = av.getAlignment().getHeight();\r
254 \r
255 \r
256     ////////////////\r
257     //draw Scale\r
258     pg.translate(idWidth,0);\r
259     scalePanel.scaleCanvas.drawScale(pg, startRes, endRes, pwidth-idWidth);\r
260 \r
261     pg.translate(-idWidth, 30);\r
262     ////////////////\r
263     // Draw the ids\r
264     Color currentColor=null;\r
265     Color currentTextColor=null;\r
266     for(int i=startSeq; i<endSeq; i++)\r
267     {\r
268       if (av.getSelection().contains(av.getAlignment().getSequenceAt(i)))\r
269       {\r
270         currentColor = Color.gray;\r
271         currentTextColor = Color.black;\r
272       }\r
273       else\r
274       {\r
275         currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
276         currentTextColor = Color.black;\r
277       }\r
278 \r
279       pg.setColor(currentColor);\r
280       pg.fillRect(0,  jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i, av.getCharHeight()),\r
281                               idWidth,\r
282                               av.getCharHeight());\r
283 \r
284       pg.setColor(currentTextColor);\r
285 \r
286       String string = av.getAlignment().getSequenceAt(i).getDisplayId();\r
287       pg.drawString(string, 0,  jalview.analysis.AlignmentUtil.getPixelHeight\r
288                     (startSeq, i, av.getCharHeight()) + av.getCharHeight() - (av.getCharHeight() / 5));\r
289     }\r
290 \r
291     // draw main sequence panel\r
292     pg.translate(idWidth,0);\r
293     pg.setClip(0,0,pwidth-idWidth, pheight);\r
294     seqPanel.seqCanvas.drawPanel(pg,startRes,endRes,startSeq,endSeq,startRes,startSeq,0);\r
295 \r
296     return Printable.PAGE_EXISTS;\r
297   }\r
298 \r
299 }\r
300 \r
301 \r
302 \r