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