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
35 public int width, sequencesHeight;
\r
36 int graphHeight = 20;
\r
37 int boxX = -1, boxY = -1, boxWidth = -1, boxHeight = -1;
\r
39 boolean resizing = false;
\r
41 // Can set different properties in this seqCanvas than
\r
42 // main visible SeqCanvas
\r
43 SequenceRenderer sr;
\r
49 public OverviewPanel(AlignmentPanel ap)
\r
54 nullFrame = new Frame();
\r
55 nullFrame.addNotify();
\r
58 sr = new SequenceRenderer(av);
\r
59 sr.graphics = nullFrame.getGraphics();
\r
60 sr.renderGaps = false;
\r
61 sr.forOverview = true;
\r
62 fr = new FeatureRenderer(av);
\r
67 // scale the initial size of overviewpanel to shape of alignment
\r
68 float initialScale = (float) av.alignment.getWidth() /
\r
69 (float) av.alignment.getHeight();
\r
71 if(av.vconsensus==null)
\r
74 if (av.alignment.getWidth() > av.alignment.getHeight())
\r
78 sequencesHeight = (int) (400f / initialScale);
\r
79 if(sequencesHeight<40)
\r
80 sequencesHeight = 40;
\r
85 width = (int) (400f * initialScale);
\r
86 sequencesHeight = 300;
\r
93 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
94 addComponentListener(new ComponentAdapter()
\r
97 public void componentResized(ComponentEvent evt)
\r
99 if (getSize().width != width ||
\r
100 getSize().height != sequencesHeight + graphHeight)
\r
102 updateOverviewImage();
\r
107 addMouseMotionListener(this);
\r
109 addMouseListener(this);
\r
111 updateOverviewImage();
\r
116 public void mouseEntered(MouseEvent evt)
\r
118 public void mouseExited(MouseEvent evt)
\r
120 public void mouseClicked(MouseEvent evt)
\r
122 public void mouseMoved(MouseEvent evt)
\r
124 public void mousePressed(MouseEvent evt)
\r
131 public void mouseReleased(MouseEvent evt)
\r
138 public void mouseDragged(MouseEvent evt)
\r
152 if (boxY > (sequencesHeight - boxHeight))
\r
154 boxY = sequencesHeight - boxHeight + 1;
\r
162 if (boxX > (width - boxWidth))
\r
164 if(av.hasHiddenColumns)
\r
166 //Try smallest possible box
\r
167 boxWidth = (int) ( (av.endRes - av.startRes + 1) *
\r
168 av.getCharWidth() * scalew);
\r
170 boxX = width - boxWidth;
\r
173 int col = (int) (boxX / scalew / av.getCharWidth());
\r
174 int row = (int) (boxY / scaleh / av.getCharHeight());
\r
176 if (av.hasHiddenColumns)
\r
178 if (!av.getColumnSelection().isVisible(col))
\r
183 col = av.getColumnSelection().findColumnPosition(col);
\r
186 if( av.hasHiddenRows )
\r
188 row = av.alignment.getHiddenSequences().findIndexWithoutHiddenSeqs(row);
\r
191 ap.setScrollValues( col, row );
\r
198 public void updateOverviewImage()
\r
202 resizeAgain = true;
\r
206 if (av.showSequenceFeatures)
\r
208 fr.featureGroups = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups;
\r
209 fr.featureColours = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours;
\r
214 if ( (getSize().width > 0) && (getSize().height > 0))
\r
216 width = getSize().width;
\r
217 sequencesHeight = getSize().height - graphHeight;
\r
219 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
221 Thread thread = new Thread(this);
\r
226 // This is set true if the user resizes whilst
\r
227 // the overview is being calculated
\r
228 boolean resizeAgain = false;
\r
233 int alwidth = av.alignment.getWidth();
\r
234 int alheight = av.alignment.getHeight();
\r
236 if (av.showSequenceFeatures)
\r
238 fr.transferSettings( ap.seqPanel.seqCanvas.getFeatureRenderer() );
\r
241 if (getSize().width > 0 && getSize().height > 0)
\r
243 width = getSize().width;
\r
244 sequencesHeight = getSize().height - graphHeight;
\r
247 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
249 int fullsizeWidth = alwidth * av.getCharWidth();
\r
250 int fullsizeHeight = alheight * av.getCharHeight();
\r
252 scalew = (float) width / (float) fullsizeWidth;
\r
253 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
255 miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);
\r
256 offscreen = nullFrame.createImage(width, sequencesHeight + graphHeight);
\r
258 Graphics mg = miniMe.getGraphics();
\r
259 float sampleCol = (float) alwidth / (float) width;
\r
260 float sampleRow = (float) alheight / (float) sequencesHeight;
\r
262 int lastcol=0, lastrow=0;
\r
263 int xstart=0, ystart=0;
\r
264 Color color = Color.yellow;
\r
265 int row, col, sameRow = 0, sameCol = 0;
\r
266 jalview.datamodel.SequenceI seq;
\r
267 boolean hiddenRow = false;
\r
268 for (row = 0; row <= sequencesHeight; row++)
\r
270 if((int)(row*sampleRow)==lastrow)
\r
277 if (av.hasHiddenRows)
\r
279 seq = av.alignment.getHiddenSequences().getHiddenSequence(lastrow);
\r
283 av.alignment.getHiddenSequences().findIndexWithoutHiddenSeqs(lastrow);
\r
285 seq = av.alignment.getSequenceAt(index);
\r
293 seq = av.alignment.getSequenceAt(lastrow);
\r
295 for (col = 0; col < width; col++)
\r
297 if ( (int) (col * sampleCol) == lastcol && (int) (row * sampleRow) == lastrow)
\r
303 lastcol = (int) (col * sampleCol);
\r
305 if (seq.getLength() > lastcol)
\r
307 color = sr.getResidueBoxColour(
\r
310 if (av.showSequenceFeatures)
\r
311 color = fr.findFeatureColour(color, seq, lastcol);
\r
315 color = Color.white; //White
\r
319 (av.hasHiddenColumns && !av.getColumnSelection().isVisible(lastcol)))
\r
321 color = color.darker().darker();
\r
324 mg.setColor(color);
\r
325 if (sameCol == 1 && sameRow == 1)
\r
326 mg.drawLine(xstart, ystart, xstart, ystart);
\r
328 mg.fillRect(xstart, ystart, sameCol, sameRow);
\r
333 lastrow = (int)(row*sampleRow);
\r
338 if (av.conservation != null)
\r
340 for (col = 0; col < width; col++)
\r
342 lastcol = (int) (col * sampleCol);
\r
344 mg.translate(col, sequencesHeight);
\r
345 ap.annotationPanel.drawGraph(mg, av.conservation,
\r
346 (int) (sampleCol) + 1,
\r
348 (int) (col * sampleCol),
\r
349 (int) (col * sampleCol) + 1);
\r
350 mg.translate( -col, -sequencesHeight);
\r
362 resizeAgain = false;
\r
363 updateOverviewImage();
\r
367 public void setBoxPosition()
\r
369 int fullsizeWidth = av.alignment.getWidth() * av.getCharWidth();
\r
370 int fullsizeHeight = (av.alignment.getHeight()
\r
371 + av.alignment.getHiddenSequences().getSize()) *
\r
372 av.getCharHeight();
\r
374 int startRes = av.getStartRes();
\r
375 int endRes = av.getEndRes();
\r
377 if (av.hasHiddenColumns)
\r
379 startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);
\r
380 endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);
\r
383 int startSeq = av.startSeq;
\r
384 int endSeq = av.endSeq;
\r
386 if (av.hasHiddenRows)
\r
389 av.alignment.getHiddenSequences().adjustForHiddenSeqs(startSeq);
\r
392 av.alignment.getHiddenSequences().adjustForHiddenSeqs(endSeq);
\r
396 scalew = (float) width / (float) fullsizeWidth;
\r
397 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
399 boxX = (int) (startRes * av.getCharWidth() * scalew);
\r
400 boxY = (int) (startSeq * av.getCharHeight() * scaleh);
\r
402 if (av.hasHiddenColumns)
\r
403 boxWidth = (int) ( (endRes - startRes + 1) * av.getCharWidth() * scalew);
\r
405 boxWidth = (int) ( (endRes - startRes + 1) * av.getCharWidth() * scalew);
\r
407 boxHeight = (int) ( (endSeq - startSeq) * av.getCharHeight() * scaleh);
\r
412 public void update(Graphics g)
\r
417 public void paint(Graphics g)
\r
419 Graphics og = offscreen.getGraphics();
\r
420 if (miniMe != null)
\r
422 og.drawImage(miniMe, 0, 0, this);
\r
423 og.setColor(Color.red);
\r
424 og.drawRect(boxX, boxY, boxWidth, boxHeight);
\r
425 og.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
\r
426 g.drawImage(offscreen, 0,0, this);
\r
430 g.setColor(Color.white);
\r
431 g.fillRect(0, 0, getSize().width, getSize().height);
\r
432 g.setColor(Color.black);
\r
433 g.setFont(new Font("Verdana", Font.BOLD, 15));
\r
434 g.drawString("Recalculating", 5, sequencesHeight / 2);
\r
435 g.drawString("Overview.....", 5, (sequencesHeight / 2) + 20);
\r