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