Reveal All added
[jalview.git] / src / jalview / gui / ScalePanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 \r
26 import javax.swing.*;\r
27 \r
28 \r
29 /**\r
30  * DOCUMENT ME!\r
31  *\r
32  * @author $author$\r
33  * @version $Revision$\r
34  */\r
35 public class ScalePanel extends JPanel implements MouseMotionListener, MouseListener\r
36 {\r
37     protected int offy = 4;\r
38 \r
39     /** DOCUMENT ME!! */\r
40     public int width;\r
41     protected AlignViewport av;\r
42     AlignmentPanel ap;\r
43     boolean stretchingGroup = false;\r
44     int min; //used by mouseDragged to see if user\r
45     int max; //used by mouseDragged to see if user\r
46 \r
47     // wants to delete columns\r
48     public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
49     {\r
50         this.av = av;\r
51         this.ap = ap;\r
52 \r
53         addMouseListener(this);\r
54         addMouseMotionListener(this);\r
55     }\r
56 \r
57     /**\r
58      * DOCUMENT ME!\r
59      *\r
60      * @param evt DOCUMENT ME!\r
61      */\r
62     public void mousePressed(MouseEvent evt)\r
63     {\r
64         int x = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
65         final int res;\r
66 \r
67         if(av.hasHiddenColumns)\r
68           res = av.getColumnSelection().adjustForHiddenColumns(x);\r
69         else\r
70           res = x;\r
71 \r
72         min = res;\r
73         max = res;\r
74 \r
75         if(reveal != null && SwingUtilities.isRightMouseButton(evt))\r
76           {\r
77             JPopupMenu pop = new JPopupMenu();\r
78             JMenuItem item = new JMenuItem("Reveal");\r
79             item.addActionListener(new ActionListener()\r
80             {\r
81               public void actionPerformed(ActionEvent e)\r
82               {\r
83                 av.getColumnSelection().revealHiddenColumns(reveal[0], av);\r
84                 reveal = null;\r
85                 ap.repaint();\r
86               }\r
87             });\r
88             pop.add(item);\r
89 \r
90             if(av.getColumnSelection().hiddenColumns.size()>1)\r
91             {\r
92               item = new JMenuItem("Reveal All");\r
93               item.addActionListener(new ActionListener()\r
94               {\r
95                 public void actionPerformed(ActionEvent e)\r
96                 {\r
97                   av.getColumnSelection().revealAllHiddenColumns(av);\r
98                   reveal = null;\r
99                   ap.repaint();\r
100                 }\r
101               });\r
102               pop.add(item);\r
103             }\r
104 \r
105             pop.show(this, evt.getX(), evt.getY());\r
106 \r
107           }\r
108         else if (av.getColumnSelection().contains(res))\r
109         {\r
110           if( SwingUtilities.isRightMouseButton(evt))\r
111           {\r
112             JPopupMenu pop = new JPopupMenu();\r
113             JMenuItem item = new JMenuItem("Hide Columns");\r
114             item.addActionListener(new ActionListener()\r
115             {\r
116               public void actionPerformed(ActionEvent e)\r
117               {\r
118                 av.getColumnSelection().hideColumns(res, av);\r
119                 ap.repaint();\r
120               }\r
121             });\r
122             pop.add(item);\r
123             pop.show(this, evt.getX(), evt.getY());\r
124 \r
125           }\r
126           else\r
127           {\r
128             av.getColumnSelection().removeElement(res);\r
129             av.setSelectionGroup(null);\r
130           }\r
131         }\r
132         else\r
133         {\r
134             av.getColumnSelection().addElement(res);\r
135             SequenceGroup sg = new SequenceGroup();\r
136 \r
137             for (int i = 0; i < av.alignment.getSequences().size(); i++)\r
138             {\r
139                 sg.addSequence(av.alignment.getSequenceAt(i), false);\r
140             }\r
141 \r
142             sg.setStartRes(res);\r
143             sg.setEndRes(res);\r
144             av.setSelectionGroup(sg);\r
145         }\r
146 \r
147 \r
148         ap.repaint();\r
149     }\r
150 \r
151     /**\r
152      * DOCUMENT ME!\r
153      *\r
154      * @param evt DOCUMENT ME!\r
155      */\r
156     public void mouseReleased(MouseEvent evt)\r
157     {\r
158         int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
159 \r
160         if(av.hasHiddenColumns)\r
161           res = av.getColumnSelection().adjustForHiddenColumns(res);\r
162 \r
163         if (!stretchingGroup)\r
164         {\r
165             ap.repaint();\r
166 \r
167             return;\r
168         }\r
169 \r
170         SequenceGroup sg = av.getSelectionGroup();\r
171 \r
172         if (res > sg.getStartRes())\r
173         {\r
174             sg.setEndRes(res);\r
175         }\r
176         else if (res < sg.getStartRes())\r
177         {\r
178             sg.setStartRes(res);\r
179         }\r
180 \r
181         stretchingGroup = false;\r
182         ap.repaint();\r
183     }\r
184 \r
185     /**\r
186      * DOCUMENT ME!\r
187      *\r
188      * @param evt DOCUMENT ME!\r
189      */\r
190     public void mouseDragged(MouseEvent evt)\r
191     {\r
192         int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
193 \r
194         if(av.hasHiddenColumns)\r
195           res = av.getColumnSelection().adjustForHiddenColumns(res);\r
196 \r
197         if (res < min)\r
198         {\r
199             min = res;\r
200         }\r
201 \r
202         if (res > max)\r
203         {\r
204             max = res;\r
205         }\r
206 \r
207         SequenceGroup sg = av.getSelectionGroup();\r
208 \r
209         if (sg != null)\r
210         {\r
211             stretchingGroup = true;\r
212 \r
213             if (!av.getColumnSelection().contains(res))\r
214             {\r
215                 av.getColumnSelection().addElement(res);\r
216             }\r
217 \r
218             if (res > sg.getStartRes())\r
219             {\r
220                 sg.setEndRes(res);\r
221             }\r
222             else if (res < sg.getStartRes())\r
223             {\r
224                 sg.setStartRes(res);\r
225             }\r
226 \r
227             for (int i = min; i <= max; i++)\r
228             {\r
229                 if ((i < sg.getStartRes()) || (i > sg.getEndRes()))\r
230                 {\r
231                     av.getColumnSelection().removeElement(i);\r
232                 }\r
233                 else\r
234                 {\r
235                     av.getColumnSelection().addElement(i);\r
236                 }\r
237             }\r
238 \r
239             ap.repaint();\r
240         }\r
241     }\r
242 \r
243     public void mouseEntered(MouseEvent evt){}\r
244     public void mouseExited(MouseEvent evt){}\r
245     public void mouseClicked(MouseEvent evt){}\r
246 \r
247     public void mouseMoved(MouseEvent evt)\r
248     {\r
249       if(!av.hasHiddenColumns)\r
250         return;\r
251 \r
252       int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
253 \r
254       res = av.getColumnSelection().adjustForHiddenColumns(res);\r
255 \r
256       reveal = null;\r
257       for(int i=0; i<av.getColumnSelection().getHiddenColumns().size(); i++)\r
258       {\r
259         int [] region = (int[])av.getColumnSelection().getHiddenColumns().elementAt(i);\r
260         if(res+1==region[0] || res-1==region[1])\r
261         {\r
262           reveal = region;\r
263           break;\r
264         }\r
265       }\r
266 \r
267       repaint();\r
268     }\r
269 \r
270     int [] reveal;\r
271 \r
272     /**\r
273      * DOCUMENT ME!\r
274      *\r
275      * @param g DOCUMENT ME!\r
276      */\r
277     public void paintComponent(Graphics g)\r
278     {\r
279         drawScale(g, av.getStartRes(), av.getEndRes(), getWidth(), getHeight());\r
280     }\r
281 \r
282     // scalewidth will normally be screenwidth,\r
283     public void drawScale(Graphics g, int startx, int endx, int width,\r
284         int height)\r
285     {\r
286         Graphics2D gg = (Graphics2D) g;\r
287         gg.setFont(av.getFont());\r
288 \r
289         if(av.antiAlias)\r
290           gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
291                               RenderingHints.VALUE_ANTIALIAS_ON);\r
292 \r
293         //Fill in the background\r
294         gg.setColor(Color.white);\r
295         gg.fillRect(0, 0, width, height);\r
296         gg.setColor(Color.black);\r
297 \r
298         //Fill the selected columns\r
299         ColumnSelection cs = av.getColumnSelection();\r
300         gg.setColor(new Color(220, 0, 0));\r
301 \r
302         for (int i = 0; i < cs.size(); i++)\r
303         {\r
304             int sel = cs.columnAt(i);\r
305             if(av.hasHiddenColumns)\r
306                 sel = av.getColumnSelection().findColumnPosition(sel);\r
307 \r
308             if ((sel >= startx) && (sel <= endx))\r
309             {\r
310                 gg.fillRect((sel - startx) * av.charWidth, 0, av.charWidth,\r
311                     getHeight());\r
312             }\r
313         }\r
314 \r
315         // Draw the scale numbers\r
316         gg.setColor(Color.black);\r
317 \r
318         int scalestartx = (startx / 10) * 10;\r
319 \r
320         FontMetrics fm = gg.getFontMetrics(av.getFont());\r
321         int y = av.charHeight - fm.getDescent();\r
322 \r
323         if ((scalestartx % 10) == 0)\r
324         {\r
325             scalestartx += 5;\r
326         }\r
327 \r
328         for (int i = scalestartx; i < endx; i += 5)\r
329         {\r
330             if ((i % 10) == 0)\r
331             {\r
332                 gg.drawString(String.valueOf(av.getColumnSelection().adjustForHiddenColumns(i)),\r
333                     (i - startx - 1) * av.charWidth, y);\r
334                 gg.drawLine((int) (((i - startx - 1) * av.charWidth) +\r
335                     (av.charWidth / 2)), y + 2,\r
336                     (int) (((i - startx - 1) * av.charWidth) +\r
337                     (av.charWidth / 2)), y + (fm.getDescent() * 2));\r
338             }\r
339             else\r
340             {\r
341                 gg.drawLine((int) (((i - startx - 1) * av.charWidth) +\r
342                     (av.charWidth / 2)), y + fm.getDescent(),\r
343                     (int) (((i - startx - 1) * av.charWidth) +\r
344                     (av.charWidth / 2)), y + (fm.getDescent() * 2));\r
345             }\r
346         }\r
347 \r
348         if (av.hasHiddenColumns)\r
349         {\r
350           gg.setColor(Color.blue);\r
351           int res;\r
352           for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)\r
353           {\r
354             res = av.getColumnSelection().findHiddenRegionPosition( i )-startx;\r
355 \r
356             gg.fillPolygon(new int[] { res*av.charWidth - 4,\r
357                                          res*av.charWidth + 4,\r
358                                          res*av.charWidth },\r
359                                 new int[]\r
360                                 {\r
361                                     y-av.charHeight/2 , y-av.charHeight/2 ,\r
362                                     y + 8\r
363                                 }, 3);\r
364 \r
365           }\r
366 \r
367           if (reveal != null && reveal[0] > startx && reveal[0] < endx)\r
368           {\r
369             gg.drawString("Reveal Columns", reveal[0] * av.charWidth, 0);\r
370           }\r
371         }\r
372 \r
373 \r
374     }\r
375 }\r