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)
130 public void mouseReleased(MouseEvent evt)
136 public void mouseDragged(MouseEvent evt)
141 private void mouseAction(MouseEvent evt)
143 od.setBoxPositionByMouse(evt.getX(), evt.getY());
144 ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
145 ap.paintAlignment(false);
151 public void updateOverviewImage()
159 if (av.isShowSequenceFeatures())
161 fr.transferSettings(ap.seqPanel.seqCanvas.fr);
166 if ((getWidth() > 0) && (getHeight() > 0))
168 od.setWidth(getWidth()); // width = getWidth();
169 od.setHeight(getHeight()); // sequencesHeight = getHeight() - graphHeight;
171 setSize(new Dimension(od.getWidth(), od.getHeight()));
173 Thread thread = new Thread(this);
183 if (av.isShowSequenceFeatures())
185 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
188 if (getSize().width > 0 && getSize().height > 0)
190 od.setWidth(getSize().width);
191 od.setHeight(getSize().height - od.getGraphHeight());
194 setSize(new Dimension(od.getWidth(), od.getHeight()));
196 miniMe = nullFrame.createImage(od.getWidth(), od.getHeight());
197 offscreen = nullFrame.createImage(od.getWidth(), od.getHeight());
199 Graphics mg = miniMe.getGraphics();
201 // od.updateScales();
203 int alwidth = av.getAlignment().getWidth();
204 int alheight = av.getAlignment().getAbsoluteHeight();
205 float sampleCol = alwidth / (float) od.getWidth();
206 float sampleRow = alheight / (float) od.getSequencesHeight();
208 buildImage(sampleRow, sampleCol, mg);
210 if (av.getAlignmentConservationAnnotation() != null)
212 for (int col = 0; col < od.getWidth() && !resizeAgain; col++)
214 mg.translate(col, od.getSequencesHeight());
215 ap.annotationPanel.renderer.drawGraph(mg,
216 av.getAlignmentConservationAnnotation(),
217 av.getAlignmentConservationAnnotation().annotations,
218 (int) (sampleCol) + 1, od.getGraphHeight(),
219 (int) (col * sampleCol), (int) (col * sampleCol) + 1);
220 mg.translate(-col, -od.getSequencesHeight());
232 updateOverviewImage();
236 private void buildImage(float sampleRow, float sampleCol, Graphics mg)
242 Color color = Color.yellow;
246 jalview.datamodel.SequenceI seq = null;
248 final boolean hasHiddenCols = av.hasHiddenColumns();
249 boolean hiddenRow = false;
251 for (int row = 0; row <= od.getSequencesHeight() && !resizeAgain; row++)
253 if ((int) (row * sampleRow) == lastrow)
259 // get the sequence which would be at alignment index 'lastrow' if no
260 // columns were hidden, and determine whether it is hidden or not
261 hiddenRow = av.getAlignment().isHidden(lastrow);
262 seq = av.getAlignment().getSequenceAtAbsoluteIndex(lastrow);
264 for (int col = 0; col < od.getWidth(); col++)
266 if ((int) (col * sampleCol) == lastcol
267 && (int) (row * sampleRow) == lastrow)
273 lastcol = (int) (col * sampleCol);
275 color = getColumnColourFromSequence(seq, hiddenRow,
276 hasHiddenCols, lastcol);
279 if (sameCol == 1 && sameRow == 1)
281 mg.drawLine(xstart, ystart, xstart, ystart);
285 mg.fillRect(xstart, ystart, sameCol, sameRow);
292 lastrow = (int) (row * sampleRow);
301 * Find the colour of a sequence at a specified column position
303 private Color getColumnColourFromSequence(
304 jalview.datamodel.SequenceI seq, boolean hiddenRow,
305 boolean hasHiddenCols, int lastcol)
308 if (seq.getLength() > lastcol)
310 color = sr.getResidueBoxColour(seq, lastcol);
312 if (av.isShowSequenceFeatures())
314 color = fr.findFeatureColour(color, seq, lastcol);
319 color = Color.white; // White
323 || (hasHiddenCols && !av.getColumnSelection()
324 .isVisible(lastcol)))
326 color = color.darker().darker();
332 * Update the overview panel box when the associated alignment panel is
336 public void setBoxPosition()
343 public void update(Graphics g)
349 public void paint(Graphics g)
351 Graphics og = offscreen.getGraphics();
354 og.drawImage(miniMe, 0, 0, this);
355 og.setColor(Color.red);
357 g.drawImage(offscreen, 0, 0, this);