Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.gui

File OverviewPanel.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
56% of files have more coverage

Code metrics

38
100
16
1
423
296
39
0.39
6.25
16
2.44

Classes

Class Line # Actions
OverviewPanel 59 100 39
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package jalview.gui;
22   
23    import jalview.bin.Cache;
24    import jalview.renderer.OverviewRenderer;
25    import jalview.util.MessageManager;
26    import jalview.util.Platform;
27    import jalview.viewmodel.OverviewDimensions;
28    import jalview.viewmodel.OverviewDimensionsHideHidden;
29    import jalview.viewmodel.OverviewDimensionsShowHidden;
30    import jalview.viewmodel.ViewportListenerI;
31   
32    import java.awt.BorderLayout;
33    import java.awt.Cursor;
34    import java.awt.Dimension;
35    import java.awt.event.ActionEvent;
36    import java.awt.event.ActionListener;
37    import java.awt.event.ComponentAdapter;
38    import java.awt.event.ComponentEvent;
39    import java.awt.event.MouseAdapter;
40    import java.awt.event.MouseEvent;
41    import java.awt.event.MouseMotionAdapter;
42    import java.beans.PropertyChangeEvent;
43    import java.beans.PropertyVetoException;
44   
45    import javax.swing.JCheckBoxMenuItem;
46    import javax.swing.JInternalFrame;
47    import javax.swing.JPanel;
48    import javax.swing.JPopupMenu;
49    import javax.swing.SwingUtilities;
50   
51    /**
52    * Panel displaying an overview of the full alignment, with an interactive box
53    * representing the viewport onto the alignment.
54    *
55    * @author $author$
56    * @version $Revision$
57    */
58    @SuppressWarnings("serial")
 
59    public class OverviewPanel extends JPanel
60    implements Runnable, ViewportListenerI
61    {
62    protected OverviewDimensions od;
63   
64    private OverviewCanvas oviewCanvas;
65   
66    protected AlignViewport av;
67   
68    private AlignmentPanel ap;
69   
70    protected JCheckBoxMenuItem displayToggle;
71   
72    protected boolean showHidden = true;
73   
74    protected boolean draggingBox = false;
75   
76    protected ProgressPanel progressPanel;
77   
78    /**
79    * Creates a new OverviewPanel object.
80    *
81    * @param alPanel
82    * The alignment panel which is shown in the overview panel
83    */
 
84  0 toggle public OverviewPanel(AlignmentPanel alPanel)
85    {
86  0 this.av = alPanel.av;
87  0 this.ap = alPanel;
88   
89  0 showHidden = Cache.getDefault(Preferences.SHOW_OV_HIDDEN_AT_START,
90    false);
91  0 if (showHidden)
92    {
93  0 od = new OverviewDimensionsShowHidden(av.getRanges(),
94    (av.isShowAnnotation()
95    && av.getAlignmentConservationAnnotation() != null));
96    }
97    else
98    {
99  0 od = new OverviewDimensionsHideHidden(av.getRanges(),
100    (av.isShowAnnotation()
101    && av.getAlignmentConservationAnnotation() != null));
102    }
103   
104  0 setLayout(new BorderLayout());
105  0 progressPanel = new ProgressPanel(OverviewRenderer.UPDATE,
106    MessageManager.getString("label.oview_calc"), getWidth());
107  0 this.add(progressPanel, BorderLayout.SOUTH);
108  0 oviewCanvas = new OverviewCanvas(od, av, progressPanel);
109   
110  0 add(oviewCanvas, BorderLayout.CENTER);
111   
112  0 av.getRanges().addPropertyChangeListener(this);
113   
114    // without this the overview window does not size to fit the overview canvas
115  0 setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
116   
117  0 addComponentListener(new ComponentAdapter()
118    {
 
119  0 toggle @Override
120    public void componentResized(ComponentEvent evt)
121    {
122    // Resize is called on the initial display of the overview.
123    // This code adjusts sizes to account for the progress bar if it has not
124    // already been accounted for, which triggers another resize call for
125    // the correct sizing, at which point the overview image is updated.
126    // (This avoids a double recalculation of the image.)
127  0 if (getWidth() == od.getWidth() && getHeight() == od.getHeight()
128    + progressPanel.getHeight())
129    {
130  0 updateOverviewImage();
131    }
132    else
133    {
134  0 if ((getWidth() > 0) && (getHeight() > 0))
135    {
136  0 od.setWidth(getWidth());
137  0 od.setHeight(getHeight() - progressPanel.getHeight());
138    }
139   
140  0 setPreferredSize(new Dimension(od.getWidth(),
141    od.getHeight() + progressPanel.getHeight()));
142    }
143    }
144   
145    });
146   
147  0 addMouseMotionListener(new MouseMotionAdapter()
148    {
 
149  0 toggle @Override
150    public void mouseDragged(MouseEvent evt)
151    {
152  0 if (!SwingUtilities.isRightMouseButton(evt))
153    {
154  0 if (draggingBox)
155    {
156    // set the mouse position as a fixed point in the box
157    // and drag relative to that position
158  0 od.adjustViewportFromMouse(evt.getX(), evt.getY(),
159    av.getAlignment().getHiddenSequences(),
160    av.getAlignment().getHiddenColumns());
161    }
162    else
163    {
164  0 od.updateViewportFromMouse(evt.getX(), evt.getY(),
165    av.getAlignment().getHiddenSequences(),
166    av.getAlignment().getHiddenColumns());
167    }
168    }
169    }
170   
 
171  0 toggle @Override
172    public void mouseMoved(MouseEvent evt)
173    {
174  0 if (od.isPositionInBox(evt.getX(), evt.getY()))
175    {
176    /*
177    * using HAND_CURSOR rather than DRAG_CURSOR
178    * as the latter is not supported on Mac
179    */
180  0 getParent().setCursor(
181    Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
182    }
183    else
184    {
185    // reset cursor
186  0 getParent().setCursor(
187    Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
188    }
189    }
190   
191    });
192   
193  0 addMouseListener(new MouseAdapter()
194    {
 
195  0 toggle @Override
196    public void mousePressed(MouseEvent evt)
197    {
198   
199  0 if (Platform.isWinRightButton(evt)) {
200  0 showPopupMenu(evt);
201  0 return;
202    }
203  0 if (SwingUtilities.isRightMouseButton(evt)) {
204  0 return;
205    }
206    // don't do anything if the mouse press is in the overview's box
207    // (wait to see if it's a drag instead)
208    // otherwise update the viewport
209  0 if (!od.isPositionInBox(evt.getX(), evt.getY()))
210    {
211  0 draggingBox = false;
212   
213    // display drag cursor at mouse position
214  0 setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
215   
216  0 od.updateViewportFromMouse(evt.getX(), evt.getY(),
217    av.getAlignment().getHiddenSequences(),
218    av.getAlignment().getHiddenColumns());
219  0 getParent().setCursor(
220    Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
221    }
222    else
223    {
224  0 draggingBox = true;
225  0 od.setDragPoint(evt.getX(), evt.getY(),
226    av.getAlignment().getHiddenSequences(),
227    av.getAlignment().getHiddenColumns());
228    }
229    }
230   
 
231  0 toggle @Override
232    public void mouseClicked(MouseEvent evt)
233    {
234  0 if (SwingUtilities.isRightMouseButton(evt))
235    {
236  0 showPopupMenu(evt);
237    }
238    }
239   
 
240  0 toggle @Override
241    public void mouseReleased(MouseEvent evt)
242    {
243  0 draggingBox = false;
244    }
245   
246    });
247   
248    /*
249    * Javascript does not call componentResized on initial display,
250    * so do the update here
251    */
252  0 if (Platform.isJS())
253    {
254  0 updateOverviewImage();
255    }
256    }
257   
258    /*
259    * Displays the popup menu and acts on user input
260    */
 
261  0 toggle protected void showPopupMenu(MouseEvent e)
262    {
263  0 JPopupMenu popup = new JPopupMenu();
264  0 ActionListener menuListener = new ActionListener()
265    {
 
266  0 toggle @Override
267    public void actionPerformed(ActionEvent event)
268    {
269    // switch on/off the hidden columns view
270  0 toggleHiddenColumns();
271  0 displayToggle.setSelected(showHidden);
272    }
273    };
274  0 displayToggle = new JCheckBoxMenuItem(
275    MessageManager.getString("label.togglehidden"));
276  0 displayToggle.setEnabled(true);
277  0 displayToggle.setSelected(showHidden);
278  0 popup.add(displayToggle);
279  0 displayToggle.addActionListener(menuListener);
280  0 popup.show(this, e.getX(), e.getY());
281    }
282   
283    /*
284    * Toggle overview display between showing hidden columns and hiding hidden columns
285    */
 
286  0 toggle protected void toggleHiddenColumns()
287    {
288  0 if (showHidden)
289    {
290  0 showHidden = false;
291  0 od = new OverviewDimensionsHideHidden(av.getRanges(),
292    (av.isShowAnnotation()
293    && av.getAlignmentConservationAnnotation() != null));
294    }
295    else
296    {
297  0 showHidden = true;
298  0 od = new OverviewDimensionsShowHidden(av.getRanges(),
299    (av.isShowAnnotation()
300    && av.getAlignmentConservationAnnotation() != null));
301    }
302  0 oviewCanvas.resetOviewDims(od);
303  0 updateOverviewImage();
304  0 setBoxPosition();
305    }
306   
307    /**
308    * Updates the overview image when the related alignment panel is updated
309    */
 
310  0 toggle public void updateOverviewImage()
311    {
312  0 if (oviewCanvas == null)
313    {
314    /*
315    * panel has been disposed
316    */
317  0 return;
318    }
319   
320  0 if ((getWidth() > 0) && (getHeight() > 0))
321    {
322  0 od.setWidth(getWidth());
323  0 od.setHeight(getHeight() - progressPanel.getHeight());
324    }
325   
326  0 setPreferredSize(new Dimension(od.getWidth(),
327    od.getHeight() + progressPanel.getHeight()));
328   
329  0 if (oviewCanvas.restartDraw())
330    {
331  0 return;
332    }
333   
334  0 Thread thread = new Thread(this);
335  0 thread.start();
336  0 repaint();
337   
338   
339    }
340   
 
341  0 toggle @Override
342    public void run()
343    {
344  0 if (oviewCanvas != null)
345    {
346  0 oviewCanvas.draw(av.isShowSequenceFeatures(),
347    (av.isShowAnnotation()
348    && av.getAlignmentConservationAnnotation() != null),
349    ap.getSeqPanel().seqCanvas.getFeatureRenderer());
350  0 setBoxPosition();
351    }
352    }
353   
354    /**
355    * Update the overview panel box when the associated alignment panel is
356    * changed
357    *
358    */
 
359  0 toggle private void setBoxPositionOnly()
360    {
361  0 if (od != null)
362    {
363  0 int oldX = od.getBoxX();
364  0 int oldY = od.getBoxY();
365  0 int oldWidth = od.getBoxWidth();
366  0 int oldHeight = od.getBoxHeight();
367  0 od.setBoxPosition(av.getAlignment().getHiddenSequences(),
368    av.getAlignment().getHiddenColumns());
369  0 repaint(oldX - 1, oldY - 1, oldWidth + 2, oldHeight + 2);
370  0 repaint(od.getBoxX(), od.getBoxY(), od.getBoxWidth(),
371    od.getBoxHeight());
372    }
373    }
374   
 
375  0 toggle private void setBoxPosition()
376    {
377  0 if (od != null)
378    {
379  0 od.setBoxPosition(av.getAlignment().getHiddenSequences(),
380    av.getAlignment().getHiddenColumns());
381  0 repaint();
382    }
383    }
384   
 
385  0 toggle @Override
386    public void propertyChange(PropertyChangeEvent evt)
387    {
388  0 setBoxPositionOnly();
389    }
390   
391    /**
392    * Removes this object as a property change listener, and nulls references
393    */
 
394  0 toggle protected void dispose()
395    {
396  0 try
397    {
398  0 if (av != null)
399    {
400  0 av.getRanges().removePropertyChangeListener(this);
401    }
402   
403  0 oviewCanvas.dispose();
404   
405    /*
406    * close the parent frame (which also removes it from the
407    * Desktop Windows menu)
408    */
409  0 ((JInternalFrame) SwingUtilities.getAncestorOfClass(
410    JInternalFrame.class, (this))).setClosed(true);
411    } catch (PropertyVetoException e)
412    {
413    // ignore
414    } finally
415    {
416  0 progressPanel = null;
417  0 av = null;
418  0 oviewCanvas = null;
419  0 ap = null;
420  0 od = null;
421    }
422    }
423    }