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