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