    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 * ●形式：&lt;og:dragDiv &gt;[ICON]&lt;/og:dragDiv&gt;
    036 *     → &lt;div class="dragDiv" id="[UNIQ]" style="left:[LOC_COL]px; top:[LOC_ROW]px;" &gt;[ICON]&lt;/div&gt;
    037 * ●body：あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{&#064;XXXX} は解析しません)
    038 *
    039 * ●Tag定義：
    040 *   &lt;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 *   /&gt;
    053 *
    054 * ●使用例
    055 *    ※ tbody の中を、og:dragDiv にした場合。
    056 *    &lt;og:dragView&gt;
    057 *      &lt;og:view
    058 *          viewFormType        = "CustomData"
    059 *          ･･･
    060 *      &gt;
    061 *          &lt;og:tbody rowspan="1" &gt;
    062 *              &lt;og:dragDiv &gt;[ICON]&lt;/og:dragDiv&gt;
    063 *          &lt;/og:tbody&gt;
    064 *      &lt;/og:view&gt;
    065 *    &lt;/og:dragView&gt;
    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&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}