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 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.db.AbstractEditor; 020import org.opengion.hayabusa.db.CellEditor; 021import org.opengion.hayabusa.db.DBColumn; 022import org.opengion.hayabusa.db.SelectionCellEditor; // 6.2.2.0 (2015/03/27) 023import org.opengion.hayabusa.db.Selection; 024import org.opengion.hayabusa.db.SelectionFactory; 025import org.opengion.fukurou.util.XHTMLTag; 026import org.opengion.fukurou.util.Attributes; 027import org.opengion.fukurou.util.TagBuffer; 028import org.opengion.fukurou.util.StringUtil; // 8.5.4.2 (2024/01/12) import static … を個別に記述 029 030// import static org.opengion.fukurou.util.StringUtil.isNull; // 6.1.1.0 (2015/01/17) 031 032/** 033 * MENU エディターは、カラムのデータをコードリソースに対応した 034 * プルダウンメニューで編集する場合に使用するクラスです。 035 * 036 * 編集パラメータに"SEQ"と記述することで正方向にしか選べないプルダウンメニューを実現できます。 037 * これにより、シーケンスにステータスを順に挙げていくような、プルダウンメニュー 038 * を作成することが出来ます。(逆に戻れないメニュー) 039 * 040 * カラムの表示に必要な属性は、DBColumn オブジェクト より取り出します。 041 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。 042 * 043 * @og.rev 6.2.2.0 (2015/03/27) SelectionCellEditor I/Fを追加 044 * @og.group データ編集 045 * 046 * @version 4.0 047 * @author Kazuhiko Hasegawa 048 * @since JDK5.0, 049 */ 050public class Editor_MENU extends AbstractEditor implements SelectionCellEditor { 051 /** このプログラムのVERSION文字列を設定します。 {@value} */ 052 private static final String VERSION = "8.5.3.0 (2023/09/08)" ; 053 054 // 3.2.3.0 (2003/06/06) final を削除。サブクラスからアクセスできるように変更。 055 /** セレクションオブジェクト */ 056 private final Selection selection ; // 6.0.4.0 (2014/11/28) サブクラスからの参照を廃止 057 private final boolean addNoValue ; // 3.5.5.7 (2004/05/10) 058 /** シーケンスフラグ */ 059 private final boolean seqFlag ; // 6.0.4.0 (2014/11/28) サブクラスからの参照を廃止 060 private final String useSLabel ; // 5.5.1.0 (2012/04/03) 061 062 private String errMsg ; // 6.0.4.0 (2014/11/28) 063 064 /** 065 * デフォルトコンストラクター。 066 * このコンストラクターで、基本オブジェクトを作成します。 067 * 068 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 069 * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機能(seqFlag)を追加します 070 * @og.rev 5.5.1.0 (2012/04/03) Slabel対応 071 */ 072 public Editor_MENU() { 073 super(); // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor 074 // 4.3.4.4 (2009/01/01) 075 selection = null; 076 addNoValue = false; // 3.5.5.7 (2004/05/10) 077 seqFlag = false; // 3.6.0.6 (2004/10/22) 078 useSLabel = "auto"; // 5.5.1.0 (2012/04/03) 079 } 080 081 /** 082 * コンストラクター。 083 * 084 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 085 * @og.rev 3.3.1.1 (2003/07/03) name , attributes 属性を final にする。 086 * @og.rev 3.5.4.2 (2003/12/15) makeCodeSelection メソッドを CodeSelectionクラスに変更。 087 * @og.rev 3.5.5.7 (2004/05/10) SelectionFactory を使用して、オブジェクト作成 088 * @og.rev 3.5.5.7 (2004/05/10) addNoValue 属性を追加します。 089 * @og.rev 3.5.6.0 (2004/06/18) XHTMLTag の 内部配列 SELECT_KEY を隠蔽します。 090 * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機能(seqFlag)を追加します 091 * @og.rev 4.0.0.0 (2005/01/31) Selection_CODE の作成の引数を CodeData に変更。 092 * @og.rev 4.0.0.0 (2007/11/07) SelectionオブジェクトをDBColumnから取得 093 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 094 * @og.rev 5.5.1.0 (2012/04/03) Slabel対応 095 * @og.rev 6.0.4.0 (2014/11/28) optionAttributes は、コンストラクタで設定します。 096 * @og.rev 6.0.4.0 (2014/11/28) サブクラスで タイプを指定するための対応 097 * @og.rev 6.2.0.0 (2015/02/27) キー:ラベル形式(KVMENU)で表示するかどうかを、指定できるようにします。 098 * @og.rev 6.2.6.0 (2015/06/19) type別Selectionの場合、ラベルリソースを使用する為、言語を引数で渡す。 099 * @og.rev 6.4.4.2 (2016/04/01) nameのfinal化 100 * @og.rev 6.9.5.0 (2018/04/23) useMultiSelect 廃止 101 * @og.rev 7.0.5.1 (2019/09/27) optionAttributes が二重に設定されていたため、削除 102 * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応 103 * 104 * @param clm DBColumnオブジェクト 105 * @param type MENUのサブクラスのタイプ(FILES,KEYVAL,NUM,HM,YMD) 106 */ 107 protected Editor_MENU( final DBColumn clm , final String type ) { 108 // super(); // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor 109 super( clm ); // 6.4.4.2 (2016/04/01) nameのfinal化 110 // name = clm.getName(); 111 addNoValue = clm.isAddNoValue() ; // 3.5.5.7 (2004/05/10) 112 seqFlag = "SEQ".equals( clm.getEditorParam() ); // 3.6.0.6 (2004/10/22) 113 useSLabel = clm.getUseSLabel() ; // 5.5.1.0 (2012/04/03) 114 115 final String lang = clm.getLang(); // 6.2.6.0 (2015/06/19) 116 final String addKeyLabel = clm.getAddKeyLabel(); // 6.2.0.0 (2015/02/27) キー:ラベル形式 117 final String disabled = clm.isWritable() ? null : "disabled" ; 118 119 // 6.1.1.0 (2015/01/17) Attributesの連結記述 120 attributes = new Attributes() 121 .set( "disabled" ,disabled ) 122 .set( "size" ,clm.getRawSize() ) // 8.5.3.0 (2023/09/08) Add 123 .set( clm.getEditorAttributes() ); // #addAttributes( Attributes ) の代替え 124 125 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 126 // 7.0.5.1 (2019/09/27) optionAttributes が二重に設定されていたため、削除 127 tagBuffer.add( XHTMLTag.selectAttri( attributes ) ); 128// .add( attributes.get( "optionAttributes" ) ); // 6.0.4.0 (2014/11/28) 129 130 // 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。 131 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 132 selection = type == null 133 ? SelectionFactory.newSelection( "MENU",clm.getCodeData(),addKeyLabel ) // 6.2.0.0 (2015/02/27) 134 : SelectionFactory.newSelection( type,clm.getEditorParam(),lang ); 135 136// // 6.0.4.0 (2014/11/28) useMultiSelect は、selection ではなく、colomn から取得する。 137// // 6.9.5.0 (2018/04/23) useMultiSelect 廃止 138// if( clm.useMultiSelect() ) { tagBuffer.add( "onkeydown" , "setKeySelect(this);" ); } 139 140 // 6.0.4.0 (2014/11/28) selection が null の場合、警告表示します。 141 if( selection == null ) { 142 errMsg = "codeData が未設定です。" 143 + " name=" + name 144 + " label=" + clm.getLabel() 145 + " editType=" + clm.getEditor() ; 146 System.out.println( errMsg ); 147 } 148 } 149 150 /** 151 * 各オブジェクトから自分のインスタンスを返します。 152 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に 153 * まかされます。 154 * 155 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 156 * @og.rev 3.1.2.1 (2003/04/10) synchronized を、削除します。 157 * @og.rev 6.0.4.0 (2014/11/28) サブクラスで タイプを指定するための対応 158 * 159 * @param clm DBColumnオブジェクト 160 * 161 * @return CellEditorオブジェクト 162 * @og.rtnNotNull 163 */ 164 public CellEditor newInstance( final DBColumn clm ) { 165 return new Editor_MENU( clm , null ); 166 } 167 168 /** 169 * データの編集用文字列を返します。 170 * 171 * @og.rev 3.5.5.5 (2004/04/23) 新規に Attributes オブジェクトを作成する方式を止めます。 172 * @og.rev 3.5.5.7 (2004/05/10) addNoValue 属性を追加します。 173 * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機能(seqFlag)を追加します 174 * @og.rev 4.3.7.2 (2009/06/15) 属性でidが出力される場合は、idを出力しない 175 * @og.rev 5.1.3.0 (2010/02/01) 一覧表示のみで、ツールチップ表示を行う。 176 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 177 * @og.rev 5.5.1.0 (2012/04/03) useSLabel対応 178 * @og.rev 6.0.4.0 (2014/11/28) selection が null の場合、警告表示します。 179 * 180 * @param value 入力値 181 * 182 * @return データの編集用文字列 183 * @og.rtnNotNull 184 */ 185 @Override 186 public String getValue( final String value ) { 187 // 6.0.4.0 (2014/11/28) selection が null の場合、警告表示します。 188 if( selection == null ) { 189 return "<span class=\"error\">" + errMsg + " value=" + value + "</span>"; 190 } 191 192 final boolean useSlbl = "true".equalsIgnoreCase( useSLabel ); // 5.5.1.0 (2012/04/03) 193 194 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 195 return new TagBuffer( "select" ) 196 .add( "name" , name ) // 4.3.6.0 (2009/04/01) 197 // 8.5.4.2 (2024/01/12) import static … を個別に記述 198 .add( "id" , name , StringUtil.isNull( attributes.get( "id" ) ) ) // 4.3.7.2 (2009/06/15) 199 .add( tagBuffer.makeTag() ) 200 .addBody( Selection.NO_VALUE_OPTION , addNoValue ) // 5.5.1.0 (2012/04/03) 201 .addBody( selection.getOption( value,seqFlag,useSlbl ) ) 202 .makeTag(); 203 } 204 205 /** 206 * name属性を変えた、データ表示/編集用のHTML文字列を作成します。 207 * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、 208 * リクエスト情報を1つ毎のフィールドで処理できます。 209 * 210 * @og.rev 2.0.0.3 (2002/09/26) optionAttributes 属性に "$i" を使うとその行数に置き換る機能を追加。 211 * @og.rev 3.1.0.0 (2003/03/20) 名前と行番号の区切り記号を "^" から "__" に変更。 212 * @og.rev 3.5.5.0 (2004/03/12) 名前と行番号の区切り記号("__")を、HybsSystem.JOINT_STRING に変更。 213 * @og.rev 3.5.5.5 (2004/04/23) 新規に Attributes オブジェクトを作成する方式を止めます。 214 * @og.rev 3.5.5.7 (2004/05/10) addNoValue 属性を追加します。 215 * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機能(seqFlag)を追加します 216 * @og.rev 4.3.7.2 (2009/06/15) 属性でidが出力される場合は、idを出力しない 217 * @og.rev 5.1.3.0 (2010/02/01) 一覧表示のみで、ツールチップ表示を行う。 218 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 219 * @og.rev 5.5.1.0 (2012/04/03) useSLabel対応 220 * @og.rev 6.0.4.0 (2014/11/28) selection が null の場合、警告表示します。 221 * 222 * @param row 行番号 223 * @param value 入力値 224 * 225 * @return データ表示/編集用の文字列 226 * @og.rtnNotNull 227 */ 228 @Override 229 public String getValue( final int row,final String value ) { 230 // 6.0.4.0 (2014/11/28) selection が null の場合、警告表示します。 231 if( selection == null ) { 232 return "<span class=\"error\">" + errMsg + " value=" + value + " row=" + row + "</span>"; 233 } 234 235 final boolean useSlbl = "auto".equalsIgnoreCase( useSLabel ) || "true".equalsIgnoreCase( useSLabel ); // 5.5.1.0 (2012/04/03) 236 237 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 238 final String newName = name + HybsSystem.JOINT_STRING + row; // 4.3.6.0 (2009/04/01) 239 return new TagBuffer( "select" ) 240 .add( "name" , newName ) // 4.3.6.0 (2009/04/01) 241 // 8.5.4.2 (2024/01/12) import static … を個別に記述 242 .add( "id" , newName , StringUtil.isNull( attributes.get( "id" ) ) ) // 4.3.7.2 (2009/06/15) 243 .add( tagBuffer.makeTag() ) 244 .addBody( Selection.NO_VALUE_OPTION , addNoValue ) // 5.5.1.0 (2012/04/03) 245 .addBody( selection.getOption( value,seqFlag,useSlbl ) ) 246 .makeTag( row,value ); 247 } 248}