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