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.plugin.column; 017 018// import org.opengion.hayabusa.common.HybsSystem; // 8.0.2.0 (2021/11/30) Add 019// import org.opengion.hayabusa.db.AbstractEditor; 020import org.opengion.hayabusa.db.CellEditor; 021import org.opengion.hayabusa.db.DBColumn; 022// import org.opengion.fukurou.util.TagBuffer; // 8.0.2.0 (2021/11/30) Add 023// import org.opengion.fukurou.util.StringUtil; // 8.0.2.0 (2021/11/30) Add 024// import org.opengion.fukurou.util.XHTMLTag; 025 026// import static org.opengion.fukurou.util.StringUtil.isNull; // 8.5.4.2 (2024/01/12) import static … を個別に記述 027 028/** 029 * YM エディターは、カラムのデータを日付(年/月)編集する場合に使用するクラスです。 030 * 元の値が8桁の場合は先頭6桁にsubstringされます。 031 * 032 * カラムの表示に必要な属性は、DBColumn オブジェクト より取り出します。 033 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。 034 * 035 * 8.0.2.0 (2021/11/30) 036 * カラムのパラメータの情報より、日付送り戻しの機能が使えます。 037 * 例:M-1,M0,M+1 or M-1,M0,M+1,true 038 * 039 * 第一引数は、日付戻しを指定します。 040 * 第二引数は、初期化します。 041 * 第三引数は、日付送りを指定します。 042 * 第四引数は、検索ボタンを押すか押さないか[true/false]を指定します。 (初期値:false) 043 * 044 * 日付についての加減算処理を行うためのコマンドを指定します。 045 * ・SYXX :年の最初の日付を指定の分だけ進めます。(SY-1なら先年の1月1日、SY1なら翌年の1月1日) 046 * ・SDXX :月の最初の日付を指定の分だけ進めます。(SD-1なら先月の1日、SD1なら翌月の1日) 047 * ・SWXX :週初め(月曜日)を指定の分だけ進めます。(SW-1なら先週の月曜日、SW1なら翌週の月曜日) 048 * ・EYXX :年の最後の日付を指定の分だけ進めます。(EY-1なら先年の年末、EY1なら翌年の年末) 049 * ・EDXX :月の最後の日付を指定の分だけ進めます。(ED-1なら先月の月末、ED1なら翌月の月末) 050 * ・EWXX :週末(日曜日)を指定の分だけ進めます。(EW-1なら先週の日曜日、EW1なら翌週の日曜日) 051 * ・YXX :年を指定の分だけ進めます。(Y-1なら1年前、Y1なら1年後) 052 * ・MXX :月を指定の分だけ進めます。(M-1なら1月前、M1なら1月後) 053 * ・DXX :日を指定の分だけ進めます。(D-1なら1日前、D1なら1日後) 054 * ※ 数字がゼロのコマンドは初期化します。 055 * ※ 数字がないコマンドはサーバー上のシステム日付をセットします。 056 * 057 * @og.rev 5.4.3.6 (2012/01/19) コメント修正 058 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 059 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 060 * @og.rev 8.5.6.1 (2024/03/29) Editor_YMD を継承します。 061 * 062 * @og.group データ編集 063 * 064 * @version 4.0 065 * @author Kazuhiko Hasegawa 066 * @since JDK5.0, 067 */ 068// public class Editor_YM extends AbstractEditor { 069public class Editor_YM extends Editor_YMD { 070 /** このプログラムのVERSION文字列を設定します。 {@value} */ 071 private static final String VERSION = "8.5.6.1 (2024/03/29)" ; 072 073 // 8.0.2.0 (2021/11/30) 日付送り戻し対応 074 // 8.5.6.1 (2024/03/29) 継承元を使用 075// private static final int CNT_ARY = 3; 076// private static final String JSP_ICON = HybsSystem.sys( "JSP_ICON" ) ; 077// private static final String FR_STR = "<a href=\"#\" onclick=\"dateFeedRtn('%1$s','%2$s','%3$s','%4$s','%5$s');\" style=\"margin:0 5px 0 3px\" >"; 078// private static final String FR_END = "<img src=\"" + JSP_ICON + "/%6$s\" alt=\"%4$s\" title=\"%4$s\" /></a>"; 079// private static final String[] FR_IMG = { "FR_PREV.png", "FR_CIRCLE.png", "FR_NEXT.png" }; 080 081// 8.5.6.1 (2024/03/29) 継承元と同じなので削除 082// // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 083//// private String isSubm = "false"; // 検索ボタンを押すか押さないか 084// /** 検索ボタンを押すか押さないか */ 085// private String onSubm = "false"; 086// /** エラーメッセージ */ 087// private String errMsg; 088// /** 編集パラメータ */ 089// private String[] prmAry; 090 091 // 8.5.6.1 (2024/03/29) 継承元を使用 092// private final boolean hidden; 093// /** 日付送り戻し機能の有効/無効 8.1.2.3 (2022/05/20) */ 094// private final boolean useDateFeed; 095 096 /** 097 * デフォルトコンストラクター。 098 * このコンストラクターで、基本オブジェクトを作成します。 099 * 100 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 101 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 102 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 103 * 104 */ 105// public Editor_YM() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 106 // 8.0.2.0 (2021/11/30) Modify 107 public Editor_YM() { 108 super(); 109// isSubm = "false"; 110// onSubm = "false"; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 111// errMsg = null; 112// prmAry = null; 113// hidden = true; 114// useDateFeed = true; // 8.1.2.3 (2022/05/20) 115 clsKey = "YM"; // 8.5.6.1 (2024/03/29) 116 } 117 118 /** 119 * DBColumnオブジェクトを指定したprivateコンストラクター。 120 * 121 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 122 * @og.rev 3.5.6.0 (2004/06/18) XHTMLTag の 内部配列 INPUT_KEY を隠蔽します。 123 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 124 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 125 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 126 * 127 * @param clm DBColumnオブジェクト 128 */ 129 private Editor_YM( final DBColumn clm ) { 130 super( clm ); 131 clsKey = "YM"; // 8.5.6.1 (2024/03/29) 132 133// tagBuffer.add( XHTMLTag.inputAttri( attributes ) ); 134 135// final boolean disabled = "disabled".equalsIgnoreCase( attributes.get( "disabled" ) ); 136// final boolean readonly = "readonly".equalsIgnoreCase( attributes.get( "readonly" ) ); // 8.0.2.0 (2021/11/30) 137// useDateFeed = clm.isDateFeed(); // 8.1.2.3 (2022/05/20) 138// 139// // 8.0.2.0 (2021/11/30) Add 日付送り戻し対応 140// hidden = disabled || readonly ; 141//// if( !hidden ) { // 8.1.2.3 (2022/05/20) Modify 142// if( !hidden && useDateFeed ) { 143// // 例:M-1,M0,M+1 or M-1,M0,M+1,true 144// final String prmStr = clm.getEditorParam(); 145// if( prmStr != null ) { 146// prmAry = StringUtil.csv2Array( prmStr ); 147// // パラメータの第四引数がある場合 148// if( prmAry.length > CNT_ARY ) { 149//// isSubm = prmAry[CNT_ARY]; 150// onSubm = prmAry[CNT_ARY]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 151// } else if( prmAry.length < CNT_ARY ) { 152// errMsg = "editorParam の設定が不足です。" 153// + " name=" + name 154// + " label=" + clm.getLabel() 155// + " editorParam=" + clm.getEditorParam(); 156// System.out.println( errMsg ); 157// } 158// } 159// } 160 } 161 162 /** 163 * 各オブジェクトから自分のインスタンスを返します。 164 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に 165 * まかされます。 166 * 167 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 168 * @og.rev 3.1.2.1 (2003/04/10) synchronized を、削除します。 169 * 170 * @param clm DBColumnオブジェクト 171 * 172 * @return CellEditorオブジェクト 173 * @og.rtnNotNull 174 */ 175 public CellEditor newInstance( final DBColumn clm ) { 176 return new Editor_YM( clm ); 177 } 178 179 /** 180 * データの編集用文字列を返します。 181 * 182 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 183 * @og.rev 8.0.3.0 (2021/12/17) イメージにname属性を付けるため、spanタグで囲います。 184 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 185 * @og.rev 8.5.4.1 (2023/12/22) HTML5廃止対応(8.0.3.0 (2021/12/17)の対応が無くても正常に動作するので削除) 186 * @og.rev 8.5.6.1 (2024/03/29) 継承元を呼び出して使用します。 187 * 188 * @param value 入力値 189 * 190 * @return データの編集用文字列 191 */ 192 @Override 193 public String getValue( final String value ) { 194 // 8.5.6.1 (2024/03/29) 継承元を呼び出して使用します。 195 final String val = value == null ? "" : value.length() > 6 ? value.substring( 0,6 ) : value ; 196 return super.getValue( val ); 197 198// // 8.0.2.0 (2021/11/30) Add 199// if( prmAry != null && prmAry.length < CNT_ARY ) { 200// return "<span class=\"error\">" + errMsg + "</span>"; 201// } 202// 203// // 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 204// // 8.0.2.0 (2021/11/30) Delete 205//// return value != null && value.length() == 8 206//// ? super.getValue( value.substring( 0,6 ) ) 207//// : super.getValue( value ); 208// 209// // 8.0.2.0 (2021/11/30) Modify 210// final String val = value != null && value.length() == 8 ? value.substring( 0,6 ) : value ; 211// 212// final String tag = new TagBuffer( "input" ) 213// .add( "name" , name ) 214// // 8.5.4.2 (2024/01/12) import static … を個別に記述 215// .add( "id" , name , StringUtil.isNull( attributes.get( "id" ) ) ) 216// .add( "value" , val ) 217// .add( "size" , size1 ) 218// .add( tagBuffer.makeTag() ) 219// .makeTag(); 220// 221// if( hidden ) { 222// return tag; 223// } else { 224// final StringBuilder buf = new StringBuilder(BUFFER_MIDDLE) 225// .append( tag ); 226// 227// // 日付送り戻し対応 228//// if( prmAry != null && prmAry.length > 0 ) { // 8.1.2.3 (2022/05/20) Modify 229// if( useDateFeed && prmAry != null && prmAry.length > 0 ) { 230// // 8.5.4.2 (2024/01/12) import static … を個別に記述 231// final String nmid = StringUtil.isNull( attributes.get( "id" ) ) ? name : attributes.get( "id" ); 232// // 第一回目の処理は、日付戻しを指定します。 233// // 第二回目の処理は、初期化します。 234// // 第三回目の処理は、日付送りを指定します。 235//// buf.append( "<span name=\"img" ).append( name ).append( "\">" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 236// for( int i=0; i<CNT_ARY; i++ ) { 237// // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 238//// buf.append( String.format( FR_STR + FR_END, "YM", nmid, val, prmAry[i], isSubm, FR_IMG[i] ) ); 239// buf.append( String.format( FR_STR + FR_END, "YM", nmid, val, prmAry[i], onSubm, FR_IMG[i] ) ); 240// } 241//// buf.append( "</span>" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 242// } 243// return buf.toString(); 244// } 245 } 246 247 /** 248 * name属性を変えた、データ表示/編集用のHTML文字列を作成します。 249 * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、 250 * リクエスト情報を1つ毎のフィールドで処理できます。 251 * 252 * @og.rev 7.2.9.4 (2020/11/20) spotbugs:メソッド呼び出しは非 null パラメータに null を渡している 253 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 254 * @og.rev 8.0.3.0 (2021/12/17) イメージにname属性を付けるため、spanタグで囲います。 255 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 256 * @og.rev 8.5.4.1 (2023/12/22) HTML5廃止対応(8.0.3.0 (2021/12/17)の対応が無くても正常に動作するので削除) 257 * @og.rev 8.5.6.1 (2024/03/29) 継承元を呼び出して使用します。 258 * 259 * @param row 行番号 260 * @param value 入力値 261 * 262 * @return データ表示/編集用の文字列 263 */ 264 @Override 265 public String getValue( final int row,final String value ) { 266 // 8.5.6.1 (2024/03/29) 継承元を呼び出して使用します。 267 final String val = value == null ? "" : value.length() > 6 ? value.substring( 0,6 ) : value ; 268 return super.getValue( row, val ); 269 270// // 8.0.2.0 (2021/11/30) Add 271// if( prmAry != null && prmAry.length < CNT_ARY ) { 272// return "<span class=\"error\">" + errMsg + " row=" + row + "</span>"; 273// } 274// 275// // 7.2.9.4 (2020/11/20) spotbugs:メソッド呼び出しは非 null パラメータに null を渡している 276// final String val = value == null ? "" 277// : (value.length() > 6 ? value.substring( 0,6 ) 278// : value ); 279// 280//// return super.getValue( row,val ); // 8.0.2.0 (2021/11/30) Delete 281// 282//// // 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 283//// return value != null && value.length() == 8 284//// ? super.getValue( row,value.substring( 0,6 ) ) 285//// : super.getValue( row,value ); 286// 287// // 8.0.2.0 (2021/11/30) Modify 288// final String name2 = name + HybsSystem.JOINT_STRING + row ; 289// 290// final String tag = new TagBuffer( "input" ) 291// .add( "name" , name2 ) 292// // 8.5.4.2 (2024/01/12) import static … を個別に記述 293// .add( "id" , name2 , StringUtil.isNull( attributes.get( "id" ) ) ) 294// .add( "value" , val ) 295// .add( "size" , size2 ) 296// .add( tagBuffer.makeTag() ) 297// .makeTag( row,val ); 298// 299// if( hidden ) { 300// return tag; 301// } else { 302// final StringBuilder buf = new StringBuilder(BUFFER_MIDDLE) 303// .append( tag ); 304// 305// // 日付送り戻し対応 306//// if( prmAry != null && prmAry.length > 0 ) { // 8.1.2.3 (2022/05/20) Modify 307// if( useDateFeed && prmAry != null && prmAry.length > 0 ) { 308// // 8.5.4.2 (2024/01/12) import static … を個別に記述 309// final String nmid = StringUtil.isNull( attributes.get( "id" ) ) ? name2 : attributes.get( "id" ); 310// // 第一回目の処理は、日付戻しを指定します。 311// // 第二回目の処理は、初期化します。 312// // 第三回目の処理は、日付送りを指定します。 313//// buf.append( "<span name=\"img" ).append( name2 ).append( "\">" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 314// for( int i=0; i<CNT_ARY; i++ ) { 315// // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 316//// buf.append( String.format( FR_STR + FR_END, "YM", nmid, val, prmAry[i], isSubm, FR_IMG[i] ) ); 317// buf.append( String.format( FR_STR + FR_END, "YM", nmid, val, prmAry[i], onSubm, FR_IMG[i] ) ); 318// } 319//// buf.append( "</span>" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 320// } 321// return buf.toString(); 322// } 323 } 324}