24460ba27ab23eaeaa2650c59ccf24ef663eef77
[jalview.git] / src / jalview / appletgui / 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.appletgui;\r
21 \r
22 import jalview.datamodel.*;\r
23 import java.awt.*;\r
24 import java.awt.event.*;\r
25 \r
26 public class ScalePanel extends Panel\r
27 {\r
28 \r
29   protected int offy = 4;\r
30   public    int width;\r
31 \r
32   protected AlignViewport av;\r
33   AlignmentPanel ap;\r
34 \r
35   boolean stretchingGroup = false;\r
36 \r
37   public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
38   {\r
39     setLayout(null);\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 update(Graphics g)\r
132   {\r
133     paint(g);\r
134   }\r
135 \r
136   public void paint(Graphics g)\r
137   {\r
138     drawScale(g, av.getStartRes(), av.getEndRes(), getSize().width, getSize().height);\r
139   }\r
140 \r
141 // scalewidth will normally be screenwidth,\r
142   public void drawScale(Graphics gg, int startx, int endx, int width, int height)\r
143   {\r
144     gg.setFont(av.getFont());\r
145 \r
146     //Fill in the background\r
147     gg.setColor(Color.white);\r
148     gg.fillRect(0,0,width, height);\r
149     gg.setColor(Color.black);\r
150 \r
151 \r
152     //Fill the selected columns\r
153     ColumnSelection cs = av.getColumnSelection();\r
154     gg.setColor(new Color(220,0,0));\r
155     for (int i=0; i<cs.size(); i++)\r
156     {\r
157       int sel  = cs.columnAt(i);\r
158       if ( sel >= startx  && sel <= endx)\r
159         gg.fillRect((sel-startx)*av.charWidth,0,av.charWidth, getSize().height);\r
160     }\r
161 \r
162 \r
163     // Draw the scale numbers\r
164     gg.setColor(Color.black);\r
165     int scalestartx = (startx/10) * 10;\r
166 \r
167     FontMetrics fm = gg.getFontMetrics(av.getFont());\r
168     int y = av.charHeight -fm.getDescent();\r
169 \r
170     if(scalestartx%10==0)\r
171       scalestartx+=5;\r
172 \r
173     for (int i=scalestartx;i < endx; i+= 5)\r
174     {\r
175       if(i%10==0)\r
176       {\r
177         gg.drawString(String.valueOf(i), (i - startx - 1) * av.charWidth, y);\r
178         gg.drawLine( (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
179                     y+2,\r
180                     (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
181                     y+fm.getDescent()*2);\r
182       }\r
183       else\r
184         gg.drawLine( (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
185                     y+fm.getDescent(),\r
186                     (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
187                    y+fm.getDescent()*2);\r
188 \r
189 \r
190     }\r
191   }\r
192 \r
193 \r
194 }\r