JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / ScalePanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.datamodel.ColumnSelection;\r
24 import jalview.datamodel.SequenceGroup;\r
25 import jalview.util.MessageManager;\r
26 \r
27 import java.awt.Color;\r
28 import java.awt.FontMetrics;\r
29 import java.awt.Graphics;\r
30 import java.awt.event.ActionEvent;\r
31 import java.awt.event.ActionListener;\r
32 import java.awt.event.InputEvent;\r
33 import java.awt.event.MouseEvent;\r
34 import java.awt.event.MouseListener;\r
35 import java.awt.event.MouseMotionListener;\r
36 \r
37 import javax.swing.JMenuItem;\r
38 import javax.swing.JPanel;\r
39 import javax.swing.JPopupMenu;\r
40 \r
41 public class ScalePanel extends JPanel implements MouseMotionListener,\r
42         MouseListener\r
43 {\r
44 \r
45   protected int offy = 4;\r
46 \r
47   public int width;\r
48 \r
49   protected AlignViewport av;\r
50 \r
51   AlignmentPanel ap;\r
52 \r
53   boolean stretchingGroup = false;\r
54 \r
55   int min; // used by mouseDragged to see if user\r
56 \r
57   int max; // used by mouseDragged to see if user\r
58 \r
59   boolean mouseDragging = false;\r
60 \r
61   int[] reveal;\r
62 \r
63   public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
64   {\r
65     setLayout(null);\r
66     this.av = av;\r
67     this.ap = ap;\r
68 \r
69     addMouseListener(this);\r
70     addMouseMotionListener(this);\r
71 \r
72   }\r
73 \r
74   public void mousePressed(MouseEvent evt)\r
75   {\r
76     int x = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
77     final int res;\r
78 \r
79     if (av.hasHiddenColumns())\r
80     {\r
81       res = av.getColumnSelection().adjustForHiddenColumns(x);\r
82     }\r
83     else\r
84     {\r
85       res = x;\r
86     }\r
87 \r
88     min = res;\r
89     max = res;\r
90     if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)\r
91     {\r
92       JPopupMenu pop = new JPopupMenu();\r
93       if (reveal != null)\r
94       {\r
95         JMenuItem item = new JMenuItem(\r
96                 MessageManager.getString("label.reveal"));\r
97         item.addActionListener(new ActionListener()\r
98         {\r
99           public void actionPerformed(ActionEvent e)\r
100           {\r
101             av.showColumn(reveal[0]);\r
102             reveal = null;\r
103             ap.paintAlignment(true);\r
104             if (ap.overviewPanel != null)\r
105             {\r
106               ap.overviewPanel.updateOverviewImage();\r
107             }\r
108           }\r
109         });\r
110         pop.add(item);\r
111 \r
112         if (av.getColumnSelection().hasManyHiddenColumns())\r
113         {\r
114           item = new JMenuItem(MessageManager.getString("action.reveal_all"));\r
115           item.addActionListener(new ActionListener()\r
116           {\r
117             public void actionPerformed(ActionEvent e)\r
118             {\r
119               av.showAllHiddenColumns();\r
120               reveal = null;\r
121               ap.paintAlignment(true);\r
122               if (ap.overviewPanel != null)\r
123               {\r
124                 ap.overviewPanel.updateOverviewImage();\r
125               }\r
126             }\r
127           });\r
128           pop.add(item);\r
129         }\r
130         this.add(pop);\r
131         pop.show(this, evt.getX(), evt.getY());\r
132       }\r
133       else if (av.getColumnSelection().contains(res))\r
134       {\r
135         JMenuItem item = new JMenuItem(\r
136                 MessageManager.getString("label.hide_columns"));\r
137         item.addActionListener(new ActionListener()\r
138         {\r
139           public void actionPerformed(ActionEvent e)\r
140           {\r
141             av.hideColumns(res, res);\r
142             if (av.getSelectionGroup() != null\r
143                     && av.getSelectionGroup().getSize() == av\r
144                             .getAlignment().getHeight())\r
145             {\r
146               av.setSelectionGroup(null);\r
147             }\r
148 \r
149             ap.paintAlignment(true);\r
150             if (ap.overviewPanel != null)\r
151             {\r
152               ap.overviewPanel.updateOverviewImage();\r
153             }\r
154           }\r
155         });\r
156         pop.add(item);\r
157         this.add(pop);\r
158         pop.show(this, evt.getX(), evt.getY());\r
159       }\r
160     }\r
161     else\r
162     // LEFT MOUSE TO SELECT\r
163     {\r
164       if (!evt.isControlDown() && !evt.isShiftDown())\r
165       {\r
166         av.getColumnSelection().clear();\r
167       }\r
168 \r
169       av.getColumnSelection().addElement(res);\r
170       SequenceGroup sg = new SequenceGroup();\r
171       for (int i = 0; i < av.getAlignment().getSequences().size(); i++)\r
172       {\r
173         sg.addSequence(av.getAlignment().getSequenceAt(i), false);\r
174       }\r
175 \r
176       sg.setStartRes(res);\r
177       sg.setEndRes(res);\r
178       av.setSelectionGroup(sg);\r
179 \r
180       if (evt.isShiftDown())\r
181       {\r
182         int min = Math.min(av.getColumnSelection().getMin(), res);\r
183         int max = Math.max(av.getColumnSelection().getMax(), res);\r
184         for (int i = min; i < max; i++)\r
185         {\r
186           av.getColumnSelection().addElement(i);\r
187         }\r
188         sg.setStartRes(min);\r
189         sg.setEndRes(max);\r
190       }\r
191     }\r
192 \r
193     ap.paintAlignment(true);\r
194     av.sendSelection();\r
195   }\r
196 \r
197   public void mouseReleased(MouseEvent evt)\r
198   {\r
199     mouseDragging = false;\r
200 \r
201     int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
202 \r
203     if (res > av.getAlignment().getWidth())\r
204     {\r
205       res = av.getAlignment().getWidth() - 1;\r
206     }\r
207 \r
208     if (av.hasHiddenColumns())\r
209     {\r
210       res = av.getColumnSelection().adjustForHiddenColumns(res);\r
211     }\r
212 \r
213     if (!stretchingGroup)\r
214     {\r
215       ap.paintAlignment(false);\r
216 \r
217       return;\r
218     }\r
219 \r
220     SequenceGroup sg = av.getSelectionGroup();\r
221 \r
222     if (res > sg.getStartRes())\r
223     {\r
224       sg.setEndRes(res);\r
225     }\r
226     else if (res < sg.getStartRes())\r
227     {\r
228       sg.setStartRes(res);\r
229     }\r
230 \r
231     stretchingGroup = false;\r
232     ap.paintAlignment(false);\r
233     av.sendSelection();\r
234   }\r
235 \r
236   public void mouseDragged(MouseEvent evt)\r
237   {\r
238     mouseDragging = true;\r
239 \r
240     int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
241     if (res < 0)\r
242     {\r
243       res = 0;\r
244     }\r
245 \r
246     if (av.hasHiddenColumns())\r
247     {\r
248       res = av.getColumnSelection().adjustForHiddenColumns(res);\r
249     }\r
250 \r
251     if (res > av.getAlignment().getWidth())\r
252     {\r
253       res = av.getAlignment().getWidth() - 1;\r
254     }\r
255 \r
256     if (res < min)\r
257     {\r
258       min = res;\r
259     }\r
260 \r
261     if (res > max)\r
262     {\r
263       max = res;\r
264     }\r
265 \r
266     SequenceGroup sg = av.getSelectionGroup();\r
267 \r
268     if (sg != null)\r
269     {\r
270       stretchingGroup = true;\r
271 \r
272       if (!av.getColumnSelection().contains(res))\r
273       {\r
274         av.getColumnSelection().addElement(res);\r
275       }\r
276 \r
277       if (res > sg.getStartRes())\r
278       {\r
279         sg.setEndRes(res);\r
280       }\r
281       if (res < sg.getStartRes())\r
282       {\r
283         sg.setStartRes(res);\r
284       }\r
285 \r
286       int col;\r
287       for (int i = min; i <= max; i++)\r
288       {\r
289         col = av.getColumnSelection().adjustForHiddenColumns(i);\r
290 \r
291         if ((col < sg.getStartRes()) || (col > sg.getEndRes()))\r
292         {\r
293           av.getColumnSelection().removeElement(col);\r
294         }\r
295         else\r
296         {\r
297           av.getColumnSelection().addElement(col);\r
298         }\r
299       }\r
300 \r
301       ap.paintAlignment(false);\r
302     }\r
303   }\r
304 \r
305   public void mouseEntered(MouseEvent evt)\r
306   {\r
307     if (mouseDragging)\r
308     {\r
309       ap.seqPanel.scrollCanvas(null);\r
310     }\r
311   }\r
312 \r
313   public void mouseExited(MouseEvent evt)\r
314   {\r
315     if (mouseDragging)\r
316     {\r
317       ap.seqPanel.scrollCanvas(evt);\r
318     }\r
319   }\r
320 \r
321   public void mouseClicked(MouseEvent evt)\r
322   {\r
323 \r
324   }\r
325 \r
326   public void mouseMoved(MouseEvent evt)\r
327   {\r
328     if (!av.hasHiddenColumns())\r
329     {\r
330       return;\r
331     }\r
332 \r
333     int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
334 \r
335     res = av.getColumnSelection().adjustForHiddenColumns(res);\r
336 \r
337     reveal = null;\r
338     for (int[] region : av.getColumnSelection().getHiddenColumns())\r
339     {\r
340       if (res + 1 == region[0] || res - 1 == region[1])\r
341       {\r
342         reveal = region;\r
343         break;\r
344       }\r
345     }\r
346 \r
347     repaint();\r
348   }\r
349 \r
350   public void update(Graphics g)\r
351   {\r
352     paint(g);\r
353   }\r
354 \r
355   public void paint(Graphics g)\r
356   {\r
357     drawScale(g, av.getStartRes(), av.getEndRes(), getSize().width,\r
358             getSize().height);\r
359   }\r
360 \r
361   // scalewidth will normally be screenwidth,\r
362   public void drawScale(Graphics gg, int startx, int endx, int width,\r
363           int height)\r
364   {\r
365     gg.setFont(av.getFont());\r
366     // Fill in the background\r
367     gg.setColor(Color.white);\r
368     gg.fillRect(0, 0, width, height);\r
369     gg.setColor(Color.black);\r
370 \r
371     // Fill the selected columns\r
372     ColumnSelection cs = av.getColumnSelection();\r
373     gg.setColor(new Color(220, 0, 0));\r
374     int avcharWidth = av.getCharWidth(), avcharHeight = av.getCharHeight();\r
375     for (int i = 0; i < cs.size(); i++)\r
376     {\r
377       int sel = cs.columnAt(i);\r
378       if (av.hasHiddenColumns())\r
379       {\r
380         sel = av.getColumnSelection().findColumnPosition(sel);\r
381       }\r
382 \r
383       if ((sel >= startx) && (sel <= endx))\r
384       {\r
385         gg.fillRect((sel - startx) * avcharWidth, 0, avcharWidth,\r
386                 getSize().height);\r
387       }\r
388     }\r
389 \r
390     // Draw the scale numbers\r
391     gg.setColor(Color.black);\r
392 \r
393     int scalestartx = (startx / 10) * 10;\r
394 \r
395     FontMetrics fm = gg.getFontMetrics(av.getFont());\r
396     int y = avcharHeight - fm.getDescent();\r
397 \r
398     if ((scalestartx % 10) == 0)\r
399     {\r
400       scalestartx += 5;\r
401     }\r
402 \r
403     String string;\r
404     int maxX = 0;\r
405 \r
406     for (int i = scalestartx; i < endx; i += 5)\r
407     {\r
408       if ((i % 10) == 0)\r
409       {\r
410         string = String.valueOf(av.getColumnSelection()\r
411                 .adjustForHiddenColumns(i));\r
412         if ((i - startx - 1) * avcharWidth > maxX)\r
413         {\r
414           gg.drawString(string, (i - startx - 1) * avcharWidth, y);\r
415           maxX = (i - startx + 1) * avcharWidth + fm.stringWidth(string);\r
416         }\r
417 \r
418         gg.drawLine(\r
419 ((i - startx - 1) * avcharWidth) + (avcharWidth / 2),\r
420                 y + 2,\r
421                 ((i - startx - 1) * avcharWidth) + (avcharWidth / 2),\r
422                 y + (fm.getDescent() * 2));\r
423 \r
424       }\r
425       else\r
426       {\r
427         gg.drawLine(\r
428 ((i - startx - 1) * avcharWidth) + (avcharWidth / 2),\r
429                 y + fm.getDescent(),\r
430  ((i - startx - 1) * avcharWidth)\r
431                 + (avcharWidth / 2),\r
432                 y + (fm.getDescent() * 2));\r
433       }\r
434     }\r
435 \r
436     if (av.hasHiddenColumns())\r
437     {\r
438       gg.setColor(Color.blue);\r
439       int res;\r
440       if (av.getShowHiddenMarkers())\r
441       {\r
442         for (int i = 0; i < av.getColumnSelection().getHiddenColumns()\r
443                 .size(); i++)\r
444         {\r
445 \r
446           res = av.getColumnSelection().findHiddenRegionPosition(i)\r
447                   - startx;\r
448 \r
449           if (res < 0 || res > endx - scalestartx)\r
450           {\r
451             continue;\r
452           }\r
453 \r
454           gg.fillPolygon(new int[]\r
455           { res * avcharWidth - avcharHeight / 4,\r
456               res * avcharWidth + avcharHeight / 4, res * avcharWidth },\r
457                   new int[]\r
458                   { y - avcharHeight / 2, y - avcharHeight / 2, y + 8 },\r
459                   3);\r
460 \r
461         }\r
462       }\r
463 \r
464       if (reveal != null && reveal[0] > startx && reveal[0] < endx)\r
465       {\r
466         gg.drawString(MessageManager.getString("label.reveal_columns"),\r
467                 reveal[0] * avcharWidth, 0);\r
468       }\r
469     }\r
470 \r
471   }\r
472 \r
473 }\r