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