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