Scalepanel has new constructor
[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     scorePanelHolder.setVisible(b);\r
79     idSpaceFillerPanel.setVisible(b);\r
80     RefreshPanels();\r
81   }\r
82 \r
83   public void setWrapAlignment(boolean wrap)\r
84   {\r
85       scalePanelHolder.setVisible(!wrap);\r
86       scorePanelHolder.setVisible(!wrap);\r
87 \r
88       hscroll.setVisible(!wrap);\r
89       idSpaceFillerPanel.setVisible(!wrap);\r
90       idSpaceFillerPanel1.setVisible(!wrap);\r
91   }\r
92 \r
93 \r
94   public void setColourScheme()\r
95   {\r
96     ColourSchemeI cs = av.getGlobalColourScheme();\r
97 \r
98     if(av.getConservationSelected())\r
99     {\r
100 \r
101       Alignment al = (Alignment)av.getAlignment();\r
102       Conservation c = new Conservation("All",\r
103                             ResidueProperties.propHash, 3, al.getSequences(), 0,\r
104                             al.getWidth() );\r
105 \r
106        c.calculate();\r
107        c.verdict(false, 100);\r
108        ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
109 \r
110        av.setGlobalColourScheme( ccs );\r
111 \r
112     }\r
113     seqPanel.seqCanvas.paintFlag = true;\r
114     repaint();\r
115   }\r
116   /*\r
117     seqCanvas.paintFlag = true;\r
118     if (av.getSelection().size() == 0)\r
119     {\r
120       seqCanvas.globalColorScheme = cs;\r
121       for (int i = 0; i < av.alignment.getGroups().size();i++)\r
122       {\r
123         SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);\r
124         sg.cs = cs;\r
125         if(!showConservation\r
126             && !(sg.cs instanceof Blosum62ColourScheme)\r
127             && sg.cs instanceof ConservationColourScheme)\r
128          {\r
129            // remove ConservationColouring from existing Conservation group\r
130            ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
131            sg.cs = ccs.cs;\r
132          }\r
133          else if(showConservation && !(sg.cs instanceof ConservationColourScheme))\r
134          {\r
135            // add ConservationColouring to new group\r
136            Conservation c = sg.getConservation();\r
137            Alignment al = (Alignment) av.getAlignment();\r
138            c = new Conservation("All", al.cons,\r
139                                 ResidueProperties.propHash, 3, sg.sequences, 0,\r
140                                 al.getWidth() );\r
141            c.calculate();\r
142            c.verdict(false, 100);\r
143            sg.setConservation(c);\r
144            sg.cs = new ConservationColourScheme(sg);\r
145          }\r
146       }\r
147     }\r
148     else\r
149     {\r
150       SequenceGroup sg = av.alignment.findGroup((Sequence)av.sel.sequenceAt(0));\r
151 \r
152       if( isNewSelection(sg) )\r
153       {\r
154         sg = av.getAlignment().addGroup();\r
155         for (int i=0; i < av.getSelection().size(); i++)\r
156         {\r
157           av.alignment.removeFromGroup(av.alignment.findGroup( (Sequence) av.\r
158               sel.sequenceAt(i)),\r
159                                        (Sequence) av.sel.sequenceAt(i));\r
160           av.alignment.addToGroup(sg, (Sequence) av.sel.sequenceAt(i));\r
161         }\r
162       }\r
163 \r
164 \r
165       sg.cs = cs;\r
166 \r
167       // Selection is made, we only want to change the conservationColour for selected group\r
168       if(  showConservation\r
169            && !(sg.cs instanceof ConservationColourScheme)\r
170            && !(sg.cs instanceof Blosum62ColourScheme))\r
171       {\r
172         Conservation c = sg.getConservation();\r
173         Alignment al = (Alignment) av.getAlignment();\r
174 \r
175         c = new Conservation("All", al.cons,\r
176                              ResidueProperties.propHash, 3, sg.sequences, 0,\r
177                              al.getWidth() );\r
178         c.calculate();\r
179         c.verdict(false, 100);\r
180         sg.setConservation(c);\r
181         sg.cs = new ConservationColourScheme(sg);\r
182     }\r
183     else  if( !showConservation && sg.cs instanceof ConservationColourScheme)\r
184     {\r
185       ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
186       sg.cs = ccs.cs;\r
187     }\r
188    }\r
189    repaint();\r
190   }\r
191 \r
192   boolean isNewSelection(SequenceGroup sg)\r
193   {\r
194     if(sg==null)\r
195       return true;\r
196 \r
197     if(sg.getSize()!=av.getSelection().size())\r
198       return true;\r
199 \r
200     for(int i=0; i<sg.getSize(); i++)\r
201      if( !av.getSelection().contains( sg.getSequenceAt(i) ))\r
202        return true;\r
203 \r
204     return false;\r
205   }\r
206 \r
207 \r
208   public ColourSchemeI getColourScheme()\r
209   {\r
210     if(av.getSelection().size()>0)\r
211        return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;\r
212     else\r
213       return seqCanvas.globalColorScheme;\r
214   }\r
215 */\r
216 \r
217 /*  public void setColourScheme(jalview.schemes.ColourSchemeI cs, boolean conservation)\r
218   {\r
219     seqPanel.setColourScheme(cs, conservation);\r
220 \r
221     av.setGlobalColourScheme(cs);\r
222 \r
223     if(overviewPanel!=null)\r
224       overviewPanel.updateOverviewImage();\r
225   }\r
226 \r
227    void updateResidueView()\r
228    {\r
229      if (viewport.getSelection().size() == 0)\r
230       {\r
231         for (int i = 0; i < viewport.alignment.getGroups().size(); i++)\r
232         {\r
233           SequenceGroup sg = (SequenceGroup) viewport.alignment.getGroups().elementAt(i);\r
234           sg.setDisplayBoxes( viewBoxesMenuItem.isSelected() );\r
235           sg.setDisplayText( viewTextMenuItem.isSelected() );\r
236           sg.setColourText( colourTextMenuItem.isSelected() );\r
237         }\r
238       }\r
239       else\r
240       {\r
241         SequenceGroup sg = viewport.alignment.findGroup( (Sequence) viewport.sel.sequenceAt(0));\r
242         if (alignPanel.seqPanel.isNewSelection(sg))\r
243         {\r
244           sg = viewport.getAlignment().addGroup();\r
245           for (int i = 0; i < viewport.getSelection().size(); i++)\r
246           {\r
247             viewport.alignment.removeFromGroup(viewport.alignment.findGroup( (\r
248                 Sequence) viewport.sel.sequenceAt(i)),\r
249                                                (Sequence) viewport.sel.sequenceAt(\r
250                 i));\r
251             viewport.alignment.addToGroup(sg,\r
252                                           (Sequence) viewport.sel.sequenceAt(i));\r
253           }\r
254         }\r
255 \r
256         sg.setDisplayBoxes(viewBoxesMenuItem.isSelected());\r
257         sg.setDisplayText(viewTextMenuItem.isSelected());\r
258         sg.setColourText(colourTextMenuItem.isSelected());\r
259       }\r
260      alignPanel.RefreshPanels();\r
261    }*/\r
262 \r
263 \r
264 \r
265   public void RefreshPanels()\r
266   {\r
267     invalidate();\r
268     seqPanel.seqCanvas.paintFlag = true;\r
269     idPanel.idCanvas.paintFlag = true;\r
270     idPanelHolder.setPreferredSize( idPanel.idCanvas.getPreferredSize() );\r
271     setScrollValues(av.getStartRes(), av.getStartSeq());\r
272     av.getConsensus(true);\r
273     validate();\r
274     repaint();\r
275     if(overviewPanel!=null)\r
276       overviewPanel.updateOverviewImage();\r
277 \r
278   }\r
279 \r
280   int hextent = 0;\r
281   int vextent = 0;\r
282 \r
283   public void setScrollValues(int x, int y)\r
284   {\r
285     hextent = seqPanel.seqCanvas.getWidth()/av.getCharWidth();\r
286     vextent = seqPanel.seqCanvas.getHeight()/av.getCharHeight();\r
287 \r
288     if(hextent+x  >  av.getAlignment().getWidth())\r
289       x =  av.getAlignment().getWidth()- hextent;\r
290 \r
291     if(vextent+y > av.getAlignment().getHeight())\r
292       y = av.getAlignment().getHeight() - vextent;\r
293 \r
294     if(y<0)\r
295       y = 0;\r
296 \r
297     if(x<0)\r
298       x=0;\r
299 \r
300     hscroll.setValues(x,hextent,0,av.getAlignment().getWidth());\r
301     vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() );\r
302     repaint();\r
303 \r
304   }\r
305 \r
306 \r
307   public void adjustmentValueChanged(AdjustmentEvent evt)\r
308   {\r
309 \r
310     if (evt.getSource() == hscroll)\r
311     {\r
312       int x = hscroll.getValue();\r
313       av.setStartRes(x);\r
314       av.setEndRes(x + seqPanel.seqCanvas.getWidth()/av.getCharWidth()-1);\r
315     }\r
316 \r
317     if (evt.getSource() == vscroll)\r
318     {\r
319         int offy = vscroll.getValue();\r
320         av.setStartSeq(offy);\r
321         av.setEndSeq(offy + seqPanel.seqCanvas.getHeight()/av.getCharHeight());\r
322     }\r
323 \r
324 \r
325     if(overviewPanel!=null)\r
326       overviewPanel.setBoxPosition();\r
327 \r
328     seqPanel.seqCanvas.paintFlag=true;\r
329     repaint();\r
330   }\r
331 \r
332 \r
333   public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException\r
334   {\r
335 \r
336     pg.translate((int)pf.getImageableX(), (int)pf.getImageableY());\r
337 \r
338     int pwidth = (int)pf.getImageableWidth();\r
339     int pheight = (int)pf.getImageableHeight();\r
340     int idWidth = (int)idPanel.idCanvas.getLabelWidth().getWidth();\r
341 \r
342     pg.setColor(Color.white);\r
343     pg.fillRect(0,0,pwidth, pheight);\r
344     pg.setFont( av.getFont() );\r
345 \r
346     ////////////////////////////////////\r
347     /// How many sequences and residues can we fit on a printable page?\r
348     int totalRes = (pwidth - idWidth)/av.getCharWidth();\r
349     int totalSeq = (int)((pheight - 30)/av.getCharHeight())-1;\r
350     int pagesWide = av.getAlignment().getWidth() / totalRes +1;\r
351     int pagesHigh = av.getAlignment().getHeight() / totalSeq +1;\r
352 \r
353     if (pi >= pagesWide*pagesHigh)\r
354      return Printable.NO_SUCH_PAGE;\r
355 \r
356     /////////////////////////////\r
357     /// Only print these sequences and residues on this page\r
358     int startRes, endRes, startSeq, endSeq;\r
359     startRes = (pi % pagesWide) * totalRes;\r
360     endRes = startRes + totalRes-1;\r
361     if(endRes>av.getAlignment().getWidth())\r
362       endRes = av.getAlignment().getWidth();\r
363 \r
364      startSeq = (pi / pagesWide) * totalSeq;\r
365      endSeq = startSeq + totalSeq;\r
366      if(endSeq > av.getAlignment().getHeight())\r
367        endSeq = av.getAlignment().getHeight();\r
368 \r
369 \r
370     ////////////////\r
371     //draw Scale\r
372     pg.translate(idWidth,0);\r
373     scalePanel.scaleCanvas.drawScale(pg, startRes, endRes, pwidth-idWidth);\r
374 \r
375     pg.translate(-idWidth, 30);\r
376     ////////////////\r
377     // Draw the ids\r
378     Color currentColor=null;\r
379     Color currentTextColor=null;\r
380     for(int i=startSeq; i<endSeq; i++)\r
381     {\r
382       if (av.getSelection().contains(av.getAlignment().getSequenceAt(i)))\r
383       {\r
384         currentColor = Color.gray;\r
385         currentTextColor = Color.black;\r
386       }\r
387       else\r
388       {\r
389         currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
390         currentTextColor = Color.black;\r
391       }\r
392 \r
393       pg.setColor(currentColor);\r
394       pg.fillRect(0,  jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i, av.getCharHeight()),\r
395                               idWidth,\r
396                               av.getCharHeight());\r
397 \r
398       pg.setColor(currentTextColor);\r
399 \r
400       String string = av.getAlignment().getSequenceAt(i).getDisplayId();\r
401       pg.drawString(string, 0,  jalview.analysis.AlignmentUtil.getPixelHeight\r
402                     (startSeq, i, av.getCharHeight()) + av.getCharHeight() - (av.getCharHeight() / 5));\r
403     }\r
404 \r
405     // draw main sequence panel\r
406     pg.translate(idWidth,0);\r
407     pg.setClip(0,0,pwidth-idWidth, pheight);\r
408     seqPanel.seqCanvas.drawPanel(pg,startRes,endRes,startSeq,endSeq,startRes,startSeq,0);\r
409 \r
410     return Printable.PAGE_EXISTS;\r
411   }\r
412 \r
413 }\r
414 \r
415 \r
416 \r