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