    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.XHTMLTag;
    019
    020import org.opengion.fukurou.util.StringUtil;
    021
    022/**
    023 * 【入力】複数行の入力が可能なテキスト入力フィールドを作成するHTML拡張タグです。
    024 *
    025 * name 属性に ラベルリソース のキーを与えることで、 ロケールにあわせたリソースを使用して、
    026 * 画面に表示します。
    027 * ロケールは、ユーザー情報の lang 属性を初期値で使用し、 セットされていない場合は、
    028 * リクエスト情報のロケールから取得します。
    029 * ラベル部分と入力フィールド部分がテーブルタグの &lt;td&gt; により左右に分割されます。
    030 * HTML 表示時は、前後に&lt;tr&gt;タグで囲って、 整形できます。
    031 *
    032 * @og.formSample
    033 * ●形式：&lt;og:queryOption &gt;
    034 *             SELECT文
    035 *         &lt;/og:queryOption &gt;
    036 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    037 *
    038 * ●Tag定義：
    039 *   &lt;og:textarea
    040 *       name             ○【HTML】名前を指定します(必須)。
    041 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
    042 *       rows               【HTML】高さ(行数)を指定します
    043 *       cols               【HTML】横幅(カラム数)を指定します
    044 *       must               【TAG】必須入力を表す色に変えるかどうか[true/false]を指定します(初期値:false)
    045 *       mustAny            【TAG】選択必須入力(どれかひとつ必須)を表す色[true/mustAny/その他]を指定します(初期値:無指定)
    046 *       useMustHidden      【TAG】必須の自動チェック用Hiddenを出力するかどうか[true/false]を指定します(初期値:true)
    047 *       aimai              【TAG】曖昧検索可能フィールドとして、曖昧検索方法を指定します(初期値:null)
    048 *       id                 【HTML】要素に対して固有の名前(id)をつける場合に設定します
    049 *       lang               【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します
    050 *       dir                【HTML】文字表記の方向(dir)を指定します
    051 *       title              【HTML】要素に対する補足的情報(title)を設定します
    052 *       style              【HTML】この要素に対して適用させるスタイルシート(style)を設定します
    053 *       readonly           【TAG】その部品に対して変更が出来ないように(readonly)指定します(サーバーに送信される)
    054 *       disabled           【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない)
    055 *       tabindex           【HTML】タブの移動順(tabindex)を指定します(0 ～ 32767)
    056 *       accesskey          【HTML】アクセスキー(alt+キーで直接指定)を割り当てます
    057 *       clazz              【HTML】要素に対して class 属性を設定します
    058 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    059 *       onClick            【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")
    060 *       onBlur             【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();")
    061 *       onFocus            【HTML】JavaScriptのイベント onFocus を設定します
    062 *       ondblClick         【HTML】JavaScriptのイベント ondblClick を設定します
    063 *       onMouseDown        【HTML】JavaScriptのイベント onMouseDown を設定します
    064 *       onMouseUp          【HTML】JavaScriptのイベント onMouseUp を設定します
    065 *       onMouseMove        【HTML】JavaScriptのイベント onMouseMove を設定します
    066 *       onMouseOut         【HTML】JavaScriptのイベント onMouseOut を設定します
    067 *       onMouseOver        【HTML】JavaScriptのイベント onMouseOver を設定します
    068 *       onSelect           【HTML】JavaScriptのイベント onSelect を設定します
    069 *       onKeydown          【HTML】JavaScriptのイベント onKeydown を設定します
    070 *       onKeypress         【HTML】JavaScriptのイベント onKeypress を設定します
    071 *       onKeyup            【HTML】JavaScriptのイベント onKeyup を設定します
    072 *       autofocus          【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。
    073 *       placeholder        【HTML5】入力欄に初期表示する内容を指定します。
    074 *       required           【HTML5】入力必須を指定します
    075 *       roles              【TAG】ロールをセットします
    076 *       useRealTimeCheck   【TAG】(通常は使いません)リアルタイムチェックを行うかどうか(初期値:true:行う) 5.9.32.2 (2018/05/18)
    077 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    078 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    079 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    080 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    081 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    082 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    083 *   &gt;   ... Body ...
    084 *   &lt;/og:textarea&gt;
    085 *
    086 * ●使用例
    087 *     &lt;og:textarea name="BUN" /&gt;
    088 *
    089 *     &lt;og:textarea name="BUN"&gt;            初期値に値をセットしたいとき
    090 *         test
    091 *     &lt;/og:textarea name="BUN"&gt;
    092 *
    093 * @og.group 画面部品
    094 *
    095 * @version  4.0
    096 * @author   Kazuhiko Hasegawa
    097 * @since    JDK5.0,
    098 */
    099public class TextareaTag extends HTMLTagSupport {
    100        /** このプログラムのVERSION文字列を設定します。   {@value} */
    101        private static final String VERSION = "6.9.8.0 (2018/05/28)" ;
    102        private static final long serialVersionUID = 698020180528L ;
    103
    104        /**
    105         * デフォルトコンストラクター
    106         *
    107         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    108         */
    109        public TextareaTag() { super(); }               // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    110
    111        /**
    112         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    113         *
    114         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
    115         *
    116         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    117         */
    118        @Override
    119        public int doStartTag() {
    120                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
    121                // 反転注意
    122                return useTag()
    123                                ? EVAL_BODY_BUFFERED            // Body を評価する。( extends BodyTagSupport 時)
    124                                : SKIP_BODY ;
    125
    126        }
    127
    128        /**
    129         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    130         *
    131         * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。
    132         * @og.rev 3.1.1.0 (2003/03/28) body 属性に、 {&#064;XXXX} パース機能を付加する。
    133         *
    134         * @return      後続処理の指示(SKIP_BODY)
    135         */
    136        @Override
    137        public int doAfterBody() {
    138                final String str = getBodyString();
    139
    140                if( str != null && str.length() > 0 ) {
    141                        final String label = StringUtil.htmlFilter( str );
    142                        if( label != null && label.length() > 0 ) {
    143                                set( "body",label );
    144                        }
    145                }
    146
    147                return SKIP_BODY ;
    148        }
    149
    150        /**
    151         * 検索条件の入力用のテキストフィールドを作成します。
    152         *
    153         * テーブルタグによりフィールドは分割されます。
    154         * 使用時は、テーブルタグを前後に使用して下さい。
    155         *
    156         * @og.rev 4.3.7.1 (2009/06/08) id=labelのclass化
    157         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性を自動化します。
    158         * @og.rev 6.2.0.0 (2015/02/27) aimai 属性を追加。
    159         *
    160         * @return  入力用のテキストフィールドタグ
    161         * @og.rtnNotNull
    162         */
    163        @Override
    164        protected String makeTag() {
    165                final String name = get( "name" );                                                      // 6.2.0.0 (2015/02/27) 後で使うので変数化
    166
    167                if( getMsglbl()  == null ) { setLbl( name ); }
    168
    169                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
    170                // 4.3.7.1 (2009/06/08) id=labelのclass化
    171                // rtn.append( "<td id=\"label\">" );
    172                        .append( "<td class=\"label\">" )
    173                        .append( getLongLabel() )               // 4.0.0 (2005/01/31)
    174                        .append( "</td>" )
    175                        .append( "<td>" )
    176                        .append( XHTMLTag.textarea( getAttributes() ) )
    177                        .append( "</td>" )
    178                        .append( makeAimaiPicker( name ) )              // 6.2.0.0 (2015/02/27) aimai 属性を追加
    179                        .append( makeMustHidden( name ) );              // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15)
    180
    181                return rtn.toString() ;
    182        }
    183
    184        /**
    185         * 【HTML】名前を指定します。
    186         *
    187         * @og.tag 名前を指定します。
    188         *
    189         * @param   name 名前
    190         */
    191        public void setName( final String name ) {
    192                set( "name",getRequestParameter( name ) );
    193        }
    194
    195        /**
    196         * 【HTML】高さ(行数)を指定します。
    197         *
    198         * @og.tag 高さ(行数)を指定します。
    199         *
    200         * @param   rows 高さ(行数)
    201         */
    202        public void setRows( final String rows ) {
    203                set( "rows",getRequestParameter( rows ) );
    204        }
    205
    206        /**
    207         * 【HTML】横幅(カラム数)を指定します。
    208         *
    209         * @og.tag 横幅を指定します。
    210         *
    211         * @param   cols 横幅(カラム数)
    212         */
    213        public void setCols( final String cols ) {
    214                set( "cols",getRequestParameter( cols ) );
    215        }
    216
    217        /**
    218         * 【TAG】リアルタイムチェックを行うかどうかを指定します(初期値:true)。
    219         *
    220         * @og.tag
    221         * カラム単位でリアルタイムチェックを行うかどうかを設定をします。
    222         * タグに独自属性としてrealTimeCheck="true/false"を追記します。
    223         * falseを設定した場合にチェックが行われなくなります。
    224         * 初期値はリアルタイムチェックを行う（true）です。
    225         *
    226         * この属性は、optionAttributesへの設定と同様の動作を行います。
    227         * 引数の文字列の、true/false 判定を行っていません。そのままの文字列が設定されます。
    228         * JavaScript 側では、false 判定のみ行っているので、不正な文字列の場合は、
    229         * 初期値(true:リアルタイムチェックを行う)が適用されます。
    230         * これは、Ver5 とﾛｼﾞｯｸを合わせておくための処置です。
    231         *
    232         * @og.rev 5.9.32.2 (2018/05/18) 新規追加
    233         * @og.rev 6.9.8.0 (2018/05/28) Ver5 とﾛｼﾞｯｸを合わせます。
    234         *
    235         * @param   flag リアルタイムチェックを行うかどうか [true:行う/false:行わない]
    236         */
    237        public void setUseRealTimeCheck( final String flag ) {
    238                // optionAttributes扱いで登録します。
    239                final String rtcf = getRequestParameter( flag );
    240
    241                if( StringUtil.isNotNull( rtcf ) ){
    242                        add( "optionAttributes", "realTimeChk=\"" + rtcf + "\"" );                      // 連結時のスペースは、Attributes クラスで処理
    243                }
    244
    245//              // optionAttributes扱いで登録します。
    246//              final boolean useRtc = StringUtil.nval( getRequestParameter( flag ) , true );
    247//
    248//              if( !useRtc ) {         // true 以外の場合のみ、optionAttributes に属性を追加します。
    249//                      add( "optionAttributes", "realTimeChk=\"false\"" );                     // 連結時のスペースは、Attributes クラスで処理
    250//              }
    251        }
    252}