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