Fixed display bugs when feature is off the screen
[jalview.git] / src / jalview / gui / FeatureRenderer.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 FeatureRenderer implements RendererI\r
9 {\r
10   AlignViewport av;\r
11 \r
12   SequenceGroup currentSequenceGroup = null;\r
13   SequenceGroup [] allGroups = null;\r
14   Color resBoxColour;\r
15   Graphics graphics;\r
16 \r
17   public FeatureRenderer(AlignViewport av)\r
18   {\r
19     this.av = av;\r
20   }\r
21 \r
22 \r
23   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
24   {\r
25     Vector features = seq.getSequenceFeatures();\r
26     Enumeration e = features.elements();\r
27     while( e.hasMoreElements() )\r
28     {\r
29       SequenceFeature sf = (SequenceFeature)e.nextElement();\r
30       int fstart = seq.findIndex(sf.getStart())-1;\r
31       int fend = seq.findIndex(sf.getEnd())-1;\r
32 \r
33       if(   (fstart<=end && fend>=start)  )\r
34       {\r
35         if(fstart<0) // fix for if the feature we have starts before the sequence start,\r
36           fstart = 0;// but the feature end is still valid!!\r
37 \r
38         if(fstart==fend)\r
39         {\r
40           g.setColor(Color.red);\r
41           g.fillRoundRect( (fstart - start) * width, y1, width, height, 4,4);\r
42           g.setColor(Color.white);\r
43 \r
44           char s = seq.getSequence().charAt(fstart);\r
45           FontMetrics fm = g.getFontMetrics();\r
46           int charOffset =  (width - fm.charWidth(s))/2;\r
47           int pady = height/5;\r
48           g.drawString(String.valueOf(s), charOffset + x1 + width * (fstart - start), y1 + height - pady);\r
49 \r
50         }\r
51         else\r
52         {\r
53           for (int i = fstart; i <= fend; i++)\r
54           {\r
55            try{\r
56              g.setColor(Color.blue);\r
57             g.fillRect( (i-start) * width, y1, width, height);\r
58 \r
59             g.setColor(Color.white);\r
60             char s = seq.getSequence().charAt(i);\r
61             FontMetrics fm = g.getFontMetrics();\r
62             int charOffset = (width - fm.charWidth(s)) / 2;\r
63             int pady = height / 5;\r
64             g.drawString(String.valueOf(s),\r
65                          charOffset + x1 + width * (i-start),\r
66                          y1 + height - pady);\r
67 \r
68            }catch(Exception ex){System.out.println(i+" "+fstart+" "+fend+" " +sf.getDescription()+" "+seq.getName()+" "+seq.getLength()); }\r
69           }\r
70         }\r
71       }\r
72 \r
73     }\r
74    }\r
75 \r
76 }\r