JAL-2388 Tidies and other corrections so applet compiles
[jalview.git] / src / jalview / appletgui / 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.appletgui;
22
23 import jalview.util.MessageManager;
24 import jalview.util.Platform;
25 import jalview.viewmodel.OverviewDimensions;
26 import jalview.viewmodel.OverviewDimensionsAllVisible;
27 import jalview.viewmodel.OverviewDimensionsWithHidden;
28
29 import java.awt.BorderLayout;
30 import java.awt.Dimension;
31 import java.awt.MenuItem;
32 import java.awt.Panel;
33 import java.awt.PopupMenu;
34 import java.awt.event.ActionEvent;
35 import java.awt.event.ActionListener;
36 import java.awt.event.ComponentAdapter;
37 import java.awt.event.ComponentEvent;
38 import java.awt.event.InputEvent;
39 import java.awt.event.MouseEvent;
40 import java.awt.event.MouseListener;
41 import java.awt.event.MouseMotionListener;
42
43 public class OverviewPanel extends Panel implements Runnable,
44         MouseMotionListener, MouseListener
45 {
46   private OverviewDimensions od;
47
48   private OverviewCanvas oviewCanvas;
49
50   private AlignViewport av;
51
52   private AlignmentPanel ap;
53
54   private boolean showHidden = true;
55
56   private boolean updateRunning = false;
57
58   public OverviewPanel(AlignmentPanel alPanel)
59   {
60     this.av = alPanel.av;
61     this.ap = alPanel;
62     setLayout(null);
63
64     od = new OverviewDimensionsWithHidden(av.getRanges(),
65             (av.isShowAnnotation() && av.getSequenceConsensusHash() != null));
66
67     oviewCanvas = new OverviewCanvas(od, av);
68     setLayout(new BorderLayout());
69     add(oviewCanvas, BorderLayout.CENTER);
70
71     setSize(new Dimension(od.getWidth(), od.getHeight()));
72     addComponentListener(new ComponentAdapter()
73     {
74
75       @Override
76       public void componentResized(ComponentEvent evt)
77       {
78         if ((getWidth() != od.getWidth())
79                 || (getHeight() != (od.getHeight())))
80         {
81           updateOverviewImage();
82         }
83       }
84     });
85
86     addMouseMotionListener(this);
87
88     addMouseListener(this);
89
90     updateOverviewImage();
91
92   }
93
94   @Override
95   public void mouseEntered(MouseEvent evt)
96   {
97   }
98
99   @Override
100   public void mouseExited(MouseEvent evt)
101   {
102   }
103
104   @Override
105   public void mouseClicked(MouseEvent evt)
106   {
107     // right button press
108     if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
109     {
110       showPopupMenu(evt);
111     }
112   }
113
114   @Override
115   public void mouseMoved(MouseEvent evt)
116   {
117   }
118
119   @Override
120   public void mousePressed(MouseEvent evt)
121   {
122     mouseAction(evt);
123   }
124
125   @Override
126   public void mouseReleased(MouseEvent evt)
127   {
128     mouseAction(evt);
129   }
130
131   @Override
132   public void mouseDragged(MouseEvent evt)
133   {
134     mouseAction(evt);
135   }
136
137   private void mouseAction(MouseEvent evt)
138   {
139     // right button press
140     if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
141     {
142       if (!Platform.isAMac())
143       {
144         showPopupMenu(evt);
145       }
146     }
147     else
148     {
149       od.updateViewportFromMouse(evt.getX(), evt.getY(), av.getAlignment()
150               .getHiddenSequences(), av.getAlignment().getHiddenColumns());
151       ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
152       ap.paintAlignment(false);
153     }
154   }
155
156   /**
157    * Updates the overview image when the related alignment panel is updated
158    */
159   public void updateOverviewImage()
160   {
161     if ((getSize().width > 0) && (getSize().height > 0))
162     {
163       od.setWidth(getSize().width);
164       od.setHeight(getSize().height);
165     }
166     setSize(new Dimension(od.getWidth(), od.getHeight()));
167
168     synchronized (this)
169     {
170       if (updateRunning)
171       {
172         oviewCanvas.restartDraw();
173         return;
174       }
175
176       updateRunning = true;
177     }
178     Thread thread = new Thread(this);
179     thread.start();
180     repaint();
181     updateRunning = false;
182   }
183
184   @Override
185   public void run()
186   {
187     oviewCanvas.draw(av.isShowSequenceFeatures(),
188             (av.isShowAnnotation() && av
189                     .getAlignmentConservationAnnotation() != null),
190             ap.seqPanel.seqCanvas.getFeatureRenderer());
191     setBoxPosition();
192   }
193
194   /**
195    * Update the overview panel box when the associated alignment panel is
196    * changed
197    * 
198    */
199   public void setBoxPosition()
200   {
201     od.setBoxPosition(av.getAlignment()
202 .getHiddenSequences(), av
203             .getAlignment().getHiddenColumns());
204     repaint();
205   }
206
207   /*
208    * Displays the popup menu and acts on user input
209    */
210   private void showPopupMenu(MouseEvent e)
211   {
212     PopupMenu popup = new PopupMenu();
213     ActionListener menuListener = new ActionListener()
214     {
215       @Override
216       public void actionPerformed(ActionEvent event)
217       {
218         // switch on/off the hidden columns view
219         toggleHiddenColumns();
220       }
221     };
222     MenuItem item = new MenuItem(
223             MessageManager.getString("label.togglehidden"));
224     popup.add(item);
225     item.addActionListener(menuListener);
226     popup.show(this, e.getX(), e.getY());
227   }
228
229   /*
230    * Toggle overview display between showing hidden columns and hiding hidden columns
231    */
232   private void toggleHiddenColumns()
233   {
234     if (showHidden)
235     {
236       showHidden = false;
237       od = new OverviewDimensionsAllVisible(av.getRanges(),
238               (av.isShowAnnotation() && av
239                       .getAlignmentConservationAnnotation() != null));
240     }
241     else
242     {
243       showHidden = true;
244       od = new OverviewDimensionsWithHidden(av.getRanges(),
245               (av.isShowAnnotation() && av
246                       .getAlignmentConservationAnnotation() != null));
247     }
248     oviewCanvas.resetOviewDims(od);
249     updateOverviewImage();
250   }
251 }