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