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属性で登録しておき、&lt;style type="text/css"&gt; で
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}