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