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