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
130 public void mouseReleased(MouseEvent evt)
\r
137 public void mouseDragged(MouseEvent evt)
\r
151 if (boxY > (sequencesHeight - boxHeight))
\r
153 boxY = sequencesHeight - boxHeight + 1;
\r
161 if (boxX > (width - boxWidth))
\r
163 if(av.hasHiddenColumns)
\r
165 //Try smallest possible box
\r
166 boxWidth = (int) ( (av.endRes - av.startRes + 1) *
\r
167 av.getCharWidth() * scalew);
\r
169 boxX = width - boxWidth;
\r
172 int col = (int) (boxX / scalew / av.getCharWidth());
\r
173 int row = (int) (boxY / scaleh / av.getCharHeight());
\r
175 if (av.hasHiddenColumns)
\r
177 if (!av.getColumnSelection().isVisible(col))
\r
182 col = av.getColumnSelection().findColumnPosition(col);
\r
185 if( av.hasHiddenRows )
\r
187 row = av.alignment.getHiddenSequences().findIndexWithoutHiddenSeqs(row);
\r
190 ap.setScrollValues( col, row );
\r
197 public void updateOverviewImage()
\r
201 resizeAgain = true;
\r
205 if (av.showSequenceFeatures)
\r
207 fr.featureGroups = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups;
\r
208 fr.featureColours = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours;
\r
213 if ( (getSize().width > 0) && (getSize().height > 0))
\r
215 width = getSize().width;
\r
216 sequencesHeight = getSize().height - graphHeight;
\r
218 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
220 Thread thread = new Thread(this);
\r
225 // This is set true if the user resizes whilst
\r
226 // the overview is being calculated
\r
227 boolean resizeAgain = false;
\r
232 int alwidth = av.alignment.getWidth();
\r
233 int alheight = av.alignment.getHeight();
\r
235 if (av.showSequenceFeatures)
\r
237 fr.transferSettings( ap.seqPanel.seqCanvas.getFeatureRenderer() );
\r
240 if (getSize().width > 0 && getSize().height > 0)
\r
242 width = getSize().width;
\r
243 sequencesHeight = getSize().height - graphHeight;
\r
246 setSize(new Dimension(width, sequencesHeight + graphHeight));
\r
248 int fullsizeWidth = alwidth * av.getCharWidth();
\r
249 int fullsizeHeight = alheight * av.getCharHeight();
\r
251 scalew = (float) width / (float) fullsizeWidth;
\r
252 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
254 miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);
\r
256 Graphics mg = miniMe.getGraphics();
\r
257 float sampleCol = (float) alwidth / (float) width;
\r
258 float sampleRow = (float) alheight / (float) sequencesHeight;
\r
260 int lastcol=-1, lastrow=-1;
\r
261 Color color = Color.yellow;
\r
262 int row, col, sameRow = 0, sameCol = 0;
\r
263 jalview.datamodel.SequenceI seq;
\r
264 boolean hiddenRow = false;
\r
265 for (row = 0; row < sequencesHeight; row++)
\r
267 if((int)(row*sampleRow)==lastrow)
\r
273 lastrow = (int)(row*sampleRow);
\r
276 if (av.hasHiddenRows)
\r
278 seq = av.alignment.getHiddenSequences().getHiddenSequence(lastrow);
\r
282 av.alignment.getHiddenSequences().findIndexWithoutHiddenSeqs(lastrow);
\r
284 seq = av.alignment.getSequenceAt(index);
\r
292 seq = av.alignment.getSequenceAt(lastrow);
\r
296 System.out.println(lastrow+" null");
\r
300 for (col = 0; col < width; col++)
\r
302 if ( (int) (col * sampleCol) == lastcol && (int) (row * sampleRow) == lastrow)
\r
308 lastcol = (int) (col * sampleCol);
\r
310 if (seq.getLength() > lastcol)
\r
312 color = sr.getResidueBoxColour(
\r
315 if (av.showSequenceFeatures)
\r
316 color = fr.findFeatureColour(color, seq, lastcol);
\r
320 color = Color.white; //White
\r
324 (av.hasHiddenColumns && !av.getColumnSelection().isVisible(lastcol)))
\r
326 color = color.darker().darker();
\r
329 mg.setColor(color);
\r
330 if (sameCol == 1 && sameRow == 1)
\r
331 mg.drawLine(col, row, col, row);
\r
333 mg.fillRect(col, row, col+sameCol, col+sameRow);
\r
340 if (av.conservation != null)
\r
342 for (col = 0; col < width; col++)
\r
344 lastcol = (int) (col * sampleCol);
\r
346 mg.translate(col, sequencesHeight);
\r
347 ap.annotationPanel.drawGraph(mg, av.conservation,
\r
348 (int) (sampleCol) + 1,
\r
350 (int) (col * sampleCol),
\r
351 (int) (col * sampleCol) + 1);
\r
352 mg.translate( -col, -sequencesHeight);
\r
364 resizeAgain = false;
\r
365 updateOverviewImage();
\r
369 public void setBoxPosition()
\r
371 int fullsizeWidth = av.alignment.getWidth() * av.getCharWidth();
\r
372 int fullsizeHeight = (av.alignment.getHeight()
\r
373 + av.alignment.getHiddenSequences().getSize()) *
\r
374 av.getCharHeight();
\r
376 int startRes = av.getStartRes();
\r
377 int endRes = av.getEndRes();
\r
379 if (av.hasHiddenColumns)
\r
381 startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);
\r
382 endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);
\r
385 int startSeq = av.startSeq;
\r
386 int endSeq = av.endSeq;
\r
388 if (av.hasHiddenRows)
\r
391 av.alignment.getHiddenSequences().adjustForHiddenSeqs(startSeq);
\r
394 av.alignment.getHiddenSequences().adjustForHiddenSeqs(endSeq);
\r
398 scalew = (float) width / (float) fullsizeWidth;
\r
399 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
401 boxX = (int) (startRes * av.getCharWidth() * scalew);
\r
402 boxY = (int) (startSeq * av.getCharHeight() * scaleh);
\r
404 if (av.hasHiddenColumns)
\r
405 boxWidth = (int) ( (endRes - startRes + 1) * av.getCharWidth() * scalew);
\r
407 boxWidth = (int) ( (endRes - startRes + 1) * av.getCharWidth() * scalew);
\r
409 boxHeight = (int) ( (endSeq - startSeq) * av.getCharHeight() * scaleh);
\r
414 public void update(Graphics g)
\r
419 public void paint(Graphics g)
\r
421 if (miniMe != null)
\r
423 g.drawImage(miniMe, 0, 0, this);
\r
427 g.setColor(Color.white);
\r
428 g.fillRect(0, 0, getSize().width, getSize().height);
\r
429 g.setColor(Color.black);
\r
430 g.setFont(new Font("Verdana", Font.BOLD, 15));
\r
431 g.drawString("Recalculating", 5, sequencesHeight / 2);
\r
432 g.drawString("Overview.....", 5, (sequencesHeight / 2) + 20);
\r
435 g.setColor(Color.red);
\r
436 g.drawRect(boxX, boxY, boxWidth, boxHeight);
\r
437 g.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
\r