anti_aliasing on
[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.RefreshPanels();\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.RefreshPanels();\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.RefreshPanels();\r
109     }\r
110   }\r
111 \r
112   public void paintComponent(Graphics g)\r
113   {\r
114     drawScale(g, av.getStartRes(), av.getEndRes(), getWidth());\r
115   }\r
116 \r
117 // scalewidth will normally be screenwidth,\r
118   public void drawScale(Graphics g, int startx, int endx, int scaleWidth)\r
119   {\r
120     Graphics2D gg = (Graphics2D)g;\r
121     gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
122     int charWidth  = av.getCharWidth();\r
123 \r
124     gg.setFont(av.getFont());\r
125 \r
126     //Fill in the background\r
127 \r
128     gg.setColor(Color.white);\r
129     gg.fillRect(0,0,scaleWidth, getHeight());\r
130 \r
131     int resWidth = endx - startx + 1;\r
132 \r
133     // We want roughly one tick every 50 pixels\r
134 \r
135     double rough = scaleWidth/50.0;\r
136 \r
137     double roughtick = resWidth/rough;\r
138 \r
139     int   digits  = (int)(Math.log(roughtick)/Math.log(10));\r
140     int   num     = (int)(roughtick/Math.pow(10,digits));\r
141 \r
142     if (roughtick>5)\r
143         num = 10;\r
144     else\r
145         num = 5;\r
146 \r
147   //   else\r
148   //  num = 2;\r
149 \r
150   //  System.out.println("Dig " + digits + " " + rough + " " + roughtick + " " + getWidth() + " " + num);\r
151 \r
152     int space = (int)(num * Math.pow(10,digits));\r
153 \r
154     //Set the text font\r
155 \r
156     gg.setColor(Color.black);\r
157 \r
158 \r
159     int scalestartx = 0;\r
160     if(space>0)\r
161       scalestartx = startx - startx%space + space;\r
162 \r
163 \r
164     //Fill the selected columns\r
165     ColumnSelection cs = av.getColumnSelection();\r
166     int width = charWidth;\r
167     if (width == 0)\r
168       width = 1;\r
169 \r
170     gg.setColor(new Color(220,0,0));\r
171     for (int i=0; i<cs.size(); i++) {\r
172       int sel  = cs.columnAt(i);\r
173       //      System.out.println("Selection = " + sel);\r
174       if ( sel >= startx  && sel <= endx) {\r
175 \r
176         gg.fillRect((sel-startx)*charWidth,0,width,getHeight());\r
177       }\r
178     }\r
179 \r
180     // Draw the scale numbers\r
181     gg.setColor(Color.black);\r
182 \r
183 \r
184     for (int i=scalestartx;i < endx;i+= space) {\r
185 \r
186       String string = String.valueOf(i);\r
187 \r
188       gg.drawString(string,(i-startx-1)*charWidth,  av.charHeight / 2 +offy);\r
189       gg.drawLine( (int)((i-startx-1)*charWidth +charWidth/2), av.charHeight/2 +offy +2, (int)((i-startx-1)*charWidth +charWidth/2),av.charHeight/2 +offy+7);\r
190 \r
191     }\r
192   }\r
193 \r
194 \r
195 }\r