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