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