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