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