2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.appletgui;
23 import jalview.viewmodel.OverviewDimensions;
25 import java.awt.Color;
26 import java.awt.Dimension;
27 import java.awt.Frame;
28 import java.awt.Graphics;
29 import java.awt.Image;
30 import java.awt.Panel;
31 import java.awt.event.ComponentAdapter;
32 import java.awt.event.ComponentEvent;
33 import java.awt.event.MouseEvent;
34 import java.awt.event.MouseListener;
35 import java.awt.event.MouseMotionListener;
37 public class OverviewPanel extends Panel implements Runnable,
38 MouseMotionListener, MouseListener
40 private OverviewDimensions od;
44 private Image offscreen;
46 private AlignViewport av;
48 private AlignmentPanel ap;
50 private boolean resizing = false;
52 // This is set true if the user resizes whilst
53 // the overview is being calculated
54 private boolean resizeAgain = false;
56 // Can set different properties in this seqCanvas than
57 // main visible SeqCanvas
58 private SequenceRenderer sr;
60 private FeatureRenderer fr;
62 private Frame nullFrame;
64 public OverviewPanel(AlignmentPanel ap)
69 nullFrame = new Frame();
70 nullFrame.addNotify();
72 sr = new SequenceRenderer(av);
73 sr.graphics = nullFrame.getGraphics();
74 sr.renderGaps = false;
75 sr.forOverview = true;
76 fr = new FeatureRenderer(av);
78 od = new OverviewDimensions(av);
80 setSize(new Dimension(od.getWidth(), od.getHeight()));
81 addComponentListener(new ComponentAdapter()
85 public void componentResized(ComponentEvent evt)
87 if ((getWidth() != od.getWidth())
88 || (getHeight() != (od.getHeight())))
90 updateOverviewImage();
95 addMouseMotionListener(this);
97 addMouseListener(this);
99 updateOverviewImage();
104 public void mouseEntered(MouseEvent evt)
109 public void mouseExited(MouseEvent evt)
114 public void mouseClicked(MouseEvent evt)
119 public void mouseMoved(MouseEvent evt)
124 public void mousePressed(MouseEvent evt)
126 od.setBoxX(evt.getX());
127 od.setBoxY(evt.getY());
132 public void mouseReleased(MouseEvent evt)
134 od.setBoxX(evt.getX());
135 od.setBoxY(evt.getY());
140 public void mouseDragged(MouseEvent evt)
142 od.setBoxX(evt.getX());
143 od.setBoxY(evt.getY());
148 * Check box dimensions and scroll positions and correct if necessary
150 private void checkValid()
153 ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
154 ap.paintAlignment(false);
160 public void updateOverviewImage()
168 if (av.isShowSequenceFeatures())
170 fr.transferSettings(ap.seqPanel.seqCanvas.fr);
175 if ((getWidth() > 0) && (getHeight() > 0))
177 od.setWidth(getWidth()); // width = getWidth();
178 od.setHeight(getHeight()); // sequencesHeight = getHeight() - graphHeight;
180 setSize(new Dimension(od.getWidth(), od.getHeight()));
182 Thread thread = new Thread(this);
192 if (av.isShowSequenceFeatures())
194 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
197 if (getSize().width > 0 && getSize().height > 0)
199 od.setWidth(getSize().width);
200 od.setHeight(getSize().height - od.getGraphHeight());
203 setSize(new Dimension(od.getWidth(), od.getHeight()));
205 miniMe = nullFrame.createImage(od.getWidth(), od.getHeight());
206 offscreen = nullFrame.createImage(od.getWidth(), od.getHeight());
208 Graphics mg = miniMe.getGraphics();
212 int alwidth = av.getAlignment().getWidth();
213 int alheight = av.getAlignment().getHeight()
214 + av.getAlignment().getHiddenSequences().getSize();
215 float sampleCol = alwidth / (float) od.getWidth();
216 float sampleRow = alheight / (float) od.getSequencesHeight();
218 buildImage(sampleRow, sampleCol, mg);
220 if (av.getAlignmentConservationAnnotation() != null)
222 for (int col = 0; col < od.getWidth() && !resizeAgain; col++)
224 mg.translate(col, od.getSequencesHeight());
225 ap.annotationPanel.renderer.drawGraph(mg,
226 av.getAlignmentConservationAnnotation(),
227 av.getAlignmentConservationAnnotation().annotations,
228 (int) (sampleCol) + 1, od.getGraphHeight(),
229 (int) (col * sampleCol), (int) (col * sampleCol) + 1);
230 mg.translate(-col, -od.getSequencesHeight());
242 updateOverviewImage();
246 private void buildImage(float sampleRow, float sampleCol, Graphics mg)
252 Color color = Color.yellow;
256 jalview.datamodel.SequenceI seq = null;
257 final boolean hasHiddenRows = av.hasHiddenRows();
258 final boolean hasHiddenCols = av.hasHiddenColumns();
259 boolean hiddenRow = false;
261 for (int row = 0; row <= od.getSequencesHeight() && !resizeAgain; row++)
263 if ((int) (row * sampleRow) == lastrow)
270 // this should largely be a method in Alignment
274 seq = av.getAlignment().getHiddenSequences()
275 .getHiddenSequence(lastrow);
278 int index = av.getAlignment().getHiddenSequences()
279 .findIndexWithoutHiddenSeqs(lastrow);
281 seq = av.getAlignment().getSequenceAt(index);
290 seq = av.getAlignment().getSequenceAt(lastrow);
292 // end of Alignment method
294 for (int col = 0; col < od.getWidth(); col++)
296 if ((int) (col * sampleCol) == lastcol
297 && (int) (row * sampleRow) == lastrow)
303 lastcol = (int) (col * sampleCol);
305 color = getColumnColourFromSequence(seq, hiddenRow,
306 hasHiddenCols, lastcol);
309 if (sameCol == 1 && sameRow == 1)
311 mg.drawLine(xstart, ystart, xstart, ystart);
315 mg.fillRect(xstart, ystart, sameCol, sameRow);
322 lastrow = (int) (row * sampleRow);
331 * Find the colour of a sequence at a specified column position
333 private Color getColumnColourFromSequence(
334 jalview.datamodel.SequenceI seq, boolean hiddenRow,
335 boolean hasHiddenCols, int lastcol)
338 if (seq.getLength() > lastcol)
340 color = sr.getResidueBoxColour(seq, lastcol);
342 if (av.isShowSequenceFeatures())
344 color = fr.findFeatureColour(color, seq, lastcol);
349 color = Color.white; // White
353 || (hasHiddenCols && !av.getColumnSelection()
354 .isVisible(lastcol)))
356 color = color.darker().darker();
362 * Update the overview panel box when the associated alignment panel is
366 public void setBoxPosition()
373 public void update(Graphics g)
379 public void paint(Graphics g)
381 Graphics og = offscreen.getGraphics();
384 og.drawImage(miniMe, 0, 0, this);
385 og.setColor(Color.red);
386 og.drawRect(od.getBoxX(), od.getBoxY(), od.getBoxWidth(),
388 og.drawRect(od.getBoxX() + 1, od.getBoxY() + 1, od.getBoxWidth() - 2,
389 od.getBoxHeight() - 2);
390 g.drawImage(offscreen, 0, 0, this);