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.taglib; 017 018import org.opengion.fukurou.util.ToString; 019import org.opengion.fukurou.util.TagBuffer; 020import org.opengion.fukurou.util.StringUtil; 021 022import static org.opengion.fukurou.util.StringUtil.nval; 023 024import java.util.Locale; 025 026/** 027 * jQueryのdraggableを使用したオブジェクトの移動を行う個々の div 要素を作成します。 028 * 029 * viewFormType="CustomData" の BODY 部に記述された、class="dragDiv"(固定) を持った、 030 * DIV要素を出力します。 031 * BODY部に、出力する際に、GE18 データベースとのインターフェースになります。 032 * 実際には、このクラスは文字列の出力のみで、DBアクセスや、TableModelアクセスは発生しません。 033 * 034 * @og.formSample 035 * ●形式:<og:dragDiv >[ICON]</og:dragDiv> 036 * → <div class="dragDiv" id="[UNIQ]" style="left:[LOC_COL]px; top:[LOC_ROW]px;" >[ICON]</div> 037 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません) 038 * 039 * ●Tag定義: 040 * <og:dragDiv 041 * id 【TAG】id属性をセットします(初期値:[UNIQ]) 042 * style 【TAG】style属性をセットします(初期値:left:[LOC_COL]px; top:[LOC_ROW]px;) 043 * names 【TAG】divタグに追加する標準属性を指定します。 044 * LOC_GRP,LOC_KEY,NAME_JA,LABEL_NAME,BIKO,ICON,R_KEY1,R_KEY2,R_KEY3 など 045 * optionAttributes 【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します 046 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 047 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 048 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 049 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 050 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 051 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 052 * /> 053 * 054 * ●使用例 055 * ※ tbody の中を、og:dragDiv にした場合。 056 * <og:dragView> 057 * <og:view 058 * viewFormType = "CustomData" 059 * ・・・ 060 * > 061 * <og:tbody rowspan="1" > 062 * <og:dragDiv >[ICON]</og:dragDiv> 063 * </og:tbody> 064 * </og:view> 065 * </og:dragView> 066 * 067 * @og.rev 7.0.1.0 (2018/10/15) 新規作成 068 * @og.group 画面部品 069 * 070 * @version 7.0 071 * @author Kazuhiko Hasegawa 072 * @since JDK11.0, 073 */ 074public class DragDiv extends CommonTagSupport { 075 /** このプログラムのVERSION文字列を設定します。 {@value} */ 076 private static final String VERSION = "7.0.1.0 (2018/10/15)" ; 077 private static final long serialVersionUID = 701020181015L ; 078 079 private static final String DEF_ID = "[UNIQ]" ; // id属性 080 private static final String DEF_STYLE = "left:[LOC_COL]px; top:[LOC_ROW]px;" ; // style属性 081 private String[] names ; // divタグに追加する標準属性を指定します。 082 083 /** 084 * デフォルトコンストラクター 085 * 086 * @og.rev 7.0.1.0 (2018/10/15) 新規作成 087 */ 088 public DragDiv() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 089 090 /** 091 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 092 * 093 * @og.rev 7.0.1.0 (2018/10/15) 新規作成 094 * 095 * @return 後続処理の指示( SKIP_BODY ) 096 */ 097 @Override 098 public int doStartTag() { 099 if( useTag() ) { 100 jspPrint( makeDiv() ); // divタグを出力します。 101 return EVAL_BODY_INCLUDE ; // Body インクルード( extends TagSupport 時) 102 } 103 return SKIP_BODY ; // Body を評価しない 104 } 105 106 /** 107 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 108 * 109 * @og.rev 7.0.1.0 (2018/10/15) 新規作成 110 * 111 * @return 後続処理の指示 112 */ 113 @Override 114 public int doEndTag() { 115 debugPrint(); 116 if( useTag() ) { 117 jspPrint( "</div>" ); // 最後の divタグを出力します。 118 } 119 120 return EVAL_PAGE ; // ページの残りを評価する。( extends TagSupport 時) 121 } 122 123 /** 124 * タグリブオブジェクトをリリースします。 125 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 126 * 127 * @og.rev 7.0.1.0 (2018/10/15) 新規作成 128 */ 129 @Override 130 protected void release2() { 131 super.release2(); 132 names = null; // divタグに追加する標準属性を指定します。 133 } 134 135 /** 136 * dragDivタグを生成します。 137 * 138 * ドラッグ処理に必要な、DIVタグを出力します。 139 * 140 * @return divタグ 141 */ 142 private String makeDiv() { 143 final TagBuffer tagBuf = new TagBuffer() 144 .startTag( "div" ) 145 .add( "class" , "dragDiv" ) 146 .add( "id" , nval( get("id" ) , DEF_ID ) ) 147 .add( "style" , nval( get("style" ) , DEF_STYLE ) ) 148 .addOptions( get( "optionAttributes" ) ); 149 150 if( names != null ) { 151 for( final String name : names ) { 152 tagBuf.add( name.toLowerCase(Locale.JAPAN) , '[' + name + "]" ); // キーと値を追加 153 } 154 } 155 156 return tagBuf.toBefore(); // タグの前半部分のみ生成します。 157 } 158 159 /** 160 * 【HTML】要素に対して固有の名前(id)をつける場合に設定します。 161 * 162 * @og.tag 163 * 特別な使用方法として、id="FOCUS" とすることで、フィールド系要素に 164 * フォーカスを移動させます。これは、そのページ内で唯一の id 属性として使用ください。 165 * 166 * ※ HTML5 より、autofocus属性の使用が可能になりました。 167 * 168 * @param id 固有の名前 169 */ 170 @Override 171 public void setId( final String id ) { 172 set( "id",getRequestParameter( id ) ); 173 } 174 175 /** 176 * 【HTML】この要素に対して適用させるスタイルシート(style)を設定します。 177 * 178 * @og.tag 179 * タグにstyle属性を設定します。これは、キー:値; のセットを複数記述できます。 180 * 通常は、class属性や、id属性で登録しておき、<style type="text/css"> で 181 * 外部から指定する方がソースは読みやすくなります。 182 * 183 * @param style スタイルシート (例 style="color:red; font-size:24pt;" など) 184 */ 185 public void setStyle( final String style ) { 186 set( "style",getRequestParameter( style ) ); 187 } 188 189 /** 190 * 【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します。 191 * 192 * @og.tag 193 * JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します。 194 * 195 * @param optionAttributes オプション属性 196 */ 197 public void setOptionAttributes( final String optionAttributes ) { 198 set( "optionAttributes",getRequestParameter( optionAttributes ) ); 199 } 200 201 /** 202 * 【TAG】処理対象のカラム名をCSV形式で複数指定します。 203 * 204 * @og.tag 205 * divタグに属性として追記します。 206 * 標準のカラム(LOC_GRP,LOC_KEY,NAME_JA,LABEL_NAME,BIKO,ICON,R_KEY1,R_KEY2,R_KEY3) の 207 * 場合は、標準の JavaScript common/jquery/dragView.js と、common/dragUpdate.jsp で 208 * 処理可能です。 209 * それ以外に、JOIN したカラムを使用する場合は、両方とも書き換える必要があります。 210 * 通常は、ここで、カラムを指定するより、dragUpdate.jsp をカスタマイズして、 211 * キーワードから、JOIN して値を取得するほうが、わかりやすいと思います。 212 * ちなみに、単に、値を使用するだけなら、div属性に追記する必要はありません。 213 * 214 * div要素への指定方法は、カラム="[カラム]" ですが、キーとなるカラムを小文字にしています。 215 * 例えば、カラムに、NAME_JA,LABEL_NAME を指定する場合、 216 * name_ja="[NAME_JA]" label_name="[LABEL_NAME]" という属性が追加されます。 217 * 218 * @og.rev 7.0.1.0 (2018/10/15) 新規作成 219 * 220 * @param nms カラム名 (CSV形式) 221 */ 222 public void setNames( final String nms ) { 223 names = StringUtil.csv2Array( getRequestParameter( nms ) ); 224 } 225 226 /** 227 * このオブジェクトの文字列表現を返します。 228 * 基本的にデバッグ目的に使用します。 229 * 230 * @return このクラスの文字列表現 231 * @og.rtnNotNull 232 */ 233 @Override 234 public String toString() { 235 return ToString.title( this.getClass().getName() ) 236 .println( "VERSION" ,VERSION ) 237 .println( "id" ,get("id" ) ) 238 .println( "style" ,get("style" ) ) 239 .println( "names" ,String.join( ", " , names ) ) 240 .println( "Other..." ,getAttributes().getAttribute() ) 241 .fixForm().toString() ; 242 } 243}