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.setBoxPositionByMouse(evt.getX(), evt.getY());
127 ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
128 ap.paintAlignment(false);
132 public void mouseReleased(MouseEvent evt)
134 od.setBoxPositionByMouse(evt.getX(), evt.getY());
135 ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
136 ap.paintAlignment(false);
140 public void mouseDragged(MouseEvent evt)
142 od.setBoxPositionByMouse(evt.getX(), evt.getY());
143 ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
144 ap.paintAlignment(false);
150 public void updateOverviewImage()
158 if (av.isShowSequenceFeatures())
160 fr.transferSettings(ap.seqPanel.seqCanvas.fr);
165 if ((getWidth() > 0) && (getHeight() > 0))
167 od.setWidth(getWidth()); // width = getWidth();
168 od.setHeight(getHeight()); // sequencesHeight = getHeight() - graphHeight;
170 setSize(new Dimension(od.getWidth(), od.getHeight()));
172 Thread thread = new Thread(this);
182 if (av.isShowSequenceFeatures())
184 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
187 if (getSize().width > 0 && getSize().height > 0)
189 od.setWidth(getSize().width);
190 od.setHeight(getSize().height - od.getGraphHeight());
193 setSize(new Dimension(od.getWidth(), od.getHeight()));
195 miniMe = nullFrame.createImage(od.getWidth(), od.getHeight());
196 offscreen = nullFrame.createImage(od.getWidth(), od.getHeight());
198 Graphics mg = miniMe.getGraphics();
202 int alwidth = av.getAlignment().getWidth();
203 int alheight = av.getAlignment().getHeight()
204 + av.getAlignment().getHiddenSequences().getSize();
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;
247 final boolean hasHiddenRows = av.hasHiddenRows();
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 // this should largely be a method in Alignment
263 // look for sequence in hidden rows
264 seq = av.getAlignment().getHiddenSequences()
265 .getHiddenSequence(lastrow);
268 // didn't find in hidden rows, adjust the index and retrieve from
270 int index = av.getAlignment().getHiddenSequences()
271 .findIndexWithoutHiddenSeqs(lastrow);
273 seq = av.getAlignment().getSequenceAt(index);
277 // found in hidden rows, ergo this row is hidden
283 seq = av.getAlignment().getSequenceAt(lastrow);
285 // end of Alignment method
287 for (int col = 0; col < od.getWidth(); col++)
289 if ((int) (col * sampleCol) == lastcol
290 && (int) (row * sampleRow) == lastrow)
296 lastcol = (int) (col * sampleCol);
298 color = getColumnColourFromSequence(seq, hiddenRow,
299 hasHiddenCols, lastcol);
302 if (sameCol == 1 && sameRow == 1)
304 mg.drawLine(xstart, ystart, xstart, ystart);
308 mg.fillRect(xstart, ystart, sameCol, sameRow);
315 lastrow = (int) (row * sampleRow);
324 * Find the colour of a sequence at a specified column position
326 private Color getColumnColourFromSequence(
327 jalview.datamodel.SequenceI seq, boolean hiddenRow,
328 boolean hasHiddenCols, int lastcol)
331 if (seq.getLength() > lastcol)
333 color = sr.getResidueBoxColour(seq, lastcol);
335 if (av.isShowSequenceFeatures())
337 color = fr.findFeatureColour(color, seq, lastcol);
342 color = Color.white; // White
346 || (hasHiddenCols && !av.getColumnSelection()
347 .isVisible(lastcol)))
349 color = color.darker().darker();
355 * Update the overview panel box when the associated alignment panel is
359 public void setBoxPosition()
366 public void update(Graphics g)
372 public void paint(Graphics g)
374 Graphics og = offscreen.getGraphics();
377 og.drawImage(miniMe, 0, 0, this);
378 og.setColor(Color.red);
380 g.drawImage(offscreen, 0, 0, this);