printing added
[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 g, PageFormat pf, int pi) throws PrinterException\r
182   {\r
183 \r
184     int pwidth = (int)pf.getImageableWidth();\r
185     int pheight = (int)pf.getImageableHeight();\r
186     int idWidth = (int)idPanel.idCanvas.getLabelWidth().getWidth();\r
187 \r
188     BufferedImage printImage = new BufferedImage(pwidth,pheight,BufferedImage.TYPE_INT_RGB);\r
189     Graphics pg = printImage.getGraphics();\r
190     pg.setColor(Color.white);\r
191     pg.fillRect(0,0,pwidth, pheight);\r
192     pg.setFont( av.getFont() );\r
193 \r
194     ////////////////////////////////////\r
195     /// How many sequences and residues can we fit on a printable page?\r
196     int totalRes = (int)((pwidth - idWidth)/av.getCharWidth());\r
197     int totalSeq = (int)((pheight - 30)/av.getCharHeight())-1;\r
198     int pagesWide = av.getAlignment().getWidth() / totalRes +1;\r
199     int pagesHigh = av.getAlignment().getHeight() / totalSeq +1;\r
200 \r
201     if (pi >= pagesWide*pagesHigh)\r
202      return Printable.NO_SUCH_PAGE;\r
203 \r
204     /////////////////////////////\r
205     /// Only print these sequences and residues on this page\r
206     int startRes, endRes, startSeq, endSeq;\r
207     startRes = (pi % pagesWide) * totalRes;\r
208     endRes = startRes + totalRes-1;\r
209     if(endRes>av.getAlignment().getWidth())\r
210       endRes = av.getAlignment().getWidth();\r
211 \r
212      startSeq = (pi / pagesWide) * totalSeq;\r
213      endSeq = startSeq + totalSeq;\r
214      if(endSeq > av.getAlignment().getHeight())\r
215        endSeq = av.getAlignment().getHeight();\r
216 \r
217 \r
218     ////////////////\r
219     //draw Scale\r
220     pg.translate(idWidth,0);\r
221     scalePanel.scaleCanvas.drawScale(pg, startRes, endRes, pwidth-idWidth);\r
222 \r
223     pg.translate(-idWidth, 30);\r
224     ////////////////\r
225     // Draw the ids\r
226     Color currentColor=null;\r
227     Color currentTextColor=null;\r
228     for(int i=startSeq; i<endSeq; i++)\r
229     {\r
230       if (av.getSelection().contains(av.getAlignment().getSequenceAt(i)))\r
231       {\r
232         currentColor = Color.gray;\r
233         currentTextColor = Color.black;\r
234       }\r
235       else\r
236       {\r
237         currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
238         currentTextColor = Color.black;\r
239       }\r
240 \r
241       pg.setColor(currentColor);\r
242       pg.fillRect(0,  jalview.analysis.AlignmentUtil.getPixelHeight(startSeq, i, av.getCharHeight()),\r
243                               getWidth(),\r
244                               av.getCharHeight());\r
245 \r
246       pg.setColor(currentTextColor);\r
247 \r
248       String string = av.getAlignment().getSequenceAt(i).getDisplayId();\r
249       pg.drawString(string, 0,  jalview.analysis.AlignmentUtil.getPixelHeight\r
250                     (startSeq, i, av.getCharHeight()) + av.getCharHeight() - (av.getCharHeight() / 5));\r
251     }\r
252 \r
253     // draw main sequence panel\r
254     pg.translate(idWidth,0);\r
255     seqPanel.seqCanvas.drawPanel(pg,startRes,endRes,startSeq,endSeq,startRes,startSeq,0);\r
256 \r
257 \r
258     g.drawImage( printImage, (int)pf.getImageableX (), (int)pf.getImageableY(), this);\r
259 \r
260    /* JFrame frame = new JFrame("preview");\r
261     javax.swing.JPanel p = new preview(printImage);\r
262     frame.getContentPane().setLayout(new BorderLayout());\r
263     frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);\r
264     frame.setVisible(true);\r
265     frame.setSize(pwidth, pheight);\r
266 \r
267     frame.validate();*/\r
268 \r
269     return Printable.PAGE_EXISTS;\r
270   }\r
271 }\r
272 \r
273 class preview extends javax.swing.JPanel\r
274 {\r
275   Image i=null;\r
276   public preview(Image image)\r
277   {\r
278     i = image;\r
279   }\r
280 \r
281   public void paint(Graphics g)\r
282   {\r
283     if(g!=null)\r
284       g.drawImage(i, 0,0,null);\r
285   }\r
286 }\r
287 \r