JAL-2388 Removing AlignmentPanel dependency (mostly)
[jalview.git] / src / jalview / gui / OverviewPanel.java
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.viewmodel.OverviewDimensions;
24
25 import java.awt.BorderLayout;
26 import java.awt.Dimension;
27 import java.awt.event.ComponentAdapter;
28 import java.awt.event.ComponentEvent;
29 import java.awt.event.MouseAdapter;
30 import java.awt.event.MouseEvent;
31 import java.awt.event.MouseMotionAdapter;
32
33 import javax.swing.JPanel;
34
35 /**
36  * Panel displaying an overview of the full alignment, with an interactive box
37  * representing the viewport onto the alignment.
38  * 
39  * @author $author$
40  * @version $Revision$
41  */
42 public class OverviewPanel extends JPanel implements Runnable
43 {
44   private OverviewDimensions od;
45
46   private OverviewCanvas oviewCanvas;
47
48   private AlignViewport av;
49
50   private AlignmentPanel ap;
51
52   /**
53    * Creates a new OverviewPanel object.
54    * 
55    * @param alPanel
56    *          The alignment panel which is shown in the overview panel
57    */
58   public OverviewPanel(AlignmentPanel alPanel)
59   {
60     this.av = alPanel.av;
61     this.ap = alPanel;
62
63     od = new OverviewDimensions(av.getRanges(),
64             (av.isShowAnnotation() && av
65                     .getAlignmentConservationAnnotation() != null));
66
67     oviewCanvas = new OverviewCanvas(od, av);
68     setLayout(new BorderLayout());
69     add(oviewCanvas, BorderLayout.CENTER);
70
71     addComponentListener(new ComponentAdapter()
72     {
73       @Override
74       public void componentResized(ComponentEvent evt)
75       {
76         if ((getWidth() != od.getWidth())
77                 || (getHeight() != (od.getHeight())))
78         {
79           updateOverviewImage();
80         }
81       }
82     });
83
84     addMouseMotionListener(new MouseMotionAdapter()
85     {
86       @Override
87       public void mouseDragged(MouseEvent evt)
88       {
89         if (!av.getWrapAlignment())
90         {
91           od.updateViewportFromMouse(evt.getX(), evt.getY(), av
92                   .getAlignment().getHiddenSequences(), av
93                   .getColumnSelection(), av.getRanges());
94           ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
95         }
96       }
97     });
98
99     addMouseListener(new MouseAdapter()
100     {
101       @Override
102       public void mousePressed(MouseEvent evt)
103       {
104         if (!av.getWrapAlignment())
105         {
106           od.updateViewportFromMouse(evt.getX(), evt.getY(), av
107                   .getAlignment().getHiddenSequences(), av
108                   .getColumnSelection(), av.getRanges());
109           ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
110         }
111       }
112     });
113
114     updateOverviewImage();
115   }
116
117   /**
118    * Updates the overview image when the related alignment panel is updated
119    */
120   public void updateOverviewImage()
121   {
122     if ((getWidth() > 0) && (getHeight() > 0))
123     {
124       od.setWidth(getWidth());
125       od.setHeight(getHeight());
126     }
127
128     setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
129
130     if (oviewCanvas.restartDraw())
131     {
132       return;
133     }
134
135     Thread thread = new Thread(this);
136     thread.start();
137     repaint();
138
139   }
140
141   @Override
142   public void run()
143   {
144     oviewCanvas.draw(av.isShowSequenceFeatures(),
145             (av.isShowAnnotation() && av
146                     .getAlignmentConservationAnnotation() != null), ap
147                     .getSeqPanel().seqCanvas.getFeatureRenderer());
148     setBoxPosition();
149   }
150
151   /**
152    * Update the overview panel box when the associated alignment panel is
153    * changed
154    * 
155    */
156   public void setBoxPosition()
157   {
158     od.setBoxPosition(av.getAlignment()
159             .getHiddenSequences(), av.getColumnSelection(), av.getRanges());
160     repaint();
161   }
162 }