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