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