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