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