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