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