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.html;
017
018import java.util.Arrays;
019import java.util.Iterator;
020import java.util.List;
021import java.util.Map;
022import java.util.concurrent.ConcurrentMap;                                              // 6.4.3.3 (2016/03/04)
023import java.util.stream.Collectors;                                                             // 6.4.3.4 (2016/03/11)
024import java.io.Writer;
025import java.io.IOException;
026
027import org.opengion.fukurou.system.HybsConst ;                                  // 6.1.0.0 (2014/12/26)
028import org.opengion.fukurou.util.StringUtil;
029import org.opengion.fukurou.util.Attributes;
030
031import org.opengion.hayabusa.common.HybsSystem;
032import org.opengion.hayabusa.common.HybsSystemException;
033import org.opengion.hayabusa.db.DBColumn;
034import org.opengion.hayabusa.db.DBTableModel;
035import org.opengion.hayabusa.db.DBColumnConfig;
036import org.opengion.hayabusa.resource.ResourceManager;
037
038/**
039 * ViewForm インターフェース の実装Abstractクラスです。
040 * これを,共通のスーパークラスとして 各種表示フォーム(例:HTML表示等)に使います。
041 *
042 * このクラス は、setter/getterメソッドのデフォルト実装を提供しています。
043 * 各種表示フォームに対応したサブクラス上で, create() をオーバーライドして下さい。
044 *
045 * @og.group 画面表示
046 *
047 * @version  4.0
048 * @author       Kazuhiko Hasegawa
049 * @since    JDK5.0,
050 */
051public abstract class AbstractViewForm implements ViewForm {
052        // 5.2.1.0 (2010/10/01)
053        // 6.1.1.0 (2015/01/17) BulkSet用の表示サイズは、一覧側のサイズになります。
054
055        /** システムの改行コードを設定します。*/
056        protected static final String CR                 = HybsConst.CR;                        // 6.1.0.0 (2014/12/26) refactoring
057        /** StringBilderなどの初期値を設定します。   {@value} */
058        protected static final int BUFFER_MIDDLE = HybsConst.BUFFER_MIDDLE;     // 6.1.0.0 (2014/12/26) refactoring
059        /** StringBilderなどの初期値を設定します。   {@value} */
060        protected static final int BUFFER_LARGE  = HybsConst.BUFFER_LARGE;      // 6.1.0.0 (2014/12/26) refactoring
061
062        // 3.8.0.3 (2005/07/15) 新しいヘッダー固定用のDIV要素を分ける。
063        private static final String LAYER_ST0 = "" ;
064        private static final String LAYER_END0 = "" ;
065        private static final String LAYER_END2 = "<a href=\"#top\" name=\"h_end\" id=\"h_end\" ></a></div></div></div></div>" ;
066
067        // 5.1.8.0 (2010/07/01) groupClass のタイプを定義します。
068        /** カラムのグループ化指定の enum static 定数です。 */
069        private enum CLM_GRP { KIGO , CHAR };
070//      private static enum CLM_GRP { KIGO , CHAR };
071
072        private String                  name                    = "";           // メニューの名前
073        private DBTableModel    table                   ;
074        private DBColumn[]              dbColumn                ;
075        private boolean[]               clmWritable     ;
076        private boolean[]               writeCtrl               ;                       // 3.8.0.9 (2005/10/17)
077        private boolean[]               clmDisplay              ;
078        private boolean[]               tdClassClms             ;                       // 8.0.1.0 (2021/11/02)
079        private String                  tdClass                 ;                       // 8.0.1.0 (2021/11/02)
080        private boolean[]               clmGroup                ;                       // 3.8.5.0 (2006/03/20)
081        private String                  groupClass              = "";           // 5.1.8.0 (2010/07/01)
082        private boolean                 useGroupDir             ;                       // 6.7.3.0 (2017/01/27)
083        private CLM_GRP                 groupType               ;                       // 5.1.8.0 (2010/07/01)
084        private boolean[]               sortKeys                ;                       // 3.6.0.0 (2004/09/17)
085        private boolean[]               useEventCols    ;                       // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
086        private boolean                 useSorterKeys   ;                       // 3.6.0.0 (2004/09/17) 内部変数
087        private String                  sorterQuery             = "";           // 3.6.0.0 (2004/09/17) 内部変数
088        private String                  viewFormID              ;
089        private int                     startNo                 ;
090        private int                     pageSize                = HybsSystem.sysInt( "HTML_PAGESIZE" ) ;
091        private boolean                 rowWritableFlag ;                               // 1カラム目が writable か?
092        private ViewMarker              viewLink                ;
093        private ViewMarker              viewMarker              ;
094        private ViewMarker              editMarker              ;                               // 3.8.6.1 (2006/10/20)
095        private String                  selectedType    = "checkbox";
096        private String                  numberType              = "sequence" ;  // 3.5.1.0 (2003/10/03) 新規作成
097        private int                             numberTypeClm   = -1;                   // 3.5.1.0 (2003/10/03) 新規作成
098        private String[]                numberTypeData  ;                               // 3.5.1.0 (2003/10/03) 新規作成
099        private String                  optTypeAttri    ;
100        private boolean                 noMessage               ;
101        private int                     backLinkCount   ;
102        private int                             headerSkipCount ;                               // 0:通常ヘッダ、n:n回ごとに現れる
103        private boolean                 skip                    = ViewForm.DEFAULT_SKIP;        // 3.5.3.1 (2003/10/31)
104        private int                             useCheckControl ;                               // 3.7.0.1 (2005/01/31)
105        private boolean                 useTableSorter  = HybsSystem.sysBool( "VIEW_USE_TABLE_SORTER" ) ;       // 3.5.4.7 (2004/02/06)
106        private boolean                 numberDisplay   = true ;                // 3.5.5.0 (2004/03/12)
107        private int                             scrollRowNo             = -1;                   // 3.7.0.3 (2005/03/01)
108
109        // 3.5.4.6 (2004/01/30) ヘッダー文字列を定義しておきます。
110        private static final String NO_HEADER = "No" ;
111
112        // 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを受け取ります。
113        /** 6.4.3.1 (2016/02/12) 作成元のMapを、HashMap から ConcurrentHashMap に置き換え。  */
114        private ConcurrentMap<String,String> viewParam  ;               // 6.4.3.3 (2016/03/04)
115
116        //5.5.8.3 (2012/11/17) Stringでなく、Objectタイプをもてるようにする(積上げガント対応)
117        private List<String[]> viewArrayList    ; // 5.5.9.0 (2012/12/03) ObjectではなくArrayList
118
119        private int columnCount ;       // 3.5.5.7 (2004/05/10)
120        private int rowCount    ;       // 4.0.0 (2006/01/06)
121
122        // 3.5.6.2 (2004/07/05) ゼブラ模様の指定を、ViewForm としてサポート
123        // 0(ゼブラなし)、-1(ワーニング)、-2以下(エラー)、1(ゼブラ)、2以上(行数まとめ)
124        private int bgColorCycle   = 1 ;
125        // 行ごとに色を変更する時の、デフォルトクラス属性
126        private static final String BG_COLOR_ROW0 = " class=\"row_0\"";
127        // 行ごとに色を変更する時の、切り替え後クラス属性
128        private static final String BG_COLOR_ROW1 = " class=\"row_1\"";
129
130        // 行ごとに色を変更する時の、切り替え後クラス属性
131        private static final String BG_COLOR_ROWSEL = " class=\"row_sel\"";             // 3.7.0.3 (2005/03/01)
132
133        // 警告時の行ごとに色を変更する時の、デフォルトクラス属性
134        private static final String BG_WARNING_COLOR_ROW0 = " class=\"row_0 row_warning\"";
135        // 警告時の行ごとに色を変更する時の、切り替え後クラス属性
136        private static final String BG_WARNING_COLOR_ROW1 = " class=\"row_1 row_warning\"";
137
138        // エラー時の行ごとに色を変更する時の、デフォルトクラス属性
139        private static final String BG_ERROR_COLOR_ROW0 = " class=\"row_0 row_error\"";
140        // エラー時の行ごとに色を変更する時の、切り替え後クラス属性
141        private static final String BG_ERROR_COLOR_ROW1 = " class=\"row_1 row_error\"";
142
143        private String colorRow0 = BG_COLOR_ROW0 ;
144        private String colorRow1 = BG_COLOR_ROW1 ;
145
146        // 5.1.8.0 (2010/07/01) 行に対して、動的にクラス属性を付与するカラム名を指定します。
147        private int bgColorClsClmNo  = -1;
148
149        // 3.5.6.4 (2004/07/16)
150        private boolean useScrollBar = HybsSystem.sysBool( "VIEW_USE_SCROLLBAR" ) ;
151
152        // 3.6.0.0 (2004/09/17)
153        private boolean firstChecked    ;
154
155        // 3.7.1.1 (2005/05/31) SEL_ROW機能使用時に、BG_COLOR_ROWSEL の使用 有/無を指定します。
156        private boolean useSelRowColor  ;
157
158        // 4.0.0 (2007/04/16) tableタグを出力するときに付与します。
159        private String  clazz                   = "viewTable";
160
161        // 4.0.0.0 (2007/11/27) ResourceManagerを設定します。(クロス集計で使用)
162        private ResourceManager resourceManager ;
163
164        // 4.2.0.0 (2008/03/03) ビューの幅と高さを指定できるようにします。
165        private String  height          ;
166        private String  width           ;
167
168        // 4.3.1.0 (2008/09/08)
169        private boolean skipNoEdit      ;
170
171        // 4.3.3.0 (2008/10/01) 画面遷移なしモード時に各行に出力する行番号及び改廃Cのキーを定義します。
172        private static final String HIDDEN_ROW_KEY =    "rid";          // 6.4.1.1 (2016/01/16) hiddenRowKey  → HIDDEN_ROW_KEY refactoring
173        private static final String HIDDEN_CDKH_KEY =   "kh";           // 6.4.1.1 (2016/01/16) hiddenCdkhKey → HIDDEN_CDKH_KEY refactoring
174
175        private boolean noTransition    ;
176
177        // 5.1.7.0 (2010/06/01) ViewFormのキャッシュ復元を画面ID単位に行う
178        private String gamenId                  ;
179
180        // 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用するカラムを指定します。
181        private boolean[]       clmBulkSet      ;
182
183        // 5.5.4.2 (2012/07/13) mustとmustAnyを保持する
184        private String[]        nullCheck       ;
185        private String[]        mustAnyCheck;           // 3.8.0.9 (2005/10/17)
186
187        // 5.9.5.3 (2016/02/26)
188        // 6.4.6.1 (2016/06/03) tableId 廃止(利用目的を明確にするため、パラメータ名をviewClassに変更)
189        private String viewClass = "VIEW_" + HybsSystem.TBL_MDL_KEY;    // 初期値
190
191        /**
192         * デフォルトコンストラクター
193         *
194         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
195         */
196        protected AbstractViewForm() { super(); }               // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
197
198        /**
199         * 初期化します。
200         * ここでは、内部で使用されているキャッシュをクリアし、
201         * 新しいモデル(DBTableModel)と言語(lang) を元に内部データを再構築します。
202         * なお、テーブルモデルに対してViewFormで変更を加える場合は、変更処理を行った後に
203         * このメソッドを実行するようにして下さい。
204         *
205         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
206         * @og.rev 3.5.6.1 (2004/06/25) lang 言語コード 属性を削除します。
207         * @og.rev 3.5.6.3 (2004/07/12) 呼ばれたら、必ず初期化するように修正(元に戻す)
208         * @og.rev 3.6.0.0 (2004/09/17) sortKeys 追加
209         * @og.rev 3.8.0.9 (2005/10/17) writeCtrl 追加
210         * @og.rev 3.8.5.0 (2006/03/20) clmGroup 追加
211         * @og.rev 4.0.0.0 (2006/01/06) rowCount 追加
212         * @og.rev 4.0.1.0 (2007/12/13) コメントの追加
213         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
214         * @og.rev 5.2.0.0 (2010/09/01) 2回連続登録時に選択行にスクロールしないバグを修正。
215         * @og.rev 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用するカラム(clmBulkSet) 追加
216         * @og.rev 5.5.4.2 (2012/07/13) mustとmustany保持
217         * @og.rev 8.0.1.0 (2021/11/02) tdClassClms,tdClass追加
218         *
219         * @param       table   DBTableModelオブジェクト
220         */
221        public void init( final DBTableModel table ) {
222                this.table = table;
223                if( table != null ) {
224                        rowCount        = table.getRowCount();                  // 4.0.0 (2006/01/06)
225                        columnCount = table.getColumnCount();
226                        clmWritable = new boolean[columnCount];
227                        writeCtrl       = new boolean[columnCount];             // 3.8.0.9 (2005/10/17)
228                        clmDisplay      = new boolean[columnCount];
229                        tdClassClms     = new boolean[columnCount];             // 8.0.1.0 (2021/11/02)
230                        tdClass         = null  ;                                               // 8.0.1.0 (2021/11/02)
231                        clmGroup        = new boolean[columnCount];             // 3.8.5.0 (2006/03/20)
232                        sortKeys        = new boolean[columnCount];             // 3.6.0.0 (2004/09/17)
233                        dbColumn        = new DBColumn[columnCount];
234                        useEventCols= new boolean[columnCount];         // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
235                        clmBulkSet  = new boolean[columnCount];         // 5.2.1.0 (2010/10/01)
236                        Arrays.fill( clmWritable,DEFAULT_CLM_WRITABLE );        // カラムの書込み許可
237                        Arrays.fill( writeCtrl,false );                                         // 書き込み制御の許可
238                        Arrays.fill( clmDisplay ,true );                                        // カラムの表示許可
239                        Arrays.fill( tdClassClms ,false );                                      // 8.0.1.0 (2021/11/02) tdClassClms,tdClass追加
240                        Arrays.fill( clmGroup ,false );                                         // 3.8.5.0 (2006/03/20) カラムのグループ化
241                        Arrays.fill( sortKeys ,false );                                         // すべてリンクしないに設定する。
242                        Arrays.fill( useEventCols, false );                                     // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
243                        Arrays.fill( clmBulkSet, false );                                       // 5.2.1.0 (2010/10/01)
244                        for( int i=0; i<columnCount; i++ ) {
245                                dbColumn[i] = table.getDBColumn( i );
246                        }
247
248                        // 1カラム目(最初のカラム=配列0番目)が writable か?
249                        rowWritableFlag = "WRITABLE".equalsIgnoreCase( getColumnName(0) );
250
251                        // 5.2.0.0 (2010/09/01) 2回連続登録時に選択行にスクロールしないバグを修正。
252                        scrollRowNo = -1;
253                        firstChecked = false;
254
255                        // 5.5.4.2 (2102/07/13)
256                        nullCheck        = table.getMustArray();
257                        mustAnyCheck = table.getMustAnyArray();
258                }
259        }
260
261        /**
262         * 内部の DBTableModel を返します。
263         *
264         * @return      DBTableModelオブジェクト
265         */
266        public DBTableModel getDBTableModel() {
267                return table;
268        }
269
270        /**
271         * ViewForm の識別IDをセットします。
272         * これは、ViewFormFactory でプールする場合の識別キーになります。
273         * プールに戻すときに自分自身に この識別IDを使用します。
274         *
275         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
276         * @og.rev 3.5.6.2 (2004/07/05) メソッド名がまぎらわしい為、変更します。
277         *
278         * @param       viewFormID 識別ID
279         */
280        public void setId( final String viewFormID ) {
281                this.viewFormID = viewFormID;
282        }
283
284        /**
285         * ViewForm の識別IDを返します。
286         * これは、ViewFormFactory でプールする場合の識別キーになります。
287         * プールに戻すときに自分自身に この識別IDを使用します。
288         *
289         * @og.rev 3.5.6.2 (2004/07/05) メソッド名がまぎらわしい為、変更します。
290         *
291         * @return      識別ID
292         */
293        public String getId() {
294                return viewFormID;
295        }
296
297        /**
298         * DBTableModel から HTML文字列を作成して返します。
299         *
300         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
301         *
302         * @return      DBTableModelから作成された HTML文字列
303         */
304        public String create() {
305                return create( 0, rowCount );
306        }
307
308        /**
309         * DBTableModel から View文字列を作成して、Writer にセットします。
310         * 処理内容は、create( int , int ) と同じですが、中間の文字列(StringBuilder)
311         * を作成せずに、直接、Writer に書き出します。
312         * よって、データ作成途中でエラーが発生しても、すでにいくつかのデータは
313         * クライアントに返されています。
314         *
315         * @og.rev 5.0.0.1 (2009/08/15) 直接出力用の Writer 引数追加
316         *
317         * @param  startNo        表示開始位置
318         * @param  pageSize   表示件数
319         * @param  wrt            直接登録用の Writer
320         */
321        public void create( final int startNo, final int pageSize, final Writer wrt ) throws IOException {
322                final String errMsg = "このメソッドは、直接登録用の Writer のビューでのみ使用できます。";
323                throw new UnsupportedOperationException( errMsg );
324        }
325
326        /**
327         * 内容をクリア(初期化)します。
328         *
329         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
330         * @og.rev 3.5.1.0 (2003/10/03) displayNumber 廃止。numberType 新規追加。
331         * @og.rev 3.5.2.0 (2003/10/20) headerSkipCount属性を追加
332         * @og.rev 3.5.3.1 (2003/10/31) skip属性を追加
333         * @og.rev 3.5.4.3 (2004/01/05) useCheckControl属性を追加
334         * @og.rev 3.5.4.3 (2004/01/05) viewFormID属性を削除(初期化しない)
335         * @og.rev 3.5.4.7 (2004/02/06) useTableSorter属性を追加
336         * @og.rev 3.5.4.7 (2004/02/06) columnMaxSize は使用されていないので削除します。
337         * @og.rev 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを追加します。
338         * @og.rev 3.5.5.0 (2004/03/12) numberType 属性の "delete" 値追加に伴なう、numberDisplay 変数の追加。
339         * @og.rev 3.5.6.2 (2004/07/05) bgColorCycle 変数の追加。
340         * @og.rev 3.5.6.4 (2004/07/16) useScrollBar 変数の追加。
341         * @og.rev 3.6.0.0 (2004/09/17) sortKeys , firstChecked , useSorterKeys , sorterQuery 変数の追加。
342         * @og.rev 3.7.0.1 (2005/01/31) 全件チェックコントロール変更( boolean ⇒ int )
343         * @og.rev 3.7.1.1 (2005/05/31) useSelRowColor 変数の追加。
344         * @og.rev 3.8.0.3 (2005/07/15) scrollBarType 変数の追加
345         * @og.rev 3.8.0.9 (2005/10/17) writeCtrl 変数の追加
346         * @og.rev 3.8.5.0 (2006/03/20) clmGroup 変数の追加
347         * @og.rev 3.8.6.1 (2006/10/20) editMarker 変数の追加
348         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
349         * @og.rev 5.1.8.0 (2010/07/01) groupClass , groupType 変数の追加
350         * @og.rev 5.1.8.0 (2010/07/01) bgColorClsClmNo 属性を追加します。
351         * @og.rev 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用するカラム(clmBulkSet) 追加
352         * @og.rev 5.5.4.2 (2012/07/13) mustとmustany追加
353         * @og.rev 5.5.9.0 (2012/12/03) viewArrayList追加(viewObjectは削除)
354         * @og.rev 6.7.3.0 (2017/01/27) useGroupDir追加
355         * @og.rev 8.0.1.0 (2021/11/02) tdClassClms,tdClass追加
356         */
357        public void clear() {
358                name                    = "";                           // メニューの名前
359                table                   = null;
360                dbColumn                = null;
361                clmWritable     = null;
362                writeCtrl               = null;                 // 3.8.0.9 (2005/10/17)
363                clmDisplay              = null;
364                tdClassClms             = null;                 // 8.0.1.0 (2021/11/02)
365                tdClass                 = null;                 // 8.0.1.0 (2021/11/02)
366                clmGroup                = null;                 // 3.8.5.0 (2006/03/20)
367                groupClass              = "";                   // 5.1.8.0 (2010/07/01)
368                useGroupDir             = false;                // 6.7.3.0 (2017/01/27)
369                groupType               = null;                 // 5.1.8.0 (2010/07/01)
370                sortKeys                = null;                 // 3.6.0.0 (2004/09/17)
371                useSorterKeys   = false;                // 3.6.0.0 (2004/09/17)
372                sorterQuery             = "";                   // 3.6.0.0 (2004/09/17)
373                startNo                 = 0 ;
374                pageSize                = HybsSystem.sysInt( "HTML_PAGESIZE" ) ;
375                rowWritableFlag = false;        // 1カラム目が writable か?
376                viewLink                = null;
377                viewMarker              = null;
378                editMarker              = null;         // 3.8.6.1 (2006/10/20)
379                backLinkCount   = 0;
380                selectedType    = "checkbox";
381                numberType              = "sequence";
382                numberTypeClm   = -1;
383                numberTypeData  = null;
384                headerSkipCount = 0;    // 0:通常ヘッダ、n:n回ごとに現れる
385                skip                    = ViewForm.DEFAULT_SKIP;        // 3.5.3.1 (2003/10/31)
386                useCheckControl = 0 ;           // 3.7.0.1 (2005/01/31)
387                viewParam               = null;         // 3.5.4.8 (2004/02/23)
388                viewArrayList   = null;         // 5.5.8.3 (2012/12/03)
389                numberDisplay   = true ;        // 3.5.5.0 (2004/03/12)
390                columnCount             = 0;            // 3.5.5.7 (2004/05/10)
391                bgColorCycle    = 1;            // 3.5.6.2 (2004/07/05)
392                bgColorClsClmNo = -1;           // 5.1.8.0 (2010/07/01)
393                colorRow0               = BG_COLOR_ROW0 ;               // 3.5.6.2 (2004/07/05)
394                colorRow1               = BG_COLOR_ROW1 ;               // 3.5.6.2 (2004/07/05)
395                useScrollBar    = HybsSystem.sysBool( "VIEW_USE_SCROLLBAR" ) ;  // 3.5.6.4 (2004/07/16)
396                firstChecked    = false;
397                useSelRowColor  = false;        // 3.7.1.1 (2005/05/31)
398                height                  = null;         // 4.2.0.0 (2008/03/18)
399                width                   = null;         // 4.2.0.0 (2008/03/18)
400                skipNoEdit              = false;        // 4.3.2.0 (2008/09/10)
401                useEventCols    = null;         // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
402                clmBulkSet              = null;         // 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用するカラム(clmBulkSet) 追加
403                nullCheck               = null;         // 5.5.4.2 (2012/07/13)
404                mustAnyCheck    = null;         // 5.5.4.2 (2012/07/13)
405        }
406
407        /**
408         * テーブルのヘッダーの前に、そのデータの表示範囲を示す文字列を作成します。
409         * [開始No - 終了No]/[件数] です。
410         *
411         * ※ result_info.jsp に id="rowCountMessage" を記述しておき、resultScript.js 内部で
412         *    orgRowCntMsg を見つけて rowCountMessage の場所まで移動させています。
413         *
414         * @og.rev 2.0.0.2 (2002/09/24) [1 - 4]/[4] 等のメッセージ出力後の &lt;br&gt; 出力を中止。
415         * @og.rev 4.3.6.0 (2008/04/01) [1 - 4]/[4]のメッセージをJavaScriptで入れ替えるように変更
416         * @og.rev 4.3.8.0 (2009/08/01) 同メッセージ複数対応及びheadでコントロール可能にする
417         *
418         * @param  stNo    表示開始位置
419         * @param  pgSize  表示件数
420         *
421         * @return      テーブルのヘッダータグ文字列
422         * @og.rtnNotNull
423         */
424        protected String getCountForm( final int stNo, final int pgSize ) {
425                if( noMessage ) { return ""; }
426
427                final int lstNo = stNo+pgSize > rowCount ? rowCount : stNo+pgSize ;
428
429                // 6.0.2.5 (2014/10/31) char を append する。
430                final StringBuilder out = new StringBuilder( BUFFER_MIDDLE )
431                        .append( "<div class=\"orgRowCntMsg\">" )
432                        .append( '[' ).append( stNo+1 ).append( " - " ).append( lstNo )
433                        .append( "]/[" ).append( rowCount )
434                        .append( "]</div>" );
435
436                return out.toString() ;
437        }
438
439        /**
440         * カラムのラベル名を返します。
441         * カラムの項目名に対して,見える形の文字列を返します。
442         * 一般には,リソースバンドルと組合せて,各国ロケール毎にラベルを
443         * 切替えます。
444         *
445         * @param       column カラム番号
446         *
447         * @return      カラムのラベル名
448         */
449        protected String getColumnLabel( final int column ) {
450                return dbColumn[column].getLabel();
451        }
452
453        /**
454         * カラム名を返します。
455         * データベースで検索したときのカラムの項目名を返します。
456         *
457         * @param       column カラム番号
458         *
459         * @return      カラム名
460         */
461        protected String getColumnName( final int column ) {
462                return dbColumn[column].getName();
463        }
464
465        /**
466         * row行,colum列 のデータの値を返します。
467         *
468         * @param       row     行番号
469         * @param       column カラム番号
470         *
471         * @return      row行,colum列 のデータの値
472         */
473        protected String getValue( final int row,final int column ) {
474                return table.getValue( row,column ) ;
475        }
476
477        /**
478         * row行,colum列 のデータの値を返します。
479         * これは、データの値そのものではなく、その値のラベル文字を返します。
480         *
481         * @og.rev 3.8.0.9 (2005/10/17) 互換性確保のメソッド
482         *
483         * @param       row     行番号
484         * @param       column カラム番号
485         *
486         * @return      row行,colum列 のデータの値
487         * @og.rtnNotNull
488         */
489        protected String getRendererValue( final int row,final int column) {
490                return getRendererValue( row,column,getValue( row,column ) );
491        }
492
493        /**
494         * row行,colum列 のデータの値を返します。
495         * これは、データの値そのものではなく、その値のラベル文字を返します。
496         *
497         * @og.rev 3.8.0.9 (2005/10/17) writableControl 追加による引数変更
498         * @og.rev 3.8.5.0 (2006/03/20) clmGroup 追加によるグループ化処理
499         * @og.rev 4.0.0.0 (2005/11/30) 行番号に対応した値を返すように変更します。
500         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
501         * @og.rev 5.1.8.0 (2010/07/01) カラムグループの groupClass 対応
502         * @og.rev 6.7.3.0 (2017/01/27) useGroupDir 追加
503         *
504         * @param       row             行番号
505         * @param       column  カラム番号
506         * @param       inVal   データの値
507         *
508         * @return      row行,colum列 のデータの値
509         */
510        protected String getRendererValue( final int row,final int column , final String inVal ) {
511                String val = dbColumn[column].getRendererValue( row,inVal );
512
513                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
514                if( useEventCols[column] && isWritable( row ) ) {
515                        val = dbColumn[column].getEventColumnTag( val, getValue( row,column ), row, false );
516                }
517                if( viewLink != null ) {
518                        val = viewLink.getMarkerString( row,column,val );
519                }
520                if( viewMarker != null ) {
521                        val = viewMarker.getMarkerString( row,column,val );
522                }
523
524                // 5.1.8.0 (2010/07/01) groupClass 対応:空文字の場合を考慮し、最後に処理を行う。
525                // 出力する値が、空文字列なら、前行と同じでも、空文字にしておきます。
526
527                // 6.7.3.0 (2017/01/27) useGroupDir 追加
528                if( groupType != null && clmGroup[column] && inVal != null && val != null && val.length() > 0 ) {
529                        if( useGroupDir && column > 0 && inVal.equals( getValue( row,column-1 ) ) ||
530                                !useGroupDir && row > 0 && row != startNo && inVal.equals( getValue( row-1,column ) ) ) {
531
532                                val = groupType == CLM_GRP.KIGO ? groupClass
533                                                                                                : "<span class=\"" + groupClass + "\">" + val + "</span>";
534                        }
535                }
536
537                return val;
538        }
539
540        /**
541         * row行,colum列 のデータの値をHTML文字列に変換して返します。
542         * リソースバンドルが登録されている場合は,リソースに応じた
543         * HTML文字列を作成します。
544         *
545         * @og.rev 3.8.0.9 (2005/10/17) writableControl 追加による引数変更
546         * @og.rev 3.8.6.1 (2006/10/20) editMarker 追加
547         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
548         *
549         * @param       row             行番号
550         * @param       column  カラム番号
551         * @param       inVal   データの値
552         *
553         * @return      row行,colum列 のデータの値
554         */
555        protected String getEditorValue( final int row, final int column, final String inVal ) {
556                String val = dbColumn[column].getEditorValue( row,inVal );
557                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
558                if( useEventCols[column] ) {
559                        val = dbColumn[column].getEventColumnTag( val, getValue( row,column ), row, true );
560                }
561                if( editMarker != null ) {
562                        val = editMarker.getMarkerString( row,column,val );
563                }
564
565                return val;
566        }
567
568        /**
569         * row行,colum列 のデータの値をHTML文字列に変換して返します。
570         * リソースバンドルが登録されている場合は,リソースに応じた
571         * HTML文字列を作成します。
572         * リソースバンドルが登録されていない場合は,getValue( int row,int column )を
573         * 返します。
574         * 新規機能として、writableControl によるエディター・レンデラー指定が出来ます。
575         * その場合、表示/編集ともに、先頭のアンダーバーは削除されます。
576         *
577         * @og.rev 3.8.0.9 (2005/10/17) writableControl によるエディター・レンデラー指定
578         *
579         * @param       row     行番号
580         * @param       column カラム番号
581         *
582         * @return      row行,colum列 のデータの値
583         * @og.rtnNotNull
584         */
585        protected String getValueLabel( final int row, final int column ) {
586                String val = getValue( row,column ) ;
587                boolean isEdit = isColumnWritable( column ) && isWritable( row ) ;
588                if( writeCtrl[column] && val != null && val.length() > 0 && val.charAt(0) == '_' ) {
589                        isEdit = false;
590                        val = val.substring(1);         // 先頭の '_' を削除
591                }
592
593                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
594                return isEdit ? getEditorValue( row,column,val ) : getRendererValue( row,column,val );
595        }
596
597        /**
598         * カラムのクラスを文字列にした名称を返します。
599         * これは,HTML上の各種タグに,データベース定義に応じたクラスを
600         * セットし,CSS(Cascading Style Sheet)の class="xxxxx" とする事により
601         * 各種スタイルを表現するのに使用します。
602         *
603         * ここでは, カラムリソースの DBTYPE 属性で指定の文字列(X,S9,KXなど)を返します。
604         *
605         * ※ 従来は、class属性に使用する値を取得していましたが、
606         *    org.opengion.plugin.view.ViewForm_HTMLTable#makeNthChild( StringBuilder , int , String )
607         *    の引数に渡すことをメインに使用します。
608         *
609         * @og.rev 4.0.0.0 (2005/01/31) 新規作成(getColumnClassName ⇒ getColumnDbType)
610         * @og.rev 5.2.2.0 (2010/11/01) className が VARCHAR2,NUMBER以外の場合は、合わせて出力します。
611         * @og.rev 6.4.4.2 (2016/04/01) contains 判定を行う新しいメソッドを使用します。
612         * @og.rev 6.4.5.0 (2016/04/08) protected化と、純粋なDBTYPE 属性を返すように変更。
613         *
614         * @param   column カラム番号
615         *
616         * @return  カラムの DBTYPE 属性
617         */
618        protected String getColumnDbType( final int column ) {
619                return dbColumn[column].getDbType();
620        }
621
622        /**
623         * カラムのクラスを文字列にした名称を返します。
624         * 内容的には、カラムの className の値と、dbTypeの値をマージした値になります。
625         * さらに、editorAttributesの "class"キーワードの値もマージします。
626         * ただし、この値には、must属性も設定されているため、それだけは除外します。
627         * 各種スタイルを表現するのに使用します。
628         *
629         * @og.rev 6.4.5.0 (2016/04/08) 新規追加
630         *
631         * @param   column カラム番号
632         *
633         * @return  カラムの DBTYPE 属性
634         */
635        protected String getClassName( final int column ) {
636                return dbColumn[column].getClassName();
637        }
638
639        /**
640         * カラムが書き込み可能かどうかを返します。
641         *
642         * @param       column カラム番号
643         *
644         * @return      書込み可能(true)/不可能(false)
645         */
646        protected boolean isColumnWritable( final int column ) {
647                return clmWritable[column];
648        }
649
650        /**
651         * カラムが書き込み可能かどうかをセットします。
652         *
653         * @param       column カラム番号
654         * @param       rw 書込み可能(true)/不可能(false)
655         */
656        public void setColumnWritable( final int column,final boolean rw ) {
657                clmWritable[column] = rw;
658        }
659
660        /**
661         * 書き込み可能カラム名を、CSV形式で与えます。
662         * 例:"OYA,KO,HJO,SU,DYSET,DYUPD"
663         * setColumnWritable( int column,boolean rw ) の簡易版です。
664         * null を与えた場合は,なにもしません。
665         * また、全カラムについて、有効にする場合は、columnName="*" を設定します。
666         *
667         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
668         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
669         *
670         * @param       columnName      カラム名
671         */
672        public void setColumnWritable( final String columnName ) {
673                if( columnName != null ) {
674                        setBooleanArray( columnName,true,clmWritable );
675
676                        // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
677                        setUseEventCols();
678                }
679        }
680
681        /**
682         * 書き込み不可カラム名を、CSV形式で与えます。
683         * 例:"OYA,KO,HJO,SU,DYSET,DYUPD"
684         * null を与えた場合は,なにもしません。
685         * また、全カラムについて、有効にする場合は、columnName="*" を設定します。
686         *
687         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
688         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
689         *
690         * @param       columnName      カラム名
691         */
692        public void setNoWritable( final String columnName ) {
693                if( columnName != null ) {
694                        setBooleanArray( columnName,false,clmWritable );
695                        // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
696                        setUseEventCols();
697                }
698        }
699
700        /**
701         * 各項目がイベントカラムをするかどうかをセットします。
702         *
703         * @og.rev 5.1.7.0 (2010/06/01) 新規作成(動的プルダウン実装見直し)
704         */
705        private void setUseEventCols() {
706                for( int column=0; column<dbColumn.length; column++ ) {
707                        final String evCols = dbColumn[column].getEventColumn();
708                        if( evCols != null && evCols.length() > 0 ) {
709                                final String[] evColsArr = StringUtil.csv2Array( evCols );
710                                for( int i=0; i<evColsArr.length; i++ ) {
711                                        String evCol = evColsArr[i];
712                                        if( evCol.charAt(0) == '_' ) { evCol = evCol.substring( 1 ); }
713                                        if( isColumnWritable( table.getColumnNo( evCol ) ) ) {
714                                                useEventCols[column] = true;
715                                                break;
716                                        }
717                                }
718                        }
719                }
720        }
721
722        /**
723         * 行指定の書込み許可を返します。
724         *
725         * @og.rev 3.5.4.2 (2003/12/15) writable カラムが "2" のときも、書き込み許可とする
726         * @og.rev 3.5.5.7 (2004/05/10) 判定ロジックを若干見直します。
727         *
728         * @param       row     行番号
729         *
730         * @return      書込み可能(true)/不可能(false)
731         */
732        protected boolean isWritable( final int row ) {
733                boolean rtn = table.isRowWritable( row );
734                if( rtn && rowWritableFlag ) {
735                        final String val = table.getValue( row,0 );
736                        rtn = "TRUE".equalsIgnoreCase( val )
737                                                || "1".equalsIgnoreCase( val )
738                                                || "2".equalsIgnoreCase( val ) ;
739
740                        if( ! rtn &&
741                                ! "FALSE".equalsIgnoreCase( val ) &&
742                                ! "0".equalsIgnoreCase( val ) &&
743                                ! "".equalsIgnoreCase( val ) ) {
744                                        final String errMsg = "writable は、TRUE,FALSE,0,1,2,null 以外指定できません。" +
745                                                                        "  row=[" + (row+1) + "]  val=[" + val + "]";
746                                        throw new HybsSystemException( errMsg );
747                        }
748                }
749                return rtn;
750        }
751
752        /**
753         * 書き込み可能な行(rowWritable == true)のチェックボックスに対して
754         * 初期値を 選択済みにするか、非選択済みにするかを指定します。
755         *
756         * @og.rev 3.5.4.2 (2003/12/15) writable カラムが "2" のとき、チェックを付ける。
757         *
758         * @param       row 行の指定
759         *
760         * @return      チェックON(true)/チェックOFF(false)
761         */
762        protected boolean isChecked( final int row ) {
763                boolean rtn = table.isRowChecked( row );
764                if( rowWritableFlag ) {
765                        final String val = table.getValue( row,0 );
766                        rtn = rtn || "2".equalsIgnoreCase( val ) ;
767                }
768                return rtn;
769        }
770
771        /**
772         * チェック済みの行の先頭に、フォーカスを当てる処理で、チェックの一つ前の
773         * 行番号欄にダミーのリンクを作成する為の判定を行います。
774         * つまり、指定の行番号の次の値が、チェックされているかどうかを判断します。
775         * さらに、これは、一番上位にチェックされている番号の時のみ
776         * 返します。(表示テーブル中、最高一回のみ、true が返る。)
777         *
778         * @og.rev 3.6.0.0 (2004/09/17) 新規作成
779         * @og.rev 3.7.0.3 (2005/03/01) setScrollRowNo の対応
780         * @og.rev 3.8.8.3 (2007/02/09) 最初の選択行 より指定行番号へのフォーカスを優先
781         * @og.rev 4.2.3.1 (2008/06/11) 1件目がチェックされている場合は、対象外とする。
782         * @og.rev 4.2.4.0 (2008/06/25) 1件目対象外の判定で、指定行番号へのフォーカスを優先する。
783         * @og.rev 5.1.1.1 (2009/12/02) 選択行アンカーは、自身の行に出す(default.js#focus2()も合わせて変更)
784         *
785         * @param       row     行の指定
786         *
787         * @return      チェックON(true)/チェックOFF(false)
788         */
789        protected boolean isFirstChecked( final int row ) {
790
791                // 最初の1回のみ、true を返す。よって、元がtrue なら、false を返す。
792                if( firstChecked ) { return false; }
793
794                // 指定の次の行を見るため、範囲オーバーしていないか確認
795                if( row >= rowCount ) { return false; } // 5.1.1.1 (2009/12/02)
796
797                final boolean rtn;
798                // 3.8.8.3 (2007/02/09) 最初の選択行 より指定行番号へのフォーカスを優先
799                if( scrollRowNo >= 0 ) {
800                        rtn = row == scrollRowNo ; // 5.1.1.1 (2009/12/02)
801                }
802                else {
803                        // 1件目がチェックされている場合は、対象外とする。4.2.3.1 (2008/06/11)
804                        if( row == 0 && table.isRowChecked( row ) ) {
805                                firstChecked = true;
806                                return false;
807                        }
808
809                        rtn = table.isRowChecked( row ); // 5.1.1.1 (2009/12/02)
810                }
811
812                // 最初の1回のみ、true を返す。よって、元がtrue なら、false を返す。
813                if( rtn ) { firstChecked = true; }
814                return rtn;
815        }
816
817        /**
818         * その行が、処理対象かどうかをチェックします。
819         * 処理対象かどうかは、書き込み可能な行(rowWritable == true)
820         * で且つ チェックされた行(rowChecked == true) とします。
821         * 例えば,NEXT/PREVでスキップ等の処理を行う場合は、 処理対象以外を
822         * スキップすることで実現できます。
823         *
824         * @param       row     行番号
825         *
826         * @return       処理対象(true)/処理対象でない(false)
827         */
828        public boolean isMarked( final int row ) {
829                return isWritable( row ) && isChecked( row ) ;
830        }
831
832        /**
833         * カラムが表示可能かどうかを返します。
834         * もし,表示不可の場合は,このカラムの全データが,表示対象から外されます。
835         *
836         * @param       column カラム番号
837         *
838         * @return      表示可能(true)/不可能(false)
839         */
840        protected boolean isColumnDisplay( final int column ) {
841                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
842                // 条件変更注意
843                return !( rowWritableFlag && column == 0 ) && clmDisplay[column];
844        }
845
846        /**
847         * 表示可能なカラムの数を返します。
848         *
849         * @return      表示可能なカラム数
850         */
851        protected int getColumnDisplayCount() {
852                int rtn = 0;
853                for( int i=0; i<columnCount; i++ ) {
854                        if( isColumnDisplay(i) ) { rtn++ ; }
855                }
856
857                return rtn;
858        }
859
860        /**
861         * カラムが表示可能かどうかをセットします。
862         * DBColumnのROLE属性による表示可否は、ViewFormTag で設定されます。
863         *
864         * @param       column カラム番号
865         * @param       rw 表示可能(true)/不可能(false)
866         */
867        public void setColumnDisplay( final int column,final boolean rw ) {
868                clmDisplay[column] = rw;
869        }
870
871        /**
872         * 表示可能カラム名を、CSV形式で与えます。
873         * 例:"OYA,KO,HJO,SU,DYSET,DYUPD"
874         * setColumnDisplay( int column,boolean rw ) の簡易版です。
875         * null を与えた場合は,なにもしません。
876         * また、全カラムについて、有効にする場合は、columnName="*" を設定します。
877         *
878         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
879         *
880         * @param       columnName      カラム名
881         */
882        public void setColumnDisplay( final String columnName ) {
883                setBooleanArray( columnName,true,clmDisplay );
884        }
885
886        /**
887         * 表示不可カラム名を、CSV形式で与えます。
888         * 例:"OYA,KO,HJO,SU,DYSET,DYUPD"
889         * null を与えた場合は,なにもしません。
890         * また、全カラムについて、有効にする場合は、columnName="*" を設定します。
891         *
892         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
893         *
894         * @param       columnName      カラム名
895         */
896        public void setNoDisplay( final String columnName ) {
897                setBooleanArray( columnName,false,clmDisplay );
898        }
899
900        /**
901         * 指定のカラム(CSV指定)に、指定のクラス属性を追加します。。
902         *
903         * どちらかが、nullか、空文字列の場合は、無視します。
904         *
905         * @og.rev 8.0.1.0 (2021/11/02) tdClassClms,tdClass追加
906         *
907         * @param       clms    指定のクラス属性をtd に追加するカラム (CSV形式) (例:"OYA,KO,HJO,SU,DYSET,DYUPD")
908         * @param       tdCls   td に追加するクラス属性
909         */
910        public void setTdClass( final String clms,final String tdCls ) {
911                if( !StringUtil.isNull( clms,tdCls ) ) {
912                        setBooleanArray( clms,true,tdClassClms );
913                        tdClass = " class='" + tdCls + "'" ;
914                }
915        }
916
917        /**
918         * setTdClassでクラス属性が指定されている場合は、class属性を追加した文字列を返します。
919         *
920         * 無指定の場合は、空文字列を返します。
921         *
922         * @og.rev 8.0.1.0 (2021/11/02) tdClassClms,tdClass追加
923         *
924         * @param       column カラム番号
925         * @return      display:none;(true)/通常(false)
926         */
927        protected String getTdClass( final int column ) {
928                return tdClassClms[column] ? tdClass : "" ;
929        }
930
931        /**
932         * 同一表示データをまとめる(表示しない)カラム名を、CSV形式で与えます。
933         *
934         * これは、カラムのグループ化指定を行います。
935         * 同じカラム番号で一つ上の行番号と同じ内容の場合に、表示しないというものです。
936         * 対応は、表示(Renderer)時のみとします。
937         * カラム単位なので、新しいゼブラによる色分けは行いません。(任意のカラムに適用できる為)
938         * また、ファイル出力などのデータ自身は変更されていませんので、そのままデータが落ちます。
939         * また、全カラムについて、有効にする場合は、group="*" を設定します。
940         *
941         * @og.rev 3.8.5.0 (2006/03/20) 新規追加
942         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
943         *
944         * @param       group まとめるカラム名(CSV形式)
945         */
946        public void setColumnGroup( final String group ) {
947                if( group != null ) {
948                        if( groupType == null ) { groupType = CLM_GRP.KIGO ; }
949                        setBooleanArray( group,true,clmGroup );
950                }
951        }
952
953        /**
954         * 同一表示データをまとめないカラム名を、CSV形式で与えます。
955         *
956         * これは、カラムのグループ化指定で、同一でもまとめないカラムを指定するほうが簡単な場合に
957         * 使用します。例えば、キー情報以外は、グループ化指定したい場合などに便利です。
958         * 動作は、columnGroup の動きと同じです。(まとめないカラムを指定するだけです。)
959         *
960         * これは、同一表示データをまとめるカラム名の指定(columnGroup)と同時にセットする
961         * ことは出来ません。
962         * また、全カラムについて、有効にする場合は、group="*" を設定します。
963         *
964         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
965         *
966         * @param       group まとめるカラム名(CSV形式)
967         */
968        public void setNoGroup( final String group ) {
969                if( group != null ) {
970                        if( groupType == null ) { groupType = CLM_GRP.KIGO ; }
971                        setBooleanArray( group,false,clmGroup );
972                }
973        }
974
975        /**
976         * 同一表示データをまとめる場合の、表示方法を指定します。
977         *
978         * これは、カラムのグループ化指定(columnGroup)を行う場合の、まとめ表示の方法を指定します。
979         * なにも指定しない場合は、まとめカラムは、表示しない(ゼロ文字列)になります。
980         * その場合、先の行と同じ場合も、変更されたカラムが、NULL(ゼロ文字列)であった場合も、
981         * 同じ用に表示されるため、区別が付きません。
982         * そこで、前の行と同じデータの場合に、特殊な処理を行うことで、区別できるようにします。
983         * 指定方法が特殊なので、注意が必要です。
984         *   記号の場合:
985         *       記号(-- , → , ↓ , * など)が指定された場合は、そのままの文字に置き換えられます。
986         *   アルファベットの場合:
987         *       アルファベット(a-z,A-Z)の場合は、&lt;span class="アルファベット"&gt;元の文字&lt;/span&gt;
988         * 例えば、バックカラーに色を付ける、文字を薄い灰色にする、などできます。
989         * ただし、データ量が圧倒的に増えるため、大量のデータ等で使用するのは避けたほうが良いと思います。
990         *
991         * @og.rev 3.8.5.0 (2006/03/20) 新規追加
992         * @og.rev 6.3.9.0 (2015/11/06) 判定条件の記述が間違っていた。
993         *
994         * @param       grpCls まとめ表示の方法
995         */
996        public void setGroupClass( final String grpCls ) {
997                if( grpCls != null ) {
998                        groupClass = grpCls ;
999                        if( groupClass.isEmpty() ) {    // ゼロ文字列の場合
1000                                groupType = CLM_GRP.KIGO ;
1001                        }
1002                        else {
1003                                final char ch = groupClass.charAt(0);
1004                                if( ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ) {        // 6.3.9.0 (2015/11/06)         6.9.7.0 (2018/05/14) PMD Useless parentheses.
1005                                        groupType = CLM_GRP.CHAR ;
1006                                }
1007                                else {
1008                                        groupType = CLM_GRP.KIGO ;
1009                                }
1010                        }
1011                }
1012        }
1013
1014        /**
1015         * 同一表示データをまとめる場合に、行(row)か列(column)を指定します(初期値:false:ROW)
1016         *
1017         * これは、カラムのグループ化指定(columnGroup)を行う場合の、まとめ表示の方向を指定します。
1018         * ROW(初期値:false)を指定すると、指定のカラムで、行単位に同一データかどうかを判定します。
1019         * COLUMN(true)を指定すると、columnGroup で指定した順番に、列方向に同一データかどうかを判定します。
1020         * DBTableModelの登録順で、ひとつ前のカラムと比較します。
1021         *
1022         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1023         *
1024         * @param       dir まとめ表示の方向(false:ROW/true:COLUMN)
1025         * @see         #setColumnGroup( String )
1026         */
1027        public void setGroupDir( final boolean dir ) {
1028                useGroupDir = dir;
1029        }
1030
1031        /**
1032         * カラム名リンクソートを表示するカラム名を、CSV形式で与えます。
1033         *
1034         * ヘッダーにソート用リンクを作成する useTableSorter 属性 に対して、
1035         * カラム個別に作成する場合のカラム名をCSV形式で指定します。
1036         * この tableSorterKeys 属性は、useTableSorter 属性 と無関係に、指定した
1037         * カラムのみ、リンクを表示します。
1038         * また、全カラムについて、有効にする場合は、columnName="*" を設定します。
1039         * 例:"OYA,KO,HJO,SU,DYSET,DYUPD"
1040         *
1041         * @og.rev 3.6.0.0 (2004/09/17) 新規作成
1042         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
1043         *
1044         * @param       columnName      カラム名
1045         */
1046        public void setTableSorterKeys( final String columnName ) {
1047                if( columnName != null ) {
1048                        setBooleanArray( columnName,true,sortKeys );
1049
1050                        useSorterKeys = true;                           // 使用したことを記憶
1051                }
1052        }
1053
1054        /**
1055         * 各カラムのフィールドのデータ長を返します。
1056         *
1057         * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更
1058         *
1059         * @param       column カラム番号
1060         *
1061         * @return      カラム数
1062         */
1063        protected int getColumnSize( final int column ) {
1064                return dbColumn[column].getTotalSize(); // 4.0.0 (2005/01/31) メソッド名変更
1065        }
1066
1067        /**
1068         * カラム数を返します。
1069         *
1070         * @return      カラム数
1071         */
1072        protected int getColumnCount() {
1073                return columnCount ;
1074        }
1075
1076        /**
1077         * 行数を返します。
1078         *
1079         * @return      行数
1080         */
1081        protected int getRowCount() {
1082                return rowCount;
1083        }
1084
1085        /**
1086         * リストボックスを作成する場合の name をセットします。
1087         *
1088         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
1089         *
1090         * @param  name 属性
1091         */
1092        protected void setName( final String name ) {
1093                this.name = name;
1094        }
1095
1096        /**
1097         * リストボックスを作成する場合の name を返します。
1098         *
1099         * @return      name属性
1100         */
1101        protected String getName() {
1102                return name;
1103        }
1104
1105        /**
1106         * カラム名をもとに、そのカラム番号を返します。
1107         * カラム名が存在しない場合は、 HybsSystemException を throw します。
1108         *
1109         * @param       columnName       カラム名
1110         *
1111         * @return      カラム番号
1112         */
1113        protected int getColumnNo( final String columnName ) {
1114                return table.getColumnNo( columnName );
1115        }
1116
1117        /**
1118         * 表示開始位置を返します。
1119         *
1120         * @return      表示開始位置
1121         */
1122        public int getStartNo() {
1123                return startNo;
1124        }
1125
1126        /**
1127         * 表示開始位置をセットします。
1128         *
1129         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
1130         *
1131         * @param  no    表示開始位置
1132         */
1133        public void setStartNo( final int no ) {
1134                if( no >= 0 ) { startNo = no; }
1135        }
1136
1137        /**
1138         * 先頭へ戻るリンク間隔を返します。
1139         *
1140         * @return      backLinkCount    リンク間隔
1141         */
1142        public int getBackLinkCount() {
1143                return backLinkCount;
1144        }
1145
1146        /**
1147         * 先頭へ戻るリンク間隔をセットします。
1148         *
1149         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
1150         *
1151         * @param  no   リンク間隔
1152         */
1153        public void setBackLinkCount( final int no ) {
1154                if( no >= 0 ) { backLinkCount = no; }
1155        }
1156
1157        /**
1158         * ヘッダーを出力する間隔を取得します。
1159         *
1160         * @og.rev 3.5.2.0 (2003/10/20) 新規作成
1161         *
1162         * @return      ヘッダーの表示間隔 ( 0:通常ヘッダ、n:n回ごとに現れる )
1163         */
1164        public int getHeaderSkipCount() {
1165                return headerSkipCount;
1166        }
1167
1168        /**
1169         * ヘッダーを出力する間隔をセットします。
1170         *
1171         * 0を指定すると、繰り返しません(つまり、ヘッダーを最初に表示するだけです。)
1172         * 数字を指定すると、その回数毎に、ヘッダーをデータの行に挿入します。
1173         *
1174         * @og.rev 3.5.2.0 (2003/10/20) 新規作成
1175         *
1176         * @param       hsc ヘッダーの表示間隔 ( 0:通常ヘッダ、n:n回ごとに現れる )
1177         */
1178        public void setHeaderSkipCount( final int hsc ) {
1179                headerSkipCount = hsc;
1180        }
1181
1182        /**
1183         * 表示件数を取得します。
1184         *
1185         * @return      表示件数
1186         */
1187        public int getPageSize() {
1188                return pageSize;
1189        }
1190
1191        /**
1192         * 表示件数をセットします。
1193         *
1194         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
1195         *
1196         * @param       psize 表示件数
1197         */
1198        public void setPageSize( final int psize ) {
1199                if( psize > 0 ) { pageSize = psize; }
1200        }
1201
1202        /**
1203         * フォーマットを設定します。
1204         * ※ このクラスでは実装されていません。
1205         *
1206         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
1207         * @param list TableFormatterのリスト
1208         */
1209        public void setFormatterList( final List<TableFormatter> list ) {               // 4.3.3.6 (2008/11/15) Generics警告対応
1210                final String errMsg = "このメソッドは、フォーマット関係のビューでのみ使用できます。";
1211                throw new UnsupportedOperationException( errMsg );
1212        }
1213
1214        /**
1215         * TableFormatterのタイプ値に対応した値を返します。
1216         *
1217         * タイプ値は、(#,$,!) が指定可能です。
1218         * rowが、-1 の場合は、getSortedColumnLabel(col) を返します。
1219         *
1220         * TableFormatterのタイプ別に値を返します。
1221         *   '#'      : getColumnLabel(loc)
1222         *   '$'      : getRendererValue(row,loc)
1223         *   '!'      : getValue(row,loc)
1224         *   それ以外 : getValueLabel(row,loc)/getSortedColumnLabel(loc)
1225         *
1226         * @og.rev 6.4.4.2 (2016/04/01) TableFormatterのタイプ別値取得
1227         *
1228         * @param type  TableFormatterのタイプ
1229         * @param row    データを取得する行番号
1230         * @param col    データを取得する列番号
1231         * @return タイプ別の値
1232         */
1233        protected String getTypeCaseValue( final char type , final int row , final int col ) {
1234                final String rtn ;
1235
1236                if( row < 0 ) {
1237                        switch( type ) {
1238                                case '#' : rtn = getColumnLabel(col);           break;
1239                                case '$' : rtn = getRendererValue(0,col);       break;
1240                                case '!' : rtn = getValue(0,col);                       break;
1241                                default  : rtn = getSortedColumnLabel(col);     break;          // row が負の場合
1242                        }
1243                }
1244                else {
1245                        switch( type ) {
1246                                case '#' : rtn = getColumnLabel(col);           break;
1247                                case '$' : rtn = getRendererValue(row,col);     break;
1248                                case '!' : rtn = getValue(row,col);                     break;
1249                                default  : rtn = getValueLabel(row,col);        break;          //
1250                        }
1251                }
1252
1253                return rtn;
1254        }
1255
1256        /**
1257         * 表示時の選択用オブジェクトのタイプを指定します。
1258         * ・複数選択可能時は "checkbox" を指定します。
1259         * ・一つだけ選ばせる場合は, "radio" を指定します。
1260         * ・隠しフィールドで全件を選ぶ場合は、"hidden" を指定します。
1261         * ・行番号に関する情報を出さない場合は、"none" を指定します(行番号は表示します)。
1262         * 初期値は、"checkbox" です。
1263         *
1264         * @og.rev 2.2.0.0 (2002/12/17) 選択用オブジェクトのタイプとして"hidden" を追加
1265         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
1266         * @og.rev 3.5.1.0 (2003/10/03) displayNumber 廃止。numberType 新規追加。
1267         *
1268         * @param       type 選択用オブジェクトのタイプ( "checkbox"/"radio"/"hidden"/"null" )
1269         */
1270        public void setSelectedType( final String type ) {
1271                if( type != null ) {
1272                        if( "checkbox".equalsIgnoreCase( type  ) ||
1273                                "radio".equalsIgnoreCase( type  ) ||
1274                                "hidden".equalsIgnoreCase( type ) ) {
1275                                        selectedType = type;
1276                        }
1277                        else {
1278                                selectedType = null;
1279                        }
1280                }
1281        }
1282
1283        /**
1284         * 表示時の行番号の表示方法を指定します。
1285         * ・sequenceは、1から始まる連番です。
1286         * ・none を指定すると、番号は表示されません。
1287         * ・delete を指定すると、行番号表示そのもののタグを取り除きます。(3.5.5.0 追加)
1288         * ・skip=カラム名を指定すると、そのカラムの値が NULL の場合は、番号をスキップします。
1289         * ・view=カラム名を指定すると、そのカラムの値が、使用されます。(ラベルは付きません)
1290         * skip=XX と、view=XX は、=の前後にスペースを入れないで下さい。
1291         * 初期値は、"sequence" です。
1292         *
1293         * @og.rev 3.5.1.0 (2003/10/03) 新規作成
1294         * @og.rev 3.5.5.0 (2004/03/12) numberType 属性の "delete" 値追加に伴なう、numberDisplay 変数の追加。
1295         * @og.rev 5.3.0.0 (2010/12/01) 左右分割スクロール(SplitViewTag)対応。numberType 再設定時のnumberDisplay初期化
1296         *
1297         * @param       type 行番号の表示方法のタイプ( /sequence/none/delete/skip=カラム名/view=カラム名/ )
1298         */
1299        public void setNumberType( final String type ) {
1300
1301                numberType = type ;
1302                numberDisplay = true;   // 5.3.0.0 (2010/12/01) numberType 再設定時のnumberDisplay初期化
1303                if( type != null && !type.startsWith( "seq" ) && !type.startsWith( "none" ) ) {
1304                        if( type.startsWith( "skip=" ) ) {
1305                                numberTypeClm = table.getColumnNo( type.substring( 5 ) );
1306                                numberTypeData = new String[rowCount];
1307                                int cnt = 1;
1308                                for( int i=0; i<rowCount; i++ ) {
1309                                        final String tmp = table.getValue( i,numberTypeClm );
1310                                        if( tmp != null && tmp.length() > 0 ) {
1311                                                numberTypeData[i] = String.valueOf( cnt );
1312                                                cnt++ ;
1313                                        }
1314                                        else {
1315                                                numberTypeData[i] = "" ;
1316                                        }
1317                                }
1318                        }
1319                        else if( type.startsWith( "view=" ) ) {
1320                                numberTypeClm = getColumnNo( type.substring( 5 ) );
1321                        }
1322                        // 3.5.5.0 (2004/03/12)
1323                        else if( type.startsWith( "delete" ) ) {
1324                                numberDisplay = false;
1325                        }
1326                        else {
1327                                // 3.5.5.0 (2004/03/12) 不正な値をエラーチェック
1328                                final String errMsg = "numberType属性の値が不正です。numberType=[" + numberType + "]" +
1329                                                CR +
1330                                                "設定できるのは、sequence/none/delete/skip=カラム名/view=カラム名/ です。";
1331                                throw new HybsSystemException( errMsg );
1332                        }
1333                }
1334        }
1335
1336        /**
1337         * 表示時の選択用オブジェクトのタイプを返します。
1338         * 複数選択可能時は "checkbox"  一つだけ選ばせる場合は, "radio" を指定します。
1339         * 初期値は、"checkbox" です。
1340         * "checkbox"/"radio"/"hidden" 以外の文字列の場合は, null を返します。
1341         *
1342         * @return       選択用オブジェクトのタイプ( "checkbox"/"radio"/"hidden"/"null" )
1343         */
1344        protected String getSelectedType() {
1345                return selectedType ;
1346        }
1347
1348        /**
1349         * No カラムの文字列を取得します。
1350         * setNumberType で指定した、(sequence / none / skip=カラム名 / view=カラム名)に
1351         * 応じた値(レンデラーの値)を返します。
1352         *
1353         * @og.rev 3.5.1.0 (2003/10/03) 新規作成
1354         *
1355         * @param   row 行番号
1356         *
1357         * @return      Noカラムの文字列
1358         */
1359        protected String getNumberData( final int row ) {
1360                String rtn = null;
1361
1362                if( numberType == null || numberType.startsWith( "se" ) ) {     // sequence
1363                        rtn = String.valueOf( row + 1 );
1364                }
1365                else {
1366                        if( numberType.startsWith( "no" ) ) {                   // none
1367                                rtn = "";
1368                        }
1369                        else if( numberType.startsWith( "vi" ) ) {              // view
1370                                rtn = getRendererValue( row,numberTypeClm );
1371                        }
1372                        else if( numberType.startsWith( "sk" ) ) {              // skip
1373                                rtn = numberTypeData[row];
1374                        }
1375                }
1376
1377                return rtn ;
1378        }
1379
1380        /**
1381         * No カラムのヘッダー文字列を取得します。
1382         * setNumberType で指定した、(sequence / none / skip=カラム名 / view=カラム名)に
1383         * 応じた値(ラベル)を返します。
1384         * 具体的には、none 以外は、"No" という文字を、none の時は、""(ゼロストリング)を返します。
1385         *
1386         * @og.rev 3.5.4.6 (2004/01/30) 新規作成
1387         *
1388         * @return       Noカラムのヘッダー文字列
1389         */
1390        protected String getNumberHeader() {
1391                String rtn = NO_HEADER;
1392
1393                if( numberType.startsWith( "no" ) ) {                   // none
1394                        rtn = "";
1395                }
1396
1397                return rtn ;
1398        }
1399
1400        /**
1401         * テーブル等のチェックボックスに属性を付加します
1402         * JavaScript などの HTML基本タグ以外の属性を、そのまま
1403         * チェックボックス/ラジオボタン等に使用します。
1404         *
1405         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
1406         *
1407         * @param       option オプション属性文字列
1408         */
1409        public void setOptionTypeAttributes( final String option ) {
1410                optTypeAttri = option;
1411        }
1412
1413        /**
1414         * テーブル等のチェックボックスに属性を付加します
1415         * JavaScript などの HTML基本タグ以外の属性を、そのまま
1416         * チェックボックス/ラジオボタン等に使用します。
1417         *
1418         * @return      オプション属性
1419         */
1420        protected String getOptionTypeAttributes() {
1421                return optTypeAttri ;
1422        }
1423
1424        /**
1425         * 最終表示番号を取得します。
1426         * 最終表示番号は、表示開始位置 + 表示件数 で求まります。
1427         * lastNo = startNo +  pageSize;
1428         *
1429         * ただし、最終表示番号 > データ件数 の場合は、 最終表示番号 = データ件数
1430         * とします。
1431         * なお、表示件数 が -1 の場合は、デフォルトの表示件数を使用します。
1432         *
1433         * @param       startNo    表示開始位置
1434         * @param       pageSize   表示件数
1435         *
1436         * @return      最終表示番号
1437         */
1438        protected int getLastNo( final int startNo, final int pageSize ) {
1439                int lastNo = startNo + ( pageSize < 0 ? getPageSize() : pageSize );
1440                if( lastNo > rowCount ) {
1441                        lastNo = rowCount ;
1442                }
1443
1444                if( rowCount < 0 || startNo < 0 || lastNo < 0 ) {
1445                        final String errMsg = "startNo lastNo の範囲が不正です。" + CR
1446                                                + " startNo=" + startNo + " , lastNo=" + lastNo + " , RowCount=" + rowCount;
1447                        throw new HybsSystemException( errMsg );
1448                }
1449
1450                return lastNo ;
1451        }
1452
1453        /**
1454         * ビューフォームのタイプを返します。
1455         * これは、ViewFormFactory で、org.opengion.hayabusa.html.ViewForm_ + 『type』
1456         * で作成されるサブクラスの 『type』 部分を返します。
1457         *
1458         * @og.rev 3.5.4.3 (2004/01/05) viewFormID を使用するように変更します。
1459         *
1460         * @return      ビューフォームのタイプ
1461         */
1462        public String getViewFormType() {
1463                return viewFormID ;
1464        }
1465
1466        /**
1467         * ビューリンクオブジェクトを設定します。
1468         * これは、ViewLink タグで作成された キー(カラム名)とリンク文字列を
1469         * 持っている Attributes オブジェクトを受け取り、内部でリンク表示に
1470         * 使用します。
1471         *
1472         * @og.rev 3.5.6.4 (2004/07/16) table が null の場合は、セットしません。
1473         *
1474         * @param       link    ビューリンクオブジェクト
1475         */
1476        public void setViewLink( final ViewMarker link ) {
1477                viewLink = link;
1478                if( viewLink != null && table != null ) {
1479                        viewLink.setDBTableModel( table ) ;
1480                }
1481        }
1482
1483        /**
1484         * ビューマーカーオブジェクトを設定します。
1485         * これは、ViewMarker タグで作成された キー(カラム名)とマーカー文字列を
1486         * 持っている Attributes オブジェクトを受け取り、内部でマーカー表示に
1487         * 使用します。
1488         *
1489         * @og.rev 3.5.6.4 (2004/07/16) table が null の場合は、セットしません。
1490         *
1491         * @param       marker  ビューマーカーオブジェクト
1492         */
1493        public void setViewMarker( final ViewMarker marker ) {
1494                viewMarker = marker;
1495                if( viewMarker != null && table != null ) {
1496                        viewMarker.setDBTableModel( table ) ;
1497                }
1498        }
1499
1500        /**
1501         * 編集マーカーオブジェクトを設定します。
1502         * これは、ViewMarker タグで、isRendere="false" で作成された 編集キー(カラム名)と
1503         * マーカー文字列を持っている Attributes オブジェクトを受け取り、内部でマーカー表示に
1504         * 使用します。
1505         *
1506         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
1507         *
1508         * @param       marker  ビューマーカーオブジェクト
1509         */
1510        public void setEditMarker( final ViewMarker marker ) {
1511                editMarker = marker;
1512                if( editMarker != null && table != null ) {
1513                        editMarker.setDBTableModel( table ) ;
1514                }
1515        }
1516
1517        /**
1518         * 検索結果メッセージを表示する/しないを設定します
1519         * 初期値は、表示する(false)です。
1520         *
1521         * @param       noMessage [true:表示しない/false:表示する]
1522         */
1523        public void setNoMessage( final boolean noMessage ) {
1524                this.noMessage = noMessage;
1525        }
1526
1527        /**
1528         * DBColumn オブジェクトを返します。
1529         *
1530         * @og.rev 3.1.8.0 (2003/05/16) DBColumn オブジェクト取得用のメソッド追加
1531         *
1532         * @param       column カラム番号
1533         *
1534         * @return  DBColumnオブジェクト
1535         */
1536        protected DBColumn getDBColumn( final int column ) {
1537                return dbColumn[column];
1538        }
1539
1540        /**
1541         * カラム(列)にカラムオブジェクトを割り当てます。
1542         * カラムオブジェクトは,ラベルやネームなど,そのカラム情報を
1543         * 保持したオブジェクトです。
1544         *
1545         * @og.rev 5.6.2.3 (2013/03/22) 新規追加
1546         *
1547         * @param   column  カラムオブジェクト
1548         * @param   clm       ヘッダーを適応するカラム(列)
1549         */
1550        protected void setDBColumn( final int column, final DBColumn clm ) {
1551                dbColumn[column] = clm;
1552        }
1553
1554        /**
1555         * チェックの入った行のみを表示させるかどうか指定します。
1556         *
1557         * "true" で、チェックの入った行のみを表示させます。
1558         * 従来は、TextField系のViewに対して、NEXT,PREVでチェックの
1559         * 入った行のみを表示させる機能でしたが、Table系のViewに対しても、
1560         * 同様に機能するように、しました。
1561         * 初期値は、ViewForm.DEFAULT_SKIP です。
1562         *
1563         * @og.rev 3.5.3.1 (2003/10/31) 新規追加
1564         *
1565         * @param       skp チェックの入った行のみを表示させるかどうか(true:のみ表示/false:前件表示)
1566         */
1567        public void setSkip( final boolean skp ) {
1568                skip = skp;
1569        }
1570
1571        /**
1572         * チェックの入った行のみを表示させるかどうか(スキップするかどうか)を返します。
1573         *
1574         * skip=true で、かつ、チェックの入っていない行の場合に、trueを返します。
1575         * つまり、skip=trueの場合は、チェックの入っていない行は、スキップするという
1576         * 判断を行います。
1577         * skip属性の初期値は、ViewForm.DEFAULT_SKIP です。
1578         *
1579         * @og.rev 3.5.3.1 (2003/10/31) 新規追加
1580         *
1581         * @param       row     行番号
1582         *
1583         * @return      スキップする(true)/スキップしない(false)
1584         */
1585        protected boolean isSkip( final int row ) {
1586                return skip && ! isChecked( row );
1587        }
1588
1589        /**
1590         * チェックボックスの全チェックを選択するJavaScript の機能を使用するかどうかを指定します。
1591         *
1592         * 1 で、コントロール用のチェックボックスが現れて、この機能を使用することができるようになります。
1593         * 0 は、従来どおりです。
1594         * 使用するにあたり、jsp/commpn/default.js にJavaScriptを設定しておきます。(設定済み)
1595//       * 初期値は、システムパラメータ の VIEW_USE_CHECK_CONTROL です。(0:使用しない)
1596         *
1597         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
1598         * @og.rev 3.7.0.1 (2005/01/31) 全件チェックコントロール変更( boolean ⇒ int )
1599         *
1600         * @param       chCtrl チェックボックスの全チェックを選択する機能を使用するかどうか
1601         *                      (1:使用する/0:使用しない/2:初期値チェック済み)
1602         */
1603        public void setUseCheckControl( final int chCtrl ) {
1604                useCheckControl = chCtrl;
1605        }
1606
1607        /**
1608         * チェックボックスの全チェックを選択するJavaScript の機能を使用するかどうかを返します。
1609         *
1610         * 内部的には、(1:使用する/0:使用しない/2:初期値チェック済み)の値を保持していますが、
1611         * タグを作成する場合には、まず、使用するかどうかを指定する必要があるため、
1612         * 1:使用する/2:初期値チェック済み は、true:使用する、0 は、false:使用しない
1613         * を返します。
1614         *
1615         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
1616         *
1617         * @return      チェックボックスの全チェックを選択する機能を使用するかどうか(true:使用する/false:使用しない)
1618         */
1619        protected boolean isUseCheckControl() {
1620                return useCheckControl > 0;
1621        }
1622
1623        /**
1624         * チェックボックスの全チェックを選択する タグ文字列を返します。
1625         *
1626         * 内部的には、(1:使用する/0:使用しない/2:初期値チェック済み)の値を
1627         * 保持していますので、それに対応した文字列を返します。
1628         *
1629         * @og.rev 3.7.0.1 (2005/01/31) 新規追加
1630         * @og.rev 5.1.8.0 (2010/07/01) 全チェックを押した状態で画面遷移した場合にチェック状態を保持する。
1631         * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。
1632         *
1633         * @return      チェックボックスの全チェックを選択する機能を使用するかどうか
1634         *                      (1:使用する/0:使用しない/2:初期値チェック済み)
1635         */
1636        protected String getAllCheckControl() {
1637                final String rtn;
1638                switch( useCheckControl ) {
1639//                      case 1: rtn = "<input type=\"checkbox\" name=\"ALL_CHECK\" value=\"2\" onClick=\"checkbox(this);\" />" ;
1640                        case 1: rtn = "<input type=\"checkbox\" name=\"ALL_CHECK\" value=\"2\" onClick=\"checkbox(this);\" >" ;
1641                                        break;
1642//                      case 2: rtn = "<input type=\"checkbox\" name=\"ALL_CHECK\" value=\"2\" onClick=\"checkbox(this);\" checked=\"checked\" />" ;
1643                        case 2: rtn = "<input type=\"checkbox\" name=\"ALL_CHECK\" value=\"2\" onClick=\"checkbox(this);\" checked=\"checked\" >" ;
1644                                        break;
1645                        default : rtn = "" ;
1646                                        break;          // 6.0.2.5 (2014/10/31) break追記
1647                }
1648                return rtn ;
1649        }
1650
1651        /**
1652         * ヘッダーにソート用リンクを作成するかどうかを指定します。
1653         *
1654         * "true" で、ヘッダーにソート用リンクを作成します。
1655         * false は、作成しません。
1656         *
1657         * @og.rev 3.5.4.7 (2004/02/06) 新規追加
1658         *
1659         * @param       flag ヘッダーにソート用リンクを作成するかどうか(true:作成する/false:作成しない)
1660         */
1661        public void setUseTableSorter( final boolean flag ) {
1662                useTableSorter = flag;
1663        }
1664
1665        /**
1666         * ヘッダーにソート用リンクを作成する時の、リクエスト引数のMapを設定します。
1667         *
1668         * ソート用URLに、リクエスト時の引数を設定する必要があります。
1669         * そのため、リクエスト時のキーと値のセットをMapで指定します。
1670         * このMap は、リクエストキャッシュより取り出します。
1671         * 実装では、このMapを元に、URLのQuery部文字列を作成します。処理過程において、
1672         * このMap を書き換えることは行いません。
1673         *
1674         * @og.rev 3.6.0.0 (2004/09/17) 新規作成
1675         * @og.rev 3.6.0.0 (2004/09/22) 引数が null の時の処理追加
1676         * @og.rev 4.0.0.0 (2005/01/31) Map.keySet より Map.entrySet を使用するように変更
1677         * @og.rev 5.10.1.1 (2018/07/13) keyのマルチバイト文字エンコード対応
1678         *
1679         * @param       map ヘッダーソート時のリンクに追加するリクエスト変数のキャッシュMap
1680         */
1681        public void makeTableSorterQuery( final Map<?,?> map ) {                                // 4.3.3.6 (2008/11/15) Generics警告対応
1682                if( map == null ) { return; }                                                                           // 3.6.0.0 (2004/09/22)
1683
1684                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
1685                final Iterator<?> ite = map.entrySet().iterator() ;                                                     // 4.0.0 (2005/01/31)
1686                while( ite.hasNext() ) {
1687                        final Map.Entry<?,?> entry = (Map.Entry<?,?>)ite.next();                                // 4.3.3.6 (2008/11/15) Generics警告対応
1688                        final String key = (String)entry.getKey();
1689                        if( key != null
1690                                         &&     ! key.equalsIgnoreCase( "command" )
1691                                         &&     ! key.equalsIgnoreCase( HybsSystem.SORT_COLUMNS ) ) {
1692                                final String[] vals = (String[])entry.getValue();                                       // 4.0.0 (2005/01/31)
1693                                if( vals != null ) {
1694                                        for( int i=0; i<vals.length; i++ ) {
1695//                                              buf.append( '&' ).append( key ).append( '=' );                          // 6.0.2.5 (2014/10/31) char を append する。
1696                                                buf.append( '&' ).append( StringUtil.urlEncode( key ) ).append( '=' )   // 5.10.1.1 (2018/07/13)
1697                                                        .append( StringUtil.urlEncode( vals[i] ) );
1698                                        }
1699                                }
1700                        }
1701                }
1702
1703                if( buf.length() > 0 ) {
1704                        sorterQuery = buf.toString();
1705                }
1706        }
1707
1708        /**
1709         * カラムソート機能(リンク)の付いたラベル名を返します。
1710         * カラムの項目名に対して,見える形の文字列を返します。
1711         * 一般には,リソースバンドルと組合せて,各国ロケール毎にラベルを
1712         * 切替えます。
1713         *
1714         * @og.rev 3.5.4.7 (2004/02/06) 新規追加
1715         * @og.rev 3.6.0.0 (2004/09/17) sortKeys の使用によるカラム個別のリンク有無追加
1716         * @og.rev 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能を利用する場合の処理を追加
1717         * @og.rev 5.2.3.0 (2010/12/01) チェックボックスでは、onChange ではなく、onClick でイベントを発生させます。
1718         * @og.rev 5.6.9.1 (2013/10/11) カラム長にカンマが入った場合の対応
1719         * @og.rev 5.7.8.1 (2014/07/18) カラム長が 1000 では、少ない為。(HTML5ではエラーになる為)
1720         * @og.rev 6.0.2.0 (2014/09/19) Bulkset エラー回避
1721         * @og.rev 6.1.1.0 (2015/01/17) Bulkset関係( ViewLength を使用、左寄せ、SLABEL設定 )
1722         * @og.rev 6.2.0.0 (2015/02/27) class="W100" を追加することで、テーブル幅いっぱいの入力枠にする。
1723         * @og.rev 6.2.1.0 (2015/03/13) 動的カラム(COLUMN)は、TEXT に置き換える。
1724         * @og.rev 6.2.2.2 (2015/04/03) NO_MAXLEN キーの値が、"true" の場合、maxlength を強制削除する。
1725         * @og.rev 6.2.2.4 (2015/04/24) class="W100"の追加条件に、dbType 制限をかけます。
1726         * @og.rev 5.9.23.0 (2017/08/10) useSorterKeysが無い場合でもspanは外側に付ける
1727         * @og.rev 6.8.1.4 (2017/08/25) must の取り消し。これは、config.setEditorAttributes( attri ); の副作用で、config から、must をremoveする必要が出てきました。
1728         * @og.rev 6.9.9.2 (2018/09/18) ソートキーのマルチバイト文字エンコード対応
1729         * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。
1730         *
1731         * @param       column カラム番号
1732         *
1733         * @return      ソート機能(リンク)の付いたラベル名
1734         */
1735        protected String getSortedColumnLabel( final int column ) {
1736                // 6.4.2.1 (2016/02/05) PMD refactoring. Prefer StringBuffer over += for concatenating strings
1737                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
1738
1739                final String clmLbl = getColumnLabel( column ) ;
1740
1741                if( useSorterKeys && sortKeys[column] || ! useSorterKeys && useTableSorter ) {  // 6.9.7.0 (2018/05/14) PMD Useless parentheses.
1742                        rtn.append( "<a href=\"?command=VIEW&" )
1743                                .append( HybsSystem.SORT_COLUMNS ).append( '=' )
1744        //                      .append( dbColumn[column].getName() )
1745                                .append( StringUtil.urlEncode( dbColumn[column].getName() ) )                   // 6.9.9.2 (2018/09/18) ソートキーのマルチバイト文字エンコード対応
1746                                .append( sorterQuery ).append( "\">" )
1747                                .append( clmLbl ).append( "</a>" );
1748                }
1749                else {
1750                        rtn.append( "<span>" ).append( clmLbl ).append( "</span>" );    // 5.9.23.0 (2017/08/10)
1751                }
1752
1753                // 5.2.1.0 (2010/10/01) 一括入力カラムのアシスト機能対応(bulkSet)
1754                if( isClmBulkSet( column ) ) {
1755                        final DBColumnConfig config = dbColumn[column].getConfig();
1756                        config.setAddNoValue( true );
1757                        // 6.2.2.2 (2015/04/03) NO_MAXLEN キーの値が、"true" の場合、maxlength を強制削除する。
1758                        final String editor = config.getEditor();
1759                        if( "RADIO".equals( editor ) ) {                        // 6.2.2.2 (2015/04/03)
1760                                config.setEditor( "MENU" );
1761                        }
1762                        // 6.2.1.0 (2015/03/13) 動的カラム(COLUMN)は、TEXT に置き換える。
1763                        else if( "COLUMN".equals( editor ) ) {          // 6.2.2.2 (2015/04/03)
1764                                config.setEditor( "TEXT" );
1765                        }
1766
1767                        final Attributes attri = new Attributes();
1768                        // 5.2.3.0 (2010/12/01) チェックボックスでは、onChange ではなく、onClick でイベントを発生させます。
1769                        if( "CHBOX".equals( editor ) ) {                        // 6.2.2.2 (2015/04/03)
1770                                attri.add( "onClick",  "bulkSet(this);" );
1771                        }
1772                        else {
1773                                attri.add( "onChange",  "bulkSet(this);" );
1774                                attri.add( "ondblclick","bulkPaste(this);" );
1775                                // 6.2.2.2 (2015/04/03) NO_MAXLEN キーの値が、"true" の場合、maxlength を強制削除する。
1776                                attri.set( "NO_MAXLEN", "true" );                               // W100 と連動
1777                                attri.add( "style",             "float:left;" );                // 6.1.1.0 (2015/01/17) CHBOX以外は左寄せ
1778
1779        //                      // 6.2.2.4 (2015/04/24) class="W100"の追加条件に、dbType 制限をかけます。
1780                                final String dbType = "," + config.getDbType() + ",";
1781                                if( ",X,K,KX,XK,ALL,".contains( dbType ) ) {
1782                                        attri.add( "class", "W100" );                           // 6.2.0.0 (2015/02/27) テーブル幅いっぱいの入力枠にする。
1783                                        config.setFieldSize( "1" );                                     // 6.2.2.2 (2015/04/03) ここで設定しないと、後付けされる。
1784                                }
1785                        }
1786                        attri.add( "onkeydown", "ctrlCV(this);" );
1787
1788                        config.setEditorAttributes( attri );
1789                        config.removeEditorAttributes( "class" , "must" );      // 6.8.1.4 (2017/08/25) must の取り消し
1790                        config.setUseSLabel( "true" );                                          // 6.1.1.0 (2015/01/17) SLABEL設定。ほんとはMENU系のみでよい。
1791
1792                        final String key = config.getName();
1793                        config.setName( "h_" + key );
1794
1795                        final DBColumn clm = new DBColumn( config );
1796
1797                        // 6.0.2.0 (2014/09/19) Bulkset エラー回避
1798                        try {
1799                                // 6.4.2.1 (2016/02/05) PMD refactoring. Prefer StringBuffer over += for concatenating strings
1800//                              rtn.append( "<br />" ).append( clm.getEditorValue( null ) );    // 注意:検索用のEditorが呼ばれる。
1801                                rtn.append( "<br>" ).append( clm.getEditorValue( null ) );              // 注意:検索用のEditorが呼ばれる。
1802                        }
1803                        catch( final RuntimeException ex ) {
1804                                final String errMsg = "bulkSet でエラーが発生しました。" + CR
1805                                                        + " Label=" + rtn + " , Column=" + key + " , Editor=" + editor          // 6.2.2.2 (2015/04/03)
1806                                                        + CR
1807                                                        + ex.getMessage();
1808                                System.err.println( errMsg );
1809                        }
1810                }
1811
1812                return rtn.toString();                  // 6.4.2.1 (2016/02/05)
1813        }
1814
1815        /**
1816         * 指定カラムNoがmust指定されているかどうか。
1817         *
1818         * @og.rev 5.5.4.2 (2012/07/13)
1819         *
1820         * @param       column カラムNO
1821         * @return must指定されているかどうか[true:されている/false:されていない]
1822         */
1823        protected boolean isMustColumn( final int column){
1824                if( nullCheck != null && nullCheck.length > 0 ){
1825                        for( int i=0; i<nullCheck.length; i++ ){
1826                                if( nullCheck[i].equals( dbColumn[column].getName() ) ){
1827                                        return true;
1828                                }
1829                        }
1830                }
1831                return false;
1832        }
1833
1834        /**
1835         * 指定カラムNoがmustAny指定されているかどうか。
1836         *
1837         * @og.rev 5.5.4.2 (2012/07/13)
1838         *
1839         * @param       column カラムNO
1840         * @return mustAny指定されているかどうか[true:されている/false:されていない]
1841         */
1842        protected boolean isMustAnyColumn( final int column){
1843                if( mustAnyCheck != null && mustAnyCheck.length > 0 ){
1844                        for( int i=0; i<mustAnyCheck.length; i++ ){
1845                                if( mustAnyCheck[i].equals( dbColumn[column].getName() ) ){
1846                                        return true;
1847                                }
1848                        }
1849                }
1850                return false;
1851        }
1852
1853        /**
1854         * ViewForm のサブクラスに渡すパラメータマップを設定します。
1855         *
1856         * @og.rev 3.5.4.8 (2004/02/23) ViewParamTag のパラメータを追加します。
1857         * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。
1858         *
1859         * @param       map パラメータマップ
1860         */
1861        public void setParam( final ConcurrentMap<String,String> map ) {
1862                viewParam = map ;
1863        }
1864
1865        /**
1866         * ViewForm のサブクラスに渡すパラメータマップの値を返します。
1867         * パラメータが 存在しない(null)か、値が 存在しない(null)の場合は、
1868         * 初期値を返します。
1869         *
1870         * @og.rev 3.5.5.9 (2004/06/07) 新規追加
1871         *
1872         * @param       key     パラメータの取り出すキー
1873         * @param       def     パラメータが存在しない場合の初期値
1874         *
1875         * @return      パラメータ値
1876         */
1877        protected String getParam( final String key, final String def ) {
1878                if( viewParam == null ) { return def; }
1879                final String rtn = viewParam.get( key );                // 4.3.3.6 (2008/11/15) Generics警告対応
1880
1881                // 6.4.1.1 (2016/01/16) 条件反転
1882                return ( rtn == null ) ? def : rtn ;
1883        }
1884
1885        /**
1886         * ViewForm のサブクラスに渡すパラメータマップの値を返します。
1887         * パラメータは、初期値が設定されているものとし、そのまま、値を返します。
1888         *
1889         * @og.rev 5.5.5.6 (2012/08/31) 新規追加
1890         *
1891         * @param       key     パラメータの取り出すキー
1892         *
1893         * @return      パラメータ値
1894         */
1895        protected String getParam( final String key ) {
1896                return (viewParam == null) ? null : viewParam.get( key );
1897        }
1898
1899        /**
1900         * ViewForm のサブクラスに渡すパラメータマップの値を int で返します。
1901         * パラメータは、初期値が設定されているものとし、null の場合は、-1 を返します。
1902         *
1903         * @og.rev 5.5.5.6 (2012/08/31) 新規追加
1904         *
1905         * @param       key     パラメータの取り出すキー
1906         *
1907         * @return      パラメータ値(未設定時は、-1)
1908         */
1909        protected int getIntParam( final String key ) {
1910                final String rtn = (viewParam == null) ? null : viewParam.get( key );
1911                return (rtn == null) ? -1 : Integer.parseInt( rtn );
1912        }
1913
1914        /**
1915         * ViewForm のサブクラスに渡すパラメータマップの値を boolean で返します。
1916         * パラメータは、初期値が設定されているものとし、null の場合は、false を返します。
1917         *
1918         * @og.rev 5.5.5.6 (2012/08/31) 新規追加
1919         * @og.rev 6.3.9.1 (2015/11/27) 3項演算子を || or &amp;&amp; で簡素化できる(PMD)。
1920         *
1921         * @param       key     パラメータの取り出すキー
1922         *
1923         * @return      パラメータ値(未設定時は、false)
1924         */
1925        protected boolean getBoolParam( final String key ) {
1926                // 6.3.9.1 (2015/11/27) Boolean#parseBoolean(String) は、引数が null の場合、false を返す(引数のnullチェックは不要)。
1927                return viewParam != null && Boolean.parseBoolean( viewParam.get( key ) );
1928        }
1929
1930        /**
1931         * ViewForm のサブクラスに渡すパラメータ(文字列配列のArrayList)を設定します。
1932         *
1933         * @og.rev 5.5.8.3 (2012/11/17) ViewParamTag のパラメータを追加します。
1934         * @og.rev 5.5.9.0 (2012/12/03) ArrayListに変更
1935         *
1936         * @param       list 文字列配列のArrayList
1937         */
1938        public void setViewArrayList( final List<String[]> list ) {
1939                viewArrayList = list ;
1940        }
1941
1942        /**
1943         * ViewForm のサブクラスに渡すパラメータ(文字列配列のArrayList)の値を返します。
1944         * パラメータは、初期値が設定されているものとし、そのまま、値を返します。
1945         *
1946         * @og.rev 5.5.8.3 (2012/11/17) 新規追加
1947         * @og.rev 5.5.9.0 (2012/12/03) ArrayListに変更
1948         *
1949         * @return      パラメータ値
1950         */
1951        protected List<String[]> getViewArrayList() {
1952                return viewArrayList;
1953        }
1954
1955        /**
1956         * No 欄そのものを作成するかどうかを返します。
1957         *
1958         * numberType 属性に、"delete" という値を設定した場合は、No 欄そのものを
1959         * 作成しません。それ以外は、作成します。
1960         * 初期値は、作成する(true)です。
1961         *
1962         * @og.rev 3.5.5.0 (2004/03/12) 新規追加
1963         *
1964         * @return      No欄そのものを作成するかどうか(true:作成する/false:作成しない)
1965         */
1966        protected boolean isNumberDisplay() {
1967                return numberDisplay;
1968        }
1969
1970        /**
1971         * マーカーオブジェクト(リンク、マーカー)を設定します。
1972         * ここでは、旧 ViewForm 属性を 新ViewForm に直接セットします。
1973         *
1974         * @og.rev 3.5.6.1 (2004/06/25) 新規追加
1975         * @og.rev 3.8.6.1 (2006/10/20) editMarker 追加
1976         *
1977         * @param       view ViewFormオブジェクト
1978         */
1979        public void markerSet( final ViewForm view ) {
1980                if( view instanceof AbstractViewForm ) {
1981                        viewLink   = ((AbstractViewForm)view).viewLink ;
1982                        if( viewLink != null ) { viewLink.setDBTableModel( table ); }
1983                        viewMarker = ((AbstractViewForm)view).viewMarker;
1984                        if( viewMarker != null ) { viewMarker.setDBTableModel( table ); }
1985                        editMarker = ((AbstractViewForm)view).editMarker;
1986                        if( editMarker != null ) { editMarker.setDBTableModel( table ); }
1987                }
1988                else {
1989                        final String errMsg = "AbstractViewForm 以外の view は、サポートしていません。"
1990                                        + " view=[" + view + "]" ;
1991                        throw new HybsSystemException( errMsg );
1992                }
1993        }
1994
1995        /**
1996         * テーブルのバックグラウンドカラーの入れ替えのサイクルをセットします。
1997         * 0(ゼブラなし)、-1(ワーニング)、-2以下(エラー)、1(ゼブラ)、2以上(行数まとめ)
1998         * 初期値は、1(ゼブラ)です。
1999         *
2000         * @og.rev 3.5.6.2 (2004/07/05) ViewForm_HTMLTable より移動
2001         *
2002         * @param  sycle  0(ゼブラなし)、-1(ワーニング)、-2以下(エラー)、1(ゼブラ)、2以上(行数まとめ)
2003         */
2004        public void setBgColorCycle( final int sycle ) {
2005                bgColorCycle    = 1;            // 強制的に設定
2006
2007                if( sycle > 0 ) {                                               // 1(ゼブラ)、2以上(行数まとめ)
2008                        colorRow0               = BG_COLOR_ROW0 ;
2009                        colorRow1               = BG_COLOR_ROW1 ;
2010                        bgColorCycle    = sycle;                        // このケースのみ引数を設定
2011                }
2012                else if( sycle == -1 ) {                                        // -1(ワーニング)
2013                        colorRow0               = BG_WARNING_COLOR_ROW0 ;
2014                        colorRow1               = BG_WARNING_COLOR_ROW1 ;
2015                }
2016                else if( sycle < -1 ) {                                 // -2以下(エラー)
2017                        colorRow0               = BG_ERROR_COLOR_ROW0 ;
2018                        colorRow1               = BG_ERROR_COLOR_ROW1 ;
2019                }
2020                else {                                                                                  // 0(ゼブラなし)
2021                        colorRow0               = "" ;
2022                        colorRow1               = "" ;
2023                }
2024        }
2025
2026        /**
2027         * テーブルのバックグラウンドカラーのクラスに指定するカラム名を指定します。
2028         *
2029         * 通常のゼブラ模様は、tr 属性のクラス指定として、row_0、row_1 が指定されます。
2030         * その代わりに、ここで指定されたカラムの値がクラス属性として設定されます。
2031         * (指定するのはカラム名です。行単位にクラス属性の値を変えることが可能です。)
2032         * 選択行(row_sel)は、優先して使用されます。
2033         * 出力されるクラス名は、"row_" + 属性値 になります。
2034         *
2035         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
2036         *
2037         * @param  clsClm ゼブラ模様の替わりに指定するクラスを格納したカラム名
2038         */
2039        public void setBgColorClsClm( final String clsClm ) {
2040                if( clsClm != null ) {
2041                        bgColorClsClmNo = table.getColumnNo( clsClm );
2042                }
2043        }
2044
2045        /**
2046         * テーブルのバックグラウンドカラーの値をセットします。
2047         * これは、DBTableModele が指定の行番号の時に、BG_COLOR_ROWSEL を
2048         * 返します。それ以外は、通常の getBgColorCycleClass( int )と
2049         * 同じ結果を返します。
2050         * BG_COLOR_ROWSEL の使用有無は、システムパラメータの
2051         * VIEW_USE_SELROW_COLOR 属性で指定できます。
2052         *
2053         * @og.rev 3.7.0.3 (2005/03/01) 新規追加
2054         * @og.rev 3.7.1.1 (2005/05/31) SEL_ROW機能使用時に、BG_COLOR_ROWSEL の使用 有/無を指定
2055         *
2056         * @param       indx 先頭からの連番( 0から始める )
2057         * @param       row 行番号
2058         *
2059         * @return      行の色を指定する class 属性( cssファイルで指定 )
2060         * @see #getBgColorCycleClass( int )
2061         */
2062        protected String getBgColorCycleClass( final int indx,final int row ) {
2063                return useSelRowColor && scrollRowNo == row ? BG_COLOR_ROWSEL : getBgColorCycleClass( indx ) ;          // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses.
2064        }
2065
2066        /**
2067         * テーブルのバックグラウンドカラーの値をセットします。
2068         * 行番号は, 0から始まるので、偶数を HTML_BG_COLOR_ROW0 、
2069         * 奇数行を HTML_BG_COLOR_ROW1 とします。
2070         * setBgColorCycle で、設定値変換しています。
2071         * bgColorClsClm が指定されている場合は、その値を利用したクラス属性を返します。
2072         * クラス名は、"row_" + 指定カラムの値 です。
2073         * 指定カラムの値 が、null または、空文字列の場合は、従来のゼブラ模様が優先されます。
2074         * また、行選択があれば、そちらが最優先されます。
2075         *
2076         * @og.rev 3.5.6.2 (2004/07/05) ViewForm_HTMLTable より移動
2077         * @og.rev 5.1.8.0 (2010/07/01) bgColorClsClmNo 対応
2078         *
2079         * @param       row 行番号( 0から始める )
2080         *
2081         * @return      行の色を指定する class 属性( cssファイルで指定 )
2082         * @see         #setBgColorClsClm( String )
2083         */
2084        protected String getBgColorCycleClass( final int row ) {
2085                String rtn = null ;
2086
2087                // 5.1.8.0 (2010/07/01) bgColorClsClmNo 対応
2088                if( bgColorClsClmNo >= 0 ) {
2089                        final String val = table.getValue( row,bgColorClsClmNo );
2090                        if( val != null && val.length() > 0 ) {
2091                                rtn = " class=\"row_" + val + "\"";
2092                        }
2093                }
2094
2095                if( rtn == null ) {
2096                        if( (row/bgColorCycle) % 2 == 0 ) {
2097                                rtn = colorRow0;                // 偶数の場合
2098                        }
2099                        else {
2100                                rtn = colorRow1;                // 奇数の場合
2101                        }
2102                }
2103
2104                return rtn ;
2105        }
2106
2107        /**
2108         * スクロールバー用のDIV要素を出力するかどうか(初期値はシステムパラメータ)
2109         *
2110         * スクロールバー対応する為、テーブルの先頭に、DIV要素を出力します。
2111         * 初期値は、システムパラメータ の VIEW_USE_SCROLLBAR です。
2112         * ※ 互換性の関係より、false になっています。
2113         * ※ 互換性の関係より、新しいタイプのヘッダー固定を、TYPE2 とします。
2114         *
2115         * @og.rev 3.5.6.4 (2004/07/16) 新規追加
2116         * @og.rev 3.8.0.3 (2005/07/15) barType 変数の追加
2117         * @og.rev 4.0.0.0 (2007/04/10) ヘッダー固定のスクロールタイプは、TYPE2 のみにする。
2118         *
2119         * @param  useBar  スクロールバー用のDIV要素の出力 [true:出力する/false:出力しない]
2120         */
2121        public void setUseScrollBar( final boolean useBar ) {
2122                useScrollBar  = useBar;
2123        }
2124
2125        /**
2126         * スクロールバー用の開始DIV要素返します。
2127         *
2128         * スクロールバー対応する為、テーブルの先頭に、DIV要素を出力します。
2129         * 初期値は、システムパラメータ の VIEW_USE_SCROLLBAR で指定されたDIV要素です。
2130         * DIV要素の開始タグになります。
2131         *
2132         * @og.rev 3.8.0.3 (2005/07/15) 新規追加
2133         * @og.rev 4.2.0.0 (2008/03/18) outerにwidthとheightを出すように修正
2134         *
2135         * @return  LAYER_ST スクロールバー用の開始DIV要素
2136         */
2137        protected String getScrollBarStartDiv() {
2138                final String layerStart ;
2139                if( useScrollBar ) {
2140                        // 6.1.0.0 (2014/12/26) refactoring:Prefer StringBuffer over += for concatenating strings
2141                        final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
2142                                .append( "<div id=\"divPos\" style=\"" );
2143                        if( height != null ){
2144                                buf.append( "height:" ).append( height ).append( ';' );
2145                        }
2146                        if( width != null ){
2147                                buf.append( "width:" ).append( width ).append( ';' );
2148                        }
2149                        buf.append( "\" ><div id=\"outer\"><div id=\"layer\" onscroll=\"SetScrollHeader(this);\"><div id=\"divHide\">" );
2150
2151                        layerStart = buf.toString();
2152                }
2153                else {
2154                        layerStart = LAYER_ST0;
2155                }
2156
2157                return layerStart;
2158        }
2159
2160        /**
2161         * スクロールバー用の終了DIV要素返します。
2162         *
2163         * スクロールバー対応する為、テーブルの終了に、DIV要素を出力します。
2164         * 初期値は、システムパラメータ の VIEW_USE_SCROLLBAR で指定されたDIV要素です。
2165         * DIV要素の終了タグになります。
2166         *
2167         * @og.rev 3.8.0.3 (2005/07/15) 新規追加
2168         *
2169         * @return  スクロールバー用の終了DIV要素
2170         */
2171        protected String getScrollBarEndDiv() {
2172                String layerEnd = LAYER_END0 ;
2173                if( useScrollBar ) {
2174                        layerEnd = LAYER_END2 ;
2175                }
2176                return layerEnd;
2177        }
2178
2179        /**
2180         * 指定の行番号まで画面をスクロールさせる場合の行番号を設定します。
2181         *
2182         * 画面をスクロール後、リンク等で他画面を表示後、戻ってきた場合に、
2183         * 先のスクロール位置まで戻します。
2184         * ただし、厳密に戻すことはできないため、大体のあたりに戻します。
2185         * 指定しない場合(クリアする場合)は、-1 をセットしてください。
2186         * useSelRowColor は、選択行に色づけするかどうかを指定します。
2187         *
2188         * @og.rev 3.7.0.3 (2005/03/01) 新規追加
2189         * @og.rev 3.7.1.1 (2005/05/31) 選択行マーカーの使用有無
2190         *
2191         * @param       rowNo   指定の行番号まで画面をスクロールさせる場合の行番号
2192         * @param       useSelRowColor  選択行マーカーの使用有無
2193         */
2194        public void setScrollRowNo( final int rowNo, final boolean useSelRowColor ) {
2195                scrollRowNo = rowNo;
2196                firstChecked = false;
2197                this.useSelRowColor = useSelRowColor;
2198        }
2199
2200        /**
2201         * 設定値に "_" が含まれている場合にレンデラーを使用するカラムをCSV形式で指定します。
2202         *
2203         * これは、従来の カラム定義の WRITABLE エディターと同等の働きを行うように
2204         * カラム属性を指定します。
2205         * WRITABLE エディターは、設定値にアンダーバー "_" が含まれている場合に、
2206         * その値を書込み禁止にする機能です。これは、エディター自身が値を判断して
2207         * 書き込み許可か禁止かを判断しています。
2208         * この動きを汎用的にするため、指定のカラムをCSV形式(CSV)で指定
2209         * することにより、レンデラーとエディターを設定値によって動的に切り替える
2210         * 機能を実現します。
2211         * その場合、表示/編集ともに、先頭のアンダーバーは削除されます。
2212         * また、全カラムについて、有効にする場合は、writableControl="*" を設定します。
2213         *
2214         * @og.rev 3.8.0.9 (2005/10/17) 新規追加
2215         * @og.rev 5.1.8.0 (2010/07/01) 内部ロジック変更(setBooleanArray)
2216         * @og.rev 7.0.1.5 (2018/12/10) writeCtrlで出力時のアンダーバー削除
2217         *
2218         * @param  wrtCtrl 書き込み制御を行いたいカラムをCSV形式で指定
2219         */
2220        public void setWritableControl( final String wrtCtrl ) {
2221                setBooleanArray( wrtCtrl,true,writeCtrl );
2222
2223                for( int i=0; i<writeCtrl.length; i++ ) {
2224                        if( writeCtrl[i] ) {
2225                                final DBColumnConfig config = dbColumn[i].getConfig();
2226                                config.setWriteControl( true );
2227                                dbColumn[i] = new DBColumn( config );
2228                                table.setDBColumn( i,dbColumn[i] );                             // DBTableModel にも書き戻す必要がある。
2229                        }
2230                }
2231        }
2232
2233        /**
2234         * CSV形式で指定されたカラムに、true/false の初期設定を行います。
2235         *
2236         * 従来は、各クラスで実装されていた処理を、一箇所にまとめます。
2237         * これにより、各種機能をあらかじめ実装しておきます。
2238         * 指定のカラムが、null の場合は、何も処理を行いません。(つまり、初期値のまま)
2239         * 指定のカラムが、* の場合は、すべてのカラムが指定されたとみなし、配列に値を設定します。
2240         * 指定のカラムが、""(ゼロ文字列)と、"-" の場合は、なにもカラムが指定されていないものとみなされ、
2241         * 初期値の逆で埋められます。
2242         *
2243         * @og.rev 5.1.8.0 (2010/07/01) 新規追加
2244         * @og.rev 6.2.1.0 (2015/03/13) カラム名のゼロ文字列と、"-" も除外する。
2245         * @og.rev 5.9.27.0 (2017/12/01) protectedにして子クラスでも使えるようにしておく
2246         *
2247         * @param  clsm    指定のカラムをCSV形式で指定
2248         * @param  def     設定する値
2249         * @param       arrays  設定するboolean配列
2250         */
2251        protected void setBooleanArray( final String clsm , final boolean def , final boolean[] arrays ) {
2252                if( clsm != null ) {
2253                        // 書き込み制御の許可 をカラム単位で設定。* の場合は、全カラム許可
2254                        if( "*".equals( clsm ) ) {
2255                                Arrays.fill( arrays,def );              // 全部埋める
2256                        }
2257                        // 6.2.1.0 (2015/03/13) カラム名のゼロ文字列と、"-" も除外する。
2258                        else if( "-".equals( clsm ) || clsm.isEmpty() ) {
2259                                Arrays.fill( arrays,!def );             // 全部逆で埋める
2260                        }
2261                        else {
2262                                Arrays.fill( arrays,!def );             // 一旦、全部逆で埋める
2263                                final String[] clmNames = StringUtil.csv2Array( clsm );
2264                                for( int i=0; i<clmNames.length; i++ ) {
2265                                        if( clmNames[i] != null && clmNames[i].length() > 0 ) {
2266                                                final int no = table.getColumnNo( clmNames[i] );
2267                                                if( no >= 0 ) { arrays[no] = def; }
2268                                        }
2269                                }
2270                        }
2271                }
2272        }
2273
2274        /**
2275         * ogPopup で検索結果の値を返すキーを、CSV形式で指定します。
2276         *
2277         * popup の検索結果を返す画面で、結果のラジオボタンにイベントセットします。
2278         * この場合、オープンもとのwindow に値を返しますが、そのキーをCSV形式で
2279         * 指定します。
2280         * なお、このメソッドは、一覧表示(HTMLTable)関係のビューのみでサポートして
2281         * いますが、チェックメソッドの関係で、それ以外のビューに適用しても素通り
2282         * するようにします。(エラーにしません)
2283         *
2284         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
2285         *
2286         * @param  rtnKeys ogPopupで値を返すカラム文字列(CSV形式)
2287         */
2288        public void setPopupReturnKeys( final String rtnKeys ) {
2289                // このメソッドは、一覧表示(HTMLTable)関係のビューのみでサポートして
2290                // いますが、チェックメソッドの関係で、それ以外のビューに適用しても素通り
2291                // するようにします。(エラーにしません)
2292        }
2293
2294        /**
2295         * table要素に対して class 属性を設定します。
2296         *
2297         * 従来の システムリソースでのテーブルレイアウトの設定を廃止し、
2298         * CSSファイルで、指定するように変更しています。
2299         * これに伴い、CSSファイルのキーとして、クラス属性を出力します。
2300         * view(または、出力されるtableタグ)のレイアウトは、このクラス属性で
2301         * 指定することが可能になります。
2302         * 初期値は、viewTable です。
2303         *
2304         * @og.rev 4.0.0.0 (2007/04/16) 新規追加
2305         *
2306         * @param       cls     class属性を表す文字列
2307         */
2308        public void setTableClass( final String cls ) {
2309                if( cls != null ) {
2310                        clazz = cls;
2311                }
2312        }
2313
2314        /**
2315         * table要素に対して class 属性を返します。
2316         *
2317         * @og.rev 4.0.0.0 (2007/04/16) 新規追加
2318         * @og.rev 5.9.5.3 (2016/02/26) classにtableIdを付加して返す
2319         * @og.rev 6.4.6.1 (2016/06/03) tableId 廃止(利用目的を明確にするため、パラメータ名をviewClassに変更)
2320         *
2321         * @return      class属性を表す文字列
2322         */
2323        protected String getTableClass() {
2324                return clazz + " " + viewClass;                         // 6.4.6.1 (2016/06/03)
2325        }
2326
2327        /**
2328         * outerのIDを持つDIV要素にheightを指定します。
2329         *
2330         * ビューの高さ、幅を指定できるようにします。
2331         * 内部的には、useScrollBar="true" 時に、div id="divPos" に、
2332         * style 属性を設定しています。(実際は、もう少し複雑)
2333         * これによって1画面に2つのビューを出力する事も可能となります。
2334         * セットする場合は、単位(pt,% など)を付けてください。
2335         * 初期値はnullです。
2336         *
2337         * @og.rev 4.2.0.0 (2008/03/18) 新規追加
2338         *
2339         * @param       high    ビューの高さ
2340         */
2341        public void setHeight( final String high ) {
2342                height = high;
2343        }
2344
2345        /**
2346         * 設定されたheightを返します。
2347         *
2348         * テーブル以外に、高さ、幅を使用する場合に、値を取得できるようにしています。
2349         * これは、セットされた文字列そのものを返しますので、
2350         * 単位(pt,% など)が付いています。
2351         * 初期値はnullです。
2352         *
2353         * @og.rev 6.9.7.0 (2018/05/14) 新規追加
2354         *
2355         * @return      ビューの高さ(未設定の場合は、null)
2356         */
2357        protected String getHeight() {
2358                return height;
2359        }
2360
2361        /**
2362         * outerのIDを持つDIV要素にwidthを指定します。
2363         *
2364         * ビューの高さ、幅を指定できるようにします。
2365         * 内部的には、useScrollBar="true" 時に、div id="divPos" に、
2366         * style 属性を設定しています。(実際は、もう少し複雑)
2367         * これによって1画面に2つのビューを出力する事も可能となります。
2368         * セットする場合は、単位(pt,% など)を付けてください。
2369         * 初期値はnullです。
2370         *
2371         * @og.rev 4.2.0.0 (2008/03/18) 新規追加
2372         *
2373         * @param       wide    ビューの高さ
2374         */
2375        public void setWidth( final String wide ) {
2376                width = wide;
2377        }
2378
2379        /**
2380         * 設定されたwidthを返します。
2381         *
2382         * テーブル以外に、高さ、幅を使用する場合に、値を取得できるようにしています。
2383         * これは、セットされた文字列そのものを返しますので、
2384         * 単位(pt,% など)が付いています。
2385         *
2386         * @og.rev 6.9.7.0 (2018/05/14) 新規追加
2387         *
2388         * @return      ビューの高さ(未設定の場合は、null)
2389         */
2390        protected String getWidth() {
2391                return width;
2392        }
2393
2394        /**
2395         * リソースマネージャを設定します。
2396         * クロス集計時に、useColumnHeader="true"とした場合のみ設定されます。
2397         *
2398         * @og.rev 4.0.0.0 新規作成
2399         *
2400         * @param       res リソースマネージャー
2401         */
2402        public void setResourceManager( final ResourceManager res ) {
2403                resourceManager = res;
2404        }
2405
2406        /**
2407         * リソースマネージャを取得します。
2408         *
2409         * @og.rev 4.0.0.0 新規作成
2410         *
2411         * @return      ResourceManagerリソースマネージャー
2412         */
2413        protected ResourceManager getResourceManager() {
2414                return resourceManager;
2415        }
2416
2417        /**
2418         * 改廃Cのついていない行をスキップするかどうか指定します。
2419         *
2420         * "true" で、改廃Cのついた行をスキップします。
2421         * 初期値はfalseです。
2422         *
2423         * @og.rev 4.3.1.0 (2008/09/08) 新規追加
2424         *
2425         * @param       sne 改廃Cのついていない行をスキップするかどうか(true:スキップする/false:スキップしない)
2426         */
2427        public void setSkipNoEdit( final boolean sne ) {
2428                skipNoEdit = sne;
2429        }
2430
2431        /**
2432         * 改廃Cのついていない行をスキップするかどうか指定します。
2433         *
2434         * skipNoEdit="true"でかつ、編集されていない(改廃Cがついていない)場合のみ
2435         * trueを返します。
2436         *
2437         * @og.rev 4.3.1.0 (2008/09/08) 新規追加
2438         *
2439         * @param       row     行番号
2440         *
2441         * @return      スキップ対象行か
2442         */
2443        protected boolean isSkipNoEdit( final int row ) {
2444                return skipNoEdit && ( table.getModifyType( row ) == null || table.getModifyType( row ).isEmpty() );
2445        }
2446
2447        /**
2448         * 画面遷移なしモードに対応した形で処理を行うかを指定します。
2449         *
2450         * "true" で、画面遷移なしモードに対応します。
2451         * 初期値はfalseです。
2452         *
2453         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
2454         *
2455         * @param       flag 画面遷移なしモードに対応するかどうか(true:対応する/false:対応しない)
2456         */
2457        public void setNoTransition( final boolean flag ) {
2458                noTransition = flag;
2459        }
2460
2461        /**
2462         * 画面遷移なしモードに対応した形で処理を行うかを返します。
2463         *
2464         * "true" で、画面遷移なしモードに対応します。
2465         * 初期値はfalseです。
2466         *
2467         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
2468         *
2469         * @return      画面遷移なしモードに対応するかどうか(true:対応する/false:対応しない)
2470         */
2471        protected boolean isNoTransition() {
2472                return noTransition;
2473        }
2474
2475        /**
2476         * 該当行の行番号と改廃Cを出力します。
2477         * 出力形式は、 rid="[行番号]" kh="[改廃C]" です。
2478         * 改廃Cが付加されていない場合は、改廃Cがnullの場合は、kh属性は出力されません。
2479         * (画面遷移なしモードで使用します)
2480         *
2481         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
2482         *
2483         * @param       row 行番号( 0から始める )
2484         *
2485         * @return      該当行の行番号と改廃C
2486         * @og.rtnNotNull
2487         */
2488        protected String getHiddenRowValue( final int row ) {
2489                String kh = "";
2490                if( table.getModifyType( row ) != null && table.getModifyType( row ).length() > 0 ) {
2491                        kh = " " + HIDDEN_CDKH_KEY + "=\"" + table.getModifyType( row ) + "\"";
2492                }
2493                return " " + HIDDEN_ROW_KEY + "=\"" + row + "\"" + kh;
2494        }
2495
2496        /**
2497         * ビューで表示したカラムの一覧をCSV形式で返します。
2498         *
2499         * @og.rev 5.1.6.0 (2010/05/01) 新規追加
2500         *
2501         * @return      ビューで表示したカラムの一覧
2502         * @og.rtnNotNull
2503         */
2504        public String getViewClms() {
2505                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
2506                for( int i=0; i<clmDisplay.length; i++ ) {
2507                        if( clmDisplay[i] && !( rowWritableFlag && i==0 ) ) {
2508                                if( buf.length() > 0 ) { buf.append( ',' ); }
2509                                buf.append( dbColumn[i].getName() );
2510                        }
2511                }
2512                return buf.toString();
2513        }
2514
2515        /**
2516         * ビューで表示したカラムの一覧をCSV形式で返します。
2517         *
2518         * このメソッドでは、TableFormatter を使用して表示されたカラム一覧を求めます。
2519         *
2520         * @og.rev 6.4.3.4 (2016/03/11) TableFormatter を使用して表示されたカラム一覧を求めます。
2521         *
2522         * @param       format TableFormatterオブジェクト
2523         * @return      ビューで表示したカラムの一覧
2524         * @og.rtnNotNull
2525         */
2526        protected String getViewClms( final TableFormatter format ) {
2527                return format.getLocationStream()                                                                               // IntStream の取得
2528                                                .filter(   loc -> loc >= 0 )                                                    // 処理条件
2529                                                .mapToObj( loc -> table.getColumnName( loc ) )                  // int から String へStreamの変換
2530                                                .collect( Collectors.joining( "," ) );                                  // CSV連結
2531        }
2532
2533        /**
2534         * 表示項目の編集(並び替え)が可能かどうかを返します。
2535         *
2536         * @og.rev 5.1.6.0 (2010/05/01) 新規追加
2537         *
2538         * @return      表示項目の編集(並び替え)が可能かどうか(true:可能)
2539         */
2540        public boolean isEditable() {
2541                return true;
2542        }
2543
2544        /**
2545         * このViewFormが作成された画面IDをセットします。
2546         *
2547         * @og.rev 5.1.7.0 (2010/06/01) 新規追加
2548         *
2549         * @param gamenId 画面ID
2550         */
2551        public void setGamenId( final String gamenId ) {
2552                this.gamenId = gamenId;
2553        }
2554
2555        /**
2556         * このViewFormが作成された画面IDを返します。
2557         *
2558         * @og.rev 5.1.7.0 (2010/06/01) 新規追加
2559         *
2560         * @return      画面ID
2561         */
2562        public String getGamenId() {
2563                return gamenId;
2564        }
2565
2566        /**
2567         * カラムが一括入力アシスト機能を利用するかどうかを返します。
2568         *
2569         * 条件は、一括入力アシストカラムで、かつ、書き込み許可(isColumnWritable(clm)==true)の場合とする。
2570         *
2571         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
2572         *
2573         * @param       column カラム番号
2574         *
2575         * @return      利用する(true)/しない(false)
2576         */
2577        protected boolean isClmBulkSet( final int column ) {
2578                return clmBulkSet[column] && clmWritable[column];
2579        }
2580
2581        /**
2582         * 一括入力カラムのアシスト機能を利用するカラム名を、CSV形式で与えます。
2583         *
2584         * これは、カラムの書き込み時に、一括入力可能なカラムをヘッダーに表示し、
2585         * 一括登録できる機能を提供します。
2586         * この機能は、jsp/common/bulkSet.js JavaScript とともに提供されます。
2587         * IE については、クリップボードも利用できます。Ctrl-C と Ctrl-V でそれぞれ
2588         * 一連のカラムの値の取り出しと書き込みが可能になります。
2589         * "*" を指定すると、すべてのカラムを(columnBulkSet)指定したことになります。
2590         *
2591         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
2592         * @og.rev 6.2.0.0 (2015/02/27) Popup(isRenderer=false のviewMarker)のBuikSet Off化対応
2593         *
2594         * @param       columnName      例:"OYA,KO,HJO,SU,DYSET,DYUPD"
2595         */
2596        public void setColumnBulkSet( final String columnName ) {
2597                setBooleanArray( columnName,true,clmBulkSet );
2598
2599                // 6.2.0.0 (2015/02/27) Popup(isRenderer=false のviewMarker)のBuikSet Off化対応
2600                // result.jsp から update.jsp に画面遷移するときに、再セットされるので、
2601                // 旧のView属性のコピーが必要。(コピーのタイミングでは、早すぎて、ここで書き換えられてしまう。)
2602                if( editMarker != null ) {
2603                        final int[] clmNos = editMarker.getColumnNos();
2604                        if( clmNos != null ) {
2605                                for( int i=0; i<clmNos.length; i++ ) {
2606                                        clmBulkSet[clmNos[i]] = false ; // 6.2.0.0 (2015/02/27) BulkSetしない
2607                                }
2608                        }
2609                }
2610        }
2611
2612        /**
2613         * 引数のフォーマッターに、noDisplayカラムのロケーションをクリアします。
2614         *
2615         * フォーマッター系の noDisplay 処理になります。
2616         *
2617         * @og.rev 6.2.0.0 (2015/02/27) フォーマット系の noDisplay 対応
2618         * @og.rev 6.2.0.1 (2015/03/06) 非表示のマーカーに、Formatter#NO_DISPLAY を使用する。
2619         *
2620         * @param       format  フォーマッター
2621         */
2622        protected void setFormatNoDisplay( final TableFormatter format ) {
2623                final int size = format.getLocationSize();
2624                for( int cl=0; cl<size; cl++ ) {
2625                        final int loc = format.getLocation( cl );
2626                        if( loc >= 0 && !isColumnDisplay( loc ) ) {     // 6.2.0.1 (2015/03/06) 非表示のマーカー
2627                                format.setNoDisplay( cl );                              // 6.2.0.1 (2015/03/06) 非表示のマーカー
2628                        }
2629                }
2630        }
2631
2632        /**
2633         * このViewFormを作成するにあたり、区別するためのクラス属性をセットします。
2634         *
2635         * 通常は、viewForm より tableId を設定します。
2636         * SplitViewTag を使用する場合は、左右分割のため、同じtableId になるため、
2637         * 左右で異なるclassを設定してください。
2638         *
2639         * @og.rev 6.4.6.1 (2016/06/03) 新規追加
2640         *
2641         * @param clazz Viewのクラス属性
2642         */
2643        public void setViewClass( final String clazz ) {
2644                if( clazz != null ) {
2645                        this.viewClass = clazz;
2646                }
2647        }
2648
2649        /**
2650         * このViewFormを作成するにあたり、区別するためのクラス属性を取得します。
2651         *
2652         * 通常は、viewForm より tableId を設定します。
2653         * SplitViewTag を使用する場合は、左右分割のため、同じtableId になるため、
2654         * 左右で異なるclassを設定してください。
2655         *
2656         * @og.rev 6.4.6.1 (2016/06/03) 新規追加
2657         *
2658         * @return Viewのクラス属性
2659         */
2660        protected String getViewClass() {
2661                return viewClass;
2662        }
2663}