wrap align correction for last row
[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(image==null || imgHeight!=image.getHeight(this))\r
110     {\r
111       image = createImage(getSize().width, imgHeight);\r
112       gg = image.getGraphics();\r
113       gg.setFont(av.getFont());\r
114     }\r
115 \r
116       //Fill in the background\r
117       gg.setColor(Color.white);\r
118       Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
119                            av.getFont().getSize());\r
120       gg.setFont(italic);\r
121 \r
122     gg.fillRect(0, 0, getSize().width, getSize().height);\r
123     drawIds( av.getStartSeq(), av.endSeq);\r
124     g.drawImage(image, 0, 0, this);\r
125   }\r
126 \r
127   void drawIds(int starty, int endy)\r
128   {\r
129     Color currentColor     = Color.white;\r
130     Color currentTextColor = Color.black;\r
131 \r
132     if (av.getWrapAlignment())\r
133     {\r
134 \r
135           int rowSize =  av.getEndRes() - av.getStartRes();\r
136           // Draw the rest of the panels\r
137 \r
138           for(int ypos=2*av.charHeight, row=av.startRes;\r
139               ypos <= getSize().height && row<av.alignment.getWidth();\r
140               ypos += av.chunkHeight, row+=rowSize )\r
141           {\r
142             for (int i = starty; i < av.alignment.getHeight(); i++)\r
143             {\r
144               SequenceI s = av.alignment.getSequenceAt(i);\r
145               drawIdString(gg, s, i, 0, ypos);\r
146             }\r
147           }\r
148 \r
149 \r
150     } else\r
151     {\r
152 \r
153       //Now draw the id strings\r
154       for (int i = starty; i < endy; i++)\r
155       {\r
156         // Selected sequence colours\r
157 \r
158         if(searchResults!=null && searchResults.contains(av.alignment.getSequenceAt(i)))\r
159         {\r
160           gg.setColor(Color.black);\r
161           currentColor = Color.black;\r
162           currentTextColor = Color.white;\r
163       }\r
164       else if (av.getSelectionGroup()!= null\r
165             && av.getSelectionGroup().sequences.contains(av.alignment.getSequenceAt(i)))\r
166         {\r
167           currentColor = Color.lightGray;\r
168           currentTextColor = Color.black;\r
169         }\r
170         else\r
171         {\r
172           currentColor = av.alignment.getSequenceAt(i).getColor();\r
173           currentTextColor = Color.black;\r
174         }\r
175 \r
176         gg.setColor(currentColor);\r
177 \r
178         gg.fillRect(0,\r
179                     AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
180                     getSize().width,\r
181                     av.charHeight);\r
182 \r
183         gg.setColor(currentTextColor);\r
184         String string = av.alignment.getSequenceAt(i).getName();\r
185         if(av.getShowFullId())\r
186           string = av.alignment.getSequenceAt(i).getDisplayId();\r
187         gg.drawString(string, 0,\r
188                       AlignmentUtil.getPixelHeight(starty, i, av.charHeight) +\r
189                       av.charHeight - (av.charHeight / 5));\r
190       }\r
191 \r
192       // add a border\r
193       gg.setColor(Color.white);\r
194       gg.fillRect(getSize().width-4,0,4,getSize().height);\r
195     }\r
196 \r
197   }\r
198 \r
199   public void setHighlighted(java.util.Vector found)\r
200   {\r
201     searchResults = found;\r
202     repaint();\r
203   }\r
204 }\r