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 static org.opengion.fukurou.util.StringUtil.nval;
019
020 import java.io.IOException;
021 import java.io.ObjectInputStream;
022 import java.io.ObjectOutputStream;
023 import java.util.ArrayList;
024 import java.util.List;
025 import java.util.Locale;
026
027 import org.opengion.fukurou.util.StringUtil;
028 import org.opengion.fukurou.util.TagBuffer;
029 import org.opengion.fukurou.util.XHTMLTag;
030 import org.opengion.hayabusa.common.HybsSystem;
031 import org.opengion.hayabusa.common.HybsSystemException;
032 import org.opengion.hayabusa.db.DBTableModel;
033 import org.opengion.hayabusa.db.DBTableModelUtil;
034
035 /** タブ形式ã?リンクを表示するタグですã?
036 *
037 * こã?タグ形式ã?実æ?は、リンクのリストであるため、実ã?画面の表示はターゲãƒ?ƒˆを指定して
038 * 別フレーãƒ?�§行うå¿?¦�がありますã?
039 *
040 * タブã?æŒ?®š方法につã�?�¦は、listType属æ?のæŒ?®šにより、クエリ発è¡?DB)により動的に生æ?する
041 * パターンと、タグæŒ?®?TAG)によりã€?�™çš?�«生æ?するパターンがありますã?
042 * listType属æ?に何もæŒ?®šされてã�?�ªã�??合ã?、Body部åˆ?�«記述されたå?容により、è?動判定されますã?
043 * ("SELECT"で始まってã�?‚‹場合ã?DB、それ以外ã?TAGとして処ç�?
044 *
045 * â‘?istType属æ?ã�?DB"の場å�?
046 * 検索された各カラãƒ??、そのé ?•ªにより次の意味を持ちますã?
047 * [第1カラãƒ? タブã?名前 : リンク時ã?キーæƒ??、後述のopenTabName属æ?のキーとしても使用 ※å¿??
048 * [第2カラãƒ? タブã?表示名称 : タブã?表示名称 æŒ?®šがなã�??合ã?、第1カラãƒ?�Œ表示名称となりますã?
049 * [第3カラãƒ? タブã?リンクå…?RL : タブã?リンクå…?RL æŒ?®šがなã�??合ã?、href属æ?の値が適用されますã?
050 * [第4カラãƒ? タブã?クラス属æ? : 個別のタブに付加されるクラス属æ? æŒ?®šがなã�??合ã?、unselClass属æ?の値が適用されますã?
051 * [第5カラãƒ? タブã?ロールズ : タブã?ロールズを指定しますã?ユーザーロールズとä¸??しなã�?Œ‡定したå?合ã?、タブが表示されなくなりますã?
052 * [第6カラãƒ? タブã?選択可否 : タブã?選択可否ã‚?true'or'false'でæŒ?®šしますã?falseを指定したå?合ã?、タブが表示されなくなりますã?
053 * (ロールズで選択不可になってã�?‚‹場合ã?、この値は無視されまã�?
054 * å�?‚«ラãƒ??値は[カラãƒ?��]=[値]の形で、リンク先ã?JSPに引数として渡されますã?
055 * またã?リンク先ã?JSPにつã�?�¦は、href属æ?でæŒ?®šしますã?
056 *
057 * ②listType属æ?ã�?TAG"の場å�?
058 * tabListタグを記述しã?個別にタブを定義しますã?
059 * 制御可能なé ?›®は、①DBの場合と同等ですã?
060 * タブã?名前を定義するname属æ?は、tabListタグでå¿?�š定義するå¿?¦�がありますã?
061 * lbl属æ?が指定されてã�?�ªã�??合ã?、name属æ?のラベル名称を取得しますã?
062 * タブã?リンクå…?SP及ã?、クラス属æ?につã�?�¦は、tabListタグでæŒ?®šがなã�??合ã?tabListタグの値が適用されますã?
063 *
064 * [共通設定]
065 * 初期設定では、第1番目の"有効な"タブが自動的に開かれますã?(="true")
066 * å�?‚¿ブã?表示方法でã€?�¸択不可能なタブが存在してã�?‚‹場合ã?、それらを読み飛ã?した上でã€?有効な"タブを
067 * 検索しますã?
068 * またã?自動で開くタブã?、openTabName属æ?でæŒ?®š可能であり、これに変数を定義することでã€?
069 * 画面リロード時もã?開いてã�?�Ÿタブを再度選択された状態で表示することが可能ですã?
070 *
071 * 選択したタブ及び非選択ã?タブã?æž?·šや、背景色等を変更する場合ã?、custom.cssでクラスを定義しã?
072 * 変更して下さã�??
073 *
074 * タブã?表示方å�?水平方å�?or 垂直方å�?につã�?�¦は、orientation属æ?で変更することが可能ですã?
075 * (初期値は、水平方å�?
076 * 水平方向にした場合ã?、listCount属æ?により強制çš?�«ä¸?®š数のタブを表示する毎に、改行を挿入することができますã?
077 *
078 * こã?タグを使用する場合ã?、headタグでå¿?�šuseTabLink="true"を指定してJavaScriptをロードして下さã�??
079 *
080 * å�?±žæ?は、{@XXXX} 変数が使用できますã?
081 * これは、ServletRequest から、XXXX をキーに値を取りå?ã�?こã?変数に割り当てますã?
082 * つまりã?こã?XXXXをキーにリクエストすれã?、この変数に値をセãƒ?ƒˆすることができますã?
083 *
084 * @og.formSample
085 * ●形式ï¼?lt;og:tabLink href="…" … />
086 * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
087 *
088 * ●Tag定義??
089 * <og:tabLink
090 * listType 【TAG】タブã?ä¸?¦§をどこから取得するかを指定しまã�?初期値:AUTO)
091 * href 【TAG】リンク先ã?JSPを指定しまã�?初期値:result.jsp)
092 * target 【TAG】リンクのターゲãƒ?ƒˆを指定しまã�?初期値:RESULT)
093 * openTab 【TAG】リンク表示にタブリンクをè?動で開くかどã�?�‹[true/false]を指定しまã�?初期値:true[=開く])
094 * openTabName 【TAG】最初に開くタブリンクの名前を指定しまã�?
095 * constKeys 【TAG】次画面に渡す定数パラメーターのキーを指定しまã�?
096 * constVals 【TAG】次画面に渡す定数パラメーターの値を指定しまã�?
097 * listCount 【TAGã€?行辺りに表示するタブã?数を指定しまã�?初期値:10)
098 * selClass 【TAG】選択タブã?クラスを指定しまã�?初期値:selTab)
099 * unselClass 【TAG】非選択タブã?クラスを指定しまã�?初期値:unselTab)
100 * orientation 【TAG】タブã?方向ã?横åž?Horizontal)か縦åž?Vertical)を指定しまã�?初期値:横åž?
101 * width 【TAG】タブリンクのå¹?‚’ % 、px 、またã? "auto" でæŒ?®šしまã�?
102 * height 【TAG】タブã?高さをã?% 、px 、またã? "auto" でæŒ?®šしまã�?
103 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
104 * > ... Body ...
105 * </og:tabLink>
106 *
107 * ●使用ä¾?
108 * â‘?Bからタブリストを取得するå?å�?
109 *
110 * Body部åˆ?�«記述されたクエリよりタブä¸?¦§を生成しますã?
111 *
112 * <og:tabLink
113 * listType = "DB" タブã?ä¸?¦§をどこから取得するか
114 * href = "result.jsp" リンク先ã?JSP
115 * target = "RESULT" リンクターゲãƒ?ƒˆ
116 * openTab = "[true/false]" タブ表示後にタブを自動で開く
117 * openTabName = "{@PN} 自動で開くタブã?名前
118 * constKeys = "KEY1" 次画面に固定で渡すキーä¸?¦§
119 * constVals = "{@VAL1}" 次画面に固定で渡すå?ä¸?¦§
120 * listCount = "10" 1行辺りに表示するタブã?数
121 * selClass = "selTab" 選択タブã?クラス
122 * unselClass = "unselTab" 非選択タブã?クラス
123 * width = "100px" タブリンクのå¹?
124 * height = "50px" タブリンクの高さ
125 * >
126 * select PN,HINM,'tabClass','query.jsp','ADMIN','false' from XX01 where PN = '{@PN}' order by PN
127 * </og:tabLink>
128 *
129 * ②tabListタグからタブリストを生æ?する場å�?
130 *
131 * tabListタグよりタブä¸?¦§を生成しますã?
132 *
133 * <og:tabLink
134 * listType = "DB" タブã?ä¸?¦§をどこから取得するか
135 * href = "result.jsp" リンク先ã?JSP
136 * target = "RESULT" リンクターゲãƒ?ƒˆ
137 * openTab = "[true/false]" タブ表示後にタブを自動で開く
138 * openTabName = "{@PN} 自動で開くタブã?名前
139 * constKeys = "KEY1" 次画面に固定で渡すキーä¸?¦§
140 * constVals = "{@VAL1}" 次画面に固定で渡すå?ä¸?¦§
141 * listCount = "10" 1行辺りに表示するタブã?数
142 * selClass = "selTab" 選択タブã?クラス
143 * unselClass = "unselTab" 非選択タブã?クラス
144 * width = "100px" タブリンクのå¹?
145 * height = "50px" タブリンクの高さ
146 * >
147 * <og:tabList name="TAB1" href="result1.jsp" keys="PN,CDK" vals="ABC,V" />
148 * <og:tabList name="TAB2" href="result2.jsp" keys="PN,CDK" vals="BCD,W" />
149 * <og:tabList name="TAB3" href="result3.jsp" keys="PN,CDK" vals="CDE,X" />
150 * </og:tabLink>
151 *
152 * @og.group 画面表示
153 *
154 * @version 0.9.0 2008/09/26
155 * @author Nakamura
156 * @since JDK1.4,
157 */
158 public class TabLinkTag extends CommonTagSupport {
159 private static final String VERSION = "5.1.8.0 (2010/07/01)";
160 private static final long serialVersionUID = 518020100701L;
161
162 /** リストã?ulタグのclass属æ? */
163 private static final String UL_TAG_START = "<ul class=\"tabList\">";
164 private static final String UL_TAG_END = "</ul>";
165
166 /** タブ表示をå?れ替えるためのJavaScript関数 */
167 private static final String CHANGE_TAB_SCRIPT = "changeTab";
168 private static final String INITIAL_TAB_SCRIPT = "initialTabSelect";
169 // "<script type=\"text/javascript\">addEvent(window,\"load\", initialTabSelect);</script>";
170
171 /** 自動で開くタブに付加されるID */
172 private static final String FIRST_TAB_ID = "firstTab";
173
174 /** リスト取得タイプã?Enum */
175 private static enum LIST_TYPE { AUTO, DB, TAG };
176
177 /** å†?ƒ¨変数 */
178 private String query = null;
179 private transient List<TabData> tabData = new ArrayList<TabData>();
180
181 /** タグで設定する属æ? */
182 private LIST_TYPE type = LIST_TYPE.AUTO;
183 private String href = "result.jsp";
184 private String target = "RESULT";
185 private boolean openTab = true;
186 private String openTabName = null;
187 private String[] constKeys = null;
188 private String[] constVals = null;
189 private int listCount = 10;
190 private String selClass = "selTab";
191 private String unselClass = "unselTab";
192 private boolean isHorizontal = true;
193 private String width = "auto";
194 private String height = "auto";
195
196 /**
197 * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
198 *
199 * @return 後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
200 */
201 @Override
202 public int doStartTag() {
203 return( EVAL_BODY_BUFFERED ); // Body を評価する
204 }
205
206 /**
207 * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
208 *
209 * @return 後続å?ç�??æŒ?¤º(SKIP_BODY)
210 */
211 @Override
212 public int doAfterBody() {
213 query = getBodyString().trim();
214 return ( SKIP_BODY );
215 }
216
217 /**
218 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
219 *
220 * @og.rev 4.3.5.0 (2008/02/01) 処ç�?�Šびå†?ƒ¨構é?を大å¹?�«見直ã�?
221 *
222 * @return 後続å?ç�??æŒ?¤º
223 */
224 @Override
225 public int doEndTag() {
226 debugPrint();
227 int rtnCode = EVAL_PAGE;
228
229 // 種別の自動判定å?ç�?
230 if( type == LIST_TYPE.AUTO ) {
231 if( query == null || query.length() == 0 ) {
232 type = LIST_TYPE.TAG;
233 }
234 else {
235 if( query.toUpperCase( Locale.JAPAN ).indexOf( "SELECT" ) >= 0 ) {
236 type = LIST_TYPE.DB;
237 }
238 else {
239 type = LIST_TYPE.TAG;
240 }
241 }
242 }
243
244 if( type == LIST_TYPE.DB ) {
245 makeTabsFromQuery();
246 }
247 else if( type == LIST_TYPE.TAG ) {
248 makeTabsFromTag();
249 }
250
251 // リンクä¸?¦§が何も設定されてã�?�ªã�??合ã?、å?ç�?�—なã�?
252 // if( tabData.size() > 0 ) {
253 if( ! tabData.isEmpty() ) {
254 makeTag();
255 }
256
257 return( rtnCode );
258 }
259
260 /**
261 * タグリブオブジェクトをリリースしますã?
262 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
263 */
264 @Override
265 protected void release2() {
266 super.release2();
267 query = null;
268 tabData = new ArrayList<TabData>();
269 type = LIST_TYPE.AUTO;
270 href = "result.jsp";
271 target = "RESULT";
272 openTab = true;
273 openTabName = null;
274 constKeys = null;
275 constVals = null;
276 listCount = 10;
277 selClass = "selTab";
278 unselClass = "unselTab";
279 isHorizontal = true;
280 width = "auto";
281 height = "auto";
282 }
283
284 /**
285 * DBからタブリンクのä¸?¦§を作æ?しますã?
286 * DBTableModelが作æ?されなã�?行数ã�?の場å�?は、リンクä¸?¦§は生æ?されませんã€?
287 */
288 private void makeTabsFromQuery() {
289 DBTableModel table = DBTableModelUtil.makeDBTable( query, new String[0], getResource(), getApplicationInfo() );
290 if( table == null || table.getRowCount() == 0 ) {
291 return;
292 }
293
294 boolean isSetLabel = false;
295 boolean isSetHref = false;
296 boolean isSetClazz = false;
297 boolean isSetRoles = false;
298 boolean isSetVisible = false;
299 if( table.getColumnCount() > 1 ) { isSetLabel = true; }
300 if( table.getColumnCount() > 2 ) { isSetHref = true; }
301 if( table.getColumnCount() > 3 ) { isSetClazz = true; }
302 if( table.getColumnCount() > 4 ) { isSetRoles = true; }
303 if( table.getColumnCount() > 5 ) { isSetVisible = true; }
304
305 int rowCount = table.getRowCount();
306 String key = table.getColumnName( 0 );
307 for( int row=0; row<rowCount; row++ ) {
308 String value = table.getValue( row, 0 );
309 String label = ( isSetLabel ? StringUtil.nval( table.getValue( row, 1 ), value ) : value );
310 String newHref = ( isSetHref ? StringUtil.nval( table.getValue( row, 2 ), href ) : href );
311 String clazz = ( isSetClazz ? StringUtil.nval( table.getValue( row, 3 ), unselClass ) : unselClass );
312 boolean visible = ( isSetRoles ? getUser().isAccess( table.getValue( row, 4 ) ) : true );
313 if( visible ) {
314 visible = ( isSetVisible ? Boolean.valueOf( table.getValue( row, 5 ) ) : true );
315 }
316
317 // 第1カラãƒ??カラãƒ?��とそã?値はリンクの引数に含める
318 newHref = XHTMLTag.addUrlEncode( newHref, XHTMLTag.urlEncode( key, value ) );
319
320 if( visible ) { // visible=falseの場合ã?表示しなã�?
321 tabData.add( new TabData( newHref, value, label, clazz, visible ) );
322 }
323 }
324 }
325
326 /**
327 * タブリストからタブリンクのä¸?¦§を作æ?しますã?
328 * (予めaddTagメソãƒ?ƒ‰により、リンクä¸?¦§が登録されてã�?‚‹ため、ここでは何も処ç�?�—ません)
329 *
330 * @see #addTag( String, String, String, String, boolean, String[], String[] )
331 */
332 private void makeTabsFromTag() {
333 // 何もありませんã€?PMD エラー回避)
334 }
335
336 /**
337 * 子タグであるタブリストタグからタブ情報をセãƒ?ƒˆしますã?
338 *
339 * @param hr 画面URL
340 * @param name タブã?名前
341 * @param label タブã?表示名称
342 * @param clz 非選択状態ã?タブに付加するclasså�?
343 * @param visible タブが選択可能(中身を表示できるかどã�?�‹)
344 * @param keys リンク先ã?JSPに渡すキーä¸?¦§
345 * @param vals リンク先ã?JSPに渡すå?ä¸?¦§
346 */
347 protected void addTag( final String hr, final String name, final String label, final String clz
348 ,final boolean visible, final String[] keys, final String[] vals ) {
349 String newHref = StringUtil.nval( hr, href );
350 if( keys != null && keys.length > 0 ) {
351 newHref = XHTMLTag.addUrlEncode( newHref, XHTMLTag.urlEncode( keys, vals ) );
352 }
353
354 if( visible ) { // visible=falseの場合ã?表示しなã�?
355 tabData.add( new TabData( newHref, name, StringUtil.nval( label, getLabel( name ) ), StringUtil.nval( clz, unselClass ), visible ) );
356 }
357 }
358
359 /**
360 * リンクä¸?¦§からHTMLタグを作æ?しますã?
361 *
362 * @og.rev 5.0.2.0 (2009/11/01) openTab属æ?がfalseの場合でもã?openTabNameにæŒ?®šされたタブに色付けするã€?
363 * @og.rev 5.1.4.0 (2010/03/01) FF対å¿?FirstTabのID付加に関するバグを修正
364 */
365 private void makeTag() {
366 StringBuilder buf = new StringBuilder();
367 buf.append( HybsSystem.CR );
368
369 boolean isExistFirst = false;
370 for( int idx=0; idx<tabData.size(); idx++ ) {
371 TabData tab = tabData.get( idx );
372
373 if( idx % listCount == 0 ) {
374 if( idx > 0 ) {
375 buf.append( UL_TAG_END ).append( HybsSystem.CR );
376 }
377 buf.append( UL_TAG_START ).append( HybsSystem.CR );
378 }
379
380 // openTabNameが定義されてã�?�ªã�??合ã?ã€?番目の有効なタブを開く
381 // 5.1.4.0 (2010/03/01) バグ修正
382 if( !isExistFirst && tab.visible
383 && ( openTabName == null || openTabName.length() == 0 || openTabName.equals( tab.name ) ) ) {
384 buf.append( tab.makeLiTag( idx, true ) );
385 isExistFirst = true;
386 }
387 else {
388 buf.append( tab.makeLiTag( idx, false ) );
389 }
390 }
391 buf.append( UL_TAG_END ).append( HybsSystem.CR );
392
393 // タブを自動で開くためのJavaScriptタグを発è¡?
394 // 5.1.4.0 (2010/03/01) FF対å¿?
395 if( openTab || ( openTabName != null && openTabName.length() > 0 ) ) {
396 buf.append( "<script type=\"text/javascript\">addEvent(window,\"load\", function() { " + INITIAL_TAB_SCRIPT + "(" );
397 buf.append( openTab );
398 buf.append( "); } );</script>" );
399 }
400
401 jspPrint( buf.toString() );
402 }
403
404 /**
405 * Tabãƒ??タ を管ç�?�—てã�?‚‹ å†?ƒ¨クラス
406 *
407 * タブã?æƒ??を管ç�?�™るためã?簡易的な、å?部クラスですã?
408 */
409 private final class TabData {
410 // 引数として初期設定される変数
411 private final String href;
412 private final String name;
413 private final String label;
414 private final String clazz;
415 // 現状の実è£?�§は、visible=falseは渡ってきませんがã?å°?�¥çš?�«disableの状態で
416 // 表示したã�??合等に対応するため残しておきますã?
417 private final boolean visible;
418
419 /**
420 * コンストラクタ
421 *
422 * @param hr 画面URL
423 * @param nm タブã?名前
424 * @param lbl タブã?表示名称
425 * @param clz 非選択状態ã?タブに付加するclasså�?
426 * @param vsb タブが選択可能(中身を表示できるかどã�?�‹)
427 */
428 public TabData( final String hr, final String nm, final String lbl, final String clz, final boolean vsb ) {
429 href = hr;
430 name = nm;
431 label = lbl;
432 clazz = clz;
433 visible = vsb;
434 }
435
436 /**
437 * liタグの部åˆ??æ–?—å?を生成しますã?
438 *
439 * @param idx 生æ?したタブã?インãƒ?ƒƒクス番号
440 * @param isFirst 始めの有効なタブかどã�?�‹
441 * @return liタグæ–?—å?
442 */
443 private String makeLiTag( final int idx, final boolean isFirst ) {
444 StringBuilder buf = new StringBuilder();
445 buf.append( "<li class=\"" ).append( clazz ).append( "\"" );
446 buf.append( " style=\"" );
447 buf.append( " width: " ).append( width ).append( ";" );
448 buf.append( " height: " ).append( height ).append( ";" );
449 // 水平方向ã?場合ã?みfloat:leftを付加しã?回り込み(+解除)を行うã€?
450 if( isHorizontal ) {
451 buf.append( " float: left;" );
452 if( idx % listCount == 0 ) {
453 // 行が変わったタイミングで、テキストã?折り返しをクリア??·¦マã?ジン(+10px)を空ける
454 buf.append( " clear: left; margin-left: " );
455 // buf.append( Math.round( idx/listCount ) * 10 ).append( "px;" );
456 // 4.3.4.4 (2009/01/01) Math.roundを呼び出す意味がなã�?�Ÿめ削除
457 buf.append( (idx/listCount) * 10 ).append( "px;" );
458 }
459 }
460 buf.append( " \"" );
461 buf.append( ">" );
462 buf.append( makeLinkTag( isFirst ) );
463 buf.append( "</li>" ).append( HybsSystem.CR );
464
465 return buf.toString();
466 }
467
468 /**
469 * aタグの部åˆ??æ–?—å?を生成しますã?
470 * タブが選択不可能な状態ã?場合ã?、タブã?表示æ–?—å?をそのまま返しますã?
471 *
472 * @og.rev 4.3.6.4 戻るã?タンがでなã�?•�題への対å¿?
473 *
474 * @param isFirst 始めの有効なタブかどã�?�‹
475 * @return liタグæ–?—å?
476 */
477 private String makeLinkTag( final boolean isFirst ) {
478 // if( !visible ) { return label; }
479
480 String newHref = XHTMLTag.addUrlEncode( href, XHTMLTag.urlEncode( constKeys, constVals ) );
481 // 4.3.6.4 (2009/05/01)
482 // タブ画面から遷移した時に、タブã?読込により、画面IDが消えてしまã�?
483 // 戻るã?タンがでなã�?¸�å?合への対å¿?
484 newHref = XHTMLTag.addUrlEncode( newHref, "GAMENID=" + getGUIInfoAttri( "KEY" ) );
485 TagBuffer tag = new TagBuffer( "a" );
486 tag.add( "href", newHref );
487 tag.add( "name", name );
488 tag.add( "target", target );
489 tag.add( "onClick", CHANGE_TAB_SCRIPT + "( this, \"" + selClass + "\" );" );
490 if ( isFirst ) {
491 tag.add( "id", FIRST_TAB_ID );
492 }
493 tag.setBody( label );
494
495 return tag.makeTag();
496 }
497 }
498
499 /**
500 * 【TAG】タブã?ä¸?¦§をどこから取得するかを指定しまã�?初期値:AUTO)ã€?
501 *
502 * @og.tag
503 * タブã?ä¸?¦§をどこから取得するかを指定しますã?
504 * 現状の実è£?�§は、クエリを発行してä¸?¦§を生成するã?DB」と、子タグである
505 * tabListタグをå?挙してタブを定義する「TAG」が実è£?�•れてã�?�¾すã?
506 *
507 * またã?「AUTO」とæŒ?®šしたå?合ã?、Body部åˆ??å†?®¹に応じて自動的に判定されますã?
508 * 初期値はã€?½¢AUTO」ですã?
509 *
510 * @param tp タブä¸?¦§取得方æ³?「AUTOã€?
511 */
512 public void setListType( final String tp ) {
513 String typeStr = nval( getRequestParameter( tp ), null );
514 try {
515 type = LIST_TYPE.valueOf( typeStr );
516 }
517 catch ( IllegalArgumentException ex ) {
518 StringBuilder errBuf = new StringBuilder( 100 );
519 errBuf.append( "listType は" );
520 for ( LIST_TYPE obj : LIST_TYPE.values() ) {
521 errBuf.append( ',' );
522 errBuf.append( obj.name() );
523 }
524 errBuf.append( "から選んでくださいã€? );
525 throw new HybsSystemException( errBuf.toString(), ex );
526 }
527 }
528
529 /**
530 * 【TAG】リンク先ã?JSPを指定しまã�?初期値:result.jsp)ã€?
531 *
532 * @og.tag
533 * リンク先ã?JSPを指定しますã?
534 * こã?タブリンクは、あくまで「タブã?形をしたリンク」なのでã€?
535 * target属æ?と合わせてセãƒ?ƒˆするå¿?¦�がありますã?
536 * 初期値はã€?½¢result.jsp」ですã?
537 *
538 * @param hr リンク先ã?JSP
539 */
540 public void setHref( final String hr ) {
541 href = nval( getRequestParameter( hr ), href );
542 }
543
544 /**
545 * 【TAG】リンクのターゲãƒ?ƒˆを指定しまã�?初期値:RESULT)ã€?
546 *
547 * @og.tag
548 * リンクのターゲãƒ?ƒˆを指定しますã?
549 * こã?タブリンクは、あくまで「タブã?形をしたリンク」なのでã€?
550 * target属æ?を設定し、別のフレーãƒ?�«実画面を表示するようにしますã?
551 * 初期値はã€?½¢RESULT」ですã?
552 *
553 * @param tgt リンクターゲãƒ?ƒˆ
554 */
555 public void setTarget( final String tgt ) {
556 target = nval( getRequestParameter( tgt ), target );
557 }
558
559 /**
560 * 【TAG】リンク表示にタブリンクをè?動で開くかどã�?�‹[true/false]を指定しまã�?初期値:true[=開く])ã€?
561 *
562 * @og.tag
563 * リンク表示にタブリンクをè?動で開くかをæŒ?®šしますã?
564 * openTabName属æ?が指定されてã�?�ªã�??合ã?自動で開くタブã?
565 * ã€?番目に表示されたタブリンク」ですã?
566 * æŒ?®šされてã�?‚‹場合ã?、その名前を持つã€?番目」ã?タブが自動で開かれますã?
567 * タブが選択不可能な状態ã?場合ã?、ã?1番目」ã?条件から除外されますã?
568 * 初期値は、ã?true(開く)」ですã?
569 *
570 * @param flag タブ表示後に自動でタブを開くか[true:自動で開く/false:開かない]
571 */
572 public void setOpenTab( final String flag ) {
573 openTab = nval( getRequestParameter( flag ), openTab );
574 }
575
576 /**
577 * 【TAG】最初に開くタブリンクの名前を指定しますã?
578 *
579 * @og.tag
580 * æœ??に開くタブリンクのキーを指定しますã?
581 *
582 * @param name æœ??に開くタブリンクの名前
583 */
584 public void setOpenTabName( final String name ) {
585 openTabName = nval( getRequestParameter( name ), openTabName );
586 }
587
588 /**
589 * 【TAG】次画面に渡す定数パラメーターのキーを指定しますã?
590 *
591 * @og.tag
592 * 次画面に渡す定数パラメーターのキーを指定しますã?
593 * キーはカンマ区åˆ?‚Šでè¤?•°æŒ?®šが可能ですã?
594 * パラメーターの値は、constVals属æ?の数とä¸??してã�?‚‹å¿?¦�がありますã?
595 *
596 * @param keys 定数パラメーターのキー
597 * @see #setConstVals( String )
598 */
599 public void setConstKeys( final String keys ) {
600 constKeys = getCSVParameter( keys );
601 }
602
603 /**
604 * 【TAG】次画面に渡す定数パラメーターの値を指定しますã?
605 *
606 * @og.tag
607 * 次画面に渡す定数パラメーターの値を指定しますã?
608 * 値はカンマ区åˆ?‚Šでè¤?•°æŒ?®šが可能ですã?
609 * パラメーターの値は、constKeys属æ?の数とä¸??してã�?‚‹å¿?¦�がありますã?
610 *
611 * @param vals 定数パラメーターのキー
612 * @see #setConstKeys( String )
613 */
614 public void setConstVals( final String vals ) {
615 constVals = getCSVParameter( vals );
616 }
617
618 /**
619 * 【TAGã€?行辺りに表示するタブã?数を指定しまã�?初期値:10)ã€?
620 *
621 * @og.tag
622 * 1行辺りに表示するタブã?数を指定しますã?
623 * 1行辺りã?タブã?数がこの設定をè¶?�ˆると、è?動的に折り返しますã?
624 * またã?折り返し毎に、左に10pxのマã?ジンを設けますã?
625 * 初期値はã€?0ですã?
626 * こã?属æ?は、orientationがHorizontal(水平方å�?の場合ã?み有効ですã?
627 *
628 * @param cnt 1行辺りに表示するタブã?数
629 */
630 public void setListCount( final String cnt ) {
631 listCount = nval( getRequestParameter( cnt ), listCount );
632 }
633
634 /**
635 * 【TAG】選択タブã?クラスを指定しまã�?初期値:selTab)ã€?
636 *
637 * @og.tag
638 * タブが選択されてã�?‚‹状態にある場合ã?、タブ部åˆ??クラス名をæŒ?®šしますã?
639 * こã?クラス名を変更する場合ã?、そのクラスをcustom/custom.css等で再定義して下さã�??
640 * 初期値は、selTabですã?
641 *
642 * @param cls 選択タブã?クラスå�?
643 */
644 public void setSelClass( final String cls ) {
645 selClass = nval( getRequestParameter( cls ), selClass );
646 }
647
648 /**
649 * 【TAG】非選択タブã?クラスを指定しまã�?初期値:unselTab)ã€?
650 *
651 * @og.tag
652 * タブが選択されてã�?�ªã�?ж態にある場合ã?、タブ部åˆ??クラス名をæŒ?®šしますã?
653 * こã?クラス名を変更する場合ã?、そのクラスをcustom/custom.css等で再定義して下さã�??
654 * 初期値は、unselTabですã?
655 *
656 * @param cls 選択タブã?クラスå�?
657 */
658 public void setUnselClass( final String cls ) {
659 unselClass = nval( getRequestParameter( cls ), unselClass );
660 }
661
662 /**
663 * 【TAG】タブã?方向ã?横åž?Horizontal)か縦åž?Vertical)を指定しまã�?初期値:横åž?ã€?
664 *
665 * @og.tag
666 * タブã?、上にタブが並ぶ横型と左にタブが並ぶ縦型がありますã?
667 * こã?属æ?では、横型ã?、Horizontal 、縦型ã?、Vertical を指定しますã?
668 * æŒ?®šã?、文字å?のæœ??のä¸?–‡字を見てã�?‚‹ã�?�‘ですã?で、HかVでも構いませんã€?
669 *
670 * 縦åž?Vertical)にした場合ã?å�?‚¿ブ要ç´??、フレーãƒ?‚µイズのå¹?�«合わせて
671 * æœ?¤§で表示されますã?å¹?‚’固定するå?合ã?、width属æ?を指定して下さã�??
672 *
673 * 初期値は、横åž?Horizontal) ですã?
674 *
675 * @param ori タブã?方向ã?横åž?Horizontal)か縦åž?Vertical)を指å®?
676 */
677 public void setOrientation( final String ori ) {
678 String ori2 = nval( getRequestParameter( ori ),null );
679 if( ori2 != null && ori2.length() > 0 ) {
680 char ch = ori2.toUpperCase(Locale.JAPAN).charAt( 0 );
681 if( ch == 'H' ) { isHorizontal = true; }
682 else if( ch == 'V' ) { isHorizontal = false; }
683 else {
684 String errMsg = "orientation のæŒ?®šã?、H(orizontal) またã?、V(ertical) ですã?"
685 + " orientation=" + ori2 ; // 5.1.8.0 (2010/07/01) errMsg 修正
686 throw new HybsSystemException( errMsg );
687 }
688 }
689 }
690
691 /**
692 * 【TAG】タブリンクのå¹?‚’ % 、px 、またã? "auto" でæŒ?®šしますã?
693 *
694 * @og.tag
695 * 初期値はã€?auto"(自動設å®? ですã?
696 * autoの場合ã?横型表示では、文字ã?å¹?�«合わせて自動的に調整されã€?
697 * 縦型表示の場合ã?、フレーãƒ?‚µイズに合わせて拡大して表示されますã?
698 *
699 * @param wh å¹?(% 、px 、またã? "auto" )
700 */
701 public void setWidth( final String wh ) {
702 width = nval( getRequestParameter( wh ),width );
703 }
704
705 /**
706 * 【TAG】タブã?高さをã?% 、px 、またã? "auto" でæŒ?®šしますã?
707 *
708 * @og.tag
709 * タブã?高さをã?% 、px 、またã? "auto" でæŒ?®šしまã�?
710 * 初期値はã€?auto"(自動設å®? ですã?
711 *
712 * @param ht 高さ (% 、px 、またã? "auto" )
713 */
714 public void setHeight( final String ht ) {
715 height = nval( getRequestParameter( ht ),height );
716 }
717
718 /**
719 * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
720 *
721 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
722 *
723 * @param strm ObjectOutputStreamオブジェクãƒ?
724 * @throws IOException 入出力エラーが発生したå?å�?
725 */
726 private void writeObject( final ObjectOutputStream strm ) throws IOException {
727 strm.defaultWriteObject();
728 }
729
730 /**
731 * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
732 *
733 * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
734 *
735 * @og.rev 5.1.8.0 (2010/07/01) tabData の初期化å?ç�?追åŠ?
736 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
737 *
738 * @param strm ObjectInputStreamオブジェクãƒ?
739 * @see #release2()
740 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
741 * @throws ClassNotFoundException クラスを見つけることができなかったå?å�?
742 */
743 private void readObject( final ObjectInputStream strm ) throws IOException, ClassNotFoundException {
744 strm.defaultReadObject();
745 tabData = new ArrayList<TabData>();
746 }
747
748 /**
749 * こã?オブジェクトã?æ–?—å?表現を返しますã?
750 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
751 *
752 * @return こã?クラスのæ–?—å?表現
753 */
754 @Override
755 public String toString() {
756 return org.opengion.fukurou.util.ToString.title(this.getClass().getName() )
757 .println( "VERSION" , VERSION )
758 .println( "listType" , type.toString() )
759 .println( "href" , href )
760 .println( "target" , target )
761 .println( "openTab" , openTab )
762 .println( "openTabName" , openTabName )
763 .println( "constKeys" , constKeys )
764 .println( "constVals" , constVals )
765 .println( "listCount" , listCount )
766 .println( "selClass" , selClass )
767 .println( "unselClass" , unselClass )
768 .println( "isHorizontal" , isHorizontal )
769 .println( "width" , width )
770 .println( "height" , height )
771 .println( "Other...", getAttributes().getAttribute() ).fixForm().toString();
772 }
773 }