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