    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;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020
    021import org.opengion.fukurou.util.TagBuffer;                                             // 6.2.0.0 (2015/02/27)
    022import org.opengion.fukurou.util.XHTMLTag;
    023import org.opengion.fukurou.util.StringUtil;                                    // 6.4.1.1 (2016/01/16)
    024import static org.opengion.fukurou.util.StringUtil.nval ;
    025
    026/**
    027 * CommonTagSupport から継承されたサブクラスです。
    028 *
    029 * HTML関連の共通属性を、設定する為のメソッドを持っています。
    030 * 主な、HTMLタグは、このクラスを継承して作ることで、必要な属性は、
    031 * Attributes オブジェクト にセットされるため、#set(String,String)
    032 * get(String) メソッドで扱う事が可能になります。
    033 * 不要な属性は、tld ファイルに記述しなければ、使用されません。
    034 *
    035 * 以下に、このメソッド内で定義される属性を記述します。
    036 *
    037 *       roles              【TAG】ロールをセットします
    038 *       must               【TAG】必須入力を表す色に変えるかどうか[true/false]を指定します(初期値:false)
    039 *       mustAny            【TAG】選択必須入力(どれかひとつ必須)を表す色[true/mustAny/その他]を指定します(初期値:無指定)
    040 *       useMustHidden      【TAG】必須の自動チェック用Hiddenを出力するかどうか[true/false]を指定します(初期値:true)
    041 *       aimai              【TAG】曖昧検索可能フィールドとして、曖昧検索方法を指定します(初期値:null)
    042 *       optionAttributes   【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します
    043 *       id                 【HTML】要素に対して固有の名前(id)をつける場合に設定します
    044 *       clazz              【HTML】要素に対して class 属性を設定します
    045 *       lang               【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します
    046 *       dir                【HTML】文字表記の方向(dir)を指定します
    047 *       title              【HTML】要素に対する補足的情報(title)を設定します
    048 *       style              【HTML】この要素に対して適用させるスタイルシート(style)を設定します
    049 *       readonly           【TAG】その部品に対して変更が出来ないように(readonly)指定します(サーバーに送信される)
    050 *       disabled           【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない)
    051 *       tabindex           【HTML】タブの移動順(tabindex)を指定します(0 ～ 32767)
    052 *       accesskey          【HTML】アクセスキー(alt+キーで直接指定)を割り当てます
    053 *       onClick            【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")
    054 *       onChange           【HTML】JavaScriptのイベント onChange を設定します(例:onChange="renew('query.jsp','QUERY');")
    055 *       onBlur             【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();")
    056 *       onFocus            【HTML】JavaScriptのイベント onFocus を設定します
    057 *       onSelect           【HTML】JavaScriptのイベント onSelect を設定します
    058 *       ondblClick         【HTML】JavaScriptのイベント ondblClick を設定します
    059 *       onMouseDown        【HTML】JavaScriptのイベント onMouseDown を設定します
    060 *       onMouseUp          【HTML】JavaScriptのイベント onMouseUp を設定します
    061 *       onMouseMove        【HTML】JavaScriptのイベント onMouseMove を設定します
    062 *       onMouseOut         【HTML】JavaScriptのイベント onMouseOut を設定します
    063 *       onMouseOver        【HTML】JavaScriptのイベント onMouseOver を設定します
    064 *       onKeydown          【HTML】JavaScriptのイベント onKeydown を設定します
    065 *       onKeypress         【HTML】JavaScriptのイベント onKeypress を設定します
    066 *       onKeyup            【HTML】JavaScriptのイベント onKeyup を設定します
    067 *       autocomplete       【HTML5】入力候補を提示して入力内容を自動補完する[on/off]（初期値はon）。
    068 *       autofocus          【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。
    069 *       pattern            【HTML5】正規表現で入力値のパターンを指定します。
    070 *       placeholder        【HTML5】入力欄に初期表示する内容を指定します。
    071 *       list               【HTML5】ユーザーに入力候補として提案するデータリストの要素のid属性の値を指定します。
    072 *       min                【HTML5】入力欄で入力できる最小値を指定します。
    073 *       max                【HTML5】入力欄で入力できる最大値を指定します。
    074 *       step               【HTML5】入力欄で刻むステップ値を指定する。
    075 *       required           【HTML5】入力必須を指定します
    076 *
    077 * 各属性は、{&#064;XXXX} 変数が使用できます。
    078 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に
    079 * 割り当てます。つまり、このXXXXをキーにリクエストすれば、
    080 * この変数に値をセットすることができます。
    081 *
    082 * http://localhost/query.jsp?KEY1=VLA1&amp;KEY2=VAL2
    083 *
    084 * のようなリクエストで、{&#064;KEY1} とすれば、 VAL1 がセットされます。
    085 *
    086 * このタグは、ラベル部分と入力フィールド部分がテーブルタグの&lt;td&gt;
    087 * により左右に分割されます。HTML 表示時は、前後に&lt;tr&gt;タグで囲って,
    088 * 整形できます。
    089 *
    090 * ※ readonly , disabled , autofocus[HTML5] , required[HTML5]  は、論理属性です。
    091 * 通常は、キーワードのみの指定で、有効です。
    092 * よって、readonly="false" としても、readonly というキーワードが存在すると、有効になります。
    093 * 記述例  ①readonly ②readonly="" ③readonly="readonly" の３種類が推奨されます。
    094 *          「属性名」 「属性名=""」 「属性名="属性名"」
    095 * フレームワーク側の問題として、①や②の渡し方は他の属性との関係や、動的なリクエスト変数の処理の
    096 * 関係で、③を利用します。また、動的切替の為に、④readonly="[true/false]" も受け付けます。
    097 * 内部的には、readonly="true" の場合は、readonly="readonly" を作成し、readonly="false" の場合は、
    098 * なにも作成しないという処理を行っています。
    099 *
    100 * 7.4.2.1 (2021/05/21)
    101 *   ｼｽﾃﾑ定数 USE_ACCESSKEY を false に設定すると、accesskey は使用されません。
    102 *
    103 * @og.group 画面部品
    104 *
    105 * @version  4.0
    106 * @author   Kazuhiko Hasegawa
    107 * @since    JDK5.0,
    108 */
    109abstract class HTMLTagSupport extends CommonTagSupport {
    110        /** このプログラムのVERSION文字列を設定します。   {@value} */
    111        private static final String VERSION = "8.1.0.4 (2022/01/28)" ;
    112        private static final long serialVersionUID = 810420220128L ;
    113
    114        // 6.4.0.4 (2015/12/26) HTML5使用時の must="true" での required属性の出力制御
    115        private static final boolean USE_MUST_REQUIRED = HybsSystem.sysBool( "USE_MUST_REQUIRED" );
    116
    117        // 8.1.0.4 (2022/01/28) aimai表記のｱｲｺﾝ使用(ICON_DIRを使用)
    118        private static final String ICON_SRC = HybsSystem.sys( "JSP" ) + "/" + HybsSystem.sys( "ICON_DIR" ) + "/" ;
    119
    120        // 6.2.0.0 (2015/02/27) AimaiPicker のタイプに対応したキーワード
    121//      private static final String[] AIMAI_TEXT = { " V ", " V*", "*V ", "*V*" };
    122        private static final String[] AIMAI_TITL = { "完全一致", "前方一致", "後方一致", "前後曖昧" };
    123        private static final String[] AIMAI_ICON = {  "<img src='" + ICON_SRC + "aimai0.png'>"
    124                                                                                                , "<img src='" + ICON_SRC + "aimai1.png'>"
    125                                                                                                , "<img src='" + ICON_SRC + "aimai2.png'>"
    126                                                                                                , "<img src='" + ICON_SRC + "aimai3.png'>" };   // 8.1.0.4 (2022/01/28)
    127
    128        // 7.4.2.1 (2021/05/21) accesskey の設定の有効(true)/無効(false)を設定します(要再起動)
    129        // 8.0.2.0 (2021/11/30) useAccessKey → USE_ACCESSKEY 変更
    130//      private static final boolean useAccessKey = HybsSystem.sysBool( "USE_ACCESSKEY" );
    131        private static final boolean USE_ACCESSKEY = HybsSystem.sysBool( "USE_ACCESSKEY" );
    132
    133        // 5.2.1.0 (2010/10/01) must , mustAny 属性を自動化します。
    134        private String  mustType        ;                       // 5.2.1.0 (2010/10/01)
    135        // 5.7.2.0 (2014/01/10) 自動化の制御をできるようにします。(初期は自動)
    136        private boolean useMustHidden = true;   // 5.7.2.0 (2014/01/10)
    137        // 6.2.0.0 (2015/02/27) aimai 属性を追加。
    138        private int             aimai           = -1;           // 6.2.0.0 (2015/02/27)
    139
    140        /**
    141         * デフォルトコンストラクター
    142         *
    143         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    144         */
    145        public HTMLTagSupport() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    146
    147        /**
    148         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    149         *
    150         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    151         * @og.rev 4.0.0.0 (2005/11/30) ロール を考慮します。
    152         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
    153         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    154         * @og.rev 6.1.0.0 (2014/12/26) HTML5のrequired属性は、useMustHidden==true でも制御可能とする。
    155         * @og.rev 6.4.0.4 (2015/12/26) USE_MUST_REQUIRED で、HTML5使用時の must="true" での required属性の出力制御
    156         * @og.rev 6.9.5.0 (2018/04/23) isUseHTML5() 廃止(true固定)
    157         *
    158         * @return      後続処理
    159         */
    160        @Override
    161        public int doEndTag() {
    162                debugPrint();           // 4.0.0 (2005/02/28)
    163                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    164                if( useTag() && getUser().isAccess( get( "roles" ) ) ) {                        // 4.3.0.0 (2008/07/04) ロールモードマルチ対応
    165                        // 6.1.0.0 (2014/12/26) HTML5のrequired属性は、useMustHidden==true でも制御可能とする。
    166//                      if( "must".equals( mustType ) && useMustHidden && isUseHTML5() && USE_MUST_REQUIRED ) {
    167                        if( "must".equals( mustType ) && useMustHidden && USE_MUST_REQUIRED ) {         // 6.9.5.0 (2018/04/23) isUseHTML5() 廃止(true固定)
    168                                set( "required","required" );
    169                        }
    170                        jspPrint( makeTag() );
    171                }
    172                return EVAL_PAGE ;
    173        }
    174
    175        /**
    176         * タグリブオブジェクトをリリースします。
    177         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    178         *
    179         * @og.rev 5.2.1.0 (2010/10/01) mustType 属性を追加。
    180         * @og.rev 5.7.2.0 (2014/01/10) useMustHidden追加
    181         * @og.rev 6.2.0.0 (2015/02/27) aimai 属性を追加
    182         */
    183        @Override
    184        protected void release2() {
    185                super.release2();
    186                mustType                = null;         // 5.2.1.0 (2010/10/01)
    187                useMustHidden   = true;         // 5.7.2.0 (2013/12/10)
    188                aimai                   = -1;           // 6.2.0.0 (2015/02/27) aimai 属性を追加。
    189        }
    190
    191        /**
    192         * タグ文字列を作成します。
    193         *
    194         * ここでは、#doEndTag() で、jspPrint の出力として書き出されます。
    195         * 各サブクラスで、実装してください。
    196         *
    197         * @return  タグ文字列
    198         */
    199        protected abstract String makeTag() ;
    200
    201        /**
    202         * 【HTML】要素に対して固有の名前(id)をつける場合に設定します。
    203         *
    204         * @og.tag
    205         * 特別な使用方法として、id="FOCUS" とすることで、フィールド系要素に
    206         * フォーカスを移動させます。これは、そのページ内で唯一の id 属性として使用ください。
    207         *
    208         * ※ HTML5 より、autofocus属性の使用が可能になりました。
    209         *
    210         * @param   id 固有の名前
    211         */
    212        @Override
    213        public void setId( final String id ) {
    214                set( "id",getRequestParameter( id ) );
    215        }
    216
    217        /**
    218         * 【HTML】要素に対して class 属性を設定します。
    219         *
    220         * @og.tag
    221         * Javaの言語使用上、class で作成できないため、代用として
    222         * clazz を使用しています。
    223         * html で作成される属性は、 class で作成されます。
    224         *
    225         * @og.rev 3.5.0.0 (2003/09/17) set ではなく、add を利用します。
    226         *
    227         * @param   cls class属性
    228         */
    229        public void setClazz( final String cls ) {
    230                add( "class",getRequestParameter( cls ) );      // 3.5.5.9 (2004/06/07) セパレータ引数付きのメソッドに変更
    231        }
    232
    233        /**
    234         * 【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します。
    235         *
    236         * @og.tag
    237         * HTMLの言語属性に使われます。指定する値は、ISO 639で規定されている「言語コード」です。
    238         * [ja/en/zh/…]などのほかに、en-US:アメリカ英語、en-cockney:コックニー英語 など、
    239         * 副言語を指定する方法も定められています。
    240         * ここでは、lang と xml:lang の両方に同じ値がセットされます。
    241         * タグの language 属性とは使用用途が異なります。
    242         *
    243         * @og.tag lang セット
    244         *
    245         * @param   lang 言語 [ja/en/zh/…]
    246         */
    247        public void setLang( final String lang ) {
    248                final String lng = getRequestParameter( lang );
    249                if( lng != null ) {
    250                        set( "lang",lng );
    251                        set( "xml:lang",lng );
    252                }
    253        }
    254
    255        /**
    256         * 【HTML】文字表記の方向(dir)を指定します。
    257         *
    258         * @og.tag
    259         * 当該要素の書字方向を指定する属性です。
    260         * ltr で、左から右に、rtl で、右から左に並べます。
    261         *
    262         * @param   dir 文字表記方向 [ltr:左から右、rtl:右から左]
    263         */
    264        public void setDir( final String dir ) {
    265                set( "dir",getRequestParameter( dir ) );
    266        }
    267
    268        /**
    269         * 【HTML】要素に対する補足的情報(title)を設定します。
    270         *
    271         * @og.tag
    272         * title セットは、ボタンなどに適用すると、マウスオーバーによりこのメッセージが
    273         * チップスのように表示されます。これを利用して、説明文を登録することが可能です。
    274         * ここに指定した文字列が、ラベルリソースに存在する場合は、そのラベルを表示し、
    275         * 存在しない場合は、そのままの値を表示します。
    276         *
    277         * 6.1.1.0 (2015/01/17)
    278         *  ① 1.引数を、{&#064;XXXX} 処理せずに、XXXX でラベルリソースの概要をチェックします。
    279         *     2.存在しなければ、ラベルをチェックします。
    280         *     3.そこにもなければ、全体を、RequestParameter 処理します。
    281         *  ② 変換後の文字列から、"￥n" を、"&amp;#13;&amp;#10;" に変換することで、改行に対応します。
    282         *     実際は、CR か LF のどちらでも改行するようです。
    283         *
    284         * @og.rev 3.5.5.8 (2004/05/20) メッセージリソースから読み込んだ文字を使用します。
    285         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
    286         * @og.rev 6.1.1.0 (2015/01/17) 直接、ラベルリソースを表示できるようにする。
    287         *
    288         * @param   title タイトル情報
    289         */
    290        public void setTitle( final String title ) {
    291                // 6.1.1.0 (2015/01/17)
    292                if( title != null ) {
    293                        String lbl = getResource().getDescription( title );                     // ①1.まずは概要
    294                        // 存在しないか、引数と同じ場合(変換できなかった=存在しない)は、再検索
    295                        if( lbl == null || lbl.isEmpty() || lbl.equals( title ) ) {
    296                                lbl = getResource().getLabel( title );                                  // ①2.なければ、ラベル
    297                                if( lbl == null || lbl.isEmpty() || lbl.equals( title ) ) {
    298                                        lbl = nval( getRequestParameter( title ),null );        // ①3.RequestParameter 処理する
    299                                }
    300                        }
    301
    302                        if( lbl != null ) {
    303                                // "\n" という文字列の正規表現は、"\\n" で本物の改行コードになるので、４つ \ が必要になる。
    304                                lbl = lbl.replaceAll( "\\\\n","&#13;&#10;" );                           // ②.改行に対応
    305                                set( "title",lbl );
    306                        }
    307                }
    308        }
    309
    310        /**
    311         * 【HTML】この要素に対して適用させるスタイルシート(style)を設定します。
    312         *
    313         * @og.tag
    314         * タグにstyle属性を設定します。これは、キー:値; のセットを複数記述できます。
    315         * 通常は、class属性や、id属性で登録しておき、&lt;style&gt; で
    316         * 外部から指定する方がソースは読みやすくなります。
    317         *
    318         * @param   style スタイルシート (例 style="color:red; font-size:24pt;" など)
    319         */
    320        public void setStyle( final String style ) {
    321                set( "style",getRequestParameter( style ) );
    322        }
    323
    324        /**
    325         * 【TAG】その部品に対して変更が出来ないように(readonly)指定します(サーバーに送信される)。
    326         *
    327         * @og.tag
    328         * INPUT/TEXTAREA 系に対して、指定可能です。
    329         * readonly="readonly" , readonly="true" が指定された場合は、有効です。
    330         * false も指定値としては、有効です。(大文字小文字の区別も不要)
    331         * それ以外の指定は、エラーとします。
    332         *
    333         * ※ readonly は、論理属性です。
    334         *
    335         * @og.rev 3.7.1.0 (2005/04/26) readonly,true,false が指定できるように変更。
    336         *
    337         * @param   ronly 読取専用 [readonly/true/false]
    338         */
    339        public void setReadonly( final String ronly ) {
    340                final String readonly = nval( getRequestParameter( ronly ),null );
    341                if( readonly != null ) {
    342                        if( "readonly".equalsIgnoreCase( readonly ) ||
    343                                "true".equalsIgnoreCase( readonly ) ) {
    344                                        set( "readonly","readonly" );
    345                        }
    346                        else if( ! "false".equalsIgnoreCase( readonly ) ) {
    347                                final String errMsg = "readonly には、[readonly,true,false]以外の文字は指定できません。"
    348                                                                + " readonly=[" + readonly + "]" + CR ;
    349                                throw new HybsSystemException( errMsg );
    350                        }
    351                }
    352        }
    353
    354        /**
    355         * 【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない)。
    356         *
    357         * @og.tag
    358         * BUTTON/INPUT/OPTGROUP/OPTION/SELECT/TEXTAREA 系に対して、指定可能です。
    359         * disabled="disabled" , disabled="true" が指定された場合は、有効です。
    360         * false も指定値としては、有効です。(大文字小文字の区別も不要)
    361         * それ以外の指定は、エラーとします。
    362         *
    363         * ※ disabled は、論理属性です。
    364         *
    365         * @og.rev 3.7.1.0 (2005/04/26) disabled,true,false が指定できるように変更。
    366         *
    367         * @param   dis disabled指定 [disabled,true:disabled/false:設定なし]
    368         */
    369        public void setDisabled( final String dis ) {
    370                final String disabled = nval( getRequestParameter( dis ),null );
    371                if( disabled != null ) {
    372                        if( "disabled".equalsIgnoreCase( disabled ) ||
    373                                "true".equalsIgnoreCase( disabled ) ) {
    374                                        set( "disabled","disabled" );
    375                        }
    376                        else if( ! "false".equalsIgnoreCase( disabled ) ) {
    377                                final String errMsg = "disabled には、[disabled/true/false]以外の文字は指定できません。"
    378                                                                + " disabled=[" + disabled + "]" + CR ;
    379                                throw new HybsSystemException( errMsg );
    380                        }
    381                }
    382        }
    383
    384        /**
    385         * 【HTML】タブの移動順(tabindex)を指定します(0 ～ 32767)。
    386         *
    387         * @og.tag
    388         * Tabキーを押したときに要素が選択される順番を指定します。
    389         * 値には、選択させたい順番を数値で記述します。
    390         *
    391         * @param       tabindex        タブ移動順 (0～32767)
    392         */
    393        public void setTabindex( final String tabindex ) {
    394                set( "tabindex",getRequestParameter( tabindex ) );
    395        }
    396
    397        /**
    398         * 【HTML】アクセスキー(alt+キーで直接指定)を割り当てます。
    399         *
    400         * @og.tag
    401         * アクセスキーは、マウスの使えない環境でも、リンクにジャンプする、ボタンを押す、入力フォームに
    402         * フォーカスを移すなどの操作を簡単に行うことができるように考慮されたものです。
    403         * Windows の「ファイル(F)」メニューについている、F と同じような働きをします。
    404         *
    405         * @og.rev 7.4.2.1 (2021/05/21) ｼｽﾃﾑ定数 USE_ACCESSKEY を false に設定すると、accesskey は使用されません。
    406         * @og.rev 8.0.2.0 (2021/11/30) useAccessKey → USE_ACCESSKEY 変更
    407         *
    408         * @param   accesskey アクセスキー
    409         */
    410        public void setAccesskey( final String accesskey ) {
    411//              if( useAccessKey ) {                            // 7.4.2.1 (2021/05/21)
    412                if( USE_ACCESSKEY ) {                           // 8.0.2.0 (2021/11/30)
    413                        set( "accesskey",getRequestParameter( accesskey ) );
    414                }
    415        }
    416
    417        /**
    418         * 【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します。
    419         *
    420         * @og.tag
    421         * JavaScript などの HTML基本タグ以外の属性を、そのまま
    422         * タグとして使用します。
    423         *
    424         * @og.rev 3.1.0.1 (2003/03/26) (')を(")に置き換え処理していたのを止める。
    425         *
    426         * @param   optionAttributes オプション属性
    427         */
    428        public void setOptionAttributes( final String optionAttributes ) {
    429                final String optAttri = getRequestParameter( optionAttributes );
    430                if( optAttri != null && optAttri.length() > 0 ) {
    431                        set( "optionAttributes",optAttri );
    432                }
    433        }
    434
    435        /**
    436         * 【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")。
    437         *
    438         * @og.tag
    439         * onClick をセットします。
    440         * 例えば、&lt;og:column name="KBSAKU" onClick="renew('query.jsp','QUERY');" /&gt;
    441         * のように指定することで、プルダウンメニューの絞込み検索が可能になります。
    442         *
    443         * @og.rev 3.5.0.0 (2003/09/17) 新規追加
    444         * @og.rev 3.5.5.9 (2004/06/07) セパレータ付きの追加メソッドに変更
    445         *
    446         * @param       onClick onClickイベント (例:onClick="renew('query.jsp','QUERY');")
    447         */
    448        public void setOnClick( final String onClick ) {
    449                add( "onClick",getRequestParameter( onClick ),";" );
    450        }
    451
    452        /**
    453         * 【HTML】JavaScriptのイベント onChange を設定します(例:onChange="renew('query.jsp','QUERY');")。
    454         *
    455         * @og.tag
    456         * onChange をセットします。
    457         * 例えば、&lt;og:column name="KBSAKU" onChange="renew('query.jsp','QUERY');" /&gt;
    458         * のように指定することで、プルダウンメニューの絞込み検索が可能になります。
    459         *
    460         * @og.rev 3.5.0.0 (2003/09/17) 新規追加
    461         * @og.rev 3.5.5.9 (2004/06/07) セパレータ付きの追加メソッドに変更
    462         *
    463         * @param   onChange    onChangeイベント (例:onChange="renew('query.jsp','QUERY');")
    464         */
    465        public void setOnChange( final String onChange ) {
    466                add( "onChange",getRequestParameter( onChange ),";" );
    467        }
    468
    469        /**
    470         * 【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();")。
    471         *
    472         * @og.tag
    473         * onBlur は、フォーカスが離れたときに発生するイベントです。
    474         *
    475         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    476         *
    477         * @param   onBlur      onBlurイベント (例:onBlur="this.value=value.toUpperCase();")
    478         */
    479        public void setOnBlur( final String onBlur ) {
    480                add( "onBlur",getRequestParameter( onBlur ),";" );
    481        }
    482
    483        /**
    484         * 【HTML】JavaScriptのイベント onFocus を設定します。
    485         *
    486         * @og.tag
    487         * onFocus は、フォーカスされたときに発生するイベントです。
    488         *
    489         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    490         *
    491         * @param   onFocus     onFocusイベント
    492         */
    493        public void setOnFocus( final String onFocus ) {
    494                add( "onFocus",getRequestParameter( onFocus ),";" );
    495        }
    496
    497        /**
    498         * 【HTML】JavaScriptのイベント onSelect を設定します。
    499         *
    500         * @og.tag
    501         * onSelect は、テキストフィールド/テキストエリアのテキストが
    502         * 選択されたときに発生するイベントです。
    503         *
    504         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    505         *
    506         * @param   onSelect    onSelectイベント
    507         */
    508        public void setOnSelect( final String onSelect ) {
    509                add( "onSelect",getRequestParameter( onSelect ),";" );
    510        }
    511
    512        /**
    513         * 【HTML】JavaScriptのイベント ondblClick を設定します。
    514         *
    515         * @og.tag
    516         * ondblClick は、マウスでダブルクリックされたときに発生するイベントです。
    517         *
    518         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    519         *
    520         * @param   ondblClick  ondblClickイベント
    521         */
    522        public void setOndblClick( final String ondblClick ) {
    523                add( "ondblClick",getRequestParameter( ondblClick ),";" );
    524        }
    525
    526        /**
    527         * 【HTML】JavaScriptのイベント onMouseDown を設定します。
    528         *
    529         * @og.tag
    530         * onMouseDown は、マウスダウンされたときに発生するイベントです。
    531         *
    532         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    533         *
    534         * @param   onMouseDown onMouseDownイベント
    535         */
    536        public void setOnMouseDown( final String onMouseDown ) {
    537                add( "onMouseDown",getRequestParameter( onMouseDown ),";" );
    538        }
    539
    540        /**
    541         * 【HTML】JavaScriptのイベント onMouseUp を設定します。
    542         *
    543         * @og.tag
    544         * onMouseUp は、マウスアップされたときに発生するイベントです。
    545         *
    546         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    547         *
    548         * @param   onMouseUp   onMouseUpイベント
    549         */
    550        public void setOnMouseUp( final String onMouseUp ) {
    551                add( "onMouseUp",getRequestParameter( onMouseUp ),";" );
    552        }
    553
    554        /**
    555         * 【HTML】JavaScriptのイベント onMouseMove を設定します。
    556         *
    557         * @og.tag
    558         * onMouseMove は、マウスが移動されたときに発生するイベントです。
    559         *
    560         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    561         *
    562         * @param   onMouseMove onMouseMoveイベント
    563         */
    564        public void setOnMouseMove( final String onMouseMove ) {
    565                add( "onMouseMove",getRequestParameter( onMouseMove ),";" );
    566        }
    567
    568        /**
    569         * 【HTML】JavaScriptのイベント onMouseOut を設定します。
    570         *
    571         * @og.tag
    572         * onMouseOut は、マウスが離れたときに発生するイベントです。
    573         *
    574         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    575         *
    576         * @param   onMouseOut  onMouseOutイベント
    577         */
    578        public void setOnMouseOut( final String onMouseOut ) {
    579                add( "onMouseOut",getRequestParameter( onMouseOut ),";" );
    580        }
    581
    582        /**
    583         * 【HTML】JavaScriptのイベント onMouseOver を設定します。
    584         *
    585         * @og.tag
    586         * onMouseOver は、マウスが重なったときに発生するイベントです。
    587         *
    588         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    589         *
    590         * @param   onMouseOver onMouseOverイベント
    591         */
    592        public void setOnMouseOver( final String onMouseOver ) {
    593                add( "onMouseOver",getRequestParameter( onMouseOver ),";" );
    594        }
    595
    596        /**
    597         * 【HTML】JavaScriptのイベント onKeydown を設定します。
    598         *
    599         * @og.tag
    600         * onKeydown は、キーが押されたときに発生するイベントです。
    601         *
    602         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    603         *
    604         * @param   onKeydown   onKeydownイベント
    605         */
    606        public void setOnKeydown( final String onKeydown ) {
    607                add( "onKeydown",getRequestParameter( onKeydown ),";" );
    608        }
    609
    610        /**
    611         * 【HTML】JavaScriptのイベント onKeypress を設定します。
    612         *
    613         * @og.tag
    614         * onKeypress は、キーが押され続けていたときに発生するイベントです。
    615         *
    616         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    617         *
    618         * @param   onKeypress  onKeypressイベント
    619         */
    620        public void setOnKeypress( final String onKeypress ) {
    621                add( "onKeypress",getRequestParameter( onKeypress ),";" );
    622        }
    623
    624        /**
    625         * 【HTML】JavaScriptのイベント onKeyup を設定します。
    626         *
    627         * @og.tag
    628         * onKeyup は、キーが押された状態から離されたときに発生するイベントです。
    629         *
    630         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    631         *
    632         * @param   onKeyup     onKeyupイベント
    633         */
    634        public void setOnKeyup( final String onKeyup ) {
    635                add( "onKeyup",getRequestParameter( onKeyup ),";" );
    636        }
    637
    638        /**
    639         * 【HTML5】入力候補を提示して入力内容を自動補完する[on/off]（初期値はon）。
    640         *
    641         * @og.tag
    642         * HTML5から追加された新機能です。
    643         * オートコンプリートを有効にする場合は、on 、無効にする場合は、off を設定します。
    644         * 初期値は、on(有効) です。
    645         *
    646         * &lt;datalist&gt; タグを使用して、入力候補となるデータリストを定義できます。
    647         * 各データのリスト項目は、&lt;option&gt;で定義します。 &lt;datalist&gt;をサポートしたブラウザでは、
    648         * &lt;option&gt;で指定された値がユーザーに対して入力候補として提案表示されます。
    649         * &lt;input&gt;のlist属性の値と&lt;datalist&gt;のid属性の値を同じにして、入力欄と
    650         * データリストを関連付けます。
    651         *
    652         * 利用可能type:[text,search,url,tel,email,password,datetime,date,month,week,time,datetime-local,number,range,color]
    653         *
    654         * <pre>
    655         * &lt;og:input type="text" name="yourarea" autocomplete="on" list="tokyo" /&gt;
    656         *
    657         *  &lt;og:datalist id="tokyo" &gt;
    658         *      &lt;og:option value="渋谷" /&gt;
    659         *      &lt;og:option value="新宿" /&gt;
    660         *      &lt;og:option value="池袋" /&gt;
    661         *  &lt;/og:datalist&gt;&lt;
    662         * </pre>
    663         *
    664         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    665         *
    666         * @param       autocomplete 自動補完設定 [on/off]（初期値はon）
    667         * @see         <a href="http://www.htmq.com/html5/input_autocomplete.shtml">autocomplete</a>
    668         */
    669        public void setAutocomplete( final String autocomplete ) {
    670                set( "autocomplete" , getRequestParameter( autocomplete ) );
    671        }
    672
    673        /**
    674         * 【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。
    675         *
    676         * @og.tag
    677         * HTML5から追加された新機能です。
    678         * autofocus属性を指定すると、ウェブページが表示された際に、
    679         * 指定した入力欄にカーソルが当たって自動的にフォーカスされます。
    680         *
    681         * autofocus="autofocus" , autofocus="true" が指定された場合は、有効です。
    682         * false も指定値としては、有効です。(大文字小文字の区別も不要)
    683         * それ以外の指定は、エラーとします。
    684         *
    685         * 利用可能type:[text,search,url,tel,email,password]
    686         *
    687         * ※ autofocus は、論理属性です。
    688         *
    689         * <pre>
    690         * &lt;og:input type="text" name="userid" autofocus="autofocus" /&gt;
    691         * </pre>
    692         *
    693         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    694         *
    695         * @param       atfocus オートフォーカス
    696         * @see         <a href="http://www.htmq.com/html5/input_autofocus.shtml">autofocus</a>
    697         */
    698        public void setAutofocus( final String atfocus ) {
    699                final String autofocus = nval( getRequestParameter( atfocus ),null );
    700                if( autofocus != null ) {
    701                        if( "autofocus".equalsIgnoreCase( autofocus ) ||
    702                                "true".equalsIgnoreCase( autofocus ) ) {
    703                                        set( "autofocus","autofocus" );
    704                        }
    705                        else if( ! "false".equalsIgnoreCase( autofocus ) ) {
    706                                final String errMsg = "autofocus には、[autofocus,true,false]以外の文字は指定できません。"
    707                                                                + " autofocus=[" + autofocus + "]" + CR ;
    708                                throw new HybsSystemException( errMsg );
    709                        }
    710                }
    711        }
    712
    713        /**
    714         * 【HTML5】正規表現で入力値のパターンを指定します。
    715         *
    716         * @og.tag
    717         * HTML5から追加された新機能です。
    718         * 正規表現を使って入力値のパターンを指定することができます。
    719         *
    720         * 利用可能type:[text,search,url,tel,email,password]
    721         *
    722         * <pre>
    723         * &lt;og:input type="text" name="userid" pattern="^[0-9A-Za-z]+$" /&gt; ※半角英数
    724         * </pre>
    725         *
    726         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    727         *
    728         * @param       pattern 入力値正規表現
    729         * @see         <a href="http://www.htmq.com/html5/input_pattern.shtml">pattern</a>
    730         */
    731        public void setPattern( final String pattern ) {
    732                set( "pattern",getRequestParameter( pattern ) );
    733        }
    734
    735        /**
    736         * 【HTML5】入力欄に初期表示する内容を指定します。
    737         *
    738         * @og.tag
    739         * HTML5から追加された新機能です。
    740         * placeholder属性で指定した値が、入力欄に初期値として表示されます。
    741         * 例えば、テキストフィールドに初期値として、 「検索するキーワードを入力してください」
    742         * などのヒントを示してユーザーの操作を補助することができます。
    743         *
    744         * 利用可能type:[text,search,url,tel,email,password]
    745         *
    746         * 6.1.1.0 (2015/01/17)
    747         *  ① 1.引数を、{&#064;XXXX} 処理せずに、XXXX でラベルリソースをチェックします。
    748         *     2.なければ、全体を、RequestParameter 処理します。
    749         *  ② 変換後の文字列から、"￥n" を、"&amp;#13;&amp;#10;" に変換することで、改行に対応します。
    750         *     実際は、CR か LF のどちらでも改行するようです。
    751         *  ③ title属性が、未設定なら、placeholder の設定キーと同じキーで、title を設定します。
    752         *
    753         * <pre>
    754         * &lt;og:input type="search" name="q" placeholder="キーワードを入力" /&gt;
    755         * </pre>
    756         *
    757         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    758         * @og.rev 6.1.1.0 (2015/01/17) 直接、ラベルリソースを表示できるようにする。
    759         *
    760         * @param       placeholder 初期表示文字
    761         * @see         <a href="http://www.htmq.com/html5/input_placeholder.shtml">placeholder</a>
    762         */
    763        public void setPlaceholder( final String placeholder ) {
    764
    765                if( placeholder != null ) {
    766                        String lbl = getResource().getLabel( placeholder );                                     // ①1.ラベル
    767                        // 存在しないか、引数と同じ場合(変換できなかった=存在しない)は、再検索
    768                        if( lbl == null || lbl.isEmpty() || lbl.equals( placeholder ) ) {
    769                                lbl = nval( getRequestParameter( placeholder ),null );                  // ①2.RequestParameter 処理する
    770                        }
    771
    772                        if( lbl != null ) {
    773                                // "\n" という文字列の正規表現は、"\\n" で本物の改行コードになるので、４つ \ が必要になる。
    774                                lbl = lbl.replaceAll( "\\\\n","&#13;&#10;" );                           // ②.改行に対応
    775                                set( "placeholder",lbl );
    776                        }
    777
    778                        // ③ title が設定されていない場合は、設定する。
    779                        // パラメータのアクセス順は不明だが、titleが後なら、上書きされるので、OK。
    780                        if( get( "title" ) == null ) {
    781                                setTitle( placeholder );        // title に placeholder のキーをセットする。
    782                        }
    783                }
    784        }
    785
    786        /**
    787         * 【HTML5】ユーザーに入力候補として提案するデータリストの要素のid属性の値を指定します。
    788         *
    789         * @og.tag
    790         * HTML5から追加された新機能です。
    791         * ユーザーに入力候補として提案するデータリストタグ(&lt;datalist&gt;)のid属性を
    792         * この、list 属性に設定することで、関連付けができます。
    793         *
    794         * ※
    795         * 内部事情で、list属性 に設定するキーも、datalistタグのid属性に設定するキーも、
    796         * inputタグ(columnタグ)の name属性＋".sel" を標準的に使用してください。
    797         *
    798         * 利用可能type:[text,search,url,tel,email,datetime,date,month,week,time,datetime-local,number,range,color]
    799         *
    800         * <pre>
    801         *              &lt;og:input type="search" name="keywords" autocomplete="on" list="keywords.sel" /&gt;
    802         *              &lt;og:datalist id="keywords.sel"&gt;
    803         *                      &lt;og:option value="ウィキペディア" /&gt;
    804         *                      &lt;og:option value="ウィルス対策" /&gt;
    805         *                      &lt;og:option value="ウィンドウズ" /&gt;
    806         *              &lt;/og:datalist&gt;
    807         * </pre>
    808         *
    809         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    810         *
    811         * @param       list データリストID
    812         * @see         <a href="http://www.htmq.com/html5/datalist.shtml">list</a>
    813         */
    814        public void setList( final String list ) {
    815                set( "list",getRequestParameter( list ) );
    816        }
    817
    818        /**
    819         * 【HTML5】入力欄で入力できる最小値を指定します。
    820         *
    821         * @og.tag
    822         * HTML5から追加された新機能です。
    823         *  数値型や日付型の入力欄で入力できる最小値を指定することができます。
    824         *
    825         * 利用可能type:[datetime,date,month,week,time,datetime-local,number,range]
    826         *
    827         * <pre>
    828         * &lt;og:input type="number" name="ninzu" min="1" max="4" /&gt;　※1人以上4人以下
    829         * </pre>
    830         *
    831         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    832         *
    833         * @param       min 入力できる最小値
    834         * @see         <a href="http://www.htmq.com/html5/input_min.shtml">min</a>
    835         */
    836        public void setMin( final String min ) {
    837                set( "min",getRequestParameter( min ) );
    838        }
    839
    840        /**
    841         * 【HTML5】入力欄で入力できる最大値を指定します。
    842         *
    843         * @og.tag
    844         * HTML5から追加された新機能です。
    845         *  数値型や日付型の入力欄で入力できる最大値を指定することができます。
    846         *
    847         * 利用可能type:[datetime,date,month,week,time,datetime-local,number,range]
    848         *
    849         * <pre>
    850         * &lt;og:input type="number" name="ninzu" min="1" max="4" /&gt;　※1人以上4人以下
    851         * </pre>
    852         *
    853         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    854         *
    855         * @param       max 入力できる最大値
    856         * @see         <a href="http://www.htmq.com/html5/input_min.shtml">max</a>
    857         */
    858        public void setMax( final String max ) {
    859                set( "max",getRequestParameter( max ) );
    860        }
    861
    862        /**
    863         * 【HTML5】入力欄で刻むステップ値を指定します。
    864         *
    865         * @og.tag
    866         * HTML5から追加された新機能です。
    867         * step属性を指定すると、 数値型や日付型の入力欄で刻むステップ値を指定することができます。
    868         *
    869         * 利用可能type:[datetime,date,month,week,time,datetime-local,number,range]
    870         *
    871         * <pre>
    872         * &lt;og:input type="number" name="lot" step="0.5" /&gt;　※単位0.5
    873         * </pre>
    874         *
    875         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    876         *
    877         * @param       step 入力ステップ値
    878         * @see         <a href="http://www.htmq.com/html5/input_step.shtml">step</a>
    879         */
    880        public void setStep( final String step ) {
    881                set( "step",getRequestParameter( step ) );
    882        }
    883
    884        /**
    885         * 【HTML5】入力必須を指定します。
    886         *
    887         * @og.tag
    888         * HTML5から追加された新機能です。
    889         * 入力項目が入力必須であることをブラウザに知らせることができます。
    890         * 単独で、required 属性を使用できるようにしておきます。
    891         *
    892//       * フレームワークの入力必須は、must 属性ですが、must 属性を指定した場合にも、
    893//       * システムリソースの USE_IE7_HEADER = "false" で、USE_HTML5_HEADER = "true" で、
    894         * USE_MUST_REQUIRED = "true" の場合は、required 属性を出力します。
    895         *
    896         * 利用可能type:[text,search,url,tel,email,datetime,date,month,week,time,datetime-local,number,checkbox,radio,file]
    897         *
    898         * ※ required は、論理属性です。
    899         *
    900         * <pre>
    901         * &lt;og:input type="text" name="yourname" required="required" /&gt;
    902         * </pre>
    903         *
    904         * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    905         *
    906         * @param       req 入力必須かどうか [required/true/false]
    907         * @see         <a href="http://www.htmq.com/html5/input_required.shtml">required</a>
    908         */
    909        public void setRequired( final String req ) {
    910                final String required = nval( getRequestParameter( req ),null );
    911                if( required != null ) {
    912                        if( "required".equalsIgnoreCase( required ) ||
    913                                "true".equalsIgnoreCase( required ) ) {
    914                                        set( "required","required" );
    915                        }
    916                        else if( ! "false".equalsIgnoreCase( required ) ) {
    917                                final String errMsg = "required には、[required/true/false]以外の文字は指定できません。"
    918                                                                + " required=[" + required + "]" + CR ;
    919                                throw new HybsSystemException( errMsg );
    920                        }
    921                }
    922        }
    923
    924        /**
    925         * 【TAG】ロールをセットします。
    926         *
    927         * @og.tag
    928         * ここで指定したカラムロールを元に、ユーザー毎のアクセス許可がチェックされます。
    929         * アクセス許可されないと、表示されません。
    930         * このロールを指定しない場合は、カラムリソースのロールが使用されます。
    931         *
    932         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
    933         *
    934         * @param       roles ロール
    935         */
    936        public void setRoles( final String roles ) {
    937                set( "roles",getRequestParameter( roles ) );
    938        }
    939
    940        /**
    941         * 【TAG】必須入力を表す色に変えるかどうか[true/false]を指定します(初期値:false)。
    942         *
    943         * @og.tag
    944         * 初期値は、必須でない("false") です。
    945         * useMustHidden==true(初期値) の場合は、必須の自動チェック用Hiddenを出力するため、
    946         * submit することで、必須チェックをかけることができます。
    947//       * さらに、システムリソースの USE_HTML5_HEADER が、true に指定されている場合は、
    948//       * HTML5 適用として、required 属性も、出力します。
    949//       *   ※ 6.1.0.0 (2014/12/26)
    950//       *      useMustHidden==true かつ、USE_HTML5_HEADER==true かつ USE_IE7_HEADER==false
    951//       *      の場合に、required 属性(HTML5の必須チェック)を出力します。
    952//       *      これは、#doEndTag() の中の、#makeTag() の直前でセットしますので、
    953//       *      #doEndTag() を継承する場合は、ご注意ください。
    954         *
    955         * &lt;og:input name="PN" must="true" /&gt;
    956         *
    957         * @og.rev 5.2.1.0 (2010/10/01) 新規追加
    958         * @og.rev 5.7.1.0 (2013/12/06) HTML5 対応(required属性)。
    959         * @og.rev 6.1.0.0 (2014/12/26) HTML5のrequired属性は、useMustHidden==true でも制御可能とする。
    960         * @og.rev 6.8.1.4 (2017/08/25) mustに、false 指定が出来るようにします。
    961         *
    962         * @param       flag    必須入力指定 [true:必須入力/false:必須削除/それ以外:何もしない]
    963         * @see         #setUseMustHidden( String )
    964         */
    965        public void setMust( final String flag ) {
    966                mustType = nval( getRequestParameter( flag ),null );
    967                if( "true".equalsIgnoreCase( mustType ) ) {
    968                        mustType = "must";
    969                        add( "class","must" );
    970
    971                        // 5.7.1.0 (2013/12/06) HTML5 対応(required属性)。
    972                        // 6.1.0.0 (2014/12/26) makeMustHidden( String ) 内で作成します。
    973                }
    974                // 6.8.1.4 (2017/08/25) mustに、false 指定が出来るようにします。
    975                else if( "false".equalsIgnoreCase( mustType ) ) {
    976                        mustType = "false";                                             // 特殊な指定
    977                }
    978        }
    979
    980        /**
    981         * 【TAG】選択必須入力(どれかひとつ必須)を表す色[true/mustAny/その他]を指定します(初期値:無指定)。
    982         *
    983         * @og.tag
    984         * 複数のカラムのうち、どれかひとつを必須とする選択必須入力を示す色を指定します。
    985         * true または、mustAny を設定すると、class属性に、mustAny がセットされます。
    986         * mustAny は、CSSファイルに初期設定されています。true または、mustAny 以外の値をセット
    987         * すると、その値がそのまま、class属性にセットされますので、選択必須のグループ化が
    988         * 可能です。
    989         * なお、実際の選択必須入力チェックは、ここではなく、columnCheck タグで指定が必要です。
    990         * 自動処理は、mustAny="true" 指定の場合のみ有効です。
    991         * 初期値は、無指定です。
    992         *
    993         * @og.rev 5.2.1.0 (2010/10/01) 新規追加
    994         *
    995         * @param       flag 選択必須入力指定 [true/mustAny/その他]
    996         * @see         #setUseMustHidden( String )
    997         */
    998        public void setMustAny( final String flag ) {
    999                if( mustType == null ) {        // must 属性と同時設定時には、must 属性を優先します。
    1000                        mustType = nval( getRequestParameter( flag ),null );
    1001                        if( "true".equalsIgnoreCase( mustType ) ) {
    1002                                mustType = "mustAny";
    1003                        }
    1004                        add( "class",mustType );        // mustType == null の場合は、add されません。
    1005                }
    1006        }
    1007
    1008        /**
    1009         * 【TAG】必須の自動チェック用Hiddenを出力するかどうか[true/false]を指定します(初期値:true)。
    1010         *
    1011         * @og.tag
    1012         * query.jsp上でmust/mustAny指定した場合に検索時の必須チェックを自動化するための
    1013         * hiddenを出力するかどうかを選択します。
    1014         * 初期値は、出力する("true") です。
    1015         * 通常は初期値で問題ありませんが、必須の切替をScriptで行う場合等に邪魔になる場合が
    1016         * あるため出力の切替を出来るようにしておきます。
    1017         *
    1018         * @og.rev 5.7.2.0 (2013/01/10) 新規作成
    1019         *
    1020         * @param       flag    必須自動チェック [true:使用する/それ以外:使用しない]
    1021         * @see         #setMust( String )
    1022         * @see         #setMustAny( String )
    1023         */
    1024        public void setUseMustHidden( final String flag ) {
    1025                useMustHidden = nval( getRequestParameter( flag ),useMustHidden );
    1026        }
    1027
    1028        /**
    1029         * 【TAG】曖昧検索可能フィールドとして、曖昧検索方法を指定します(初期値:null)。
    1030         *
    1031         * @og.tag
    1032         * 従来は、clazz="aimai" として、点線の入力フィールドのみ作成していましたが、
    1033         * AimaiPicker をCallするようにして、検索方法を指定できるようにします。
    1034         * なお、AimaiPickerは、カラムの値に、選択した条件に応じた ％を付与するため、
    1035         * result.jsp の like には、％を含めない様に記述してください。
    1036         *
    1037         * ※ 互換表示の為に、"true" 属性は残しておきます。ピッカー無しで、点線の入力フィールド
    1038         *    のみ設定します。(clazz="aimai" は、廃止の方向です)
    1039         *
    1040         *   ① class="aimai" の設定 (ほぼ、従来と同じ)
    1041         *   ② AimaiPicker となる、preタグを出力(スペースを含む固定幅文字にするため)
    1042         *   ③ aimai属性で、前方一致、後方一致、前後曖昧、完全一致 選択が可能
    1043         *   ④ aimai属性で選択した検索方法を、submit時にvalueに反映し、result.jsp に送信する。
    1044         *
    1045         * aimai属性の指定方法を以下に示します。
    1046         * 　"0" または "V"   :完全一致
    1047         * 　"1" または "V*"  :前方一致
    1048         * 　"2" または "*V"  :後方一致
    1049         * 　"3" または "*V*" :前後曖昧
    1050         * 　"true"           :従来互換(clazz="aimai")
    1051         *
    1052         * Vは、0,1,2,3 以外であれば、何でも構いません。* の位置で判定します。
    1053         *
    1054         * @og.rev 6.2.0.0 (2015/02/27) aimai 属性を追加。
    1055         *
    1056         * @param   val 曖昧検索指定 [0,V:完全一致/1,V*:前方一致/2,*V:後方一致/3,*V*:前後曖昧]
    1057         */
    1058        public void setAimai( final String val ) {
    1059                final String tmp = nval( getRequestParameter( val ),null );
    1060                if( tmp != null && !tmp.isEmpty() ) {
    1061                        add( "class","aimai" );                                         // class 設定は先に行う必要がある。
    1062
    1063                        // 曖昧タイプは、0,1,2,3,null(指定が不明時) に再設定しなおします。
    1064                        if( tmp.length() == 1 && "0,1,2,3".indexOf( tmp ) >= 0 ) {
    1065                                aimai = Integer.parseInt( tmp );                                // 0,1,2,3 を直接指定した場合。
    1066                        }
    1067                        else if( "true".equalsIgnoreCase( tmp ) ) {
    1068                                aimai = -1;                                                                             // 従来互換(clazz="aimai") 初期値なので、あえて設定の必要はない。
    1069                        }
    1070                        else {
    1071                                aimai = 0 ;                                                                                                     // * が 0個 ＝ V:完全一致 ＝ 0
    1072                                if( tmp.endsWith(   "*" ) ) { aimai  = 1; }                                     // * が 後ろ＝V*:前方一致 ＝ 1
    1073                                if( StringUtil.startsChar( tmp,'*' ) ) { aimai += 2; }          // * が 前  ＝*V:後方一致 ＝ 2
    1074                                                                                                                                // 先にV*:前方一致(typeを加算)＝*V*:前後曖昧 ＝ 3
    1075                        }
    1076                }
    1077        }
    1078
    1079        /**
    1080         * mustType 属性を取得します。
    1081         *
    1082         * must , mustAny 属性を設定する場合に、mustType 属性を設定します。
    1083         * その設定された値を取り出します。
    1084         * 何も設定されていない状態では、null を返します。
    1085         *
    1086         * @og.rev 5.2.1.0 (2010/10/01) 新規追加。
    1087         *
    1088         * @return      mustType属性
    1089         */
    1090        protected String getMustType() {
    1091                return mustType ;
    1092        }
    1093
    1094        /**
    1095         * must , mustAny 属性を自動化するためのhiddenタグを生成します。
    1096         *
    1097         * HybsSystem.MUST_KEY + mustType をキーに、指定のカラム名を値として
    1098         * hidden を作成します。この値を columnChack タグで拾って must 処理します。
    1099         * なお、must , mustAny 属性を使用していない場合は、ゼロ文字列 を返します。
    1100         *
    1101         * @og.rev 5.2.1.0 (2010/10/01) 新規追加。
    1102         * @og.rev 5.7.2.0 (2014/01/10) useMustHidden対応
    1103         * @og.rev 6.2.0.0 (2015/02/27) MustHidden は、同一 name で、カラム名を作成するので、id は、セットしない。
    1104         * @og.rev 6.8.1.4 (2017/08/25) mustに、false 指定が出来るようにします。
    1105         *
    1106         * @param       name    must指定するカラム等の名称
    1107         *
    1108         * @return      自動化するためのhiddenタグ
    1109         * @og.rtnNotNull
    1110         */
    1111        protected String makeMustHidden( final String name ) {
    1112                // 6.1.1.0 (2015/01/17) refactoring. ロジックの見直し
    1113                return mustType != null && !"false".equalsIgnoreCase( mustType ) && useMustHidden       // 6.8.1.4 (2017/08/25)
    1114                                        ? XHTMLTag.hidden( HybsSystem.MUST_KEY + mustType, name , null )                // 6.2.0.0 (2015/02/27)
    1115                                        : "" ;
    1116        }
    1117
    1118        /**
    1119         * aimai 属性を自動化するためのAimaiPicker関連タグを生成します。
    1120         *
    1121         * AIMAI_xxxのid属性をキーに、指定のカラムのvalue値の％付加を、JavaScriptで行います。
    1122         * そのための、preタグを出力します。
    1123         *
    1124         * @og.rev 6.2.0.0 (2015/02/27) aimai 属性を追加。
    1125         * @og.rev 6.2.2.0 (2015/03/27) id属性がある場合は、そちらを優先する。
    1126         * @og.rev 8.1.0.4 (2022/01/28) aimai表記のｱｲｺﾝ使用(ICON_DIRを使用)
    1127         *
    1128         * @param       name    aimai指定するカラム
    1129         *
    1130         * @return      自動化するためのpreタグ
    1131         * @og.rtnNotNull
    1132         */
    1133        protected String makeAimaiPicker( final String name ) {
    1134                if( aimai >= 0 ) {
    1135                        // 6.2.2.0 (2015/03/27) id属性がある場合は、そちらを優先する。
    1136                        final String id = get( "id" );
    1137                        final String aimaiId = "AIMAI_" + ( id == null || id.isEmpty() ? name : id );
    1138
    1139                        return new TagBuffer( "pre" )
    1140                                                .add(   "id"            , aimaiId )                                             // 6.2.2.0 (2015/03/27)
    1141                                                .add(   "class"         , "aimaiClm" )
    1142                                                .add(   "aimaiType"     , String.valueOf( aimai ) )
    1143                                                .add(   "title"         , AIMAI_TITL[aimai] )
    1144//                                              .addBody( AIMAI_TEXT[aimai] )
    1145                                                .addBody( AIMAI_ICON[aimai] )                                           // 8.1.0.4 (2022/01/28)
    1146                                                .makeTag();
    1147                }
    1148                return "" ;
    1149        }
    1150
    1151//      /**
    1152//       * HTML5を使用するかどうか(true:使用する/false:使用しない)を取得します。
    1153//       *
    1154//       * HTML5 の機能を有効にするには、ネイティブモードで動作させる必要があります。
    1155//       *   ① USE_IE7_HEADER = "false" に設定する。
    1156//       *   ② USE_HTML5_HEADER = "true" に設定する。
    1157//       *   ③ IEのツール⇒互換表示設定で、互換表示に追加したWebサイトから削除する。
    1158//       *   ④ 同上の設定で、イントラサイトを互換表示で表示するのチェックを外す。
    1159//       * 必要があります。
    1160//       * このメソッドで返すのは、①と②の設定ができていれば true、そうでなければ、false を返します。
    1161//       *
    1162//       *      (初期値:USE_IE7_HEADER[={@og.value SystemData#USE_IE7_HEADER}])。
    1163//       *      (初期値:USE_HTML5_HEADER[={@og.value SystemData#USE_HTML5_HEADER}])。
    1164//       *
    1165//       * @og.rev 5.7.1.0 (2013/12/06) 新規追加
    1166//       * @og.rev 6.4.0.4 (2015/12/26) 他に使ってなさそうなので、protected → private にしておく。
    1167//       * @og.rev 6.9.5.0 (2018/04/23) USE_IE7_HEADER 廃止(false固定) , USE_HTML5_HEADER 廃止(true固定)
    1168//       *
    1169//       * @return      HTML5を使用するかどうか(true:使用する/false:使用しない)
    1170//       * @see         #setMust( String )
    1171//       */
    1172//      private boolean isUseHTML5() {
    1173//              // 6.1.1.0 (2015/01/17) refactoring. ロジックの見直し
    1174//              return  ! HybsSystem.sysBool( "USE_IE7_HEADER" )                // ① IE7互換モードが、false
    1175//                         && HybsSystem.sysBool( "USE_HTML5_HEADER" );         // ② HTML5 ヘッダーが true
    1176//      }
    1177}