37cfcaf568ed7f03904f4e1c1ac67338d2cd2d2f
[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     av.setSelectionGroup(sg);\r
66     ap.RefreshPanels();\r
67   }\r
68 \r
69   public void doMouseReleased(MouseEvent evt)\r
70   {\r
71     if(!stretchingGroup)\r
72       return;\r
73 \r
74     int x = evt.getX();\r
75     int res = x/av.getCharWidth() + av.getStartRes();\r
76 \r
77    if (! av.getColumnSelection().contains(res))\r
78      av.getColumnSelection().addElement(res);\r
79 \r
80    SequenceGroup sg = av.getSelectionGroup();\r
81 \r
82    if(res>sg.getStartRes())\r
83      sg.setEndRes(res);\r
84    else if(res<sg.getStartRes())\r
85      sg.setStartRes(res);\r
86 \r
87    stretchingGroup = false;\r
88    ap.RefreshPanels();\r
89   }\r
90 \r
91   public void doMouseDragged(MouseEvent evt)\r
92   {\r
93     int x = evt.getX();\r
94     int res = x/av.getCharWidth() + av.getStartRes();\r
95 \r
96     SequenceGroup sg = av.getSelectionGroup();\r
97     if(sg!=null)\r
98     {\r
99       stretchingGroup = true;\r
100       if (res > sg.getStartRes())\r
101         sg.setEndRes(res);\r
102       else if (res < sg.getStartRes())\r
103         sg.setStartRes(res);\r
104 \r
105       ap.RefreshPanels();\r
106     }\r
107   }\r
108 \r
109   public void paintComponent(Graphics g)\r
110   {\r
111     drawScale(g, av.getStartRes(), av.getEndRes(), getWidth());\r
112   }\r
113 \r
114 // scalewidth will normally be screenwidth,\r
115   public void drawScale(Graphics gg, int startx, int endx, int scaleWidth)\r
116   {\r
117     int charWidth  = av.getCharWidth();\r
118 \r
119     gg.setFont(av.getFont());\r
120 \r
121     //Fill in the background\r
122 \r
123     gg.setColor(Color.white);\r
124     gg.fillRect(0,0,scaleWidth, getHeight());\r
125 \r
126     int resWidth = endx - startx + 1;\r
127 \r
128     // We want roughly one tick every 50 pixels\r
129 \r
130     double rough = scaleWidth/50.0;\r
131 \r
132     double roughtick = resWidth/rough;\r
133 \r
134     int   digits  = (int)(Math.log(roughtick)/Math.log(10));\r
135     int   num     = (int)(roughtick/Math.pow(10,digits));\r
136 \r
137     if (roughtick>5)\r
138         num = 10;\r
139     else\r
140         num = 5;\r
141 \r
142   //   else\r
143   //  num = 2;\r
144 \r
145   //  System.out.println("Dig " + digits + " " + rough + " " + roughtick + " " + getWidth() + " " + num);\r
146 \r
147     int space = (int)(num * Math.pow(10,digits));\r
148 \r
149     //Set the text font\r
150 \r
151     gg.setColor(Color.black);\r
152 \r
153 \r
154     int scalestartx = 0;\r
155     if(space>0)\r
156       scalestartx = startx - startx%space + space;\r
157 \r
158 \r
159     //Fill the selected columns\r
160     ColumnSelection cs = av.getColumnSelection();\r
161     int width = charWidth;\r
162     if (width == 0)\r
163       width = 1;\r
164 \r
165     gg.setColor(new Color(220,0,0));\r
166     for (int i=0; i<cs.size(); i++) {\r
167       int sel  = cs.columnAt(i);\r
168       //      System.out.println("Selection = " + sel);\r
169       if ( sel >= startx  && sel <= endx) {\r
170 \r
171         gg.fillRect((sel-startx)*charWidth,0,width,getHeight());\r
172       }\r
173     }\r
174 \r
175     // Draw the scale numbers\r
176     gg.setColor(Color.black);\r
177 \r
178 \r
179     for (int i=scalestartx;i < endx;i+= space) {\r
180 \r
181       String string = String.valueOf(i);\r
182 \r
183       gg.drawString(string,(i-startx-1)*charWidth,  av.charHeight / 2 +offy);\r
184       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
185 \r
186     }\r
187   }\r
188 \r
189 \r
190 }\r