7e4b6176414de3d13ebef8b9f72692f7c1045ae9
[jalview.git] / src / jalview / gui / ScaleCanvas.java
1 package jalview.gui;\r
2 \r
3 import java.awt.*;\r
4 import javax.swing.*;\r
5 \r
6 public class ScaleCanvas extends JPanel {\r
7 \r
8   int      xoffset;\r
9 \r
10   public static final int HEIGHT = 30;\r
11 \r
12   boolean paintFlag = false;\r
13 \r
14   protected AlignViewport av;\r
15 \r
16   public ScaleCanvas(AlignViewport av) {\r
17     this.av         = av;\r
18 \r
19   }\r
20   public void paintComponent(Graphics g)\r
21   {\r
22     drawScale(g, av.getStartRes(), av.getEndRes(), getWidth());\r
23   }\r
24 \r
25 // scalewidth will normally be screenwidth,\r
26   public void drawScale(Graphics gg, int startx, int endx, int scaleWidth)\r
27   {\r
28 \r
29     double charWidth  = av.getCharWidth();\r
30 \r
31     gg.setFont(av.getFont());\r
32 \r
33     //Fill in the background\r
34 \r
35     gg.setColor(Color.white);\r
36     gg.fillRect(0,0,scaleWidth, HEIGHT);\r
37 \r
38     int resWidth = endx - startx + 1;\r
39 \r
40     // We want roughly one tick every 50 pixels\r
41 \r
42     double rough = scaleWidth/50.0;\r
43 \r
44     double roughtick = resWidth/rough;\r
45 \r
46     int   digits  = (int)(Math.log(roughtick)/Math.log(10));\r
47     int   num     = (int)(roughtick/Math.pow(10,digits));\r
48 \r
49     if (Math.abs(10-num) < 3)\r
50         num = 10;\r
51     else if (Math.abs(5-num) >= 2)\r
52         num = 5;\r
53   //   else\r
54   //  num = 2;\r
55 \r
56     //System.out.println("Dig " + digits + " " + rough + " " + roughtick + " " + getWidth() + " " + num);\r
57 \r
58     int space = (int)(num * Math.pow(10,digits));\r
59 \r
60     //Set the text font\r
61 \r
62     gg.setColor(Color.black);\r
63 \r
64     int scalestartx = startx - startx%space + space;\r
65 \r
66 \r
67     //Fill the selected columns\r
68     ColumnSelection cs = av.getColumnSelection();\r
69     int width = (int)charWidth;\r
70     if (width == 0)\r
71       width = 1;\r
72 \r
73     gg.setColor(new Color(220,0,0));\r
74     for (int i=0; i<cs.size(); i++) {\r
75       int sel  = cs.columnAt(i);\r
76       //      System.out.println("Selection = " + sel);\r
77       if ( sel >= startx  && sel <= endx) {\r
78 \r
79         gg.fillRect((int)((sel-startx)*charWidth),0,width,getHeight());\r
80       }\r
81     }\r
82 \r
83     // Draw the scale numbers\r
84     gg.setColor(Color.black);\r
85 \r
86 \r
87     for (int i=scalestartx;i < endx;i+= space) {\r
88 \r
89       String string = String.valueOf(i);\r
90 \r
91       gg.drawString(string,(int)((i-startx-1)*charWidth),15);\r
92       gg.drawLine( (int)((i-startx-1)*charWidth +charWidth/2), 17, (int)((i-startx-1)*charWidth +charWidth/2), 24);\r
93 \r
94     }\r
95 \r
96 \r
97   }\r
98 \r
99   public Dimension getMinimumSize() {\r
100     return new Dimension(500,HEIGHT);\r
101   }\r
102 \r
103   public Dimension getPreferredSize() {\r
104     return getMinimumSize();\r
105   }\r
106 \r
107 }\r
108 \r