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