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