Formatted source
[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 java.awt.*;\r
22 import java.awt.event.*;\r
23 import javax.swing.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 \r
27 public class ScalePanel\r
28     extends JPanel\r
29 {\r
30   protected int offy = 4;\r
31   public int width;\r
32   protected AlignViewport av;\r
33   AlignmentPanel ap;\r
34   boolean stretchingGroup = false;\r
35 \r
36   public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
37   {\r
38     this.av = av;\r
39     this.ap = ap;\r
40 \r
41     addMouseListener(new MouseAdapter()\r
42     {\r
43       public void mousePressed(MouseEvent evt)\r
44       {\r
45         doMousePressed(evt);\r
46       }\r
47 \r
48       public void mouseReleased(MouseEvent evt)\r
49       {\r
50         doMouseReleased(evt);\r
51       }\r
52     });\r
53     addMouseMotionListener(new MouseMotionAdapter()\r
54     {\r
55       public void mouseDragged(MouseEvent evt)\r
56       {\r
57         doMouseDragged(evt);\r
58       }\r
59     });\r
60   }\r
61 \r
62   public void doMousePressed(MouseEvent evt)\r
63   {\r
64     int x = evt.getX();\r
65     int res = (x / av.getCharWidth()) + av.getStartRes();\r
66     SequenceGroup sg = null;\r
67 \r
68     if (av.getColumnSelection().contains(res))\r
69     {\r
70       av.getColumnSelection().removeElement(res);\r
71     }\r
72     else\r
73     {\r
74       av.getColumnSelection().addElement(res);\r
75 \r
76       sg = new SequenceGroup();\r
77 \r
78       for (int i = 0; i < av.alignment.getSequences().size(); i++)\r
79       {\r
80         sg.addSequence(av.alignment.getSequenceAt(i));\r
81       }\r
82 \r
83       sg.setStartRes(res);\r
84       sg.setEndRes(res);\r
85 \r
86       ap.annotationPanel.addEditableColumn(res);\r
87     }\r
88 \r
89     av.setSelectionGroup(sg);\r
90     ap.repaint();\r
91   }\r
92 \r
93   public void doMouseReleased(MouseEvent evt)\r
94   {\r
95     if (!stretchingGroup)\r
96     {\r
97       return;\r
98     }\r
99 \r
100     int x = evt.getX();\r
101     int res = (x / av.getCharWidth()) + av.getStartRes();\r
102 \r
103     if (!av.getColumnSelection().contains(res))\r
104     {\r
105       av.getColumnSelection().addElement(res);\r
106     }\r
107 \r
108     SequenceGroup sg = av.getSelectionGroup();\r
109 \r
110     if (res > sg.getStartRes())\r
111     {\r
112       sg.setEndRes(res);\r
113     }\r
114     else if (res < sg.getStartRes())\r
115     {\r
116       sg.setStartRes(res);\r
117     }\r
118 \r
119     stretchingGroup = false;\r
120     ap.repaint();\r
121   }\r
122 \r
123   public void doMouseDragged(MouseEvent evt)\r
124   {\r
125     int x = evt.getX();\r
126     int res = (x / av.getCharWidth()) + av.getStartRes();\r
127 \r
128     SequenceGroup sg = av.getSelectionGroup();\r
129 \r
130     if (sg != null)\r
131     {\r
132       stretchingGroup = true;\r
133 \r
134       if (res > sg.getStartRes())\r
135       {\r
136         sg.setEndRes(res);\r
137       }\r
138       else if (res < sg.getStartRes())\r
139       {\r
140         sg.setStartRes(res);\r
141       }\r
142 \r
143       ap.annotationPanel.addEditableColumn(res);\r
144       ap.repaint();\r
145     }\r
146   }\r
147 \r
148   public void paintComponent(Graphics g)\r
149   {\r
150     drawScale(g, av.getStartRes(), av.getEndRes(), getWidth(), getHeight());\r
151   }\r
152 \r
153   // scalewidth will normally be screenwidth,\r
154   public void drawScale(Graphics g, int startx, int endx, int width,\r
155                         int height)\r
156   {\r
157     Graphics2D gg = (Graphics2D) g;\r
158     gg.setFont(av.getFont());\r
159     gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
160                         RenderingHints.VALUE_ANTIALIAS_ON);\r
161 \r
162     //Fill in the background\r
163     gg.setColor(Color.white);\r
164     gg.fillRect(0, 0, width, height);\r
165     gg.setColor(Color.black);\r
166 \r
167     //Fill the selected columns\r
168     ColumnSelection cs = av.getColumnSelection();\r
169     gg.setColor(new Color(220, 0, 0));\r
170 \r
171     for (int i = 0; i < cs.size(); i++)\r
172     {\r
173       int sel = cs.columnAt(i);\r
174 \r
175       if ( (sel >= startx) && (sel <= endx))\r
176       {\r
177         gg.fillRect( (sel - startx) * av.charWidth, 0, av.charWidth,\r
178                     getHeight());\r
179       }\r
180     }\r
181 \r
182     // Draw the scale numbers\r
183     gg.setColor(Color.black);\r
184 \r
185     int scalestartx = (startx / 10) * 10;\r
186 \r
187     FontMetrics fm = gg.getFontMetrics(av.getFont());\r
188     int y = av.charHeight - fm.getDescent();\r
189 \r
190     if ( (scalestartx % 10) == 0)\r
191     {\r
192       scalestartx += 5;\r
193     }\r
194 \r
195     for (int i = scalestartx; i < endx; i += 5)\r
196     {\r
197       if ( (i % 10) == 0)\r
198       {\r
199         gg.drawString(String.valueOf(i),\r
200                       (i - startx - 1) * av.charWidth, y);\r
201         gg.drawLine( (int) ( ( (i - startx - 1) * av.charWidth) +\r
202                             (av.charWidth / 2)), y + 2,\r
203                     (int) ( ( (i - startx - 1) * av.charWidth) +\r
204                            (av.charWidth / 2)), y + (fm.getDescent() * 2));\r
205       }\r
206       else\r
207       {\r
208         gg.drawLine( (int) ( ( (i - startx - 1) * av.charWidth) +\r
209                             (av.charWidth / 2)), y + fm.getDescent(),\r
210                     (int) ( ( (i - startx - 1) * av.charWidth) +\r
211                            (av.charWidth / 2)), y + (fm.getDescent() * 2));\r
212       }\r
213     }\r
214   }\r
215 }\r