Tick 5 and 10 marks
[jalview.git] / src / jalview / gui / ScalePanel.java
1 package jalview.gui;\r
2 \r
3 import jalview.datamodel.*;\r
4 import java.awt.*;\r
5 import java.awt.event.*;\r
6 import javax.swing.*;\r
7 \r
8 public class ScalePanel extends JPanel\r
9 {\r
10 \r
11   protected int offy = 4;\r
12   public    int width;\r
13 \r
14   protected AlignViewport av;\r
15   AlignmentPanel ap;\r
16 \r
17   boolean stretchingGroup = false;\r
18 \r
19   public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
20   {\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 paintComponent(Graphics g)\r
113   {\r
114     drawScale(g, av.getStartRes(), av.getEndRes(), getWidth(), getHeight());\r
115   }\r
116 \r
117 // scalewidth will normally be screenwidth,\r
118   public void drawScale(Graphics g, int startx, int endx, int width, int height)\r
119   {\r
120     Graphics2D gg = (Graphics2D)g;\r
121     gg.setFont(av.getFont());\r
122     gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
123 \r
124     //Fill in the background\r
125     gg.setColor(Color.white);\r
126     gg.fillRect(0,0,width, height);\r
127     gg.setColor(Color.black);\r
128 \r
129 \r
130     //Fill the selected columns\r
131     ColumnSelection cs = av.getColumnSelection();\r
132     gg.setColor(new Color(220,0,0));\r
133     for (int i=0; i<cs.size(); i++)\r
134     {\r
135       int sel  = cs.columnAt(i);\r
136       if ( sel >= startx  && sel <= endx)\r
137         gg.fillRect((sel-startx)*av.charWidth,0,av.charWidth,getHeight());\r
138     }\r
139 \r
140 \r
141     // Draw the scale numbers\r
142     gg.setColor(Color.black);\r
143     int scalestartx = (startx/10) * 10;\r
144 \r
145     FontMetrics fm = gg.getFontMetrics(av.getFont());\r
146     int y = av.charHeight -fm.getDescent();\r
147 \r
148     if(scalestartx%10==0)\r
149       scalestartx+=5;\r
150 \r
151     for (int i=scalestartx;i < endx; i+= 5)\r
152     {\r
153       if(i%10==0)\r
154       {\r
155         gg.drawString(String.valueOf(i), (i - startx - 1) * av.charWidth, y);\r
156         gg.drawLine( (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
157                     y+2,\r
158                     (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
159                     y+fm.getDescent()*2);\r
160       }\r
161       else\r
162         gg.drawLine( (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
163                     y+fm.getDescent(),\r
164                     (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
165                    y+fm.getDescent()*2);\r
166 \r
167 \r
168     }\r
169   }\r
170 \r
171 \r
172 }\r