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