Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.gui

File OverviewPanel.java

 

Coverage histogram

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

Code metrics

40
99
16
1
420
296
40
0.4
6.19
16
2.5

Classes

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