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 */
016package org.opengion.hayabusa.taglib;
017
018import static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.IOException;
021import java.io.ObjectInputStream;
022import java.io.ObjectOutputStream;
023import java.util.ArrayList;
024import java.util.List;
025import java.util.Locale;
026import java.util.Map;
027
028import org.opengion.fukurou.util.StringUtil;
029import org.opengion.fukurou.util.XHTMLTag;
030import org.opengion.hayabusa.common.HybsSystem;
031import org.opengion.hayabusa.common.HybsSystemException;
032import org.opengion.hayabusa.db.DBColumn;
033import org.opengion.hayabusa.db.DBColumnConfig;
034import org.opengion.hayabusa.db.DBEditConfig;
035import org.opengion.hayabusa.db.DBLastSql;
036import org.opengion.hayabusa.db.DBTableModel;
037import org.opengion.hayabusa.db.DBTableModelSorter;
038import org.opengion.hayabusa.html.FormatterType;
039import org.opengion.hayabusa.html.TableFormatter;
040import org.opengion.hayabusa.html.ViewCrossTableParam;
041import org.opengion.hayabusa.html.ViewForm;
042import org.opengion.hayabusa.html.ViewFormFactory;
043import org.opengion.hayabusa.html.ViewMarker;
044import org.opengion.hayabusa.resource.RoleMode;
045import org.opengion.hayabusa.resource.UserInfo;
046import org.opengion.hayabusa.resource.GUIInfo;
047
048/**
049 * データベースの検索結果を表示するタグです。
050 *
051 * 検索結果は、DBTableModel にセットされます。
052 * このタグに、データ(DBTableModel)と、
053 * コントローラ(ViewForm)を与えて、 外部からコントロールすることで、テキストフィールドやテーブルの形で表示したり、
054 * 入力可/不可、表示可/不可の設定を行うことができます。
055 *
056 * @og.formSample
057 * ●形式:<og:view />
058 *     <og:view
059 *         viewFormType = "HTMLTable"
060 *         command      = "{@command}"
061 *         startNo      = "0"
062 *         pageSize     = "20"
063 *         language     = "ja" />
064 *
065 *     viewFormType : ViewFormオブジェクトを作成する時のキー(オプション)     ViewFormFactory参照
066 *     command      : 処理コマンド( PREV,NEXT,FIRST,LAST,VIEW )(オプション)
067 *     startNo      : データの書き始めの初期値を指定(オプション)
068 *     pageSize     : データのページ数(画面表示件数)を指定(オプション)
069 *     language     : ロケール(オプション)
070 *
071 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
072 *
073 * ●Tag定義:
074 *   <og:view
075 *       viewFormType       【TAG】ViewForm オブジェクトを作成するクラス({@og.doc03Link viewFormType ViewForm_**** クラス})を指定します
076 *       command            【TAG】コマンド(PREV,NEXT,FIRST,LAST,NEW,RENEW,VIEW,REVIEW,RESET)をセットします
077 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
078 *       startNo            【TAG】表示データを作成する場合の表示の開始行番号をセットします
079 *       pageSize           【TAG】表示データを作成する場合の1ページの行数をセットします
080 *       pagePlus           【TAG】1ページの行数の増加分をセットします(初期値:0)
081 *       writable           【TAG】行が書き込み可能かどうか[true/false]を設定します (初期値:DBTableModel#DEFAULT_WRITABLE[=true])
082 *       checked            【TAG】行のチェックボックスの初期値を設定するかどうか[true/false]を指定します(初期値:null)
083 *       rowspan            【TAG】表示データを作成する場合のフォーマットの行数をセットします(初期値:2)
084 *       skip               【TAG】NEXT等で、選択行以外をスキップするのかどうか[true/false]を指定します (初期値:ViewForm#DEFAULT_SKIP[=false])
085 *       columnWritable     【TAG】書き込み可能カラム名を、カンマ区切りで与えます
086 *       noWritable         【TAG】書き込み不可カラム名を、カンマ区切りで与えます
087 *       columnDisplay      【TAG】表示可能カラム名を、カンマ区切りで与えます
088 *       clmSeqDisplay      【TAG】表示可能カラム名を、カラム順に、カンマ区切りで与えます
089 *       noDisplay          【TAG】表示不可カラム名を、カンマ区切りで与えます
090 *       columnGroup        【TAG】同一表示データをまとめる(表示しない)カラム名を、カンマ区切りで与えます
091 *       noGroup            【TAG】同一表示データをまとめないカラム名を、カンマ区切りで与えます
092 *       groupClass         【TAG】同一表示データをまとめる場合の、表示方法を指定します
093 *       tableSorterKeys    【TAG】カラム名リンクソートを表示するカラム名を、カンマ区切りで与えます
094 *       tableId            【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID
095 *       viewFormId         【TAG】(通常使いません)sessionから取得する ViewForm オブジェクトの ID
096 *       viewLinkId         【TAG】(通常つかいません)requestから取得する ViewLink に対応する Attributes オブジェクトの ID
097 *       viewMarkerId       【TAG】(通常使いません)requestから取得する ViewMarker に対応する Attributes オブジェクトの ID
098 *       editMarkerId       【TAG】(通常使いません)requestから取得する EditMarker に対応する Attributes オブジェクトの ID
099 *       selectedType       【TAG】表示時の選択用オブジェクトのタイプ[checkbox/radio/hidden]を指定します(初期値:checkbox)
100 *       numberType         【TAG】表示時の行番号の表示方法[sequence/none/delete/skip=カラム名/view=カラム名]を指定します(初期値:sequence)
101 *       optionTypeAttributes        【TAG】テーブル等のチェックボックスに属性を付加します
102 *       noMessage          【TAG】検索結果メッセージを表示しないかどうか[true/false]を設定します(初期値:false[表示する])
103 *       backLinkCount      【TAG】ページの先頭へのリンクの間隔をセットします (初期値:VIEW_BACK_LINK_COUNT[=0])
104 *       headerSkipCount    【TAG】ヘッダーを出力する間隔をセットします(初期値:システムパラメータ の VIEW_HEADER_SKIP_COUNT)
105 *       useCheckControl    【TAG】チェックボックスの全チェックを選択するJavaScript の機能を使用するかどうかを指定します (初期値:VIEW_USE_CHECK_CONTROL[=true])
106 *       useTableSorter     【TAG】ヘッダーにソート用リンクを作成するかどうか[true/false]を指定します (初期値:VIEW_USE_TABLE_SORTER[=true])
107 *       useParam           【TAG】パラメーターファイルの使用をするかどうか[true/false]を指定します(初期値:false)
108 *       useConsistency     【TAG】Consistency キー による整合性チェックを行うかどうか[true/false]を指定します(初期値:true)
109 *       bgColorCycle       【TAG】テーブルのバックグラウンドカラーの入れ替えのサイクルをセットします(初期値は、1:ゼブラ)
110 *       bgColorClsClm      【TAG】テーブルのバックグラウンドカラーのクラスに指定するカラム名を指定します
111 *       useScrollBar       【TAG】スクロールバー用のDIV要素を出力するかどうか[true/false]を指定します (初期値:VIEW_USE_SCROLLBAR[=true])
112 *       loadMarker         【TAG】viewLink や viewMarker の情報取り込みを制御する(初期値は、NEW,RENEW,REVIEW,RESET)
113 *       useSelectedRow     【TAG】SEL_ROW機能[true:有効/false:無効]を指定します (初期値:VIEW_USE_SELECTED_ROW[=true])
114 *       useSelRowColor     【TAG】SEL_ROW使用時の選択行色変更[true:有効/false:無効]を指定します (初期値:VIEW_USE_SELROW_COLOR[=true])
115 *       useHilightRow      【TAG】HILIGHT_ROW機能[true:有効/false:無効]を指定します (初期値:VIEW_USE_HILIGHT_ROW[=true])
116 *       useAfterHtmlTag    【TAG】 処理時間やページサイズなどの情報出力[true:有効/false:無効]を指定します(初期値:true)
117 *       writableControl    【TAG】設定値に "_" が含まれている場合にレンデラーを使用するカラムをCSV形式で指定します
118 *       popupReturnKeys    【TAG】ogPopup で検索結果の値を返すキーを、CSV形式で指定します
119 *       clazz              【TAG】table要素に対して class 属性を設定します(初期値:viewTable)
120 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
121 *       height             【TAG】ビューの高さを指定します
122 *       width              【TAG】ビューの幅を指定します
123 *       fileDwnClms        【TAG】ファイルダウンロード時の抜出カラム名(CSV形式)を指定します
124 *       skipNoEdit         【TAG】編集行のみを表示するかを指定します
125 *       noTransition       【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します
126 *       useHilightCheckOnly【TAG】選択行ハイライトの制御をチェックボックスのみで有効にするかを指定します (初期値:VIEW_USE_HILIGHT_CHECK_ONLY[=false])
127 *       columnBulkSet      【TAG】一括入力カラムのアシスト機能を利用するカラム名を、カンマ区切りで与えます
128 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
129 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
130 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true)
131 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true)
132 *       mainView           【TAG】(通常は使いません)セッションに情報を登録するかどうか[true/false]指定します。(初期値:true)
133 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
134 *   >   ... Body ...
135 *   </og:view>
136 *
137 * ●使用例
138 *       <og:view viewFormId="HTMLTable" command="NEW" startNo="0" pageSize="5" / >
139 *
140 * @og.group 画面表示
141 *
142 * @version  4.0
143 * @author       Kazuhiko Hasegawa
144 * @since    JDK5.0,
145 */
146public class ViewFormTag extends CommonTagSupport {
147        //* このプログラムのVERSION文字列を設定します。   {@value} */
148        private static final String VERSION = "5.7.7.3 (2014/06/27)" ;
149
150        private static final long serialVersionUID = 577320140627L ;
151
152        /** command 引数に渡す事の出来る コマンド  プレビュー {@value}  */
153        public static final String CMD_PREV  = "PREV" ;
154        /** command 引数に渡す事の出来る コマンド  ネクスト {@value}  */
155        public static final String CMD_NEXT  = "NEXT" ;
156        /** command 引数に渡す事の出来る コマンド  ファースト {@value}  */
157        public static final String CMD_FIRST = "FIRST";
158        /** command 引数に渡す事の出来る コマンド  ラスト {@value}  */
159        public static final String CMD_LAST  = "LAST" ;
160        /** command 引数に渡す事の出来る コマンド  新規 {@value}  */
161        public static final String CMD_NEW       = "NEW" ;
162        /** command 引数に渡す事の出来る コマンド  再検索 {@value}  */
163        public static final String CMD_RENEW = "RENEW" ;
164        /** command 引数に渡す事の出来る コマンド  表示 {@value}  */
165        public static final String CMD_VIEW  = "VIEW" ;
166        /** command 引数に渡す事の出来る コマンド  再表示 {@value}  */
167        public static final String CMD_REVIEW  = "REVIEW" ;
168        /** command 引数に渡す事の出来る コマンド  リセット {@value}  */
169        public static final String CMD_RESET  = "RESET" ;
170        /** command 引数に渡す事の出来る コマンド リスト  */
171        private static final String[] COMMAND_LIST = new String[] {
172                        CMD_PREV , CMD_NEXT , CMD_FIRST , CMD_LAST , CMD_NEW , CMD_RENEW , CMD_VIEW , CMD_REVIEW , CMD_RESET };
173
174        // 3.8.0.8 (2005/10/03)
175        /** コマンドリストに存在しない場合の値 従来の CMD_VIEW と区別させるため。 */
176        private static final String CMD_XXX  = "XXX" ;
177
178        private   static final String START_NO_KEY              = "startNo";
179        private   static final String PAGE_SIZE_KEY     = "pageSize";
180        private   static final String PAGE_PLUS_KEY     = "pagePlus";
181
182        // 3.5.6.3 (2004/07/12) スクロールバー用のDIV 要素属性定義
183
184        private String          tableId                 = HybsSystem.TBL_MDL_KEY;
185        private String          viewFormId              = HybsSystem.VIEWFORM_KEY;
186        private String          viewFormType    = null;
187        private String          viewLinkId              = HybsSystem.VIEWLINK_KEY;
188        private String          viewMarkerId    = HybsSystem.VIEW_MARK_KEY;
189        private String          editMarkerId    = HybsSystem.EDIT_MARK_KEY;             // 3.8.6.1 (2006/10/20)
190        private String          command                 = null;
191        private int                     startNo                 = -1;           // HTML画面上の表示開始位置(初期値)
192        private int                     tempStartNo             = -1;           // 再検索時の表示開始位置
193        private int                     pageSize                = -1;           // HTML画面上に表示する件数
194        private int                     pagePlus                = -1;           // 3.5.6.4 (2004/07/16)
195        private transient DBTableModel  table           = null;
196        private transient ViewForm              form            = null;
197        private String          columnWritable  = null;
198        private String          noWritable              = null;
199        private String          columnDisplay   = null;
200        private String          noDisplay               = null;
201        private String          clmSeqDisplay   = null;         // 5.1.6.0 (2010/05/01) ViewForm_HTMLSeqClmTable 対応
202        private String          columnGroup             = null;         // 3.8.5.0 (2006/03/20)
203        private String          noGroup                 = null;         // 5.1.8.0 (2010/07/01)
204        private String          groupClass              = null;         // 5.1.8.0 (2010/07/01)
205        private boolean         noMessage               = false;
206        private String          writable                = null;
207        private String          checked                 = null;
208        private boolean         skip                    = ViewForm.DEFAULT_SKIP;
209        private String          rowspan                 = "2";
210        private String          selectedType    = "checkbox";
211        private String          numberType              = "sequence";           // 3.5.1.0 (2003/10/03) 追加
212        private String          optTypeAttri    =  null;
213        private int                     backLinkCount   = HybsSystem.sysInt( "VIEW_BACK_LINK_COUNT" );
214        private int                     headerSkipCount = HybsSystem.sysInt( "VIEW_HEADER_SKIP_COUNT" );        // 0:通常ヘッダ、n:n回ごとに現れる
215        private List<TableFormatter>              values                  = null;
216        private String          bodyString              = null;
217        private int                     useCheckControl = -1 ;
218        private String          useTableSorter  = null ;        // 3.5.4.7 (2004/02/06)
219
220        private long dyStart = 0;       // 3.5.4.7 (2004/02/06) 実行時間測定用のDIV要素を出力します。
221        private boolean         useParam                = false;        // 3.5.4.8 (2004/02/23) パラメータTagの使用を宣言します。
222        private Map<String,String> viewParam = null;      // 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを受け取ります。
223        private List<String[]> viewArrayList = null; // 5.5.9.0 (2012/12/03) viewObjectから変更
224        
225        private transient DBLastSql        lastSql      ;       // 5.8.6.0 (2015/04/03) 6.0.2.4一部移植
226        private transient DBEditConfig editConf ;       // 5.8.6.0 (2015/04/03) 6.0.2.4一部移植
227        private int[]   editMarkerClmNos        ;               // 5.8.6.0 (2015/04/03) 6.0.2.4一部移植
228        private String  editColumnDisplay       = null; // 5.8.6.0 (2015/04/03)
229
230        // 3.5.5.8 (2004/05/20) 整合性チェックを行う為の、Consistency キー を出力するかどうかを指定します。
231        private boolean         useConsistency  = HybsSystem.sysBool( "USE_CONSISTENCY" ) ;
232
233        // 3.5.6.2 (2004/07/05) ゼブラ模様の指定を、ViewForm としてサポート
234        // 0(ゼブラなし)、-1(ワーニング)、-2以下(エラー)、1(ゼブラ)、2以上(行数まとめ)
235        private int bgColorCycle = 1 ;
236
237        // 5.1.8.0 (2010/07/01) 行に対して、動的にクラス属性を付与するカラム名を指定します。
238        private String bgColorClsClm = null;
239
240        private String          useScrollBar    = null ;
241
242        // 3.6.0.0 (2004/09/17) カラムソートリンクを出すカラム名を指定。
243        private String          sortKeys        = null;
244
245        // 3.6.0.4 (2004/10/14) viewLink や viewMarker の情報取り込みを制御
246        // 前後の , が重要です!
247        private String          loadMarker      = ",NEW,RENEW,REVIEW,RESET,";
248
249        // 3.7.1.1 (2005/05/23) SEL_ROW機能の有効/無効を指定します。
250        private String          useSelectedRow  = null ;
251
252        // 3.7.1.1 (2005/05/31) SEL_ROW機能使用時に、BG_COLOR_ROWSEL の使用 有/無を指定します。
253        private String          useSelRowColor  = null;
254
255        // 3.7.1.1 (2005/05/23) 処理時間やページサイズなどの情報出力の有効/無効を指定します。
256        private boolean         useAfterHtmlTag = true ;
257
258        // 3.8.0.9 (2005/10/17) 設定値に "_" が含まれている場合に、レンデラーを使用します。
259        private String          writableControl = null;
260
261        // 3.8.6.0 (2006/09/29) HILIGHT_ROW機能の有効/無効を指定します。
262        private String          useHilightRow   = null;
263
264        // 3.8.6.1 (2006/10/20) ogPopup で検索結果の値を返すキーを、CSV形式で指定します。
265        private String          popupReturnKeys = null ;
266
267        // 4.0.0 (2007/04/16) tableタグを出力するときに付与します。
268        private String          clazz                   = "viewTable";
269
270        // 4.2.0.0 (2008/03/18) ビューの幅と高さを指定できるようにします。
271        private String          height                  = null;
272        private String          width                   = null;
273
274        // 4.3.0.0 (2008/07/04) fileUD ファイルダウンロード時の抜出カラム名(CSV形式)
275        private String          fileDwnClms             = null ;
276
277        // 4.3.1.0 (2008/09/08)
278        private boolean         skipNoEdit              = false;
279
280        // 4.3.3.0 (2008/10/01)
281        private boolean         noTransition    = false;
282
283        // 4.3.7.0 (2009/06/01) HILIGHT_ROW機能有効時に制御を行チェックボックスのみにします。
284        private String          useHilightCheckOnly     = null;
285
286        // 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用するカラムを指定します。
287        private String          columnBulkSet   = null;
288        private boolean         useDefBulkset   = HybsSystem.sysBool( "VIEW_USE_DEFAULT_BULKSET" ) ;
289
290        // 5.7.6.1 (2014/05/09) startNoのセッション保存を指定します。
291        private boolean         isMainView              = true; 
292
293        // 5.7.7.3 (2014/06/27) MSG0085 Edit機能で指定しているカラム({0})が検索結果に存在しません。削除後、再作成して下さい。
294        private   String        editWarnwMsg    = "MSG0085";
295        
296        // 5.5.9.0 (2016/06/03) 6.4.6.1同様の対応。
297        private String  viewClass       ;                               // 今は、外部からの登録は行わない。
298
299        /**
300         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
301         *
302         * @og.rev 3.5.4.7 (2004/02/06) DBTableModelのソート機能 useTableSorter を追加
303         * @og.rev 3.5.4.7 (2004/02/06) 実行時間測定用に、開始時刻を取得します。
304         * @og.rev 3.5.4.8 (2004/02/23) useParam を、BODY部の処理判定に加えます。
305         * @og.rev 3.5.6.0 (2004/06/18) DBRowHeader のパッケージプライベート化に伴なう変更
306         * @og.rev 3.5.6.1 (2004/06/25) viewFormType変更時のviewForm 再セット
307         * @og.rev 3.5.6.2 (2004/07/05) command="VIEW" などで、ありえないとしていた処理を追加
308         * @og.rev 3.5.6.3 (2004/07/12) markerSet で table の整合性もチェックする。
309         * @og.rev 3.5.6.4 (2004/07/16) DBTableModelのソート時には、viewを初期設定する。
310         * @og.rev 3.6.0.0 (2004/09/17) scope が request の場合(検索)ヘッダーソートリンクは使えない。
311         * @og.rev 3.6.0.0 (2004/09/22) pageSize の form への設定見直し。
312         * @og.rev 3.6.0.0 (2004/09/25) viewLink , viewMarker のリクエストメモリ削除の中止
313         * @og.rev 3.6.0.4 (2004/10/14) viewLink や viewMarker の情報取り込みを制御する loadMarker を追加
314         * @og.rev 3.6.0.5 (2004/10/18) viewLink , viewMarker のリクエストメモリ削除を復活します。
315         * @og.rev 3.8.0.8 (2005/10/03) ヘッダーソート時に、startNo を 0 に戻します。
316         * @og.rev 3.8.8.5 (2007/03/09) markerSet する条件を強化する。
317         * @og.rev 3.8.8.9 (2007/05/29) ソート時のviewLink,viewMarker の取り込み
318         * @og.rev 3.8.9.3 (2007/08/28) soryKeysのみを指定した場合に、ソート用のテーブルモデルが作成されないバグを修正。
319         * @og.rev 4.1.0.0(2008/01/11)システムパラメータ(useCheckControl)の読取は doEndTag 関数から doStartTag 関数に移動します。
320         * @og.rev 5.1.6.0 (2010/05/01) ViewForm_HTMLSeqClmTable クラス によるカラム表示順処理を行います。
321         * @og.rev 5.1.6.0 (2010/05/01) 左右分割スクロール画面でヘッダースクロールが2回処理されるバグを修正
322         * @og.rev 5.1.6.0 (2010/05/01) ユーザー毎の画面項目並び替え対応
323         * @og.rev 5.1.7.0 (2010/06/01) ViewFormに画面IDをセットし、セットされた画面IDと同じ場合のみViewFormを復元する。
324         * @og.rev 5.1.7.0 (2010/06/01) DBColumnの{&#064;XXXX}変数対応
325         * @og.rev 5.1.7.0 (2010/06/01) ヘッダーソート後に画面遷移し、戻ってきた際にstartNoがクリアされるバグを修正
326         * @og.rev 5.1.8.0 (2010/07/01) 全チェックを押した状態で画面遷移した場合にチェック状態を保持する。
327         * @og.rev 5.1.8.0 (2010/07/01) 同時設定不可(columnWritable,noWritable,columnDisplay,noDisplay,columnGroup,noGroup) チェック
328         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
329         * @og.rev 5.3.0.0 (2010/12/01) 左右分割スクロール(SplitViewTag)対応
330         * @og.rev 5.3.6.0 (2011/06/01) Edit機能見直し
331         * @og.rev 5.4.1.0 (2011/11/01) 5.1.8.0 (2010/07/01)の全チェック保持機能を廃止
332         * @og.rev 5.8.6.0 (2015/04/03) OrgClmNames対応
333         * @og.rev 5.8.8.0 (2015/06/05) エラーメッセージリソース化
334         * @og.rev 5.9.9.0 (2016/06/03) 6.4.6.1同等対応(利用目的を明確にするため、パラメータ名をviewClassに変更)
335         *
336         * @return      後続処理の指示
337         */
338        @Override
339        public int doStartTag() {
340                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
341                if( !useTag() ) { return SKIP_BODY ; }  // Body を評価しない
342                
343                //5.9.9.0
344                // SplitViewTag を使う場合は、再設定されるので、初期設定をここで行っておく。
345                viewClass = "VIEW_" + tableId ;
346
347                // 5.3.0.0 (2010/12/01) 左右分割スクロール(SplitViewTag)対応
348                splitViewParamSet();
349                
350                // 5.1.8.0 (2010/07/01) 同時設定不可(columnWritable,noWritable,columnDisplay,noDisplay,columnGroup,noGroup) チェック
351                if( columnWritable != null && noWritable != null ) {
352                        String errMsg = "columnWritable と noWritable は同時に指定できません。"
353                                                        + "columnWritable = [" + columnWritable
354                                                        + "] , noWritable = [" + noWritable
355                                                        + "]";
356                        throw new HybsSystemException( errMsg );
357                }
358
359                if( columnDisplay != null && noDisplay != null ) {
360                        String errMsg = "columnDisplay と noDisplay は同時に指定できません。"
361                                                        + "columnDisplay = [" + columnDisplay
362                                                        + "] , noDisplay = [" + noDisplay
363                                                        + "]";
364                        throw new HybsSystemException( errMsg );
365                }
366
367                if( columnGroup != null && noGroup != null ) {
368                        String errMsg = "columnGroup と noGroup は同時に指定できません。"
369                                                        + "columnGroup = [" + columnGroup
370                                                        + "] , noGroup = [" + noGroup
371                                                        + "]";
372                        throw new HybsSystemException( errMsg );
373                }
374
375                dyStart = System.currentTimeMillis();
376                table = (DBTableModel)getObject( tableId );
377                if( table == null ) { return SKIP_BODY ; }
378
379                // 5.1.6.0 (2010/05/01)ViewForm_HTMLSeqClmTable クラス によるカラム表示順処理を行います。
380                // clmSeqDisplay 属性が設定されていると、クラス指定を変更し、columnDisplay に、clmSeqDisplay を
381                // 設定し、noDisplay を、削除(null をセット)します。
382                if( clmSeqDisplay != null ) {
383                        viewFormType    = "HTMLSeqClmTable" ;
384                        columnDisplay   = clmSeqDisplay;
385                        noDisplay               = null;
386                }
387                
388                // 5.8.6.0 (2015/04/03)
389                final String guikey = getGUIInfoAttri( "KEY" );
390                lastSql = (DBLastSql)getSessionAttribute( HybsSystem.DB_LAST_SQL_KEY );
391                // ここではtableId,scope,項目名などで厳密にチェックを行います。
392                if( lastSql != null && lastSql.isGuiMatch( guikey ) && lastSql.isTableMatch( tableId, getScope() ) ) {
393                        final String editName = getRequestValue( "editName" );
394                        if( editName != null ) {
395                                editConf = getUser().getEditConfig( guikey, editName );
396                                if( editConf != null ){
397                                        makeEditTable( editConf );
398                                }
399                        }
400                }
401                
402//              // 5.1.6.0 (2010/05/01) seqClmTableを使用するかどうかをチェックします
403//              // 5.3.6.0 (2011/06/01) Edit機能見直しによりメソッド名変更
404//              String editName = getRequestValue( "editName" );
405//              if( editName != null ) {
406//                      String guikey = getGUIInfoAttri( "KEY" );
407//                      DBEditConfig config = getUser().getEditConfig( guikey, editName );
408//                      if( config != null ) {
409//                              makeEditTable( config );
410//                      }
411//              }
412
413                // 5.1.7.0 (2010/06/01) DBColumnの{@XXXX}変数対応
414                int clmSize = table.getColumnCount();
415                for( int clmNo=0; clmNo<clmSize; clmNo++ ) {
416                        DBColumn dbColumn = table.getDBColumn( clmNo );
417                        if ( dbColumn.isNeedsParamParse() ){
418                                DBColumnConfig config = dbColumn.getConfig();
419                                config.setRendererParam( getRequestParameter( config.getRendererParam() ) );
420                                config.setEditorParam( getRequestParameter( config.getEditorParam() ) );
421                                DBColumn newColumn = new DBColumn( config );
422                                table.setDBColumn( clmNo, newColumn );
423                        }
424                }
425
426                // 3.8.8.9 (2007/05/29) ソート時の viewLink,viewMarker の取り込み
427                boolean useSorter = false;
428
429                // 3.5.4.7 (2004/02/06) DBTableModelのソート機能 追加
430                // 登録後に同じソート順で再表示させるために、リクエストキャッシュに登録します。
431                // 3.8.9.3 (2007/08/28) soryKeysのみを指定した場合に、ソート用のテーブルモデルが作成されないバグを修正。
432                // 5.1.6.0 (2010/05/01) 左右分割スクロール画面でヘッダースクロールが2回処理されるバグを修正
433                if( "session".equals( getScope() )
434                        && ( nval( useTableSorter,sysBool( "VIEW_USE_TABLE_SORTER" ) ) || sortKeys != null )
435                        && !( table.getConsistencyKey().equals( getRequestAttribute( HybsSystem.VIEW_SORT_KEY ) ) ) ) {
436
437                        String clm = getRequestValue( HybsSystem.SORT_COLUMNS );
438                        // 若干トリッキー。初めてクリックされるまで、DBTableModelSorter は作成しない。
439                        if( clm != null && clm.length() > 0 ) {
440                                useSorter = true;       // 3.8.8.9 (2007/05/29)
441                                startQueryTransaction( tableId );               // 3.6.0.8 (2004/11/19)
442                                int clmNo = table.getColumnNo( clm );
443                                boolean sortAscending = nval( getRequestValue( HybsSystem.SORT_ASCENDING ),true );
444                                if( table instanceof DBTableModelSorter ) {
445                                        if( !CMD_RESET.equals( command ) ) {
446                                                ((DBTableModelSorter)table).sortByColumn( clmNo );
447                                        }
448                                        sortAscending = ((DBTableModelSorter)table).isAscending() ;     // ソート方向
449                                }
450                                else {
451                                        DBTableModelSorter temp = new DBTableModelSorter();
452                                        temp.setModel( table );
453                                        temp.sortByColumn( clmNo,sortAscending );
454                                        table = temp;
455                                }
456                                // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
457                                if( ! commitTableObject( tableId, table ) ) {
458//                                      jspPrint( "ViewFormTag Query処理が割り込まれました。DBTableModel は登録しません。" );
459                                        jspPrint( "ViewFormTag " + getResource().getLabel( "ERR0041" ) ); // 5.8.8.0 (2015/06/05)
460                                        return SKIP_PAGE;
461                                }
462                                if( CMD_VIEW.equals( command ) ) {
463                                        setRequestCacheData( HybsSystem.SORT_COLUMNS,clm );
464                                        setRequestCacheData( HybsSystem.SORT_ASCENDING,String.valueOf( sortAscending ) );
465                                }
466
467                                // 5.1.6.0 (2010/05/01)
468                                setRequestAttribute( HybsSystem.VIEW_SORT_KEY, table.getConsistencyKey() );
469
470                                // 3.8.0.8 (2005/10/03) ヘッダーソート時に、startNo を 0 に戻します。
471                                // 5.1.7.0 (2010/06/01) ヘッダーソート後に画面遷移し、戻ってきた際にstartNoがクリアされるバグを修正
472                                if( !CMD_RENEW.equals( command ) ) {
473                                        startNo = 0;
474                                        tempStartNo = startNo;
475                                }
476                        }
477                }
478
479                if( CMD_NEW.equals( command ) || CMD_RENEW.equals( command ) || CMD_REVIEW.equals( command ) || CMD_RESET.equals( command ) ) {
480                        form = ViewFormFactory.newInstance( viewFormType );             // 3.5.6.1 (2004/06/25)
481                        form.init( table );
482                        table.setDefaultRowWritable( DBTableModel.DEFAULT_WRITABLE );
483                        table.setDefaultRowChecked(  DBTableModel.DEFAULT_CHECKED );
484                }
485                else {
486                        // 3.5.6.1 (2004/06/25) viewFormType変更時のviewForm 再セット
487                        ViewForm oldForm = (ViewForm)getObject( viewFormId );
488                        // 5.1.7.0 (2010/06/01) ViewFormに画面IDをセットし、セットされた画面IDと同じ場合のみViewFormを復元する。
489                        if( oldForm != null && getGUIInfoAttri( "KEY" ).equals( oldForm.getGamenId() ) ) {
490                                if( oldForm.getViewFormType().equals( viewFormType ) ) {
491                                        form = oldForm ;
492                                }
493                                else {
494                                        form = ViewFormFactory.newInstance( viewFormType );
495                                }
496                                form.init( table );
497                                // 3.5.6.3 (2004/07/12) markerSet で table の整合性もチェックする。
498                                DBTableModel oldTable = oldForm.getDBTableModel();
499                                if( table.getConsistencyKey().equals( oldTable.getConsistencyKey() ) ) {
500                                        // 3.8.8.5 (2007/03/09) markerSet する条件を強化する。
501                                        // 3.8.8.9 (2007/05/29) ソート時の viewLink,viewMarker の取り込み
502                                        if( "true".equalsIgnoreCase( loadMarker ) ||
503                                                loadMarker.indexOf( "," + command + "," ) >= 0 ||
504                                                useSorter ) {
505                                                        form.markerSet( oldForm );
506                                        }
507                                }
508                        }
509                        else {
510                                // 3.5.6.2 (2004/07/05) command="VIEW" などで、ありえないとしていた処理を追加
511                                form = ViewFormFactory.newInstance( viewFormType );
512                                form.init( table );
513                        }
514                }
515
516                // 5.1.7.0 (2010/06/01) ViewFormに画面IDをセットし、セットされた画面IDと同じ場合のみViewFormを復元する。
517                form.setGamenId( getGUIInfoAttri( "KEY" ) );
518
519                // 3.6.0.4 (2004/10/14) ViewMarker 等のセットは、loadMarker で制御します。
520                if( "true".equalsIgnoreCase( loadMarker ) ||
521                        loadMarker.indexOf( "," + command + "," ) >= 0 ) {
522                        ViewMarker viewLink = (ViewMarker)getRequestAttribute( viewLinkId );
523                        if( viewLink != null ) {
524                                form.setViewLink( viewLink );
525                                removeRequestAttribute( viewLinkId );   // 3.6.0.5 (2004/10/18) 復活
526                        }
527
528                        ViewMarker viewMarker = (ViewMarker)getRequestAttribute( viewMarkerId );
529                        if( viewMarker != null ) {
530                                form.setViewMarker( viewMarker );
531                                removeRequestAttribute( viewMarkerId ); // 3.6.0.5 (2004/10/18) 復活
532                        }
533
534                        // 3.8.6.1 (2006/10/24) editMarker を追加する。
535                        ViewMarker editMarker = (ViewMarker)getRequestAttribute( editMarkerId );
536                        if( editMarker != null ) {
537                                form.setEditMarker( editMarker );
538                                removeRequestAttribute( editMarkerId );
539                                editMarkerClmNos = editMarker.getColumnNos(); // 5.8.6.0 (2015/04/03)
540                        }
541                }
542                // 3.8.0.5 (2005/08/26) false の場合は、無条件に、form のviewLinkとViewMarkerをクリアします。
543                if( "false".equalsIgnoreCase( loadMarker ) ) {
544                        form.setViewLink( null );
545                        form.setViewMarker( null );
546                        form.setEditMarker( null );             // 3.8.6.1 (2006/10/24)
547                }
548                // 4.1.0.0(2008/01/11)システムパラメータ(useCheckControl)の読取は doEndTag 関数から doStartTag 関数に移動します。
549                if( useCheckControl < 0 ) {
550                        useCheckControl = intCase( sys( "VIEW_USE_CHECK_CONTROL" ) ) ;
551                }
552                setTableRowWritable( table );
553
554                setDefaultParameter();
555
556        //      if( pagePlus != 0 ) {   ※ なぜ != だったのか謎。pagePlusがマイナス時は?
557                if( pagePlus > 0 ) {
558                        form.setPageSize( pageSize + pagePlus );
559                }
560                else {
561                        form.setPageSize( pageSize );                           // 3.6.0.0 (2004/09/22) 追加
562                }
563
564                // 3.5.4.8 (2004/02/23)
565                if( form.canUseFormat() || useParam ) { return EVAL_BODY_BUFFERED ; }   // JSP API 1.2
566
567                return SKIP_BODY ;
568        }
569
570        /**
571         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
572         *
573         * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行vう。
574         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。ボディが存在する場合のみボディが呼ばれる対応。
575         * @og.rev 3.5.4.0 (2003/11/25) 外部からフォーマットが指定されない場合は、内部のフォーマットを登録する。
576         * @og.rev 5.1.7.0 (2010/06/01) フォーマットの{&#064;XXXX}の値に[が含まれる場合は、サイニタイズ("\\]\\"に変換)する。
577         *
578         * @return      後続処理の指示(SKIP_BODY)
579         */
580        @Override
581        public int doAfterBody() {
582                bodyString = getSanitizedBodyString();
583                return SKIP_BODY ;
584        }
585
586        /**
587         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
588         *
589         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
590         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
591         * @og.rev 3.5.0.0 (2003/03/28) noClass 属性の追加。および、ロジック整理。
592         * @og.rev 3.5.1.0 (2003/10/03) numberType 属性の追加
593         * @og.rev 3.5.2.0 (2003/10/20) headerSkipCount属性を追加
594         * @og.rev 3.5.2.0 (2003/10/20) form が null の場合の条件分岐を追加
595         * @og.rev 3.5.3.1 (2003/10/31) Table系のViewで、skip属性を使用する。
596         * @og.rev 3.5.4.0 (2003/11/25) command="RESET"時に、戻った画面のpageSize がクリアされてしまう対応。
597         * @og.rev 3.5.4.0 (2003/11/25) フォーマット文字列を、TableFormatter オブジェクトを使用するように変更。
598         * @og.rev 3.5.4.1 (2003/12/01) startNo を隠しフィールドに持つ処理を廃止。(キャッシュを使用)
599         * @og.rev 3.5.4.3 (2004/01/05) useCheckControl属性を追加
600         * @og.rev 3.5.4.7 (2004/02/06) DBTableModelのソート機能 useTableSorter を追加
601         * @og.rev 3.5.4.7 (2004/02/06) makeStartNoKeyメソッドの廃止(setRequestCacheDataを利用)
602         * @og.rev 3.5.4.7 (2004/02/06) 実行時間測定用のDIV要素を出力しておきます。
603         * @og.rev 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを追加します。
604         * @og.rev 3.5.5.5 (2004/04/23) DBTableModel の整合性パラメータを hidden で出力します。
605         * @og.rev 3.5.5.8 (2004/05/20) makeConsistencyKey メソッドに処理ロジックを移します。
606         * @og.rev 3.5.6.2 (2004/07/05) bgColorCycle 変数の追加。
607         * @og.rev 3.5.6.4 (2004/07/16) スクロールバー用のDIV要素の出力(開始)
608         * @og.rev 3.6.0.0 (2004/09/17) カラムソートリンクを出すカラム名を指定。
609         * @og.rev 3.6.0.0 (2004/09/22) pageSize の hidden 出力は、初期設定値とします。
610         * @og.rev 3.7.0.3 (2005/03/01) 指定の行番号まで画面をスクロールさせる機能を追加。
611         * @og.rev 3.7.1.1 (2005/05/23) 処理時間やページサイズなどの情報出力の有効/無効を指定します。
612         * @og.rev 3.8.0.3 (2005/07/15) ヘッダー固定のスクロールタイプをセットします。
613         * @og.rev 3.8.0.9 (2005/10/17) writableControl 属性を追加します。
614         * @og.rev 3.8.6.0 (2006/09/29) useHilightRow 属性を追加します。
615         * @og.rev 3.8.6.1 (2006/10/20) ポップアップで値を返すカラム文字列(CSV形式)
616         * @og.rev 4.0.0.0 (2007/11/27) ヘッダーカラムのエディター、レンデラー適用対応
617         * @og.rev 4.1.2.0 (2008/03/12) columnWritable,noWritable に、"null" を指定可能とする。
618         * @og.rev 4.2.0.0 (2008/03/18) ビューの高さ、幅の指定を可能にします。
619         * @og.rev 4.2.1.0 (2008/04/11) null チェック方法変更
620         * @og.rev 4.3.0.0 (2008/07/04) ロールモードによる設定
621         * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。抜き出すカラムを指定します。
622         * @og.rev 4.3.1.0 (2008/09/08) canUseFormatのエラーハンドリングは各サブクラスで行う。editOnly属性対応。
623         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
624         * @og.rev 4.3.6.0 (2009/04/01) eventColumn対応
625         * @og.rev 4.3.7.0 (2009/06/01) 行ハイライト機能でチェックボックスでのみON/OFFができるオプションを追加
626         * @og.rev 4.3.8.0 (2009/08/01) noTransition値取得メソッド名変更
627         * @og.rev 5.1.3.0 (2010/02/01) noTransitionのコントロールは、requestで行う。
628         * @og.rev 5.1.6.0 (2010/05/01) fileDwnClmsが指定されない場合は、Viewで表示されたカラムをセット
629         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
630         * @og.rev 5.1.7.0 (2010/06/01) HilightRow用のDivは必ず出す(画面遷移なし登録(JavaScript)の正規表現でマッチさせるため))
631         * @og.rev 5.1.8.0 (2010/07/01) form.setNoGroup( noGroup ) , form.setGroupClass( groupClass ) 追加
632         * @og.rev 5.1.8.0 (2010/07/01) form.setBgColorClsClm( bgColorClsClm ) 追加
633         * @og.rev 5.1.8.0 (2010/07/01) Divを必ず出すのは、画面遷移なし登録の場合のみとする(CustomData対応)
634         * @og.rev 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用するカラムを指定します。(columnBulkSet)
635         * @og.rev 5.2.2.0 (2010/11/01) useHeaderColumn 属性を、ViewCrossTableParam.USE_HEADER_COLUMN をキーに、取得する
636         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
637         * @og.rev 5.5.8.3 (2012/11/17) viewObject追加
638         * @og.rev 5.5.9.0 (2012/12/03) viewObjectをviewArrayListに変更
639         * @og.rev 5.7.6.1 (2014/05/09) mainView対応
640         * @og.rev 5.8.6.0 (2015/04/03) OrgClmNames対応
641         * @og.rev 5.9.5.3 (2016/02/25) formにtableIdを渡す
642         * @og.rev 5.9.9.0 (2016/06/03) 6.4.6.1同等対応(利用目的を明確にするため、パラメータ名をviewClassに変更)
643         * @og.rev 5.9.14.1 (2016/11/11) bulkSetをnullと出来るようにする
644         * @of.rev 5.9.15.0 (2016/12/2) 6.2.5.0 Edit機能でも、条件によっては、書き込み許可するので、特殊処理廃止
645         *
646         * @return      後続処理の指示
647         */
648        @Override
649        public int doEndTag() {
650                debugPrint();           // 4.0.0 (2005/02/28)
651                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
652                if( !useTag() ) { return EVAL_PAGE ; }
653
654                // noTransition = isNoTransitionRequest() || noTransition; // 4.3.3.0 (2008/10/01) 追加
655                noTransition = isNoTransitionRequest(); // 5.1.3.0 (2010/02/01)
656                if( form == null ) { return EVAL_PAGE ; }       // 3.5.2.0 (2003/10/20)
657                if( form.canUseFormat() ) {
658                        if( values == null && bodyString != null && !useParam ) {
659                                TableFormatter format = new TableFormatter();
660                                format.setFormatType( FormatterType.TYPE_HEAD );
661                                format.setFormat( bodyString );
662                                format.setRowspan( rowspan );
663                                values = new ArrayList<TableFormatter>();
664                                values.add( format );
665                                form.setFormatterList( values );
666                        }
667                        else if( values != null ) {
668                                form.setFormatterList( values );
669                        }
670                }
671
672                if( table != null ) {
673                        // 4.2.0.0 (2008/03/18) ビューの高さ、幅を指定する。null回避はAbstractViewFormで行う
674                        form.setHeight( height );
675                        form.setWidth( width );
676
677                        form.setColumnWritable( columnWritable );
678                        form.setNoWritable( noWritable );
679                        form.setColumnDisplay( columnDisplay );
680                        form.setNoDisplay( noDisplay );
681                        form.setColumnGroup( columnGroup );                             // 3.8.5.0 (2006/03/20)
682                        form.setNoGroup( noGroup );                                             // 5.1.8.0 (2010/07/01) 追加
683                        form.setGroupClass( groupClass );                               // 5.1.8.0 (2010/07/01) 追加
684                        form.setTableSorterKeys( sortKeys );                    // 3.6.0.0 (2004/09/17) 追加
685                        form.setNoMessage( noMessage );
686                        form.setSelectedType( selectedType );
687                        form.setUseCheckControl( useCheckControl );             // 3.5.4.3 (2004/01/05) 追加
688                        form.setNumberType( numberType );                               // 3.5.1.0 (2003/10/03) 追加
689                        form.setOptionTypeAttributes( optTypeAttri );
690                        form.setBackLinkCount( backLinkCount );
691                        form.setHeaderSkipCount( headerSkipCount );             // 3.5.2.0 (2003/10/20) 追加
692                        if( useParam ) { 
693                                form.setParam( viewParam );     // 3.5.4.8 (2004/02/23)
694                                form.setViewArrayList( viewArrayList ); // 5.5.9.0 (2012/12/03)
695                        }
696                        form.setBgColorCycle( bgColorCycle );                   // 3.5.6.2 (2004/07/05) 追加
697                        form.setBgColorClsClm( bgColorClsClm );                 // 5.1.8.0 (2010/07/01) 追加
698                        form.setWritableControl( writableControl );             // 3.8.0.9 (2005/10/17) 追加
699
700                        // 5.2.1.0 (2010/10/01) 初期バルクセットが true で、かつ、変数が未設定の場合は、全カラム(*)選択とする。
701                        if( useDefBulkset && columnBulkSet == null ) { columnBulkSet = "*"; }
702                        // selectedType が radio の場合は、カラムの設定を行わない。
703                        // 5.9.14.1 (2016/11/11) bulkSetをnullに設定出来るようにする。
704                        //if( "radio".equalsIgnoreCase( selectedType ) ) { columnBulkSet = null; }
705                        if( "radio".equalsIgnoreCase( selectedType ) || "null".equalsIgnoreCase( columnBulkSet ) ) { columnBulkSet = null; } //
706                        form.setColumnBulkSet( columnBulkSet );                 // 5.2.1.0 (2010/10/01) 追加
707
708                        // 5.8.6.0 (2015/04/03)
709                        // editConf が null でないという事は、lastSql の条件がクリアされている。
710                        if( editConf != null ) {
711                                // 5.9.15.0 (2016/12/2) 6.2.5.0Edit機能でも、条件によっては、書き込み許可するので、特殊処理廃止
712//                              if( editMarkerClmNos != null ) {
713//                                      for( int i=0; i<editMarkerClmNos.length; i++ ) {
714//                                              form.setColumnDisplay( editMarkerClmNos[i] , false );   // 表示しない
715//                                      }
716//                              }
717                                final String orgClms = form.getViewClms();              // form.setColumnDisplay(String) の再セット前に取り出す。
718                                lastSql.setOrgClmNames( orgClms );
719                                if( editColumnDisplay != null){
720                                        form.setColumnDisplay( editColumnDisplay );
721                                        form.setNoDisplay( null );
722                                }
723                        }
724                        
725                        
726                        // 3.6.0.0 (2004/09/22) pageSize の hidden 出力は、初期設定値とします。
727                        int oldPageSize = pageSize;
728                        pageSize = form.getPageSize();
729                        commandExec( command );
730
731                        form.setStartNo( startNo );
732                        form.setSkip( skip );                                                   // 3.5.3.1 (2003/10/31)
733                        form.setSkipNoEdit( skipNoEdit );                               // 4.3.1.0 (2008/09/08)
734                        boolean useTblSorter = "session".equals( getScope() ) &&
735                                                nval( useTableSorter,sysBool( "VIEW_USE_TABLE_SORTER" ) );
736                        form.setUseTableSorter( useTblSorter );         // 3.5.4.7 (2004/02/06)
737
738                        // 3.6.0.0 (2004/09/17)
739                        // tableSorter 時のリンクに追加するリクエスト変数のキャッシュMapを追加する。
740                        if( useTblSorter || sortKeys != null ) {
741                                // 4.0.0 (2005/01/31)
742                                String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" );
743                                Map<?,?> mem = (Map<?,?>)getSessionAttribute( memKey );             // 4.3.3.6 (2008/11/15) Generics警告対応
744                                form.makeTableSorterQuery( mem );
745                        }
746
747                        // 3.5.6.4 (2004/07/16) スクロールバー用のDIV要素の出力(開始)
748                        // 3.8.0.3 (2005/07/15) ヘッダー固定のスクロールタイプをセットします。
749                        // 4.0.0 (2007/04/10) ヘッダー固定のスクロールタイプは、一つにする。
750        //              String hctype = (String)getRequest().getAttribute( HybsSystem.HEADER_FIX_TYPE );
751                        boolean useScBar = nval( useScrollBar,sysBool( "VIEW_USE_SCROLLBAR" ) );
752        //              form.setUseScrollBar( useScBar,hctype );
753                        form.setUseScrollBar( useScBar );
754
755                        // 3.8.6.1 (2006/10/20) ポップアップで値を返すカラム文字列(CSV形式)
756                        form.setPopupReturnKeys( popupReturnKeys );
757                        form.setTableClass( clazz );            // 4.0.0 (2007/04/16)
758
759                        // 3.7.0.3 (2005/03/01) 指定の行番号まで画面をスクロールさせる機能を追加。{I} は無視する。
760                        String rowval = nval( getRequestValue( "SEL_ROW" ),null ) ;
761
762                        boolean useSelRow = nval( useSelectedRow,sysBool( "VIEW_USE_SELECTED_ROW" ) );
763                        if( useSelRow && rowval != null && !rowval.equalsIgnoreCase( "{I}" ) ) {
764                                boolean useSelRowClr = nval( useSelRowColor,sysBool( "VIEW_USE_SELROW_COLOR" ) ) ;
765                                form.setScrollRowNo( Integer.parseInt( rowval ),useSelRowClr );
766                        }
767
768                        // 4.0.0 (2005/11/30) カラムロールを判定して、アクセス不可の場合は表示させないようにする。
769                        int clmSize = table.getColumnCount();
770                        UserInfo userInfo = getUser();
771                        for( int clmNo=0; clmNo<clmSize; clmNo++ ) {
772                                DBColumn dbColumn = table.getDBColumn( clmNo );
773
774                                // 4.3.6.0 (2009/04/01) セッションに生SQLを登録
775                                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
776                                String evCol = dbColumn.getEventColumn();
777                                if( evCol != null && evCol.length() > 0 ){
778                                        addEventColumn( dbColumn );
779                                }
780
781                                // 4.3.0.0 (2008/07/04) ロールモードによる設定
782                                byte bitMode = userInfo.getAccessBitMode( dbColumn.getRoleMode() );
783                                // アクセス不許可の場合のみ、セットする。
784                                // それ以外は、columnDisplay ,noDisplay 属性が適用されている。
785                                if( !RoleMode.isRead( bitMode ) ) {
786                                        form.setColumnDisplay( clmNo,false );
787                                }
788                                // 書込み不許可の場合のみ、セットする。
789                                // それ以外は、columnWritable ,noWritable 属性が適用されている。
790                                if( !RoleMode.isWrite( bitMode ) ) {
791                                        form.setColumnWritable( clmNo,false );
792                                }
793                        }
794
795                        // 3.8.6.0 (2006/09/29) useHilightRow 属性追加
796                        boolean useHiRow = nval( useHilightRow,sysBool( "VIEW_USE_HILIGHT_ROW" ) );
797                        // 5.1.7.0 (2010/06/01) HilightRow用のDivは必ず出す(画面遷移なし登録(JavaScript)の正規表現でマッチさせるため))
798                        // 5.1.8.0 (2010/07/01) Divを必ず出すのは、画面遷移なし登録の場合のみとする(CustomData対応)
799                        if( useHiRow || noTransition ) {
800                                jspPrint( "<div id=\"divHlr\"" );
801                                if( useHiRow ) {
802                                        // 4.3.7.0 (2009/06/01)
803                                        boolean useHiCkOnly = nval( useHilightCheckOnly,sysBool( "VIEW_USE_HILIGHT_CHECK_ONLY" ) );
804                                        jspPrint( " onclick=\"hilightRow( event, " + useHiCkOnly + ");\"" );
805                                }
806                                jspPrint( ">" );
807                        }
808
809                        // 5.2.2.0 (2010/11/01) useHeaderColumn 属性を、ViewCrossTableParam.USE_HEADER_COLUMN をキーに、取得する
810                        if( viewParam != null &&
811                                        "true".equalsIgnoreCase( viewParam.get( ViewCrossTableParam.USE_HEADER_COLUMN ) ) ) {
812                                form.setResourceManager( getResource() );
813                        }
814
815                        form.setNoTransition( noTransition ); // 4.3.3.0 (2008/10/01) 追加
816                        
817//                      form.setTableId( tableId ); // 5.9.5.3 (2016/02/26)
818                        form.setViewClass( viewClass ); // 5.9.9.0 (2016/06/03)
819
820                        jspPrint( form.create( startNo,pageSize ) );
821
822                        // 5.1.8.0 (2010/07/01) Divを必ず出すのは、画面遷移なし登録の場合のみとする(CustomData対応)
823                        if( useHiRow || noTransition ) {
824                                jspPrint( "</div>" );
825                        }
826
827                        // 5.7.6.1 (2014/05/09) mainView時のみstartNoを登録する
828                        if( isMainView ){
829                                setRequestCacheData( START_NO_KEY,String.valueOf( tempStartNo ) );      // 3.5.4.7 (2004/02/06)
830                        }
831
832                        // 3.6.0.0 (2004/09/22) pageSize の hidden 出力は、初期設定値とします。
833                        if( useAfterHtmlTag ) { // 3.7.1.1 (2005/05/23)
834                                jspPrint( makePageSize( oldPageSize ) );                // 3.6.0.0 (2004/09/22)
835                        }
836
837                        makeConsistencyKey();           // 3.5.5.8 (2004/05/20)
838
839                        setObject( viewFormId, form );
840
841                        // 3.5.4.8 (2004/02/23) 超特殊処理 DBTableModel を View で置き換えます。
842                        // 5.2.2.0 (2010/11/01) saveTableId 属性を、ViewCrossTableParam.SAVE_SCOPE_KEY をキーに、取得する
843                        if( viewParam != null ) {
844                                String saveTableId = viewParam.get( ViewCrossTableParam.SAVE_TABLEID_KEY );     // 5.2.2.0 (2010/11/01)
845                                if( saveTableId != null ) {
846                                        String saveScope = viewParam.get( ViewCrossTableParam.SAVE_SCOPE_KEY );
847                                        setObject( saveTableId, form.getDBTableModel() , saveScope );
848                                }
849                        }
850
851                        // 5.1.6.0 (2010/05/01) Viewで表示した項目をDBLastSqlにセットします。
852                        if( table.getRowCount() > 0 ) {
853                                setViewClms();
854                        }
855                }
856
857                if( useAfterHtmlTag ) { // 3.7.1.1 (2005/05/23)
858                        // 3.5.4.7 (2004/02/06)
859                        long dyTime = System.currentTimeMillis()-dyStart;
860                        jspPrint( "<div id=\"viewTime\" value=\"" + (dyTime) + "\"></div>" );       // 3.5.6.3 (2004/07/12)
861                }
862
863                return EVAL_PAGE ;
864        }
865
866        /**
867         * タグリブオブジェクトをリリースします。
868         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
869         *
870         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
871         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
872         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
873         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
874         * @og.rev 3.5.2.0 (2003/10/20) headerSkipCount属性を追加
875         * @og.rev 3.5.3.0 (2003/10/27) backLinkCount,headerSkipCount属性の初期値をPropertyファイルから設定
876         * @og.rev 3.5.4.0 (2003/11/25) format 関係の文字列を廃止。TableFormatter クラスを使用する。
877         * @og.rev 3.5.4.3 (2004/01/05) useCheckControl属性を追加
878         * @og.rev 3.5.4.7 (2004/02/06) DBTableModelのソート機能 useTableSorter を追加
879         * @og.rev 3.5.4.7 (2004/02/06) 実行時間測定用に、dyStart を追加します。
880         * @og.rev 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを追加します。
881         * @og.rev 3.5.5.8 (2004/05/20) useConsistency 属性を追加します。
882         * @og.rev 3.5.6.2 (2004/07/05) bgColorCycle 変数の追加。
883         * @og.rev 3.5.6.3 (2004/07/12) useScrollBar 変数の追加。
884         * @og.rev 3.6.0.0 (2004/09/17) sortKeys 変数の追加。カラムソートリンクを出すカラム名を指定。
885         * @og.rev 3.6.0.4 (2004/10/14) loadMarker 変数の追加。
886         * @og.rev 3.7.0.1 (2005/01/31) 全件チェックコントロール変更(useCheckControl)
887         * @og.rev 3.7.1.1 (2005/05/23) SEL_ROW機能の有効/無効を指定します。
888         * @og.rev 3.7.1.1 (2005/05/23) 処理時間やページサイズなどの情報出力の有効/無効を指定します。
889         * @og.rev 3.8.0.9 (2005/10/17) writableControl 属性を追加します。
890         * @og.rev 3.8.6.0 (2006/09/29) useHilightRow 属性を追加します。
891         * @og.rev 3.8.6.1 (2006/10/20) editMarkerId , popupReturnKeys属性を追加します。
892         * @og.rev 4.3.0.0 (2008/07/04) fileUD ファイルダウンロード時の抜出カラム名(CSV形式)
893         * @og.rev 4.3.1.0 (2008/09/08) isSkipNoEdit属性対応
894         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
895         * @og.rev 4.3.7.0 (2009/06/01) useHilightCheckOnly 属性を追加します。
896         * @og.rev 5.1.6.0 (2010/05/01) clmSeqDisplay 属性を追加します。
897         * @og.rev 5.1.8.0 (2010/07/01) noGroup , noGroup 属性を追加します。
898         * @og.rev 5.1.8.0 (2010/07/01) bgColorClsClm 属性を追加します。
899         * @og.rev 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用する、columnBulkSet 属性を追加します。
900         * @og.rev 5.5.9.0 (2012/12/03) viewArrayList追加
901         * @og.rev 5.7.6.1 (2014/05/09) mainView追加
902         * @og.rev 5.8.6.0 (2015/04/03) OrgClmNames対応
903         * @og.rev 5.9.9.0 (2016/06/03) 6.4.6.1同等対応(利用目的を明確にするため、パラメータ名をviewClassに変更)
904         */
905        @Override
906        protected void release2() {
907                super.release2();
908                tableId                         = HybsSystem.TBL_MDL_KEY;
909                viewFormId                      = HybsSystem.VIEWFORM_KEY;
910                viewFormType            = null;
911                viewLinkId                      = HybsSystem.VIEWLINK_KEY;
912                viewMarkerId            = HybsSystem.VIEW_MARK_KEY;
913                editMarkerId            = HybsSystem.EDIT_MARK_KEY;             // 3.8.6.1 (2006/10/20)
914                command                         = null;
915                startNo                         = -1;           // HTML画面上の表示開始位置(初期値)
916                tempStartNo                     = -1;           // 再検索時の表示開始位置
917                pageSize                        = -1;           // HTML画面上に表示する件数
918                pagePlus                        = -1;           // 3.5.6.4 (2004/07/16)
919                table                           = null;
920                form                            = null;
921                columnWritable          = null;
922                noWritable                      = null;
923                columnDisplay           = null;
924                noDisplay                       = null;
925                clmSeqDisplay           = null;         // 5.1.6.0 (2010/05/01) ViewForm_HTMLSeqClmTable 対応
926                columnGroup                     = null;         // 3.8.5.0 (2006/03/20)
927                noGroup                         = null;         // 5.1.8.0 (2010/07/01)
928                groupClass                      = null;         // 5.1.8.0 (2010/07/01)
929                noMessage                       = false;
930                writable                        = null;
931                checked                         = null;
932                skip                            = ViewForm.DEFAULT_SKIP;
933                rowspan                         = "2";
934                selectedType            = "checkbox";
935                numberType                      = "sequence";
936                optTypeAttri            = null;
937                values                          = null;
938                backLinkCount           = HybsSystem.sysInt( "VIEW_BACK_LINK_COUNT" );
939                headerSkipCount         = HybsSystem.sysInt( "VIEW_HEADER_SKIP_COUNT" );        // 0:通常ヘッダ、n:n回ごとに現れる
940                bodyString                      = null;
941                useCheckControl         = -1 ;
942                useTableSorter          = null ;        // 3.5.4.7 (2004/02/06)
943                dyStart                         = 0;            // 3.5.4.7 (2004/02/06)
944                viewParam                       = null;         // 3.5.4.8 (2004/02/23)
945                useParam                        = false;        // 3.5.4.8 (2004/02/23)
946                useConsistency          = HybsSystem.sysBool( "USE_CONSISTENCY" );              // 3.5.5.8 (2004/05/20)
947                bgColorCycle            = 1 ;           // 3.5.6.2 (2004/07/05)
948                bgColorClsClm           = null;         // 5.1.8.0 (2010/07/01)
949                useScrollBar            = null;
950                sortKeys                        = null;         // 3.6.0.0 (2004/09/17)
951                loadMarker                      = ",NEW,RENEW,REVIEW,RESET,";                                   // 4.0.0.0 (2007/11/26)
952                useSelectedRow          = null;
953                useSelRowColor          = null;
954                useAfterHtmlTag         = true;         // 3.7.1.1 (2005/05/23)
955                writableControl         = null;         // 3.8.0.9 (2005/10/17)
956                useHilightRow           = null;         // 3.8.6.0 (2006/09/29)
957                popupReturnKeys         = null ;        // 3.8.6.1 (2006/10/20)
958                clazz                           = "viewTable";  // 4.0.0 (2007/04/16)
959                height                          = null;         // 4.2.0.0 (2008/03/18)
960                width                           = null;         // 4.2.0.0 (2008/03/18)
961                fileDwnClms                     = null ;        // 4.3.0.0 (2008/07/04)
962                skipNoEdit                      = false;        // 4.3.1.0 (2008/09/08)
963                noTransition            = false;        // 4.3.3.0 (2008/10/01)
964                useHilightCheckOnly     = null;         // 4.3.7.0 (2009/06/01)
965                columnBulkSet           = null;         // 5.2.1.0 (2010/10/01)
966                useDefBulkset           = HybsSystem.sysBool( "VIEW_USE_DEFAULT_BULKSET" ) ;            // 5.2.1.0 (2010/10/01)
967                viewArrayList           = null;         // 5.5.9.0 (2012/12/03)
968                isMainView                      = true;         // 5.7.6.1 (2014/05/09)
969                lastSql                         = null;         // 5.8.6.0 (2015/04/03)
970                editConf                        = null;         // 5.8.6.0 (2015/04/03)
971                editColumnDisplay       = null;         // 5.8.6.0 
972                viewClass                       = null;         // 5.9.9.0
973        }
974
975        /**
976         * 左右分割スクロール(SplitViewTag)が存在すれば、パラメータの初期値設定などを行います。
977         *
978         * @og.rev 5.3.0.0 (2010/12/01) 左右分割スクロール(SplitViewTag)対応
979         * @og.rev 5.5.4.0 (2012/07/02) 2回目のnoDisplayを追記型に変更
980         * @og.rev 5.9.9.0 (2016/06/03) 6.4.6.1同等対応(利用目的を明確にするため、パラメータ名をviewClassに変更)
981         */
982        private void splitViewParamSet() {
983                SplitViewTag splitView = (SplitViewTag)findAncestorWithClass( this,SplitViewTag.class );
984                if( splitView != null ) {
985                        String  fixDisplay  = splitView.getFixDisplay();
986                        boolean isFirstStep = splitView.isFirstStep();
987
988                        if( isFirstStep ) {     // 1回目(左側:固定部)
989                                // Viewタグの左側には、fixDisplay のカラムを columnDisplay に設定する。
990                                columnDisplay = fixDisplay;
991                                noDisplay     = null;
992                                viewClass               = "VIEW_" + tableId + "_X1";                    // 6.4.6.1 (2016/06/03)
993                        }
994                        else {                          // 2回目(右側:可変部)
995                                // Viewタグの右側には、command="VIEW" , noMessage="true" , useSelectedRow="false"
996                                // numberType="delete" をセットするとともに、fixDisplay のカラムを noDisplay の
997                                columnDisplay = null;
998                                if( noDisplay != null && noDisplay.length() > 0 ){
999                                        noDisplay     += ","+fixDisplay; // 5.5.4.0 (2012/07/02) カンマ区切りで追記する
1000                                }
1001                                else{
1002                                        noDisplay     = fixDisplay;
1003                                }
1004
1005                                command                 = "VIEW";
1006                                numberType              = "delete" ;
1007                                noMessage               = true;
1008                                useSelectedRow  = "false";
1009                                viewClass               = "VIEW_" + tableId +"_X2";                     // 6.4.6.1 (2016/06/03)
1010                        }
1011                }
1012        }
1013
1014        /**
1015         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
1016         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
1017         *
1018         * @og.tag
1019         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
1020         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
1021         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
1022         * この tableId 属性を利用して、メモリ空間を分けます。
1023         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
1024         *
1025         * @param       id sessionに登録する時の ID
1026         */
1027        public void setTableId( final String id ) {
1028                tableId   = nval( getRequestParameter( id ),tableId );  // 3.8.0.9 (2005/10/17)
1029        }
1030
1031        /**
1032         * 【TAG】(通常使いません)sessionから取得する ViewForm オブジェクトの ID。
1033         *
1034         * @og.tag
1035         * 表示処理後に,(内部ポインタを書き換えた)ViewForm オブジェクトを
1036         * 同じキーで、sessionに登録します。
1037         * 初期値は、HybsSystem.VIEWFORM_KEY です。
1038         *
1039         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1040         * @og.rev 3.5.6.4 (2004/07/16) VIEW_ID を付加して、他のid と混同しないようにします。
1041         *
1042         * @param       id ViewForm オブジェクトID
1043         */
1044        public void setViewFormId( final String id ) {
1045                String temp = getRequestParameter( id ) ;
1046                if( temp != null && temp.length() > 0 ) {
1047                        viewFormId = temp + TaglibUtil.VIEW_ID;
1048                }
1049        }
1050
1051        /**
1052         * 【TAG】(通常つかいません)requestから取得する ViewLink に対応する Attributes オブジェクトの ID。
1053         *
1054         * @og.tag
1055         * ViewForm オブジェクトに、ViewLink オブジェクトをこのキーより取得することにより、
1056         * カラムに対して、リンク情報を付加して表示させる。
1057         * 初期値は、HybsSystem.VIEWLINK_KEY です。
1058         *
1059         * @og.rev 3.1.4.0 (2003/04/18) 初期値を考慮して、属性登録を行うように変更。
1060         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1061         * @og.rev 3.5.6.4 (2004/07/16) LINK_ID を付加して、他のid と混同しないようにします。
1062         *
1063         * @param       id ViewLink オブジェクトID
1064         */
1065        public void setViewLinkId( final String id ) {
1066                String temp = getRequestParameter( id ) ;
1067                if( temp != null && temp.length() > 0 ) {
1068                        viewLinkId = temp + TaglibUtil.LINK_ID;
1069                }
1070        }
1071
1072        /**
1073         * 【TAG】(通常使いません)requestから取得する ViewMarker に対応する Attributes オブジェクトの ID。
1074         *
1075         * @og.tag
1076         * ViewForm オブジェクトに、ViewMarker オブジェクトをこのキーより取得することにより、
1077         * カラムに対して、マーカー情報を付加して表示させる。
1078         * 初期値は、HybsSystem.VIEW_MARK_KEY です。
1079         *
1080         * @og.rev 3.1.4.0 (2003/04/18) 新規追加
1081         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1082         * @og.rev 3.5.6.4 (2004/07/16) MARK_ID を付加して、他のid と混同しないようにします。
1083         *
1084         * @param       id ViewMarker オブジェクトID
1085         */
1086        public void setViewMarkerId( final String id ) {
1087                String temp = getRequestParameter( id ) ;
1088                if( temp != null && temp.length() > 0 ) {
1089                        viewMarkerId = temp + TaglibUtil.MARK_ID;
1090                }
1091        }
1092
1093        /**
1094         * 【TAG】(通常使いません)requestから取得する EditMarker に対応する Attributes オブジェクトの ID。
1095         *
1096         * @og.tag
1097         * ViewForm オブジェクトに、EditMarker オブジェクト(実際は、ViewMarker オブジェクト)を
1098         * このキーより取得することにより、カラムに対して、マーカー情報を付加して表示させる。
1099         * 初期値は、HybsSystem.EDIT_MARK_KEY です。
1100         *
1101         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
1102         *
1103         * @param       id EditMarker オブジェクトID(実際は、ViewMarker オブジェクト)
1104         */
1105        public void setEditMarkerId( final String id ) {
1106                String temp = getRequestParameter( id ) ;
1107                if( temp != null && temp.length() > 0 ) {
1108                        editMarkerId = temp + TaglibUtil.MARK_ID;
1109                }
1110        }
1111
1112        /**
1113         * 【TAG】ViewForm オブジェクトを作成するクラス({@og.doc03Link viewFormType ViewForm_**** クラスの ****})を指定します。
1114         *
1115         * @og.tag
1116         * これは、org.opengion.hayabusa.html 以下の ViewForm_**** クラスの **** を
1117         * 与えます。これらは、ViewForm インターフェースを継承したサブクラスです。
1118         * 属性クラス定義の {@link org.opengion.hayabusa.html.ViewForm  ViewForm} を参照願います。
1119         * {@og.doc03Link viewFormType ViewForm_**** クラス}
1120         *
1121         * @param       id ViewForm タイプ
1122         * @see         org.opengion.hayabusa.html.ViewForm  ViewFormのサブクラス
1123         */
1124        public void setViewFormType( final String id ) {
1125                viewFormType = getRequestParameter( id );
1126
1127                if( viewFormType == null || viewFormType.length() == 0 ) {
1128                        String errMsg = "viewForm の id が設定されていません。";
1129                        throw new HybsSystemException( errMsg );
1130                }
1131        }
1132
1133        /**
1134         * 【TAG】コマンド(PREV,NEXT,FIRST,LAST,NEW,RENEW,VIEW,REVIEW,RESET)をセットします。
1135         *
1136         * @og.tag
1137         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
1138         * フィールド定数値のいづれかを、指定できます。
1139         *
1140         * @og.rev 3.8.0.8 (2005/10/03) その他のコマンドを CMD_XXX にします。
1141         *
1142         * @param       cmd コマンド(public static final 宣言されている文字列)
1143         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ViewFormTag.CMD_PREV">コマンド定数</a>
1144         */
1145        public void setCommand( final String cmd ) {
1146                String cmd2 = getRequestParameter( cmd );
1147                if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
1148
1149                if( command == null ||
1150                         (command.trim()).length() == 0 ||
1151                        ! check( command, COMMAND_LIST ) ) {
1152                                // 3.8.0.8 (2005/10/03) その他のコマンドを CMD_XXX にします。
1153                                command = CMD_XXX ;
1154                }
1155        }
1156
1157        /**
1158         * 【TAG】表示データを作成する場合の表示の開始行番号をセットします。
1159         *
1160         * @og.tag
1161         * セットされていない場合は,変更しません。
1162         *
1163         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
1164         *
1165         * @param       no 表示開始行番号(先頭は 0)
1166         */
1167        public void setStartNo( final String no ) {
1168                startNo = nval( getRequestParameter( no ),startNo );
1169                tempStartNo = startNo;
1170        }
1171
1172        /**
1173         * 【TAG】表示データを作成する場合の1ページの行数をセットします。
1174         *
1175         * @og.tag
1176         * セットされていない場合は,変更しません。
1177         *
1178         * @param       sz 1ページの行数
1179         */
1180        public void   setPageSize( final String sz ) {
1181                pageSize = nval( getRequestParameter( sz ),pageSize );
1182        }
1183
1184        /**
1185         * 【TAG】1ページの行数の増加分をセットします(初期値:0)。
1186         *
1187         * @og.tag
1188         * セットされていない場合は,0(増加なし)です。
1189         *
1190         * @param       pp 1ページの行数
1191         */
1192        public void   setPagePlus( final String pp ) {
1193                pagePlus = nval( getRequestParameter( pp ),pagePlus );
1194        }
1195
1196        /**
1197         * 【TAG】ページの先頭へのリンクの間隔をセットします
1198         *              (初期値:VIEW_BACK_LINK_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_BACK_LINK_COUNT}])。
1199         *
1200         * @og.tag
1201         * 0 にセットすると、リンクは作成されません。
1202         * テーブルのヘッダー固定ができないケースでは、データ件数が多いと、登録ボタンが見えなくなります。
1203         * その場合、スクロールして上に上がるより、行番号に作成されリンクで、一気に上に戻るほうが早く処理できます。
1204         * その場合、段組み等していると、間隔を少なくしておく必要が出てきます。
1205         * ヘッダー固定を利用する場合は、不要です。
1206         * (初期値:システム定数のVIEW_BACK_LINK_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_BACK_LINK_COUNT}])。
1207         *
1208         * @param       blc リンクの間隔
1209         * @see         org.opengion.hayabusa.common.SystemData#VIEW_BACK_LINK_COUNT
1210         */
1211        public void   setBackLinkCount( final String blc ) {
1212                backLinkCount = nval( getRequestParameter( blc ),backLinkCount );
1213        }
1214
1215        /**
1216         * 【TAG】ヘッダーを出力する間隔をセットします
1217         *              (初期値:VIEW_HEADER_SKIP_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_HEADER_SKIP_COUNT}])。
1218         *
1219         * @og.tag
1220         * 0を指定すると、繰り返しません(つまり、ヘッダーを最初に表示するだけです。)
1221         * 数字を指定すると、その回数毎に、ヘッダーをデータの行に挿入します。
1222         * (初期値:システム定数のVIEW_HEADER_SKIP_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_HEADER_SKIP_COUNT}])。
1223         *
1224         * @og.rev 3.5.2.0 (2003/10/20) 新規作成
1225         *
1226         * @param       hsc ヘッダーの表示間隔 ( 0:通常ヘッダ、n:n回ごとに現れる )
1227         * @see         org.opengion.hayabusa.common.SystemData#VIEW_HEADER_SKIP_COUNT
1228         */
1229        public void   setHeaderSkipCount( final String hsc ) {
1230                headerSkipCount = nval( getRequestParameter( hsc ),headerSkipCount );
1231        }
1232
1233        /**
1234         * 【TAG】書き込み可能カラム名を、カンマ区切りで与えます。
1235         *
1236         * @og.tag
1237         * これは、書き込み不可カラム名の指定(noWritable)と同時にセットする
1238         * ことは出来ません。
1239         * "*" を指定すると、すべてのカラムを(columnWritable)指定したことになります。
1240         *
1241         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1242         * @og.rev 4.1.2.0 (2008/03/12) 引数に、"null" を指定可能とする。
1243         * @og.rev 4.2.1.0 (2008/04/11) null チェック方法変更
1244         * @og.rev 4.2.1.1 (2008/04/30) 引数にA,B,{&#064;XXXX}等が指定された場合に{&#064;XXXX}の変換が行われないバグを修正
1245         * @og.rev 5.1.8.0 (2010/07/01) noWritable 同時セットチェックを、メソッドではなく、本体で行う。
1246         *
1247         * @param       columnName      例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1248         * @see         #setNoWritable( String )
1249         */
1250        public void setColumnWritable( final String columnName ) {
1251                columnWritable = nval( getRequestParameter(columnName),null );
1252                if( "null".equalsIgnoreCase( columnWritable ) ) { columnWritable = ""; }
1253        }
1254
1255        /**
1256         * 【TAG】書き込み不可カラム名を、カンマ区切りで与えます。
1257         *
1258         * @og.tag
1259         * これは、書き込み可能カラム名の指定(columnWritable)と同時にセットする
1260         * ことは出来ません。
1261         * "*" を指定すると、すべてのカラムを(noWritable)指定したことになります。
1262         *
1263         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1264         * @og.rev 4.1.2.0 (2008/03/12) 引数に、"null" を指定可能とする。
1265         * @og.rev 4.2.1.0 (2008/04/11) null チェック方法変更
1266         * @og.rev 4.2.1.1 (2008/04/30) 引数にA,B,{&#064;XXXX}等が指定された場合に{&#064;XXXX}の変換が行われないバグを修正
1267         * @og.rev 5.1.8.0 (2010/07/01) noWritable 同時セットチェックを、メソッドではなく、本体で行う。
1268         *
1269         * @param       columnName      例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1270         * @see         #setColumnWritable( String )
1271         */
1272        public void setNoWritable( final String columnName ) {
1273                noWritable = nval( getRequestParameter(columnName),null );
1274                if( "null".equalsIgnoreCase( noWritable ) ) { noWritable = ""; }
1275        }
1276
1277        /**
1278         * 【TAG】表示可能カラム名を、カンマ区切りで与えます。
1279         *
1280         * @og.tag
1281         * これは、表示不可カラム名の指定(noDisplay)と同時にセットする
1282         * ことは出来ません。
1283         * "*" を指定すると、すべてのカラムを(columnDisplay)指定したことになります。
1284         *
1285         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1286         * @og.rev 5.1.8.0 (2010/07/01) noWritable 同時セットチェックを、メソッドではなく、本体で行う。
1287         *
1288         * @param       columnName      例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1289         * @see         #setNoDisplay( String )
1290         */
1291        public void setColumnDisplay( final String columnName ) {
1292                columnDisplay = nval( getRequestParameter(columnName),null );
1293                if( "null".equalsIgnoreCase( columnDisplay ) ) { columnDisplay = ""; }
1294        }
1295
1296        /**
1297         * 【TAG】表示不可カラム名を、カンマ区切りで与えます。
1298         *
1299         * @og.tag
1300         * これは、表示可能カラム名の指定(columnDisplay)と同時にセットする
1301         * ことは出来ません。
1302         * "*" を指定すると、すべてのカラムを(noDisplay)指定したことになります。
1303         *
1304         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1305         * @og.rev 5.1.8.0 (2010/07/01) noWritable 同時セットチェックを、メソッドではなく、本体で行う。
1306         *
1307         * @param       columnName      例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1308         * @see         #setColumnDisplay( String )
1309         */
1310        public void setNoDisplay( final String columnName ) {
1311                noDisplay = nval( getRequestParameter(columnName),null );
1312                if( "null".equalsIgnoreCase( noDisplay ) ) { noDisplay = ""; }
1313        }
1314
1315        /**
1316         * 【TAG】表示可能カラム名を、カラム順に、カンマ区切りで与えます。
1317         *
1318         * @og.tag
1319         * これは、ViewForm_HTMLSeqClmTable 用に特別に用意された属性です。
1320         * 機能的には、columnDisplay 属性で、カラムの表示順まで指定できる機能を
1321         * 用意すべきですが、過去のタグとの互換性の関係で、別に用意しています。
1322         * (この属性を使用すると、通常の表示より、処理速度が低下します。)
1323         *  例:"OYA,KO,HJO,SU,DYSET,DYUPD" この順番で表示され、指定以外のカラムは表示されません。
1324         *
1325         * @og.rev 5.1.6.0 (2010/05/01) clmSeqDisplay 属性を追加します。
1326         *
1327         * @param       columnName      カラム名
1328         */
1329        public void setClmSeqDisplay( final String columnName ) {
1330                clmSeqDisplay = nval( getRequestParameter(columnName),null );
1331        }
1332
1333        /**
1334         * 【TAG】同一表示データをまとめる(表示しない)カラム名を、カンマ区切りで与えます。
1335         *
1336         * @og.tag
1337         * これは、カラムのグループ化指定を行います。
1338         * 同じカラム番号で一つ上の行番号と同じ内容の場合に、特殊な表示方法で表示します。
1339         * 対応は、表示(Renderer)時のみとします。
1340         * 特殊な表示方法の指定は、groupClass 属性で指定します。
1341         * (例:groupClass にアルファベット以外の文字・・そのまま表示、アルファベットはクラス属性を付与します。)
1342         * カラム単位なので、新しいゼブラによる色分けは行いません。(任意のカラムに適用できる為)
1343         * また、ファイル出力などのデータ自身は変更されていませんので、そのままデータが落ちます。
1344         *
1345         * これは、同一表示データをまとめないカラム名の指定(noGroup)と同時にセットする
1346         * ことは出来ません。
1347         * "*" を指定すると、すべてのカラムを(columnGroup)指定したことになります。
1348         *
1349         * @og.rev 3.8.5.0 (2006/03/20) 新規追加
1350         * @og.rev 5.1.8.0 (2010/07/01) noWritable 同時セットチェックを、メソッドではなく、本体で行う。
1351         *
1352         * @param       group   例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1353         * @see         #setNoGroup( String )
1354         * @see         #setGroupClass( String )
1355         */
1356        public void setColumnGroup( final String group ) {
1357                columnGroup = nval( getRequestParameter( group ),null );
1358                if( "null".equalsIgnoreCase( columnGroup ) ) { columnGroup = ""; }
1359        }
1360
1361        /**
1362         * 【TAG】同一表示データをまとめないカラム名を、カンマ区切りで与えます。
1363         *
1364         * @og.tag
1365         * これは、カラムのグループ化指定で、同一でもまとめないカラムを指定するほうが簡単な場合に
1366         * 使用します。例えば、キー情報以外は、グループ化指定したい場合などに便利です。
1367         * 動作は、columnGroup の動きと同じです。(まとめないカラムを指定するだけです。)
1368
1369         * これは、同一表示データをまとめるカラム名の指定(columnGroup)と同時にセットする
1370         * ことは出来ません。
1371         * "*" を指定すると、すべてのカラムを(noGroup)指定したことになります。
1372         *
1373         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
1374         *
1375         * @param       group   例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1376         * @see         #setColumnGroup( String )
1377         * @see         #setGroupClass( String )
1378         */
1379        public void setNoGroup( final String group ) {
1380                noGroup = nval( getRequestParameter( group ),null );
1381                if( "null".equalsIgnoreCase( noGroup ) ) { noGroup = ""; }
1382        }
1383
1384        /**
1385         * 【TAG】同一表示データをまとめる場合の、表示方法を指定します。
1386         *
1387         * @og.tag
1388         * これは、カラムのグループ化指定(columnGroup)を行う場合の、まとめ表示の方法を指定します。
1389         * なにも指定しない場合は、まとめカラムは、表示しない(ゼロ文字列)になります。
1390         * その場合、先の行と同じ場合も、変更されたカラムが、NULL(ゼロ文字列)であった場合も、
1391         * 同じ用に表示されるため、区別が付きません。
1392         * そこで、前の行と同じデータの場合に、特殊な処理を行うことで、区別できるようにします。
1393         * 指定方法が特殊なので、注意が必要です。
1394         *   記号の場合:
1395         *       記号(-- , → , ↓ , * など)が指定された場合は、そのままの文字に置き換えられます。
1396         *       初期値は、空文字列(ゼロ文字列)です。
1397         *   アルファベットの場合:
1398         *       アルファベット(a-z,A-Z)の場合は、&lt;span class="アルファベット"&gt;元の文字&lt;/span&gt;
1399         * 例えば、バックカラーに色を付ける、文字を薄い灰色にする、などできます。
1400         * ただし、データ量が圧倒的に増えるため、大量のデータ等で使用するのは避けたほうが良いと思います。
1401         *
1402         * @og.rev 3.8.5.0 (2006/03/20) 新規追加
1403         *
1404         * @param       grpCls まとめ表示の方法
1405         */
1406        public void setGroupClass( final String grpCls ) {
1407                groupClass = nval( getRequestParameter(grpCls),null );
1408        }
1409
1410        /**
1411         * 【TAG】カラム名リンクソートを表示するカラム名を、カンマ区切りで与えます。
1412         *
1413         * @og.tag
1414         * ヘッダーにソート用リンクを作成する useTableSorter 属性 に対して、
1415         * カラム個別に作成する場合のカラム名をカンマ区切り文字で指定します。
1416         * この sortKeys 属性は、useTableSorter 属性 と無関係に、指定した
1417         * カラムのみ、リンクを表示します。
1418         * "*" を指定すると、すべてのカラムを(tableSorterKeys)指定したことになります。
1419         * 例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1420         *
1421         * @og.rev 3.6.0.0 (2004/09/17) 新規作成
1422         *
1423         * @param       columnName      カラム名
1424         */
1425        public void setTableSorterKeys( final String columnName ) {
1426                sortKeys = nval( getRequestParameter(columnName),null );
1427        }
1428
1429        /**
1430         * 【TAG】検索結果メッセージを表示しないかどうか[true/false]を設定します(初期値:false[表示する])。
1431         *
1432         * @og.tag
1433         * 初期値は、表示する(true以外)です。
1434         *
1435         * @param       flag 検索結果メッセージの制御 [true:表示しない/それ以外:表示する]
1436         */
1437        public void setNoMessage( final String flag ) {
1438                noMessage = nval( getRequestParameter( flag ),noMessage );
1439        }
1440
1441        /**
1442         * 【TAG】行が書き込み可能かどうか[true/false]を設定します
1443         *              (初期値:DBTableModel#DEFAULT_WRITABLE[={@og.value DBTableModel#DEFAULT_WRITABLE}])。
1444         *
1445         * @og.tag
1446         * 書込み許可する場合は, true、許可しない場合は, true 以外を設定します。
1447         * ここで、false を設定すると全行書込み禁止になります。true を設定した
1448         * 場合、デフォルトで書込み許可が与えられ、先頭カラムが writable であれば、
1449         * その値を取り込んで、行ごとの書込み許可/不許可が決定されます。
1450         * writable,checked,useCheckControl については、writable が最優先で
1451         * 次に、useCheckControl="2"(または、checked)、次に、checked を判定します。
1452         * checked="true"の場合は、useCheckControl が、"1"(true)以上の場合、
1453         * "2"(checked)に設定されます。
1454         * (初期値:DBTableModel#DEFAULT_WRITABLE[={@og.value DBTableModel#DEFAULT_WRITABLE}])。
1455         *
1456         * @param       flag [true:書込み許可/true以外:書込み禁止]
1457         * @see         org.opengion.hayabusa.db.DBTableModel#DEFAULT_WRITABLE
1458         */
1459        public void setWritable( final String flag ) {
1460                writable = getRequestParameter( flag );
1461        }
1462
1463        /**
1464         * テーブルデータに書込み許可/チェック状態を設定します。
1465         *
1466         * @og.rev 3.6.0.0 (2004/09/17) writable が false の場合全件チェック用チェックボックスを出さない。
1467         * @og.rev 3.7.0.1 (2005/01/31) 全件チェックコントロールのロジック変更(useCheckControl)
1468         * @og.rev 3.8.8.5 (2007/03/09) 全件チェック(useCheckControl)と、個別チェック(checked)の整合性
1469         * @og.rev 5.5.5.6 (2012/08/31) ユーザーと画面の関係が、リードオンリーの場合は、writable=falseを内部設定する。
1470         * @og.rev 5.5.6.1 (2012/09/03) writable自動セットは指定コマンドのみ
1471         *
1472         * @param       table   DBTableModelオブジェクト
1473         */
1474        private void setTableRowWritable( final DBTableModel table ) {
1475
1476                // 5.5.5.6 (2012/08/31) リードオンリーの場合は、writable=falseを内部設定する。
1477                // このタグで、writable が指定された場合は、そちらを優先する。(つまり、null の場合は、内部設定する。)
1478                // 5.5.6.1 (2012/09/03) この処理を行うのは指定コマンドのみ
1479                if( ( writable == null || writable.length() == 0 ) && check( command, COMMAND_LIST ) ) {
1480                        GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
1481                        if ( ! guiInfo.isWrite() ){
1482                                writable = "FALSE" ;
1483                        }
1484                }
1485
1486                if( writable != null && writable.length() > 0 ) {
1487                        boolean flag = "TRUE".equalsIgnoreCase( writable );
1488                        table.setDefaultRowWritable( flag );
1489                        if( ! flag ) { useCheckControl = 0; }                   // 3.7.0.1 (2005/01/31)
1490                }
1491
1492                // 全チェックONの場合は、個別チェックもONにする。
1493                if( useCheckControl == 2 ) { checked = "true"; }        // 3.8.8.5 (2007/03/09)
1494
1495                if( checked != null && checked.length() > 0 ) {
1496                        boolean flag = "TRUE".equalsIgnoreCase( checked );
1497                        table.setDefaultRowChecked( flag );
1498                        // 個別チェックONの場合は、全チェックもONにする。
1499                        if( flag && useCheckControl >= 1 ) { useCheckControl = 2; }                  // 3.8.8.5 (2007/03/09)
1500                }
1501        }
1502
1503        /**
1504         * 【TAG】行のチェックボックスの初期値を設定するかどうか[true/false]を指定します(初期値:null)。
1505         *
1506         * @og.tag
1507         * 書き込み可能な行(rowWritable == true)のチェックボックスに対して
1508         * 初期値を 選択済みにするか、非選択済みにするかを指定します。
1509         * writable,checked,useCheckControl については、writable が最優先で
1510         * 次に、useCheckControl="2"(または、checked)、次に、checked を判定します。
1511         * checked="true"の場合は、useCheckControl が、"1"(true)以上の場合、
1512         * "2"(checked)に設定されます。
1513         *
1514         * @param       flag [true:書込み許可/それ以外:書込み禁止]
1515         */
1516        public void setChecked( final String flag ) {
1517                checked = getRequestParameter( flag );
1518        }
1519
1520        /**
1521         * 【TAG】NEXT等で、選択行以外をスキップするのかどうか[true/false]を指定します
1522         *              (初期値:ViewForm#DEFAULT_SKIP[={@og.value ViewForm#DEFAULT_SKIP}])。
1523         *
1524         * @og.tag
1525         * 明細情報の登録/編集時に、必要な個所のみを順番に処理する場合に使用します。
1526         * (初期値:ViewForm#DEFAULT_SKIP[={@og.value ViewForm#DEFAULT_SKIP}])。
1527         *
1528         * @param       flag スキップ  [true:する/それ以外:しない]
1529         * @see         org.opengion.hayabusa.html.ViewForm#DEFAULT_SKIP
1530         */
1531        public void setSkip( final String flag ) {
1532                skip = nval( getRequestParameter( flag ),skip );
1533        }
1534
1535        /**
1536         * 【TAG】表示データを作成する場合のフォーマットの行数をセットします(初期値:2)。
1537         *
1538         * @og.tag 表示データを作成する場合のフォーマットの行数をセットします。
1539         *
1540         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1541         *
1542         * @param       rowspan フォーマットの行数
1543         */
1544        public void setRowspan( final String rowspan ) {
1545                this.rowspan = getRequestParameter(rowspan);
1546        }
1547
1548        /**
1549         * 【TAG】表示時の選択用オブジェクトのタイプ[checkbox/radio/hidden]を指定します(初期値:checkbox)。
1550         *
1551         * @og.tag
1552         * 複数選択可能時は "checkbox" を指定します。
1553         * 一つだけ選ばせる場合は, "radio" を指定します。
1554         * 隠しフィールドで全件を選ぶ場合は、"hidden" を指定します。
1555         * 初期値は、"checkbox" です。
1556         *
1557         * @og.rev 3.3.1.1 (2003/07/03) {&#064;XXXX} 変数が使用できるように修正。
1558         *
1559         * @param       type 選択用オブジェクトのタイプ[checkbox:複数選択/radio:一つだけ/hidden:全件選択]
1560         */
1561        public void setSelectedType( final String type ) {
1562                selectedType = nval( getRequestParameter(type),selectedType );
1563        }
1564
1565        /**
1566         * 【TAG】表示時の行番号の表示方法[sequence/none/delete/skip=カラム名/view=カラム名]を指定します(初期値:sequence)。
1567         *
1568         * @og.tag
1569         * ・sequenceは、1から始まる連番です。
1570         * ・none を指定すると、番号は表示されません。
1571         * ・delete を指定すると、行番号表示そのもののタグを取り除きます。(3.5.5.0 追加)
1572         * ・skip=カラム名を指定すると、そのカラムの値が NULL の場合は、番号をスキップします。
1573         * ・view=カラム名を指定すると、そのカラムの値が、使用されます。(ラベルは付きません)
1574         * skip=XX と、view=XX は、=の前後にスペースを入れないで下さい。
1575         * 初期値は、"sequence" です。
1576         *
1577         * @og.rev 3.5.1.0 (2003/10/03) 新規作成
1578         *
1579         * @param       type 行番号の表示方法のタイプ [sequence:連番/none:非表示/delete:タグ削除/skip=カラム名/view=カラム名]
1580         */
1581        public void setNumberType( final String type ) {
1582                numberType = nval( getRequestParameter(type),numberType );
1583        }
1584
1585        /**
1586         * 【TAG】テーブル等のチェックボックスに属性を付加します。
1587         *
1588         * @og.tag
1589         * JavaScript などの HTML基本タグ以外の属性を、そのまま
1590         * チェックボックス/ラジオボタン等に使用します。
1591         * そのときに、(')は、(")に置き換えます。
1592         *
1593         * @param       attributes HTML基本タグ以外の属性
1594         */
1595        public void setOptionTypeAttributes( final String attributes ) {
1596                String optAttri = getRequestParameter( attributes );
1597                if( optAttri != null && optAttri.length() > 0 ) {
1598                        optTypeAttri = optAttri.replace( '\'', '\"' );
1599                }
1600        }
1601
1602        /**
1603         * 【TAG】チェックボックスの全チェックを選択するJavaScript の機能を使用するかどうかを指定します
1604         *              (初期値:VIEW_USE_CHECK_CONTROL[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_CHECK_CONTROL}])。
1605         *
1606         * @og.tag
1607         * "true" で、コントロール用のチェックボックスが現れて、この機能を使用することができるようになります。
1608         * false は、従来どおりです。
1609         * 使用するにあたり、jsp/commpn/default.js にJavaScriptを設定しておきます。(設定済み)
1610         * false は、0でも代用可能です。true は、1でも代用可能です。
1611         * checked は、2でも代用可能です。checked は、初期値を、チェック済みにします。
1612         * 注意:0,1,2,true,false,checked 以外の文字をセットすると、エラーが発生します。
1613         * writable,checked,useCheckControl については、writable が最優先で
1614         * 次に、useCheckControl="2"(または、checked)、次に、checked を判定します。
1615         * checked="true"の場合は、useCheckControl が、"1"(true)以上の場合、
1616         * "2"(checked)に設定されます。
1617         * (初期値:ユーザー定数のVIEW_USE_CHECK_CONTROL[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_CHECK_CONTROL}])。
1618         *
1619         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
1620         * @og.rev 3.7.0.1 (2005/01/31) 全件チェックコントロールのロジック変更(useCheckControl)
1621         *
1622         * @param       flag チェックボックスの全チェックを選択する機能を使用するかどうか
1623         *                      (true,1:使用する/false,0:使用しない/checked,2:初期値チェック済み)
1624         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_CHECK_CONTROL
1625         */
1626        public void setUseCheckControl( final String flag ) {
1627                useCheckControl = intCase( getRequestParameter(flag) );
1628
1629                if( useCheckControl < 0 ) {
1630                        String errMsg = "useCheckControl は、false(0)/true(1)/2 のいずれかしか登録できません。["
1631                                                 + flag + "]";
1632                        throw new HybsSystemException( errMsg );
1633                }
1634        }
1635
1636        /**
1637         * 【TAG】ヘッダーにソート用リンクを作成するかどうか[true/false]を指定します
1638         *              (初期値:VIEW_USE_TABLE_SORTER[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_TABLE_SORTER}])。
1639         *
1640         * @og.tag
1641         * "true" で、ヘッダーにソート用リンクを作成します。
1642         * false は、従来どおりです。
1643         * 検索済みのDBTableModelを、メモリ上でソートし、再表示させます。
1644         *              (初期値:ユーザー定数のVIEW_USE_TABLE_SORTER[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_TABLE_SORTER}])。
1645         *
1646         * @og.rev 3.5.4.7 (2004/02/06) 新規追加
1647         *
1648         * @param       flag ヘッダーにソート用リンクを作成するかどうか [true:作成する/false:作成しない]
1649         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_TABLE_SORTER
1650         */
1651        public void setUseTableSorter( final String flag ) {
1652                useTableSorter = nval( getRequestParameter(flag),useTableSorter );
1653        }
1654
1655        /**
1656         * 表示データをプレビュー可能かどうかを返します。
1657         *
1658         * 不可能な状態とは,すでに一番先頭から表示されている場合です。
1659         *
1660         * @return      プレビュー可能(true)/不可能(false)
1661         */
1662        private boolean isPrev() {
1663                if( startNo <= 0 ) {
1664                        return false;
1665                }
1666                return true;
1667        }
1668
1669        /**
1670         * 表示データをネクスト可能かどうかを返します。
1671         *
1672         * 不可能な状態とは,すでに一番後ろが表示されている場合です。
1673         *
1674         * @return      ネクスト可能(true)/不可能(false)
1675         */
1676        private boolean  isNext() {
1677                if( (startNo + pageSize) >= table.getRowCount() ) {
1678                        return false;
1679                }
1680                return true;
1681        }
1682
1683        /**
1684         * コマンドを実行します。
1685         *
1686         * コマンドは,HTMLから(get/post)指定されますので,setCommand()メソッドで
1687         * 登録します。
1688         * コマンドを登録すると同時に,実行も行ないます。
1689         *
1690         * @og.rev 3.8.0.8 (2005/10/03) その他のコマンドを CMD_XXX にします。
1691         *
1692         * @param       command コマンド(public static final 宣言されている文字列)
1693         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ViewFormTag.CMD_PREV">コマンド定数</a>
1694         */
1695        private void commandExec( final String command ) {
1696                if(      CMD_PREV.equals(       command ) ) { prev() ;  }
1697                else if( CMD_NEXT.equals(       command ) ) { next() ;  }
1698                else if( CMD_FIRST.equals(      command ) ) { first() ; }
1699                else if( CMD_LAST.equals(       command ) ) { last() ;  }
1700        //      else if( CMD_NEW.equals(        command ) ) {}          // 何もしない
1701        //      else if( CMD_REVIEW.equals( command ) ) {}              // 何もしない
1702        //      else if( CMD_RESET.equals(      command ) ) {}          // 何もしない
1703                else if( CMD_VIEW.equals(       command ) ) { view() ;  }
1704                // 3.8.0.8 (2005/10/03) その他のコマンドを CMD_XXX にします。
1705                else if( CMD_XXX.equals(        command ) ) { view() ;  }
1706                this.command = null;
1707        }
1708
1709        /**
1710         * HTMLデータの表示をプレビュー(戻し)します。
1711         *
1712         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
1713         *
1714         */
1715        private void prev() {
1716                if( ! isPrev() ) { return ; }                   // prev 出来ない。
1717                tempStartNo = tempStartNo - pageSize;
1718                if( tempStartNo < 0 ) { tempStartNo = 0; }
1719                if( skip ) {
1720                        for( int i=startNo-1; i>=0; i-- ) {
1721                                if( form.isMarked( i ) ) {
1722                                        startNo = i;
1723                                        break;
1724                                }
1725                        }
1726                        return ;
1727                }
1728
1729                startNo = startNo - pageSize;
1730                if( startNo < 0 ) {
1731                        startNo = 0;
1732                }
1733        }
1734
1735        /**
1736         * HTMLデータの表示をネクスト(先送り)します。
1737         *
1738         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
1739         *
1740         */
1741        private void next() {
1742                if( ! isNext() ) { return ; }                   // next 出来ない。
1743                tempStartNo = tempStartNo + pageSize;
1744                if( skip ) {
1745                        int end  = table.getRowCount();
1746                        for( int i=startNo+1; i<end; i++ ) {
1747                                if( form.isMarked( i ) ) {
1748                                        startNo = i;
1749                                        break;
1750                                }
1751                        }
1752                        return ;
1753                }
1754
1755                startNo = startNo + pageSize;
1756        }
1757
1758        /**
1759         * HTMLデータの表示をファースト(最初)します。
1760         *
1761         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
1762         *
1763         */
1764        private void first() {
1765                tempStartNo = 0;
1766                if( tempStartNo < 0 ) { tempStartNo = 0; }
1767                if( skip ) {
1768                        int end  = table.getRowCount();
1769                        for( int i=startNo; i<end; i++ ) {
1770                                if( form.isMarked( i ) ) {
1771                                        startNo = i;
1772                                        break;
1773                                }
1774                        }
1775                        return ;
1776                }
1777
1778                startNo = 0;
1779        }
1780
1781        /**
1782         * HTMLデータの表示をラスト(最後)します。
1783         *
1784         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
1785         *
1786         */
1787        private void last() {
1788                tempStartNo = table.getRowCount() - pageSize;
1789                if( tempStartNo < 0 ) { tempStartNo = 0; }
1790                if( skip ) {
1791                        for( int i=startNo; i>=0; i-- ) {
1792                                if( form.isMarked( i ) ) {
1793                                        startNo = i;
1794                                        break;
1795                                }
1796                        }
1797                        return ;
1798                }
1799
1800                startNo = table.getRowCount() - pageSize;
1801                if( startNo < 0 ) { startNo = 0; }
1802        }
1803
1804        /**
1805         * HTMLデータの表示をします。
1806         *
1807         */
1808        private void view() {
1809                if( skip ) {
1810                        int end  = table.getRowCount();
1811                        for( int i=startNo; i<end; i++ ) {
1812                                if( form.isMarked( i ) ) {
1813                                        startNo = i;
1814                                        break;
1815                                }
1816                        }
1817                        return ;
1818                }
1819        }
1820
1821        /**
1822         * startNo,pageSize,pagePlus の初期値を設定する。
1823         *
1824         * @og.rev 3.0.1.3 (2003/03/11) startNo を隠しフィールドに持つ処理を、追加
1825         * @og.rev 3.5.4.1 (2003/12/01) startNo をキャッシュから取り出すように変更。
1826         * @og.rev 3.5.4.7 (2004/02/06) getStartNoKeyメソッドの廃止(getRequestCacheDataを利用)
1827         * @og.rev 3.7.0.2 (2005/02/14) NEXT 時に何も選択しないで追加した場合は、1件目から表示する。
1828         * @og.rev 3.8.0.8 (2005/10/03) その他のコマンドを CMD_XXX にします。
1829         *
1830         */
1831        private void setDefaultParameter() {
1832                // 3.7.0.2 (2005/02/14)
1833                // 3.8.0.8 (2005/10/03) その他のコマンドを CMD_XXX にします。
1834                if( CMD_XXX.equals( command ) ) {
1835                        String[] selected = getRequestValues( HybsSystem.ROW_SEL_KEY ) ;
1836                        if( selected == null || selected.length == 0 ) {
1837                                startNo = 0;
1838                                tempStartNo = startNo;
1839                        }
1840                }
1841
1842                if( startNo<0 ) {
1843                        startNo = nval( getRequestCacheData( START_NO_KEY ),form.getStartNo() ) ;
1844                        tempStartNo = startNo;
1845                }
1846
1847                if( pageSize<0 ) {
1848                        pageSize = nval( getRequestValue( PAGE_SIZE_KEY ),form.getPageSize() ) ;
1849                }
1850
1851                if( pagePlus<0 ) {
1852                        pagePlus = nval( getRequestValue( PAGE_PLUS_KEY ),0 ) ;
1853                }
1854
1855        }
1856
1857        /**
1858         * 内部タグの TheadTag / TbodyTag / TfootTag より、個々のフォーマットを定義する
1859         * 為のTableFormatter オブジェクトを受け取る。
1860         *
1861         * @og.rev 3.5.4.0 (2003/11/25) 新規登録(setAttributes メソッドより移行)
1862         *
1863         * @param       form TableFormatterオブジェクト
1864         */
1865        protected void addFormatter( final TableFormatter form ) {
1866                if( values == null ) { values = new ArrayList<TableFormatter>(); }
1867                values.add( form );
1868        }
1869
1870        /**
1871         * pageSize をhidden属性で出力するタグを作成します。
1872         *
1873         * @og.rev 3.5.4.0 (2003/11/25) command="RESET"時に、戻った画面のpageSize がクリアされてしまう対応。
1874         * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。
1875         *
1876         * @param       pageSize        ページサイズ
1877         *
1878         * @return      hidden属性で出力するタグ
1879         */
1880        private String makePageSize( final int pageSize ) {
1881                String name   = PAGE_SIZE_KEY;
1882                String value  = String.valueOf( pageSize );
1883
1884                return XHTMLTag.hidden( name,value );   // 3.5.5.5 (2004/04/23)
1885        }
1886
1887        /**
1888         * consistencyKey をhidden属性で出力するタグを作成します。
1889         * 出力する条件は、useConsistency="true" (初期値)、で
1890         * scope が、 request 以外の場合です。
1891         * tableId が設定された場合は、consistencyKey に、tableId を加えた
1892         * キーにします。
1893         *
1894         * @og.rev 3.5.5.5 (2004/04/23) DBTableModel の整合性パラメータを hidden で出力します。
1895         * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。
1896         * @og.rev 3.5.5.8 (2004/05/20) makeConsistencyKey メソッドに処理ロジックを移します。
1897         *
1898         */
1899        private void makeConsistencyKey() {
1900                if( useConsistency && ! "request".equals( getScope() ) ) {
1901                        String name   = HybsSystem.CONSISTENCY_KEY;
1902                        String value  = table.getConsistencyKey() ;
1903
1904                        jspPrint( XHTMLTag.hidden( name,value ) );
1905                }
1906        }
1907
1908        /**
1909         * "false","true","checked" の文字列を、それぞれ、0,1,2 に対応した数字に変換します。
1910         * それ以外の文字列は、-1 にします。
1911         *
1912         * @og.rev 3.7.0.1 (2005/01/31) 新規作成
1913         *
1914         * @param    flag 文字列 (true=1 , false=0 , checked=2) の文字列
1915         *
1916         * @return   設定値(0,1,2の数字、不正な場合は、-1 を返す。
1917         */
1918        private static int intCase( final String flag ) {
1919                int rtn = -1;
1920                if( "FALSE".equalsIgnoreCase( flag ) || "0".equalsIgnoreCase( flag ) ) {
1921                        rtn = 0;
1922                }
1923                else if( "TRUE".equalsIgnoreCase( flag ) || "1".equalsIgnoreCase( flag ) ) {
1924                        rtn = 1;
1925                }
1926                else if( "CHECKED".equalsIgnoreCase( flag ) || "2".equalsIgnoreCase( flag ) ) {
1927                        rtn = 2;
1928                }
1929                return rtn ;
1930        }
1931
1932        /**
1933         * ViewForm のサブクラスに渡すパラメータマップ
1934         *
1935         * @og.rev 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを追加します。
1936         *
1937         * @param       map パラメータマップ
1938         */
1939        protected void setParam( final Map<String,String> map ) {
1940                viewParam = map ;
1941        }
1942        
1943        /**
1944         * ViewForm のサブクラスに渡すパラメータ(文字列配列のArrayList)を設定します。
1945         *
1946         * @og.rev 5.5.8.3 (2012/11/17) 新規作成(スタックガント対応)
1947         * @og.rev 5.5.9.0 (2012/12/03) objectからArrayListに変更
1948         *
1949         * @param       list 文字列配列のArrayList
1950         */
1951        protected void setViewArrayList( final List<String[]> list ) {
1952                viewArrayList = list;
1953        }
1954
1955        /**
1956         * 【TAG】パラメーターファイルの使用をするかどうか[true/false]を指定します(初期値:false)。
1957         *
1958         * @og.tag
1959         * "true" で、パラメータファイルを読み込むため、BODY部を処理します。
1960         * false は、パラメータファイうを使用しません。
1961         * パラメータファイルは、各ViewFormのサブクラス用に用意します。
1962         * 初期値は、false です。(false)
1963         *
1964         * @og.rev 3.5.4.8 (2004/02/23) 新規追加
1965         *
1966         * @param       flag パラメーターファイルを使用 [true:使用する/false:使用しない]
1967         */
1968        public void setUseParam( final String flag ) {
1969                useParam = nval( getRequestParameter(flag),useParam );
1970        }
1971
1972        /**
1973         * 【TAG】Consistency キー による整合性チェックを行うかどうか[true/false]を指定します(初期値:true)。
1974         *
1975         * @og.tag
1976         * 検索結果を DBTableModel にセットする時に、整合性キーの Consistency キーを
1977         * 作成します。これを、Viewタグでhidden出力しておき、Entryタグでデータ書き換え時に
1978         * 整合性チェックを行います。これは、IEの戻るボタンで戻った場合に、画面の
1979         * キーと検索結果の DBTableModel の内容が一致しない場合のエラーチェックに
1980         * なります。
1981         * この属性は、何らかのケースで、このエラーチェックを行いたくない場合に、
1982         * false に設定することで、整合性チェックを行いません。
1983         * 初期値は、true(整合性チェックを行う)です。
1984         *
1985         * @og.rev 3.5.5.7 (2004/05/10) 新規登録
1986         *
1987         * @param       ck      Consistency Key の使用するかどうか [true:行う/false:行わない]
1988         */
1989        public void setUseConsistency( final String ck ) {
1990                useConsistency = nval( getRequestParameter( ck ),useConsistency );
1991        }
1992
1993        /**
1994         * 【TAG】テーブルのバックグラウンドカラーの入れ替えのサイクルをセットします(初期値は、1:ゼブラ)。
1995         *
1996         * @og.tag
1997         * 0(ゼブラなし)、-1(ワーニング)、-2以下(エラー)、1(ゼブラ)、2以上(行数まとめ)
1998         * 初期値は、1(ゼブラ)です。
1999         *
2000         * @og.rev 3.5.6.2 (2004/07/05) 新規追加
2001         *
2002         * @param  sycle  0(ゼブラなし)、-1(ワーニング)、-2以下(エラー)、1(ゼブラ)、2以上(行数まとめ)
2003         */
2004        public void setBgColorCycle( final String sycle ) {
2005                bgColorCycle = nval( getRequestParameter( sycle ),bgColorCycle );
2006        }
2007
2008        /**
2009         * 【TAG】テーブルのバックグラウンドカラーのクラスに指定するカラム名を指定します。
2010         *
2011         * @og.tag
2012         * 通常のゼブラ模様は、tr 属性のクラス指定として、row_0、row_1 が指定されます。
2013         * その代わりに、ここで指定されたカラムの値がクラス属性として設定されます。
2014         * (指定するのはカラム名です。行単位にクラス属性の値を変えることが可能です。)
2015         * 選択行(row_sel)は、優先して使用されます。
2016         * 出力されるクラス名は、"row_" + 属性値 になります。
2017         *
2018         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
2019         *
2020         * @param  clsClm ゼブラ模様の替わりに指定するクラスを格納したカラム名
2021         */
2022        public void setBgColorClsClm( final String clsClm ) {
2023                bgColorClsClm = nval( getRequestParameter( clsClm ),bgColorClsClm );
2024        }
2025
2026        /**
2027         * 【TAG】スクロールバー用のDIV要素を出力するかどうか[true/false]を指定します
2028         *              (初期値:VIEW_USE_SCROLLBAR[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_SCROLLBAR}])。
2029         *
2030         * @og.tag
2031         * スクロールバー対応する為、テーブルの先頭に、DIV要素を出力します。
2032         * (初期値:ユーザー定数のVIEW_USE_SCROLLBAR[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_SCROLLBAR}])。
2033         * ※ 互換性の関係より、false になっています。
2034         *
2035         * @og.rev 3.5.6.3 (2004/07/12) 新規追加
2036         *
2037         * @param  useBar  スクロールバー用のDIV要素を出力するかどうか[true:出力する/false:しない]
2038         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_SCROLLBAR
2039         */
2040        public void setUseScrollBar( final String useBar ) {
2041                useScrollBar = nval( getRequestParameter( useBar ),useScrollBar );
2042        }
2043
2044        /**
2045         * 【TAG】viewLink や viewMarker の情報取り込みを制御する(初期値は、NEW,RENEW,REVIEW,RESET)。
2046         *
2047         * @og.tag
2048         * viewLink や viewMarker の情報取り込みは、command が、NEW,RENEW,REVIEW,RESET
2049         * の場合のみ行われています。
2050         * この属性で、"true" を指定すると、コマンドに無関係に取り込みます。
2051         * "false" の場合は、form にキャッシュしているリンク、マーカーを削除します。
2052         * 取り込み時に、viewLink や viewMarker オブジェクトが存在しない場合は、
2053         * 何もしません。これは、viewMarker オブジェクト自身がすでに設定済みの場合(VIEWなど)
2054         * NEXTやPREVでは、viewMarkerオブジェクトは、リクエスト変数に設定されない為です。
2055         * この場合は、登録しませんが、既存の viewMarkerオブジェクトを持っているはずなので、
2056         * なにも設定しなくても viewMarker は適用されます。
2057         * 初期値は、NEW,RENEW,REVIEW,RESET です。
2058         *
2059         * @og.rev 3.6.0.4 (2004/10/14) 新規追加
2060         *
2061         * @param  load  viewLink や viewMarker の情報取り込みを制御する
2062         */
2063        public void setLoadMarker( final String load ) {
2064                loadMarker = nval( getRequestParameter( load ),loadMarker );
2065        }
2066
2067        /**
2068         * 【TAG】SEL_ROW機能[true:有効/false:無効]を指定します
2069         *              (初期値:VIEW_USE_SELECTED_ROW[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_SELECTED_ROW}])。
2070         *
2071         * @og.tag
2072         * SEL_ROW機能は、戻るリンクから戻ったときや、登録したときに、選択していた
2073         * 行番号や、先にクリックされた行番号を返す機能で、SEL_ROW リクエストに設定された
2074         * 行がマーカーされます。この機能の有効(true)/無効(false)を指定します。
2075         * この属性で、"true" を指定すると、有効になります。
2076         * "false" の場合は、無効です。
2077         * (初期値:ユーザー定数のVIEW_USE_SELECTED_ROW[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_SELECTED_ROW}])。
2078         *
2079         * @og.rev 3.7.1.1 (2005/05/23) 新規追加
2080         *
2081         * @param  selRow  SEL_ROW機能の有効/無効を指定 [true:有効/false:無効]
2082         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_SELECTED_ROW
2083         */
2084        public void setUseSelectedRow( final String selRow ) {
2085                useSelectedRow = nval( getRequestParameter( selRow ),useSelectedRow );
2086        }
2087
2088        /**
2089         * 【TAG】SEL_ROW使用時の選択行色変更[true:有効/false:無効]を指定します
2090         *              (初期値:VIEW_USE_SELROW_COLOR[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_SELROW_COLOR}])。
2091         *
2092         * @og.tag
2093         * SEL_ROW機能は、現在選択されている行まで、スクロールする機能ですが、そのとき、
2094         * 選択行にマーカーするかどうかを、指定します。
2095         * この属性で、"true" を指定すると、有効になります。
2096         * "false" の場合は、無効です。
2097         * (初期値:ユーザー定数のVIEW_USE_SELROW_COLOR[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_SELROW_COLOR}])。
2098         *
2099         * @og.rev 3.7.1.1 (2005/05/31) 新規追加
2100         *
2101         * @param  selRowColor  SEL_ROW使用時の選択行色変更の有効/無効を指定 [true:有効/false:無効]
2102         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_SELROW_COLOR
2103         */
2104        public void setUseSelRowColor( final String selRowColor ) {
2105                useSelRowColor = nval( getRequestParameter( selRowColor ),useSelRowColor );
2106        }
2107
2108        /**
2109         * 【TAG】 処理時間やページサイズなどの情報出力[true:有効/false:無効]を指定します(初期値:true)。
2110         *
2111         * @og.tag
2112         * ViewForm で、CustomData などの 非HTML表示ビューを使用する場合、
2113         * 最後に、処理時間とページサイズ(NEXT時に使用)などの情報を、hidden で
2114         * 出力していますが、これを制御するフラグをセットします。
2115         * true(有効)にすると、これらのHTMLが出力されます。false にすると、出力されません。
2116         * 初期値は、true(有効) です。
2117         *
2118         * @og.rev 3.7.1.1 (2005/05/23) 新規追加
2119         *
2120         * @param  useTag  情報出力の有効/無効を指定 [true:有効/false:無効]
2121         */
2122        public void setUseAfterHtmlTag( final String useTag ) {
2123                useAfterHtmlTag = nval( getRequestParameter( useTag ),useAfterHtmlTag );
2124        }
2125
2126        /**
2127         * 【TAG】設定値に "_" が含まれている場合にレンデラーを使用するカラムをCSV形式で指定します。
2128         *
2129         * @og.tag
2130         * これは、従来の カラム定義の WRITABLE エディターと同等の働きを行うように
2131         * カラム属性を指定します。
2132         * WRITABLE エディターは、設定値にアンダーバー "_" が含まれている場合に、
2133         * その値を書込み禁止にする機能です。これは、エディター自身が値を判断して
2134         * 書き込み許可か禁止かを判断しています。
2135         * この動きを汎用的にするため、指定のカラムをカンマ区切り文字(CSV)で指定
2136         * することにより、レンデラーとエディターを設定値によって動的に切り替える
2137         * 機能を実現します。
2138         * その場合、表示/編集ともに、先頭のアンダーバーは削除されます。
2139         * また、全カラムについて、有効にする場合は、writableControl="*" を設定します。
2140         *
2141         * @og.rev 3.8.0.9 (2005/10/17) 新規追加
2142         *
2143         * @param  wrtCtrl 書き込み制御を行いたいカラムをCSV形式で指定
2144         */
2145        public void setWritableControl( final String wrtCtrl ) {
2146                writableControl = nval( getRequestParameter( wrtCtrl ),writableControl );
2147        }
2148
2149        /**
2150         * 【TAG】HILIGHT_ROW機能[true:有効/false:無効]を指定します
2151         *              (初期値:VIEW_USE_HILIGHT_ROW[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_HILIGHT_ROW}])。
2152         *
2153         * @og.tag
2154         * HILIGHT_ROW機能は、チェックボックスやラジオボタンで行選択した際に、どの行が選択されたか
2155         * 判るように行のハイライト表示を行う機能です。
2156         * さらに、行の任意の箇所をクリックしても、チェックが入り、ハイライト表示されます。
2157         * この属性で、"true" を指定すると、有効になります。
2158         * "false" の場合は、無効です。
2159         * (初期値:ユーザー定数のVIEW_USE_HILIGHT_ROW[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_HILIGHT_ROW}])。
2160         *
2161         * @og.rev 3.8.6.0 (2006/09/29) HILIGHT_ROW機能の有効/無効を指定します。
2162         *
2163         * @param  hilightRow  HILIGHT_ROW機能の有効/無効を指定 [true:有効/false:無効]
2164         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_HILIGHT_ROW
2165         */
2166        public void setUseHilightRow( final String hilightRow ) {
2167                useHilightRow = nval( getRequestParameter( hilightRow ),useHilightRow );
2168        }
2169
2170        /**
2171         * 【TAG】ogPopup で検索結果の値を返すキーを、CSV形式で指定します。
2172         *
2173         * @og.tag
2174         * popup の検索結果を返す画面で、結果のラジオボタンにイベントセットします。
2175         * この場合、オープンもとのwindow に値を返しますが、そのキーをCSV形式で
2176         * 指定します。
2177         * なお、このメソッドは、一覧表示(HTMLTable)関係のビューのみでサポートして
2178         * いますが、チェックメソッドの関係で、それ以外のビューに適用しても素通り
2179         * するようにします。(エラーにしません)
2180         *
2181         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
2182         *
2183         * @param  rtnKeys ogPopupで値を返すカラム文字列(CSV形式)
2184         */
2185        public void setPopupReturnKeys( final String rtnKeys ) {
2186                popupReturnKeys = nval( getRequestParameter( rtnKeys ),popupReturnKeys );
2187        }
2188
2189        /**
2190         * 【TAG】table要素に対して class 属性を設定します(初期値:viewTable)。
2191         *
2192         * @og.tag
2193         * Javaの言語使用上、class で作成できないため、代用として
2194         * clazz を使用している。
2195         * html で作成される属性は、 class で作成される。
2196         * 初期値は、"viewTable" です。
2197         *
2198         * @og.rev 4.0.0.0 (2007/04/16) 新規追加
2199         *
2200         * @param       cls     class属性を表す文字列
2201         */
2202        public void setClazz( final String cls ) {
2203                clazz = nval( getRequestParameter( cls ),clazz );
2204        }
2205
2206        /**
2207         * 【TAG】ビューの高さを指定します。
2208         *
2209         * @og.tag
2210         * id=posDivのDIV要素に高さを指定します。
2211         * javascriptからこの高さを見てビューの高さを決定します。
2212         * 単位も指定して下さい。
2213         *
2214         * @og.rev 4.2.0.0 (2008/03/18) 新規追加
2215         *
2216         * @param       high    class属性を表す文字列
2217         */
2218        public void setHeight( final String high ) {
2219                height = nval( getRequestParameter( high ), height );
2220        }
2221
2222        /**
2223         * 【TAG】ビューの幅を指定します。
2224         *
2225         * @og.tag
2226         * id=posDivのDIV要素に幅を指定します。
2227         * javascriptからこの値を見てビューの幅を決定します。
2228         * 単位も指定して下さい。(%指定推奨)
2229         *
2230         * @og.rev 4.2.0.0 (2008/03/18) 新規追加
2231         *
2232         * @param       wide    指定するビューの幅
2233         */
2234        public void setWidth( final String wide ) {
2235                width = nval( getRequestParameter( wide ), width );
2236        }
2237
2238        /**
2239         * 【TAG】ファイルダウンロード時の抜出カラム名(CSV形式)を指定します。
2240         *
2241         * @og.tag
2242         * fileUDのファイル抜出時のカラムをカンマ形式で指定します。
2243         *
2244         * @og.rev 4.3.0.0 (2008/07/04) 新規追加
2245         *
2246         * @param       dwnClms 抜出カラム名(CSV形式)
2247         */
2248        public void setFileDwnClms( final String dwnClms ) {
2249                fileDwnClms = nval( getRequestParameter( dwnClms ), fileDwnClms );
2250        }
2251
2252        /**
2253         * 【TAG】編集行のみを表示するかを指定します。
2254         *
2255         * @og.tag
2256         * 編集行のみを表示するかを指定します。trueがセットされた場合、編集行(改廃Cがついている行)
2257         * のみが出力されます。
2258         *
2259         * @og.rev 4.3.1.0 (2008/09/08)
2260         *
2261         * @param       sne     編集行のみを出力するか
2262         */
2263        public void setSkipNoEdit( final String sne ) {
2264                skipNoEdit = nval( getRequestParameter( sne ), skipNoEdit );
2265        }
2266
2267        /**
2268         * 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します。
2269         *
2270         * @og.tag
2271         * 画面遷移なしの登録を行うかどうかを指定します。
2272         * trueが指定された場合、HTML出力時に、各行に対して、行番号と改廃Cが属性情報として付加されます。
2273         * ここで出力された情報を元に、JavaScriptの入れ替え処理を行います。
2274         *
2275         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
2276         *
2277         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
2278         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
2279         *
2280         * @param   noTrnstn 画面遷移を行わない形式の登録方法を使用するか
2281         */
2282        public void setNoTransition( final String noTrnstn ) {
2283                setNoTransitionRequest( nval( getRequestParameter( noTrnstn ), isNoTransitionRequest() ) );
2284        }
2285
2286        /**
2287         * 【TAG】選択行ハイライトの制御をチェックボックスのみで有効にするかを指定します
2288         *              (初期値:VIEW_USE_HILIGHT_CHECK_ONLY[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_HILIGHT_CHECK_ONLY}])。
2289         *
2290         * @og.tag
2291         * 選択行ハイライトの制御をチェックボックスのみで有効にするかを指定します。
2292         * trueの場合、チェックボックスのみで有効になります。
2293         * falseの場合、行全体の各要素で有効になります。
2294         * trueにした場合、チェックボックスが存在しない行に対しては、ハイライトすることはできません。
2295         * (初期値:ユーザー定数のVIEW_USE_HILIGHT_CHECK_ONLY[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_USE_HILIGHT_CHECK_ONLY}])。
2296         *
2297         * @og.rev 4.3.7.0 (2009/06/01) 新規追加
2298         *
2299         * @param   hiCkOnly 選択行ハイライトの制御をチェックボックスのみで有効にするか
2300         * @see         org.opengion.hayabusa.common.SystemData#VIEW_USE_HILIGHT_CHECK_ONLY
2301         */
2302        public void setUseHilightCheckOnly( final String hiCkOnly ) {
2303                useHilightCheckOnly = nval( getRequestParameter( hiCkOnly ), useHilightCheckOnly );
2304        }
2305
2306        /**
2307         * 【TAG】一括入力カラムのアシスト機能を利用するカラム名を、カンマ区切りで与えます。
2308         *
2309         * @og.tag
2310         * これは、カラムの書き込み時に、一括入力可能なカラムをヘッダーに表示し、
2311         * 一括登録できる機能を提供します。
2312         * この機能は、jsp/common/bulkSet.js JavaScript とともに提供されます。
2313         * IE については、クリップボードも利用できます。Ctrl-C と Ctrl-V でそれぞれ
2314         * 一連のカラムの値の取り出しと書き込みが可能になります。
2315         * (プルダウンの場合はオプションに上記が追加されます)
2316         * "*" を指定すると、すべてのカラムを(columnBulkSet)指定したことになります。
2317         * "-"を指定すると、全てのカラムに対して指定しなかった事となります。
2318         *
2319         * システムリソースで、VIEW_USE_DEFAULT_BULKSET を true に設定すると、初期値が "*"
2320         * になりますので、個別の view に設定しなくてもこの機能が使用できるようになります。
2321         *
2322         * この機能は一括入力の手間削減が目的なので、selectedType が radio の場合は、
2323         * この機能は無効になります。
2324         *
2325         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
2326         * @og.rev 5.4.4.0 (2012/02/01) コメント追加
2327         *
2328         * @param       columnName      例:"OYA,KO,HJO,SU,DYSET,DYUPD"
2329         */
2330        public void setColumnBulkSet( final String columnName ) {
2331                columnBulkSet = nval( getRequestParameter(columnName),columnBulkSet );
2332        }
2333
2334        /**
2335         * タグの名称を、返します。
2336         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
2337         *
2338         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
2339         *
2340         * @return  タグの名称
2341         */
2342        @Override
2343        protected String getTagName() {
2344                return "view" ;
2345        }
2346
2347        /**
2348         * seqClmTableを使用するかどうかをチェックします
2349         *
2350         * ここではtableId,scope,項目名などで厳密にチェックを行い、これらが元の情報と合致しない場合は、
2351         * ViewFormTypeの置き換えを行わないようにします。
2352         *
2353         * @og.rev 5.1.6.0 (2010/05/01) 新規追加
2354         * @og.rev 5.3.6.0 (2011/06/01) Edit機能見直しによりメソッド名変更
2355         * @og.rev 5.7.7.3 (2014/06/27) カラムが存在しない場合の挙動変更
2356         * @og.rev 5.8.6.0 (2015/04/03) editColumnDisplay
2357         * @og.rev 5.8.7.1 (2015/05/22) エラー時はeditConfをnullとしておく
2358         *
2359         * @param       config  DBEditConfigオブジェクト
2360         */
2361        private void makeEditTable( final DBEditConfig config ) {
2362                String userViewClms = config.getViewClms();
2363                DBLastSql lastSql = (DBLastSql)getSessionAttribute( HybsSystem.DB_LAST_SQL_KEY );
2364                if( lastSql != null && lastSql.isGuiMatch( getGUIInfoAttri( "KEY" ) ) && lastSql.isTableMatch( tableId, getScope() ) ) {
2365                        // 1Queryに対して複数Viewがある場合(左右分割など)、Viewの各項目定義が'|'で分割されてセットされています。
2366                        int vwCnt = nval( (String)getRequestAttribute( "h_vwCnt" ), 0 );
2367                        String[] clmGroup = StringUtil.csv2Array( userViewClms, '|' );
2368                        if( clmGroup.length > vwCnt ) {
2369                                // AAA,!BBB,CCC,DDD,!EEE から!がついたカラムのみを取り除く(!がある項目は非表示)
2370                                String thisViewClms = ( "," + clmGroup[vwCnt] ).replaceAll( ",![^,]*", "" );
2371                                // 行カウントカラムを表示する。
2372                                if( table.getColumnNo( "rowCount", false ) >= 0 ) {
2373                                        thisViewClms += ",rowCount";
2374                                }
2375                                if( thisViewClms.length() > 0 ) {
2376                                        thisViewClms = thisViewClms.substring( 1 );
2377                                }
2378                                String[] clm = StringUtil.csv2Array( thisViewClms );
2379                                boolean isUse = true;
2380                                for( int i=0; i<clm.length; i++ ) {
2381                                        if( table.getColumnNo( clm[i], false ) < 0 ) {
2382                                                isUse = false;
2383                                                editConf = null; // 5.8.7.1 (2015/05/22)
2384                                                jspPrint( getResource().getLabel( editWarnwMsg, new String[] { getResource().getLabel(clm[i]) } ) + HybsSystem.BR ); // 5.7.7.3 (2014/06/27)
2385                                                break;
2386                                        }
2387                                }
2388                                if( isUse ) {
2389                                        viewFormType    = "HTMLSeqClmTable";
2390//                                      columnDisplay   = thisViewClms;
2391                                        editColumnDisplay = thisViewClms; // 5.8.6.0 (2015/04/03) 後からcolumnDisplayセット
2392                                        clmSeqDisplay   = thisViewClms;
2393//                                      noDisplay               = null;
2394                                        setRequestAttribute( "h_vwCnt", String.valueOf( vwCnt+1 ) );
2395                                }
2396                        }
2397                }
2398        }
2399
2400        /**
2401         * Viewで表示した項目をDBLastSqlにセットします。
2402         *
2403         * ここではtableId,scopeなどで厳密にチェックを行い、これらが元の情報と合致しない場合は、
2404         * DBLastSqlへのセットを行わないようにします。
2405         *
2406         * @og.rev 5.1.6.0 (2010/05/01) 新規追加
2407         * @og.rev 5.3.9.0 (2011/09/01) ヘッダーソートを行った場合、編集対象カラムが正しく表示されないバグを修正
2408         */
2409        private void setViewClms() {
2410                // 4.3.0.0 (2008/07/04) fileUD 対応。抜き出すカラムを指定します。
2411                DBLastSql lastSql = (DBLastSql)getSessionAttribute( HybsSystem.DB_LAST_SQL_KEY );
2412                if( lastSql != null ) {
2413                        String guikey = getGUIInfoAttri( "KEY" );
2414                        if( lastSql.isGuiMatch( guikey ) && lastSql.isTableMatch( tableId, getScope() ) && lastSql.isViewEditable() ) {
2415                                // 5.1.6.0 (2010/05/01) fileDwnClmsが指定されない場合は、Viewで表示されたカラムをセット
2416                                if( form.isEditable() ) {
2417
2418                                        // 5.3.9.0 (2011/09/01) リクエストに対して初めて処理する場合に対象カラムを一旦クリアする。
2419                                        boolean vwBln = nval( (String)getRequestAttribute( "h_vwBln" ), false );
2420                                        if( !vwBln ) {
2421                                                lastSql.setViewClmNames( null );
2422                                                lastSql.setClmNames( null );
2423                                                setRequestAttribute( "h_vwBln", "true" );
2424                                        }
2425
2426                                        String clmNames = lastSql.getViewClmNames();
2427                                        if( clmNames == null || clmNames.length() == 0 ) {
2428                                                clmNames = nval( fileDwnClms, form.getViewClms() );
2429                                        }
2430                                        else {
2431                                                // 1Queryに対して複数Viewがある場合(左右分割など)、Viewの各項目定義が'|'で分割されてセットします。
2432                                                clmNames += "|" + nval( fileDwnClms, form.getViewClms() );
2433                                        }
2434                                        lastSql.setViewClmNames( clmNames );
2435                                        lastSql.setClmNames( clmNames.replace( "|", "," ) );
2436                                        setSessionAttribute( HybsSystem.DB_LAST_SQL_KEY,lastSql );
2437                                }
2438                                else {
2439                                        lastSql.setViewNotEditable();
2440                                }
2441                        }
2442                }
2443        }
2444
2445        /**
2446         * 【TAG】(通常使いません)Viewに関する情報をセッションに情報を登録するかどうかを指定します(初期値:true)。
2447         *
2448         * @og.tag
2449         * 同一画面IDで、複数のViewを表示する場合に利用します。
2450         * View関連の情報をセッションに登録し利用していますが、複数のViewが存在する場合に前の情報が上書きされてしまいます。
2451         * 複数のViewを利用する際に、メイン以外のViewの値をfalseに指定する事でセッションへの保存をしません。
2452         * (QueryTagのmainTransも同時に設定するか検討してください)
2453         *
2454         * 現段階では、セッション保存抑制を行う値はstartNoのみです。
2455         *
2456         * @og.rev 5.7.6.1 (2010/05/09) 新規作成
2457         *
2458         * @param  flag メイントランザクションかどうか
2459         */
2460        public void setMainView( final String flag ) {
2461                isMainView = nval( getRequestParameter( flag ),isMainView );
2462        }
2463
2464        /**
2465         * シリアライズ用のカスタムシリアライズ書き込みメソッド
2466         *
2467         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
2468         * @serialData 一部のオブジェクトは、シリアライズされません。
2469         *
2470         * @param       strm    ObjectOutputStreamオブジェクト
2471         * @throws IOException  入出力エラーが発生した場合
2472         */
2473        private void writeObject( final ObjectOutputStream strm ) throws IOException {
2474                strm.defaultWriteObject();
2475        }
2476
2477        /**
2478         * シリアライズ用のカスタムシリアライズ読み込みメソッド
2479         *
2480         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
2481         *
2482         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
2483         * @serialData 一部のオブジェクトは、シリアライズされません。
2484         *
2485         * @param       strm    ObjectInputStreamオブジェクト
2486         * @see #release2()
2487         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
2488         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
2489         */
2490        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
2491                strm.defaultReadObject();
2492        }
2493
2494        /**
2495         * このオブジェクトの文字列表現を返します。
2496         * 基本的にデバッグ目的に使用します。
2497         *
2498         * @return このクラスの文字列表現
2499         */
2500        @Override
2501        public String toString() {
2502                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
2503                                .println( "VERSION"                     ,VERSION                        )
2504                                .println( "tableId"                     ,tableId                        )
2505                                .println( "viewFormId"          ,viewFormId                     )
2506                                .println( "viewFormType"        ,viewFormType           )
2507                                .println( "viewLinkId"          ,viewLinkId                     )
2508                                .println( "viewMarkerId"        ,viewMarkerId           )
2509                                .println( "command"                     ,command                        )
2510                                .println( "startNo"                     ,startNo                        )
2511                                .println( "tempStartNo"         ,tempStartNo            )
2512                                .println( "pageSize"            ,pageSize                       )
2513                                .println( "pagePlus"            ,pagePlus                       )
2514                                .println( "columnWritable"      ,columnWritable         )
2515                                .println( "noWritable"          ,noWritable                     )
2516                                .println( "columnDisplay"       ,columnDisplay          )
2517                                .println( "noDisplay"           ,noDisplay                      )
2518                                .println( "columnGroup"         ,columnGroup            )
2519                                .println( "noMessage"           ,noMessage                      )
2520                                .println( "writable"            ,writable                       )
2521                                .println( "checked"                     ,checked                        )
2522                                .println( "skip"                        ,skip                           )
2523                                .println( "rowspan"                     ,rowspan                        )
2524                                .println( "selectedType"        ,selectedType           )
2525                                .println( "numberType"          ,numberType                     )
2526                                .println( "optTypeAttri"        ,optTypeAttri           )
2527                                .println( "backLinkCount"       ,backLinkCount          )
2528                                .println( "headerSkipCount"     ,headerSkipCount        )
2529                                .println( "bodyString"          ,bodyString                     )
2530                                .println( "useCheckControl"     ,useCheckControl        )
2531                                .println( "useTableSorter"      ,useTableSorter         )
2532                                .println( "useParam"            ,useParam                       )
2533                                .println( "useConsistency"      ,useConsistency         )
2534                                .println( "bgColorCycle"        ,bgColorCycle           )
2535                                .println( "useScrollBar"        ,useScrollBar           )
2536                                .println( "sortKeys"            ,sortKeys                       )
2537                                .println( "loadMarker"          ,loadMarker                     )
2538                                .println( "useSelectedRow"      ,useSelectedRow         )
2539                                .println( "useSelRowColor"      ,useSelRowColor         )
2540                                .println( "useAfterHtmlTag"     ,useAfterHtmlTag        )
2541                                .println( "writableControl"     ,writableControl        )
2542                                .println( "hight"                       ,height                         )
2543                                .println( "width"                       ,width                          )
2544                                .println( "skipNoEdit"          ,skipNoEdit                     )
2545                                .println( "noTransition"        ,noTransition           )
2546                                .println( "useHilightCheckOnly",useHilightCheckOnly)
2547                                .println( "COMMAND_LIST"        ,COMMAND_LIST           )
2548                                .println( "Other..."    ,getAttributes().getAttribute() )
2549                                .fixForm().toString() ;
2550        }
2551}