2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
20 package jalview.appletgui;
\r
23 import java.awt.event.*;
\r
25 public class OverviewPanel
\r
26 extends Panel implements Runnable, MouseMotionListener, MouseListener
\r
34 public int width, sequencesHeight;
\r
35 int graphHeight = 20;
\r
36 int boxX = -1, boxY = -1, boxWidth = -1, boxHeight = -1;
\r
38 boolean resizing = false;
\r
40 // Can set different properties in this seqCanvas than
\r
41 // main visible SeqCanvas
\r
42 SequenceRenderer sr;
\r
48 public OverviewPanel(AlignmentPanel ap)
\r
53 nullFrame = new Frame();
\r
54 nullFrame.addNotify();
\r
57 sr = new SequenceRenderer(av);
\r
58 sr.graphics = nullFrame.getGraphics();
\r
59 sr.renderGaps( false );
\r
60 sr.forOverview = true;
\r
61 fr = new FeatureRenderer(av);
\r
66 // scale the initial size of overviewpanel to shape of alignment
\r
67 float initialScale = (float) av.alignment.getWidth() /
\r
68 (float) av.alignment.getHeight();
\r
70 if(av.vconsensus==null)
\r
73 if (av.alignment.getWidth() > av.alignment.getHeight())
\r
77 sequencesHeight = (int) (400f / initialScale);
\r
78 if(sequencesHeight<40)
\r
79 sequencesHeight = 40;
\r
84 width = (int) (400f * initialScale);
\r
85 sequencesHeight = 300;
\r
92 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
93 addComponentListener(new ComponentAdapter()
\r
96 public void componentResized(ComponentEvent evt)
\r
98 if (getSize().width != width ||
\r
99 getSize().height != sequencesHeight + graphHeight)
\r
101 updateOverviewImage();
\r
106 addMouseMotionListener(this);
\r
108 addMouseListener(this);
\r
110 updateOverviewImage();
\r
115 public void mouseEntered(MouseEvent evt)
\r
117 public void mouseExited(MouseEvent evt)
\r
119 public void mouseClicked(MouseEvent evt)
\r
121 public void mouseMoved(MouseEvent evt)
\r
123 public void mousePressed(MouseEvent evt)
\r
132 public void mouseReleased(MouseEvent evt)
\r
137 ap.setScrollValues( (int) (boxX / scalew / av.getCharWidth()),
\r
138 (int) (boxY / scaleh / av.getCharHeight()));
\r
141 public void mouseDragged(MouseEvent evt)
\r
146 ap.setScrollValues( (int) (boxX / scalew / av.getCharWidth()),
\r
147 (int) (boxY / scaleh / av.getCharHeight()));
\r
160 if (boxY > sequencesHeight - boxHeight)
\r
162 boxY = sequencesHeight - boxHeight + 1;
\r
170 if (boxX > width - boxWidth)
\r
172 boxX = width - boxWidth;
\r
179 public void updateOverviewImage()
\r
183 resizeAgain = true;
\r
187 if (av.showSequenceFeatures)
\r
189 fr.featureGroups = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups;
\r
190 fr.featureColours = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours;
\r
191 fr.sequenceFeatures = ap.seqPanel.seqCanvas.getFeatureRenderer().sequenceFeatures;
\r
196 if ( (getSize().width > 0) && (getSize().height > 0))
\r
198 width = getSize().width;
\r
199 sequencesHeight = getSize().height - graphHeight;
\r
201 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
204 Thread thread = new Thread(this);
\r
209 // This is set true if the user resizes whilst
\r
210 // the overview is being calculated
\r
211 boolean resizeAgain = false;
\r
216 int alwidth = av.alignment.getWidth();
\r
217 int alheight = av.alignment.getHeight();
\r
219 if (av.showSequenceFeatures)
\r
221 fr.renderOrder = ap.seqPanel.seqCanvas.getFeatureRenderer().renderOrder;
\r
222 fr.featureGroups = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups;
\r
223 fr.featureColours = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours;
\r
224 fr.sequenceFeatures = ap.seqPanel.seqCanvas.getFeatureRenderer().sequenceFeatures;
\r
227 if (getSize().width > 0 && getSize().height > 0)
\r
229 width = getSize().width;
\r
230 sequencesHeight = getSize().height - graphHeight;
\r
233 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
235 int fullsizeWidth = alwidth * av.getCharWidth();
\r
236 int fullsizeHeight = alheight * av.getCharHeight();
\r
238 scalew = (float) width / (float) fullsizeWidth;
\r
239 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
241 miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);
\r
243 Graphics mg = miniMe.getGraphics();
\r
244 float sampleCol = (float) alwidth / (float) width;
\r
245 float sampleRow = (float) alheight / (float) sequencesHeight;
\r
247 int lastcol=0, lastseq=0;
\r
248 int xstart=0, ystart=0;
\r
249 Color color = Color.yellow;
\r
250 int col, sameRow = 0, sameCol = 0;
\r
251 jalview.datamodel.SequenceI sequence;
\r
253 for (int row = 0; row <= sequencesHeight; row++)
\r
255 if((int)(row*sampleRow)==lastseq)
\r
261 sequence = av.getAlignment().getSequenceAt(lastseq);
\r
263 for (col = 0; col < width; col++)
\r
265 if((int)(col*sampleCol) == lastcol)
\r
271 lastcol = (int)(col*sampleCol);
\r
273 if(sequence.getLength()>lastcol)
\r
275 color = sr.findSequenceColour(sequence, lastcol);
\r
277 if (av.showSequenceFeatures)
\r
278 color = fr.findFeatureColour(color,
\r
283 color = color.white;
\r
285 mg.setColor(color);
\r
286 if (sameCol == 1 && sameRow == 1)
\r
287 mg.drawLine(xstart, ystart, xstart, ystart);
\r
289 mg.fillRect(xstart, ystart, sameCol, sameRow);
\r
296 lastseq = (int)(row*sampleRow);
\r
301 if (av.conservation != null)
\r
303 for (col = 0; col < width; col++)
\r
305 lastcol = (int) (col * sampleCol);
\r
307 mg.translate(col, sequencesHeight);
\r
308 ap.annotationPanel.drawGraph(mg, av.conservation,
\r
309 (int) (sampleCol) + 1,
\r
311 (int) (col * sampleCol),
\r
312 (int) (col * sampleCol) + 1);
\r
313 mg.translate( -col, -sequencesHeight);
\r
328 resizeAgain = false;
\r
329 updateOverviewImage();
\r
333 public void setBoxPosition()
\r
335 int fullsizeWidth = av.alignment.getWidth() * av.getCharWidth();
\r
336 int fullsizeHeight = av.alignment.getHeight() * av.getCharHeight();
\r
338 scalew = (float) width / (float) fullsizeWidth;
\r
339 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
341 boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew);
\r
342 boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh);
\r
343 boxWidth = (int) ( (av.getEndRes() - av.getStartRes() + 1) *
\r
344 av.getCharWidth() * scalew);
\r
345 boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY;
\r
349 public void update(Graphics g)
\r
354 public void paint(Graphics g)
\r
356 if (miniMe != null)
\r
358 g.drawImage(miniMe, 0, 0, this);
\r
362 g.setColor(Color.white);
\r
363 g.fillRect(0, 0, getSize().width, getSize().height);
\r
364 g.setColor(Color.black);
\r
365 g.setFont(new Font("Verdana", Font.BOLD, 15));
\r
366 g.drawString("Recalculating", 5, sequencesHeight / 2);
\r
367 g.drawString("Overview.....", 5, (sequencesHeight / 2) + 20);
\r
370 g.setColor(Color.red);
\r
371 g.drawRect(boxX, boxY, boxWidth, boxHeight);
\r
372 g.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
\r