boxes, colour text, show text added to groups
[jalview.git] / src / jalview / appletgui / SequenceRenderer.java
1 package jalview.appletgui;\r
2 \r
3 import jalview.datamodel.*;\r
4 import jalview.schemes.*;\r
5 import java.awt.*;\r
6 \r
7 public class SequenceRenderer\r
8 {\r
9   AlignViewport av;\r
10   FontMetrics fm;\r
11   boolean renderGaps = true;\r
12   SequenceGroup currentSequenceGroup = null;\r
13   SequenceGroup [] allGroups = null;\r
14   Color resBoxColour;\r
15   Graphics graphics;\r
16 \r
17   public SequenceRenderer(AlignViewport av)\r
18   {\r
19     this.av = av;\r
20   }\r
21 \r
22 \r
23   public void renderGaps(boolean b)\r
24   {\r
25     renderGaps = b;\r
26   }\r
27 \r
28   public Color getResidueBoxColour(ColourSchemeI cs, SequenceI seq, int i)\r
29   {\r
30     getBoxColour(cs, seq, i);\r
31     return resBoxColour;\r
32   }\r
33 \r
34   void getBoxColour(ColourSchemeI cs, SequenceI seq, int i)\r
35   {\r
36    if (cs != null)\r
37        resBoxColour = cs.findColour(seq.getSequence(i, i + 1), i);\r
38    else\r
39        resBoxColour = Color.white;\r
40   }\r
41 \r
42   public void drawSequence(Graphics g,SequenceI seq,SequenceGroup [] sg, int start, int end, int x1, int y1, int width, int height)\r
43   {\r
44     allGroups = sg;\r
45 \r
46     graphics = g;\r
47 \r
48     drawBoxes(seq, start, end, x1, y1, (int) width, height);\r
49 \r
50     fm = g.getFontMetrics();\r
51     drawText(seq,start,end,x1,y1,(int)width,height);\r
52 \r
53   }\r
54 \r
55   public void drawBoxes(SequenceI seq,int start, int end, int x1, int y1, int width, int height) {\r
56     int i      = start;\r
57     int length = seq.getLength();\r
58 \r
59     int curStart = -1;\r
60     int curWidth = width;\r
61 \r
62     Color tempColour = null;\r
63     while (i <= end && i < length)\r
64     {\r
65       if(inCurrentSequenceGroup(i))\r
66       {\r
67         if( currentSequenceGroup.getDisplayBoxes())\r
68              getBoxColour(currentSequenceGroup.cs, seq, i);\r
69         else\r
70              resBoxColour = Color.white;\r
71       }\r
72       else if(av.getShowBoxes())\r
73             getBoxColour(av.getGlobalColourScheme(), seq, i);\r
74       else\r
75         resBoxColour = Color.white;\r
76 \r
77 \r
78       if (resBoxColour != tempColour)\r
79       {\r
80         if(tempColour!=null)\r
81           graphics.fillRect(x1+width*(curStart-start),y1,curWidth,height);\r
82         graphics.setColor(resBoxColour);\r
83 \r
84         curStart = i;\r
85         curWidth = width;\r
86         tempColour = resBoxColour;\r
87 \r
88       }\r
89       else\r
90         curWidth += width;\r
91 \r
92       i++;\r
93     }\r
94 \r
95 \r
96      graphics.fillRect(x1+width*(curStart-start),y1,curWidth,height);\r
97   }\r
98 \r
99   public void drawText(SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r
100   {\r
101     int pady = height/5;\r
102     int charOffset=0;\r
103     char s;\r
104     // Need to find the sequence position here.\r
105 \r
106     String sequence  = seq.getSequence();\r
107     for (int i = start; i <= end; i++)\r
108     {\r
109         if(i<sequence.length())\r
110           s = sequence.charAt(i);\r
111         else\r
112           s = ' ';\r
113 \r
114         if(!renderGaps && jalview.util.Comparison.isGap(s))\r
115           continue;\r
116 \r
117 \r
118         if (inCurrentSequenceGroup(i))\r
119         {\r
120           if(!currentSequenceGroup.getDisplayText())\r
121             continue;\r
122 \r
123             if (currentSequenceGroup.getColourText())\r
124             {\r
125               getBoxColour(currentSequenceGroup.cs, seq, i);\r
126               graphics.setColor(resBoxColour.darker());\r
127             }\r
128         }\r
129         else\r
130         {\r
131           if(!av.getShowText())\r
132             continue;\r
133 \r
134           if(av.getColourText())\r
135            {\r
136              getBoxColour(av.getGlobalColourScheme(), seq, i);\r
137              if(av.getShowBoxes())\r
138               graphics.setColor(resBoxColour.darker());\r
139             else\r
140               graphics.setColor(resBoxColour);\r
141            }\r
142            else\r
143              graphics.setColor(Color.black);\r
144         }\r
145 \r
146           charOffset =  (width - fm.charWidth(s))/2;\r
147           graphics.drawString(String.valueOf(s),\r
148                               charOffset + x1 + width * (i - start),\r
149                               y1 + height - pady);\r
150         }\r
151 \r
152 \r
153   }\r
154 \r
155   boolean inCurrentSequenceGroup(int res)\r
156   {\r
157     if(allGroups ==null)\r
158       return false;\r
159 \r
160     for(int i=0; i<allGroups.length; i++)\r
161       if(allGroups[i].getStartRes()<=res && allGroups[i].getEndRes()>=res)\r
162       {\r
163          currentSequenceGroup = allGroups[i];\r
164          return true;\r
165       }\r
166 \r
167     return false;\r
168   }\r
169 \r
170   public void drawHighlightedText(SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r
171   {\r
172     int pady = height/5;\r
173     int charOffset=0;\r
174     graphics.setColor(Color.black);\r
175     graphics.fillRect(x1,y1,width*(end-start+1),height);\r
176     graphics.setColor(Color.white);\r
177 \r
178     char s='~';\r
179     // Need to find the sequence position here.\r
180     for (int i = start; i <= end; i++)\r
181     {\r
182        if(i<seq.getLength())\r
183           s = seq.getSequence().charAt(i);\r
184 \r
185      charOffset =  (width - fm.charWidth(s))/2;\r
186       graphics.drawString(String.valueOf(s), charOffset + x1 + width * (i - start), y1 + height - pady);\r
187     }\r
188   }\r
189 \r
190 \r
191 }\r