a8f84563ca3aedef8937bbb054c0086fb55030ac
[jalview.git] / src / jalview / appletgui / IdCanvas.java
1 package jalview.appletgui;\r
2 \r
3 import java.awt.*;\r
4 import jalview.datamodel.*;\r
5 import jalview.analysis.*;\r
6 public class IdCanvas extends Panel\r
7 {\r
8   protected AlignViewport av;\r
9 \r
10   protected boolean showScores  = true;\r
11 \r
12   protected int     maxIdLength = -1;\r
13   protected String  maxIdStr    = null;\r
14   Image image;\r
15   Graphics gg;\r
16   int imgHeight=0;\r
17   boolean fastPaint = false;\r
18 \r
19   java.util.Vector searchResults;\r
20 \r
21   public IdCanvas(AlignViewport av)\r
22   {\r
23     setLayout(null);\r
24     this.av         = av;\r
25     PaintRefresher.Register(this);\r
26   }\r
27 \r
28   public void drawIdString(Graphics gg,SequenceI s,int i, int starty, int ypos) {\r
29       int charHeight = av.getCharHeight();\r
30 \r
31       if(searchResults!=null && searchResults.contains(s))\r
32       {\r
33         gg.setColor(Color.black);\r
34         gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getSize().width,charHeight);\r
35         gg.setColor(Color.white);\r
36       }\r
37       else if (av.getSelectionGroup()!=null && av.getSelectionGroup().sequences.contains(s)) {\r
38           gg.setColor(Color.lightGray);\r
39           gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getSize().width,charHeight);\r
40           gg.setColor(Color.white);\r
41       } else {\r
42           gg.setColor(s.getColor());\r
43           gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getSize().width,charHeight);\r
44           gg.setColor(Color.black);\r
45       }\r
46 \r
47       String string = s.getName();\r
48       if(av.getShowFullId())\r
49         string = s.getDisplayId();\r
50 \r
51       gg.drawString(string,0,AlignmentUtil.getPixelHeight(starty,i,charHeight) + ypos + charHeight-   (charHeight/5));\r
52 \r
53   }\r
54 \r
55   public void fastPaint(int vertical)\r
56   {\r
57     if(gg==null)\r
58     {  repaint(); return;}\r
59 \r
60     gg.copyArea( 0,0, getSize().width, imgHeight, 0, -vertical*av.charHeight );\r
61 \r
62     int ss=av.startSeq, es=av.endSeq, transY = 0;\r
63     if (vertical > 0) // scroll down\r
64      {\r
65        ss = es - vertical;\r
66        if(ss<av.startSeq) // ie scrolling too fast, more than a page at a time\r
67          ss = av.startSeq;\r
68        else\r
69          transY = imgHeight - vertical * av.charHeight;\r
70      }\r
71      else if (vertical < 0)\r
72      {\r
73        es = ss - vertical;\r
74        if(es > av.endSeq)\r
75          es = av.endSeq;\r
76      }\r
77 \r
78 \r
79 \r
80         gg.translate(0, transY);\r
81 \r
82         drawIds(ss, es);\r
83 \r
84         gg.translate( 0, -transY );\r
85 \r
86 \r
87       fastPaint = true;\r
88       repaint();\r
89   }\r
90 \r
91   public void update(Graphics g)\r
92   {\r
93     paint(g);\r
94   }\r
95   public void paint(Graphics g)\r
96   {\r
97     if(getSize().height<0 || getSize().width<0)\r
98       return;\r
99     if (fastPaint)\r
100     {\r
101       fastPaint = false;\r
102       g.drawImage(image, 0, 0, this);\r
103       return;\r
104     }\r
105 \r
106     imgHeight = getSize().height;\r
107     imgHeight -= imgHeight % av.charHeight;\r
108 \r
109     if (imgHeight<1)\r
110       return;\r
111 \r
112     if(image==null || imgHeight!=image.getHeight(this))\r
113     {\r
114       image = createImage(getSize().width, imgHeight);\r
115       gg = image.getGraphics();\r
116       gg.setFont(av.getFont());\r
117     }\r
118 \r
119       //Fill in the background\r
120       gg.setColor(Color.white);\r
121       Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
122                            av.getFont().getSize());\r
123       gg.setFont(italic);\r
124 \r
125     gg.fillRect(0, 0, getSize().width, getSize().height);\r
126     drawIds( av.getStartSeq(), av.endSeq);\r
127     g.drawImage(image, 0, 0, this);\r
128   }\r
129 \r
130   void drawIds(int starty, int endy)\r
131   {\r
132     Color currentColor     = Color.white;\r
133     Color currentTextColor = Color.black;\r
134 \r
135     if (av.getWrapAlignment())\r
136     {\r
137 \r
138           int rowSize =  av.getEndRes() - av.getStartRes();\r
139           // Draw the rest of the panels\r
140 \r
141           for(int ypos=2*av.charHeight, row=av.startRes;\r
142               ypos <= getSize().height && row<av.alignment.getWidth();\r
143               ypos += av.chunkHeight, row+=rowSize )\r
144           {\r
145             for (int i = starty; i < av.alignment.getHeight(); i++)\r
146             {\r
147               SequenceI s = av.alignment.getSequenceAt(i);\r
148               drawIdString(gg, s, i, 0, ypos);\r
149             }\r
150           }\r
151 \r
152 \r
153     } else\r
154     {\r
155 \r
156       //Now draw the id strings\r
157       for (int i = starty; i < endy; i++)\r
158       {\r
159         // Selected sequence colours\r
160 \r
161         if(searchResults!=null && searchResults.contains(av.alignment.getSequenceAt(i)))\r
162         {\r
163           gg.setColor(Color.black);\r
164           currentColor = Color.black;\r
165           currentTextColor = Color.white;\r
166       }\r
167       else if (av.getSelectionGroup()!= null\r
168             && av.getSelectionGroup().sequences.contains(av.alignment.getSequenceAt(i)))\r
169         {\r
170           currentColor = Color.lightGray;\r
171           currentTextColor = Color.black;\r
172         }\r
173         else\r
174         {\r
175           currentColor = av.alignment.getSequenceAt(i).getColor();\r
176           currentTextColor = Color.black;\r
177         }\r
178 \r
179         gg.setColor(currentColor);\r
180 \r
181         gg.fillRect(0,\r
182                     AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
183                     getSize().width,\r
184                     av.charHeight);\r
185 \r
186         gg.setColor(currentTextColor);\r
187         String string = av.alignment.getSequenceAt(i).getName();\r
188         if(av.getShowFullId())\r
189           string = av.alignment.getSequenceAt(i).getDisplayId();\r
190         gg.drawString(string, 0,\r
191                       AlignmentUtil.getPixelHeight(starty, i, av.charHeight) +\r
192                       av.charHeight - (av.charHeight / 5));\r
193       }\r
194 \r
195       // add a border\r
196       gg.setColor(Color.white);\r
197       gg.fillRect(getSize().width-4,0,4,getSize().height);\r
198     }\r
199 \r
200   }\r
201 \r
202   public void setHighlighted(java.util.Vector found)\r
203   {\r
204     searchResults = found;\r
205     repaint();\r
206   }\r
207 }\r