try out graphics 2d
[jalview.git] / src / jalview / gui / IdCanvas.java
1 package jalview.gui;\r
2 \r
3 import java.awt.*;\r
4 import java.awt.Graphics2D.*;\r
5 \r
6 import javax.swing.*;\r
7 import jalview.datamodel.*;\r
8 import jalview.analysis.*;\r
9 public class IdCanvas extends JPanel\r
10 {\r
11   protected Image    img;\r
12   protected Graphics2D gg;\r
13 \r
14   protected int      imgWidth;\r
15   protected int      imgHeight;\r
16 \r
17   protected AlignViewport av;\r
18 \r
19   public boolean paintFlag   = false;\r
20   protected boolean showScores  = true;\r
21 \r
22   protected int     maxIdLength = -1;\r
23   protected String  maxIdStr    = null;\r
24 \r
25   public IdCanvas(AlignViewport av)\r
26   {\r
27     setLayout(new BorderLayout());\r
28     this.av         = av;\r
29     PaintRefresher.Register(this);\r
30   }\r
31 \r
32   public void drawIdString(Graphics g,SequenceI ds,int i, int starty, int ypos) {\r
33       int charHeight = av.getCharHeight();\r
34 \r
35       if (av.getSelection().contains(ds)) {\r
36           gg.setColor(Color.gray);\r
37           gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getWidth(),charHeight);\r
38           gg.setColor(Color.white);\r
39       } else {\r
40           gg.setColor(ds.getColor());\r
41           gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getWidth(),charHeight);\r
42           gg.setColor(Color.black);\r
43       }\r
44 \r
45       String string = ds.getName() + "/" + ds.getStart() + "-" + ds.getEnd();\r
46 \r
47       gg.drawString(string,0,AlignmentUtil.getPixelHeight(starty,i,charHeight) + ypos + charHeight-   (charHeight/5));\r
48 \r
49   }\r
50 \r
51   public void paintComponent(Graphics g) {\r
52     AlignmentI da         = av.getAlignment();\r
53     int        charHeight = av.getCharHeight();\r
54     Font       f          = av.getFont();\r
55 \r
56     if (img == null ||\r
57         imgWidth != getWidth()   ||\r
58         imgHeight != getHeight() ||\r
59         paintFlag == true) {\r
60 \r
61       imgWidth = getWidth();\r
62       imgHeight = getHeight();\r
63 \r
64       if (imgWidth <= 0 )  {\r
65         imgWidth  = 700;\r
66       }\r
67       if (imgHeight <= 0 ) {\r
68         imgHeight = 500;\r
69       }\r
70 \r
71       img = createImage(imgWidth,imgHeight);\r
72 \r
73 \r
74       gg = (Graphics2D)img.getGraphics();\r
75       gg.setColor(Color.white);\r
76       gg.fillRect(0,0,imgWidth,imgHeight);\r
77 \r
78       gg.setFont(f);\r
79 \r
80       paintFlag = false;\r
81 \r
82     }\r
83 \r
84 \r
85     //Fill in the background\r
86     gg.setColor(Color.white);\r
87     gg.fillRect(0,0,imgWidth,imgHeight);\r
88 \r
89     Color currentColor     = Color.white;\r
90     Color currentTextColor = Color.black;\r
91 \r
92     //Which ids are we printing\r
93     int starty = av.getStartSeq();\r
94     int endy   = av.getEndSeq();\r
95 \r
96 \r
97 \r
98     if (av.getWrapAlignment())\r
99     {\r
100         starty = starty%av.getChunkHeight();\r
101 \r
102         int ypos     = 0;\r
103         int rowstart = starty;\r
104 \r
105         if (starty == 0)\r
106             ypos = 2*charHeight;\r
107        else if (starty == 1)\r
108        {\r
109             starty = 0;\r
110             ypos = charHeight;\r
111         }\r
112 \r
113         endy   = starty + da.getHeight();\r
114 \r
115         if (endy > da.getHeight()) {\r
116             endy = da.getHeight();\r
117         }\r
118 \r
119         for (int i = starty; i < endy; i++) {\r
120           SequenceI s = da.getSequenceAt(i);\r
121           drawIdString(gg,s,i,starty,ypos);\r
122         }\r
123         if (rowstart == 0) {\r
124             ypos   = ypos +  av.getChunkHeight();\r
125         } else if (rowstart == 1) {\r
126             ypos   = ypos +  av.getChunkHeight();\r
127         } else {\r
128             ypos   = ypos +  av.getChunkHeight() - rowstart*charHeight;\r
129         }\r
130 \r
131         starty = 0;\r
132 \r
133         int chunkwidth = av.getChunkWidth();\r
134         int startx = (int)(av.getEndSeq()/chunkwidth)*chunkwidth;\r
135         int endx   = startx + chunkwidth;\r
136 \r
137 \r
138         while (ypos <= getHeight() && endx < da.getWidth()) {\r
139 \r
140             for (int i = starty; i < endy; i++) {\r
141               SequenceI s = da.getSequenceAt(i);\r
142               drawIdString(gg,s,i,starty,ypos);\r
143             }\r
144 \r
145             ypos   += av.getChunkHeight();\r
146             startx += chunkwidth;\r
147             endx = startx + chunkwidth;\r
148 \r
149             if (endx > da.getWidth()) {\r
150                 endx = da.getWidth();\r
151             }\r
152 \r
153             starty = 0;\r
154 \r
155             if (endy > da.getHeight()) {\r
156                 endy = da.getHeight();\r
157             }\r
158 \r
159         }\r
160     } else {\r
161 \r
162     //Now draw the id strings\r
163     for (int i = starty; i < endy; i++)\r
164     {\r
165 \r
166       // Selected sequence colours\r
167       if (av.getSelection().contains(da.getSequenceAt(i)))\r
168       {\r
169           currentColor     = Color.gray;\r
170           currentTextColor = Color.black;\r
171       }\r
172       else\r
173       {\r
174         currentColor = da.getSequenceAt(i).getColor();\r
175         currentTextColor = Color.black;\r
176       }\r
177 \r
178       gg.setColor(currentColor);\r
179 \r
180 \r
181 \r
182       gg.fillRect(0,\r
183                     AlignmentUtil.getPixelHeight(starty,i,charHeight),\r
184                     getWidth(),\r
185                     charHeight);\r
186 \r
187       gg.setColor(currentTextColor);\r
188 \r
189       String string = da.getSequenceAt(i).getDisplayId();\r
190 \r
191       gg.drawString(string,0,AlignmentUtil.getPixelHeight(starty,i,charHeight) +  charHeight-   (charHeight/5));\r
192     }\r
193     }\r
194 \r
195     g.drawImage(img,0,0,this);\r
196   }\r
197 \r
198 \r
199   public Dimension getLabelWidth()\r
200   {\r
201 \r
202    FontMetrics fm = this.getGraphics().getFontMetrics(av.font);\r
203    AlignmentI al = av.getAlignment();\r
204 \r
205    int i   = 0;\r
206    int idWidth = 0;\r
207 \r
208    while (i < al.getHeight() && al.getSequenceAt(i) != null)\r
209    {\r
210      SequenceI s   = al.getSequenceAt(i);\r
211      String str   = s.getDisplayId();\r
212      if (fm.stringWidth(str) > idWidth)\r
213        idWidth = fm.stringWidth(str);\r
214      i++;\r
215    }\r
216 \r
217    return new Dimension(idWidth + 10,getHeight());\r
218  }\r
219 \r
220  public Dimension getPreferredSize()\r
221  {\r
222    return getLabelWidth();\r
223  }\r
224 \r
225 \r
226 }\r