    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;                                              // 6.1.1.0 (2015/01/17)
    019import static org.opengion.fukurou.util.StringUtil.nval;
    020
    021import java.util.concurrent.atomic.AtomicInteger;       // 5.5.2.6 (2012/05/25) findbugs対応
    022
    023/**
    024 * 表示のON/OFF制御が出来るフィールドセットを作成するタグです。
    025 *
    026 * フィールドセットは関連するフォームの部品やラベルをグループ化する要素で、
    027 * 表示のON/OFF制御が出来ます。
    028 * BODY 部分にるフォーム部品などのタグを記述すれば、そのままタイトル付きのグループ化
    029 * された状態を作成できます。
    030 * useDisplayHide="false" で通常の fieldset と同じ機能になります。通常、useDisplayHide="true"
    031 * にすることで、タイトル部(一般のlegendタグ)をクリックすると、表示がON/OFFします。
    032 * useDisplayHide の初期値は、true(表示 ON/OFF機能を使用する)です。
    033 * 表示機能が使用できる状態(useDisplayHide="true")では、さらに、初期表示を行うかどうかを
    034 * 指定できます。これは、defaultNone="true" とすると初期表示は "style=display:none;" に
    035 * 設定され(つまり、表示されない状態)、defaultNone="false" とすると初期表示されます。
    036 * defaultNone の初期値は、true(表示されない状態)です。
    037 * このタグには、通常、第一要素としてBODY部に記述する legendタグ は設定不要です。
    038 * このタグの lbl 属性に、リソース情報を記述することで、直接 legendタグ を
    039 * 生成しています。
    040 *
    041 * @og.formSample
    042 * ●形式：&lt;og:fieldset
    043 *                    lbl="…"                      ラベルリソースのキー
    044 *                  [ useDisplayHide="true" ]       表示 ON/OFF機能を使用する(true)かどうか
    045 *                  [ useDisplayHide="true" ]       初期値を表示ON(false)にするかOFF(true)にするか
    046 *         &gt;
    047 *             &lt;input …" /&gt;
    048 *             &lt;input …" /&gt;
    049 *         &lt;/og:fieldset&gt;
    050 * ●body：あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{&#064;XXXX} は解析しません)
    051 *
    052 * ●Tag定義：
    053 *   &lt;og:fieldset
    054 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
    055 *       useDisplayHide     【TAG】表示 ON/OFF機能を使用するかどうか[true/false]を指定します(初期値:true)
    056 *       defaultNone        【TAG】表示ON/OFF機能を使用する場合の初期値を、隠し(none)にするかどうか[true/false]を指定します(初期値:true)
    057 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
    058 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
    059 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
    060 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
    061 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    062 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    063 *   &gt;   ... Body ...
    064 *   &lt;/og:fieldset&gt;
    065 *
    066 * ●使用例
    067 *    例１:通常の状態。表示ON/OFF機能を使用し、初期値は表示OFF 状態
    068 *     &lt;og:fieldset lbl="INSERT_GEA11" &gt;
    069 *         &lt;og:submit  value="insertGEA11" lbl="COPY" command="COPY" /&gt;
    070 *         &lt;og:column  name="SYSTEM_ID" useRequestValue="false" must="true" td="no" /&gt;
    071 *     &lt;/og:fieldset&gt;
    072 *
    073 *    例２:通常の状態。表示ON/OFF機能を使用し、初期値は表示ON 状態
    074 *     &lt;og:fieldset lbl="GEM0001" defaultNone="false" &gt;
    075 *         &lt;og:column  name="SYSTEM_ID" useRequestValue="false" must="true" td="no" /&gt;
    076 *     &lt;/og:fieldset&gt;
    077 *
    078 * @og.rev 4.0.0.0 (2005/11/30) 新規作成
    079 * @og.group 画面部品
    080 *
    081 * @version  4.0
    082 * @author   Kazuhiko Hasegawa
    083 * @since    JDK5.0,
    084 */
    085public class FieldsetTag extends CommonTagSupport {
    086        /** このプログラムのVERSION文字列を設定します。   {@value} */
    087        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
    088        private static final long serialVersionUID = 642020160129L ;
    089
    090        private static AtomicInteger uniqID = new AtomicInteger(1);             // 5.5.2.6 (2012/05/25) findbugs対応
    091
    092        private boolean useDisplayHide  = true;         // 表示 ON/OFF機能を使用する(true)かどうか
    093        private boolean defaultNone             = true;         // 初期値を表示ON(false)にするかOFF(true)にするか
    094
    095        /**
    096         * デフォルトコンストラクター
    097         *
    098         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    099         */
    100        public FieldsetTag() { super(); }               // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    101
    102        /**
    103         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    104         *
    105         * @og.rev 3.8.5.2 (2006/05/31) 初期値:defaultNone を hidden で出力しておく。
    106         * @og.rev 5.5.2.6 (2012/05/25) findbugs対応。staticフィールドへの書き込みに、AtomicInteger を利用します。
    107         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    108         *
    109         * @return      後続処理の指示( EVAL_BODY_INCLUDE )
    110         */
    111        @Override
    112        public int doStartTag() {
    113                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    114                if( !useTag() ) { return SKIP_BODY ; }
    115
    116                final String id = String.valueOf( uniqID.getAndIncrement() );   // 5.5.2.6 (2012/05/25) findbugs対応
    117
    118                String hideFunc = "";
    119                String onoffMsg = "";
    120                String divBody  = "";
    121                String hiddenVal = "";
    122
    123                if( useDisplayHide ) {
    124                        hideFunc = " onClick=\"hide( \'FS" + id + "\' );\"" ;
    125                        divBody  = "<div id=\"FS" + id + "A\" style=\"display:" ;
    126                        hiddenVal = "<input type=\"hidden\" name=\"FS" + id + "C\" value=\"" + defaultNone + "\" />" ;
    127                        if( defaultNone ) {
    128                                onoffMsg = "<span id=\"FS" + id + "B\" >+ </span>";
    129                                divBody += "none;\" >" ;
    130                        }
    131                        else {
    132                                onoffMsg = "<span id=\"FS" + id + "B\" >- </span>";
    133                                divBody += "inline;\" >" ;
    134                        }
    135                }
    136
    137                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    138                        .append( "<fieldset style=\"display:inline;\">" ).append( CR )
    139                        .append( "<legend" ).append( hideFunc ).append( '>' )           // 6.0.2.5 (2014/10/31) char を append する。
    140                        .append( "<strong>" ).append( onoffMsg )
    141                        .append( getLongLabel() )
    142                        .append( "</strong></legend>" ).append( CR )
    143                        .append( divBody )
    144                        .append( CR )
    145                        .append( hiddenVal )
    146                        .append( CR );
    147
    148                jspPrint( buf.toString() );
    149                return EVAL_BODY_INCLUDE ;      // Body インクルード( extends TagSupport 時)
    150        }
    151
    152        /**
    153         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    154         *
    155         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    156         *
    157         * @return      後続処理の指示
    158         */
    159        @Override
    160        public int doEndTag() {
    161                debugPrint();           // 4.0.0 (2005/02/28)
    162
    163                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    164                if( useTag() ) {
    165                        if( useDisplayHide ) {
    166                                jspPrint( "</div></fieldset>" + CR );
    167                        }
    168                        else {
    169                                jspPrint( "</fieldset>" + CR );
    170                        }
    171                }
    172
    173                return EVAL_PAGE ;              // ページの残りを評価する。
    174        }
    175
    176        /**
    177         * タグリブオブジェクトをリリースします。
    178         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    179         *
    180         */
    181        @Override
    182        protected void release2() {
    183                super.release2();
    184                useDisplayHide  = true;
    185                defaultNone             = true;
    186        }
    187
    188        /**
    189         * 【TAG】表示 ON/OFF機能を使用するかどうか[true/false]を指定します(初期値:true)。
    190         *
    191         * @og.tag
    192         * 表示 ON/OFF機能を使用する場合は、true / 通常の fieldset を使用する場合は、
    193         * false を指定します。
    194         * 初期値は、true(ON/OFF機能を使用する)です。
    195         *
    196         * @param       flag 表示ON/OFF機能 [true:使用する/false:使用しない]
    197         * @see         #setDefaultNone( String )
    198         */
    199        public void setUseDisplayHide( final String flag ) {
    200                useDisplayHide = nval( getRequestParameter( flag ),useDisplayHide ) ;
    201        }
    202
    203        /**
    204         * 【TAG】表示ON/OFF機能を使用する場合の初期値を、隠し(none)にするかどうか[true/false]を指定します(初期値:true)。
    205         *
    206         * @og.tag
    207         * 表示 ON/OFF機能を使用する場合にのみ設定値は有効に機能します。
    208         * 隠し(none)にする場合は、true を、表示にする場合は、false をセットします。
    209         * 初期値は、true(隠し(none)にする)です。
    210         *
    211         * @param       flag 初期隠し [true:隠し(none)にする/false:表示にする]
    212         * @see         #setUseDisplayHide( String )
    213         */
    214        public void setDefaultNone( final String flag ) {
    215                defaultNone = nval( getRequestParameter( flag ),defaultNone ) ;
    216        }
    217
    218        /**
    219         * このオブジェクトの文字列表現を返します。
    220         * 基本的にデバッグ目的に使用します。
    221         *
    222         * @return このクラスの文字列表現
    223         * @og.rtnNotNull
    224         */
    225        @Override
    226        public String toString() {
    227                return ToString.title( this.getClass().getName() )
    228                                .println( "VERSION"                     ,VERSION                                                )
    229                                .println( "key"                         ,getLabelInterface().getKey()   )
    230                                .println( "msglbl"                      ,getMsglbl()                                    )
    231                                .println( "useDisplayHide"      ,useDisplayHide                                 )
    232                                .println( "defaultNone"         ,defaultNone                                    )
    233                                .println( "Other..."            ,getAttributes().getAttribute() )
    234                                .fixForm().toString() ;
    235        }
    236}