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