001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.taglib;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.common.HybsSystemException;
020 import org.opengion.hayabusa.html.TabData;
021
022 import static org.opengion.fukurou.util.StringUtil.nval ;
023
024 import java.util.List;
025 import java.util.ArrayList;
026 import java.util.Locale ;
027
028 /**
029 * 【å»?¢】タブã?インでã€??目をå?割して表示するタブテーブルを作æ?しますã?
030 *
031 * ※ こã?タグはå»?¢予定ですã?tabLink、tabList の使用をご検討くã�?�•ã�??
032 *
033 * ä¸?�¤の大きなHTMLをã?タブを使用することでè¤?•°の塊にåˆ?‰²表示できますã?
034 * åˆ?‰²された各タブã?、ä¸?�¤のHTMLのため、タブ間の移動によるæƒ??の消失はありませんã€?
035 * またã?ä¸?�¤のHTMLのため、タブにまたがって入力したå?は、すべて ä¸?‹¬送信することã‚?
036 * 可能ですã?(Formタグで、å?てのタブをまとめて記述してã�?‚Œば)
037 * タブテーブルは、orientation 属æ?で、横(horizontal)と縦(vertical)を指定できますã?
038 * これは、タブã?位置が異なるだけで、機è?は同ä¸?�§すã?初期値は、横(horizontal)ですã?
039 * 個ã?のタブã?æŒ?®šã?、tab タグを使用しますã?
040 * å¿?�šä¸?�¤以上ã?tab タグã‚?BODY要ç´?�«記述するå¿?¦�がありますã?
041 * selectedIndex を指定すると、å?期表示させるタブをæŒ?®šできますã?番号は?�から始まりますã?
042 *
043 * @og.formSample
044 * ●形式ï¼?lt;og:tabTable
045 * orientation = "[horizontal/vertical]" タブã?方å�?横/縦)
046 * height = "[100px / 100%]" ãƒ??ブルの高さ(px OR %)
047 * width = "[100px / 100%]" ãƒ??ブルのå¹?px OR %)
048 * selectedIndex = "[0..]" 初期表示するタブ番号
049 * >
050 * <og:tab lbl="?¥?¥?¥" > ... </og:tab > タブそのもã?
051 * <og:tab lbl="?¥?¥?¥" > ... </og:tab > タブそのもã?
052 * </og:tabTable >
053 * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
054 *
055 * ●Tag定義??
056 * <og:tabTable
057 * orientation 【å»?¢】タブã?方向ã?横åž?horizontal)か縦åž?vertical)を指定しまã�?初期値:横åž?
058 * height 【å»?¢】タブã?高さをã?% 、px 、またã? "auto" でæŒ?®šしまã�?
059 * width 【å»?¢】タブã?å¹?‚’ % 、px 、またã? "auto" でæŒ?®šしまã�?
060 * selectedIndex 【å»?¢】å?期表示するペã?ジ番号を指定しまã�?初期値:0)
061 * style 【å»?¢】å?期表示時ã?タブに与えã‚?style 属æ?を指定しまã�?
062 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
063 * > ... Body ...
064 * </og:tabTable>
065 *
066 * ●使用ä¾?
067 * 横åž?horizontal)の場合ã?横型が初期値のため、無æŒ?®šで使用できますã?
068 * <og:tabTable>
069 * <og:tab lbl="page 1"><jsp:directive.include file="paGE1.jsp" /></og:tab>
070 * <og:tab lbl="page 2"><jsp:directive.include file="page2.jsp" /></og:tab>
071 * <og:tab lbl="page 3"><jsp:directive.include file="page3.jsp" /></og:tab>
072 * </og:tabTable>
073 *
074 * 縦åž?vertical)の場合ã?ãƒ??ブルの高さを指定するå¿?¦�がありますã?(px OR %)
075 * <og:tabTable orientation="vertical" height="100px" >
076 * <og:tab lbl="page 1"><jsp:directive.include file="paGE1.jsp" /></og:tab>
077 * <og:tab lbl="page 2"><jsp:directive.include file="page2.jsp" /></og:tab>
078 * <og:tab lbl="page 3"><jsp:directive.include file="page3.jsp" /></og:tab>
079 * </og:tabTable>
080 *
081 * @og.rev 3.5.6.5 (2004/08/09) 新規作æ?
082 * @og.group (å»?¢)画面部å“?
083 *
084 * @version 4.0
085 * @author Kazuhiko Hasegawa
086 * @since JDK5.0,
087 * @deprecated マイクロソフトのスクリプトに依存するためã?å»?¢しますã?tabLink、tabList の使用をご検討くã�?�•ã�??
088 */
089 @Deprecated public class TabTableTag extends CommonTagSupport {
090 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
091 private static final String VERSION = "4.0.0.0 (2005/08/31)" ;
092
093 private static final long serialVersionUID = 400020050831L ;
094
095 private static final String CR = HybsSystem.CR ;
096 // private static final String JSV = "<script language=\"JavaScript\">ots.style.height = otab.offsetHeight ;</script>";
097 private static final String JSV = "<script type=\"text/javascript\">ots.style.height = otab.offsetHeight ;</script>";
098
099 private transient List<TabData> tabList = null;
100 private boolean orientation = true; // true:horizontal false:vertical
101
102 // 3.5.6.6 (2004/08/23) height と width の初期値変更ã€?
103 private String height = null;
104 private String width = null;
105 private String style = null; // 3.8.6.1 (2006/10/24)
106 private int selectedIndex = -1 ; // 3.7.1.1 (2005/05/31) 初期選択されるペã?ジ番号
107 private int realIndex = -1 ; // 3.8.6.2 (2006/11/01) 実際の選択タブã?ペã?ジ番号
108 private int realTabCount = -1 ; // 3.8.6.2 (2006/11/01) 実際のタブã?ペã?ジ番号
109
110 /**
111 * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
112 *
113 * @return 後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
114 */
115 @Override
116 public int doStartTag() {
117 return( EVAL_BODY_BUFFERED ); // Body を評価するã€? extends BodyTagSupport æ™?
118 }
119
120 /**
121 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
122 *
123 * @return 後続å?ç�??æŒ?¤º
124 */
125 @Override
126 public int doEndTag() {
127 debugPrint(); // 4.0.0 (2005/02/28)
128 if( tabList == null ) {
129 String errMsg = "BODY部に TabTag がå¿?�šå¿?¦�ですã?";
130 throw new HybsSystemException( errMsg );
131 }
132
133 jspPrint( makeTag() );
134 return(EVAL_PAGE);
135 }
136
137 /**
138 * タグリブオブジェクトをリリースしますã?
139 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
140 *
141 * @og.rev 3.5.6.6 (2004/08/23) height と width の初期値変更ã€?
142 * @og.rev 3.8.6.1 (2006/10/24) style属æ?を追åŠ?
143 * @og.rev 3.8.6.2 (2006/11/01) selectedIndex の初期値変更(0 â‡?-1)ã€?
144 */
145 @Override
146 protected void release2() {
147 super.release2();
148 tabList = null;
149 orientation = true; // true:horizontal false:vertical
150 height = null;
151 width = null;
152 selectedIndex = -1 ; // 3.7.1.1 (2005/05/31) 初期選択されるペã?ジ番号
153 realIndex = -1 ; // 3.8.6.2 (2006/11/01) 実際の選択タブã?ペã?ジ番号
154 realTabCount = -1 ; // 3.8.6.2 (2006/11/01) 実際のタブã?ペã?ジ番号
155 style = null;
156 }
157
158 /**
159 * 出力するタグæ–?—å?を作æ?しますã?
160 *
161 * @og.rev 3.5.6.6 (2004/08/23) メソãƒ?ƒ‰ã‚?HorizontalとVerticalにåˆ?‰²ã€?
162 *
163 * @return タグæ–?—å?
164 */
165 private String makeTag() {
166 if( orientation ) {
167 if( height == null ) { height = "auto"; }
168 if( width == null ) { width = "auto"; }
169 return makeHorizontalTag();
170 }
171 else {
172 if( height == null ) { height = "200px"; }
173 if( width == null ) { width = "100%" ; }
174 return makeVerticalTag();
175 }
176 }
177
178 /**
179 * 出力すã‚?horizontal タグæ–?—å?を作æ?しますã?
180 *
181 * @og.rev 3.5.6.6 (2004/08/23) メソãƒ?ƒ‰ã‚?HorizontalとVerticalにåˆ?‰²ã€?
182 * @og.rev 3.7.1.1 (2005/05/23) 初期表示するペã?ジ番号を指å®?
183 * @og.rev 3.8.6.0 (2006/08/23) IE7対応ã?mp:multipage の width:100%; を削除
184 * @og.rev 3.8.6.1 (2006/10/20) action属æ?を追åŠ?
185 * @og.rev 3.8.6.2 (2006/11/01) selectedIndex は、å?めての OPENタブとしますã?
186 *
187 * @return タグæ–?—å?
188 */
189 private String makeHorizontalTag() {
190 // 注意ï¼?**/ でマã?カー付けされてã�?‚‹行ã?、縦横で異なる記述が書かれてã�?�¾すã?
191 if( realIndex < 0 ) { realIndex = 0; } // 3.8.6.2 (2006/11/01)
192
193 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_LARGE );
194
195 buf.append( "<table cellpadding=\"0px\" cellspacing=\"0px\"" ).append( CR );
196 buf.append( " style=\"width:" ).append( width ).append( ";" );
197
198 buf.append( "\">" ).append( CR );
199 buf.append( " <tr valign=\"top\">" ).append( CR );
200 buf.append( " <td id=\"otab\">" ).append( CR );
201 buf.append( " <ts:tabstrip id=\"ots\" targetid=\"omp\" style=\"height:100%\"" ).append( CR );
202 buf.append( " tabdefaultstyle=\"border:solid 1px black;padding:3px;\"" ).append( CR );
203 buf.append( " tabhoverstyle=\"color:blue;\"" ).append( CR );
204 /**/ buf.append( " tabselectedstyle=\"border:solid 1px black;border-bottom:none\"" ).append( CR );
205 /**/ buf.append( " sepdefaultstyle=\"border-bottom:solid 1px black;\"" ).append( CR );
206 // 3.7.1.1 (2005/05/23) 追åŠ?
207 buf.append( " selectedIndex=\"" ).append( realIndex ).append( "\"" ).append( CR );
208 /**/ buf.append( " orientation=\"horizontal\">" ).append( CR );
209
210 int size = tabList.size();
211 TabData tab ;
212 for( int i=0; i<size; i++ ) {
213 tab = tabList.get(i);
214 if( tab.isOpen() ) {
215 buf.append( tab.getTab( style ) ).append( CR );
216 }
217 else {
218 buf.append( tab.getTab( null ) ).append( CR );
219 }
220
221 if( orientation && (i != size-1) ) {
222 buf.append( "<ts:tabseparator />" ).append( CR );
223 }
224 }
225 buf.append( "<ts:tabseparator defaultstyle=\"width:100%;height:100%\" />" ).append( CR );
226
227 buf.append( " </ts:tabstrip>" ).append( CR );
228 buf.append( " </td>" ).append( CR );
229
230 /**/ buf.append( "</tr><tr style=\"height:" ).append( height ).append( "\" >" ).append( CR );
231
232 buf.append( " <td width=\"100%\">" ).append( CR );
233 buf.append( " <mp:multipage id=\"omp\"" ).append( CR );
234 /**/ // buf.append( " style=\"border:solid 1px black;border-top:none;padding:5px;height:100%;width:100%;\">" ).append( CR );
235 /**/ buf.append( " style=\"border:solid 1px black;border-top:none;padding:5px;height:100%;\">" ).append( CR );
236
237 for( int i=0; i<size; i++ ) {
238 tab = tabList.get(i);
239 buf.append( tab.getTabBody() ).append( CR );
240 }
241 buf.append( " </mp:multipage>" ).append( CR );
242 buf.append( " </td>" ).append( CR );
243 buf.append( " </tr>" ).append( CR );
244 buf.append( "</table>" ).append( CR );
245
246 return buf.toString();
247 }
248
249 /**
250 * 出力すã‚?vertical タグæ–?—å?を作æ?しますã?
251 *
252 * @og.rev 3.5.6.6 (2004/08/23) メソãƒ?ƒ‰ã‚?HorizontalとVerticalにåˆ?‰²ã€?
253 * @og.rev 3.7.1.1 (2005/05/23) 初期表示するペã?ジ番号を指å®?
254 * @og.rev 3.8.6.0 (2006/08/23) IE7対応ã?mp:multipage の height:100%; を削除
255 * @og.rev 3.8.6.1 (2006/10/20) action属æ?を追åŠ?
256 * @og.rev 3.8.6.2 (2006/11/01) selectedIndex は、å?めての OPENタブとしますã?
257 *
258 * @return タグæ–?—å?
259 */
260 private String makeVerticalTag() {
261 // 注意ï¼?**/ でマã?カー付けされてã�?‚‹行ã?、縦横で異なる記述が書かれてã�?�¾すã?
262 if( realIndex < 0 ) { realIndex = 0; } // 3.8.6.2 (2006/11/01)
263
264 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_LARGE );
265
266 buf.append( "<table cellpadding=\"0px\" cellspacing=\"0px\"" ).append( CR );
267 buf.append( " style=\"width:" ).append( width ).append( ";" );
268 /**/ buf.append( "height:" ).append( height ).append( ";" );
269
270 buf.append( "\">" ).append( CR );
271 buf.append( " <tr valign=\"top\">" ).append( CR );
272 buf.append( " <td id=\"otab\">" ).append( CR );
273 buf.append( " <ts:tabstrip id=\"ots\" targetid=\"omp\" style=\"height:100%\"" ).append( CR );
274 buf.append( " tabdefaultstyle=\"border:solid 1px black;padding:3px;\"" ).append( CR );
275 buf.append( " tabhoverstyle=\"color:blue;\"" ).append( CR );
276 /**/ buf.append( " tabselectedstyle=\"border:solid 1px black;border-right:none\"" ).append( CR );
277 /**/ buf.append( " sepdefaultstyle=\"border-right:solid 1px black;\"" ).append( CR );
278 // 3.7.1.1 (2005/05/23) 追åŠ?
279 buf.append( " selectedIndex=\"" ).append( realIndex ).append( "\"" ).append( CR );
280 /**/ buf.append( " orientation=\"vertical\">" ).append( CR );
281
282 int size = tabList.size();
283 TabData tab ;
284 for( int i=0; i<size; i++ ) {
285 tab = tabList.get(i);
286 if( tab.isOpen() ) {
287 buf.append( tab.getTab( style ) ).append( CR );
288 }
289 else {
290 buf.append( tab.getTab( null ) ).append( CR );
291 }
292
293 if( orientation && (i != size-1) ) {
294 buf.append( "<ts:tabseparator />" ).append( CR );
295 }
296 }
297 buf.append( "<ts:tabseparator defaultstyle=\"width:100%;height:100%\" />" ).append( CR );
298
299 buf.append( " </ts:tabstrip>" ).append( CR );
300 buf.append( " </td>" ).append( CR );
301
302 buf.append( " <td style=\"width:100%;height:100%;\">" ).append( CR );
303 buf.append( " <mp:multipage id=\"omp\"" ).append( CR );
304 /**/ // buf.append( " style=\"border:solid 1px black;border-left:none;padding:5px;height:100%;width:100%;\">" ).append( CR );
305 /**/ buf.append( " style=\"border:solid 1px black;border-left:none;padding:5px;height:100%;\">" ).append( CR );
306
307 for( int i=0; i<size; i++ ) {
308 tab = tabList.get(i);
309 buf.append( tab.getTabBody() ).append( CR );
310 }
311 buf.append( " </mp:multipage>" ).append( CR );
312 buf.append( " </td>" ).append( CR );
313 buf.append( " </tr>" ).append( CR );
314 buf.append( "</table>" ).append( CR );
315 buf.append( JSV ).append( CR ); // vertical 時に IE7でサイズの取り方が異なる為の対策ã?
316
317 return buf.toString();
318 }
319
320 /**
321 * 設定すã‚?タブオブジェクトを、å?部変数(List)に追åŠ?�—ますã?
322 *
323 * BODY 部に記述されã�?タブオブジェクトをé ?•ªに追åŠ?�—ますã?
324 * タブã?インのタグをå?力するå?合も、このé ?•ªで作æ?しますã?
325 *
326 * @og.rev 3.8.6.1 (2006/10/20) action属æ?を追åŠ?
327 * @og.rev 3.8.6.2 (2006/11/01) realIndex は、å?めての OPENタブとしますã?
328 *
329 * @param data タブオブジェクãƒ?
330 */
331 protected void addTabData( final TabData data ) {
332 if( tabList == null ) { tabList = new ArrayList<TabData>(); }
333 tabList.add( data );
334
335 // タブが選択されてã�?‚Œば、その値を選択番号とするã€?
336 if( realIndex < 0 && data.isOpen() ) {
337 realIndex = tabList.size()-1 ;
338 }
339 }
340
341 /**
342 * selectedIndex で設定されたタブかどã�?�‹を判断して返しますã?
343 *
344 * こã?メソãƒ?ƒ‰呼び出しã?、各タブから1回のみ有効としますã?
345 * 呼び出すたびに、å?部変数 realTabCount をカウントアãƒ??しますã?
346 * つまりã?そã?数がã?タブã?個数に対応しますã?
347 * タブã?、DELETE と判断されるケースがあるためã?実際の数より少なく登録されますã?
348 * そã?ときに、ここで自åˆ??身が選択されてã�?‚‹ことを判断して、実際の選択タブを
349 * JavaScript にæŒ?®šするときに使用しますã?
350 *
351 * @og.rev 3.8.6.2 (2006/11/01) 新規作æ?
352 *
353 * @return 選択タブかどã�?�‹
354 */
355 protected boolean isSelected() {
356 realTabCount ++ ;
357 return (selectedIndex == realTabCount) ;
358 }
359
360 /**
361 * 【å»?¢】タブã?方向ã?横åž?horizontal)か縦åž?vertical)を指定しまã�?初期値:横åž?ã€?
362 *
363 * @og.tag
364 * タブã?、上にタブが並ぶ横型と左にタブが並ぶ縦型がありますã?
365 * こã?属æ?では、横型ã?、horizontal 、縦型ã?、vertical を指定しますã?
366 * æŒ?®šã?、文字å?のæœ??のä¸?–‡字を見てã�?‚‹ã�?�‘ですã?で、HかVでも構いませんã€?
367 * 初期値は、横åž?horizontal) ですã?
368 *
369 * @param ori タブã?方向ã?横åž?horizontal)か縦åž?vertical)を指å®?
370 * @deprecated クラスがå»?¢されましたã€?
371 */
372 @Deprecated public void setOrientation( final String ori ) {
373 String ori2 = nval( getRequestParameter( ori ),null );
374 if( ori2 != null && ori2.length() > 0 ) {
375 char ch = ori2.toUpperCase(Locale.JAPAN).charAt( 0 );
376 if( ch == 'H' ) { orientation = true; }
377 else if( ch == 'V' ) { orientation = false; }
378 else {
379 String errMsg = "orientation のæŒ?®šã?、H(orizontal) またã?、V(ertical) ですã?"
380 + " orientation=" + ori2 ; // 5.1.8.0 (2010/07/01) errMsg 修正
381 throw new HybsSystemException( errMsg );
382 }
383 }
384 }
385
386 /**
387 * 【å»?¢】タブã?高さをã?% 、px 、またã? "auto" でæŒ?®šしますã?
388 *
389 * @og.tag
390 * 縦åž?orientation="vertical")の初期値はã€?auto" ですã?
391 * 横åž?orientation="horizontal")の初期値はã€?200px"ですã?
392 * 横型ã?場合ã?ã€?auto" に設定するとã€?«˜さã�?"0" になってしまã�?�¾すã?
393 * å¿?�š、なにかã?値(px)でæŒ?®šするå¿?¦�がありますã?
394 * 縦åž?で "auto" に設定すると、各タブ毎に中の記述æƒ??によって、タブã?
395 * 大きさが替わりますã?タブをåˆ?‚Š替えた時にã€?�•和感がなã�?§˜にするにはã€?
396 * 高さを固å®?px æŒ?®?するとよいですã?
397 *
398 * @param ht 高さ (% 、px 、またã? "auto" )
399 * @deprecated クラスがå»?¢されましたã€?
400 */
401 @Deprecated public void setHeight( final String ht ) {
402 height = nval( getRequestParameter( ht ),height );
403 }
404
405 /**
406 * 【å»?¢】タブã?å¹?‚’ % 、px 、またã? "auto" でæŒ?®šしますã?
407 *
408 * @og.tag
409 * 縦åž?orientation="vertical")の初期値はã€?auto" ですã?
410 * 横åž?orientation="horizontal")の初期値はã€?100%"ですã?
411 * ※ 縦型ã?場合ã?å¹?�« px で数字を設定してもã?有効に作用しませんã€?
412 *
413 * @param wh å¹?(% 、px 、またã? "auto" )
414 * @deprecated クラスがå»?¢されましたã€?
415 */
416 @Deprecated public void setWidth( final String wh ) {
417 width = nval( getRequestParameter( wh ),width );
418 }
419
420 /**
421 * 【å»?¢】å?期表示するペã?ジ番号を指定しまã�?初期値:0)ã€?
422 *
423 * @og.tag
424 * タブテーブルには、è¤?•°のタブを含みますã?初期表示時にどのタブを
425 * 表示するかをæŒ?®šしますã?
426 * ペã?ジ番号はã€?から始まる数字ですã?
427 * 初期値はã€?ですã?
428 *
429 * @og.rev 3.7.1.1 (2005/05/23) 新規作æ?
430 *
431 * @param no 初期表示するペã?ジ番号(0..)
432 * @deprecated クラスがå»?¢されましたã€?
433 */
434 @Deprecated public void setSelectedIndex( final String no ) {
435 selectedIndex = nval( getRequestParameter( no ),selectedIndex );
436 }
437
438 /**
439 * 【å»?¢】å?期表示時ã?タブに与えã‚?style 属æ?を指定しますã?
440 *
441 * @og.tag
442 * ts:tab 本体では、å?期選択時のスタイルシートを、defaultStyle と
443 * selectedStyle で与えるå¿?¦�がありますã?これは、id 属æ?を設定してã€?
444 * 外部でスタイルシートを定義する形式でæŒ?®šできませんã€?
445 * ここでæŒ?®šしã�?style 属æ? は、å?別の tabTag に与えã‚?style 属æ? より優先度は
446 * 低くなりますã?
447 *
448 * @og.rev 3.8.6.1 (2006/10/24) 新規追åŠ?
449 *
450 * @param st タブに与えã‚?初期 style 属æ?
451 * @deprecated クラスがå»?¢されましたã€?
452 */
453 @Deprecated public void setStyle( final String st ) {
454 style = nval( getRequestParameter( st ),style );
455 }
456
457 /**
458 * こã?オブジェクトã?æ–?—å?表現を返しますã?
459 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
460 *
461 * @return こã?クラスのæ–?—å?表現
462 */
463 @Override
464 public String toString() {
465 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
466 .println( "VERSION" ,VERSION )
467 .println( "height" ,height )
468 .println( "width" ,width )
469 .println( "selectedIndex" ,selectedIndex )
470 .println( "Other..." ,getAttributes().getAttribute() )
471 .fixForm().toString() ;
472 }
473 }