    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import org.opengion.fukurou.util.XHTMLTag;
    019import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    020import org.opengion.hayabusa.resource.GUIInfo;
    021import org.opengion.fukurou.util.StringUtil ;                                   // 6.2.0.0 (2015/02/27)
    022
    023import static org.opengion.fukurou.util.StringUtil.nval;
    024
    025/**
    026 * テキストフィールドの入力を補助するポップアップを作成します。
    027 *
    028 * 通常のテキストフィールドに組み込むケースと、一覧表に組み込むケースに対応しています。
    029 * 基本的には、columnMarker タグと同じ使い方ですが、フィールドが書き込み許可時に表示させる必要が
    030 * あるため、実際には、viewMarker の isRendere="false" で使用するケースが多いと思います。
    031 * なお、ポップアップ専用なので href="index.jsp" target="CONTENTS" がデフォルトで設定されています。
    032 *
    033 * @og.formSample
    034 * ●形式：&lt;og:popup gamenId="…" href="…" keys="…,…" vals="…,…" rtnKeys="…,…" /&gt;
    035 * ●body：なし
    036 *
    037 * ●Tag定義：
    038 *   &lt;og:popup
    039 *       name               【TAG】この要素をリンクの対象とするための名前を指定します
    040 *       gamenId            【TAG】画面ID属性を登録します
    041 *       useGamenId         【TAG】GAMENID 属性を付加するかどうか[true/false]を設定します(初期値:true)  7.0.4.0 (2019/05/31)
    042 *       href               【TAG】ポップアップ先のURLを指定します(初期値:index.jsp)
    043 *       keys               【TAG】ポップアップ先に渡す入力キー配列をCSV形式で複数指定します
    044 *       vals               【TAG】ポップアップ先に渡す値配列をCSV形式で複数指定します
    045 *       rtnKeys            【TAG】ポップアップ先より受け取るキー配列をCSV形式で複数指定します
    046 *       column             【TAG】リンクをつけたいカラムを指定します
    047 *       onMark             【TAG】リンクを張る(true or 1)/張らない(false or 0)の設定を指定します(初期値:true)
    048 *       markList           【TAG】処理するマークを、"|"区切りの文字列で指定します
    049 *       height             【TAG】ダイアログの縦幅をピクセル数で指定します
    050 *       width              【TAG】ダイアログの横幅をピクセル数で指定します
    051 *       src                【TAG】表示させる画像のURLを指定します
    052 *       charset            【TAG】ポップアップ先の文字コードセットを指定します
    053 *       target             【TAG】ポップアップ先の表示ターゲットを指定します(初期値:CONTENTS)
    054 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    055 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    056 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    057 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    058 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    059 *       id                 【HTML】要素に対して固有の名前(id)をつける場合に設定します
    060 *       lang               【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します
    061 *       dir                【HTML】文字表記の方向(dir)を指定します
    062 *       title              【HTML】要素に対する補足的情報(title)を設定します
    063 *       style              【HTML】この要素に対して適用させるスタイルシート(style)を設定します
    064 *       tabindex           【HTML】タブの移動順(tabindex)を指定します(0 ～ 32767)
    065 *       accesskey          【HTML】アクセスキー(alt+キーで直接指定)を割り当てます
    066 *       clazz              【HTML】要素に対して class 属性を設定します
    067 *       onClick            【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")
    068 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
    069 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    070 *       command            【TAG】(通常は使いません)処理の実行を指定する command を設定できます(初期値:NEW)
    071 *       append             【TAG】返ってきた値をキャレット位置に追記するかどうか(初期値：false)
    072 *       useSpan            【TAG】buttonではなくspanタグでポップアップを指定するかどうか[true/false]を設定します(初期値:false)  7.0.3.0 (2019/05/13)
    073 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    074 *   /&gt;
    075 *
    076 * ●使用例
    077 *    ・普通のポップアップ
    078 *        &lt;og:popup gamenId="GE0002" href="index.jsp" target="CONTENTS"
    079 *                    keys="AAA,BBB,CCC" vals="{&#064;AAA},{&#064;B},ABC"
    080 *                    rtnKeys="DDD,EEE" /&gt;
    081 *
    082 *    ・QUERYの入力フィールドに組み込む
    083 *      ①keys、vals、rtnKeys がセットされる場合
    084 *      　　　　セットされる keys に対して vals の値をポップアップ画面に渡し、ポップアップ画面の戻り値を rtnKeys にセットされます。
    085 *        &lt;og:column name="AAA" value="{&#064;AAA}" &gt;
    086 *            &lt;og:popup gamenId="GE0002"
    087 *                        keys="AAA,BBB,CCC" vals="{&#064;AAA},{&#064;B},ABC"
    088 *                        rtnKeys="DDD,EEE" /&gt;
    089 *        &lt;/og:column&gt;
    090 *      ②keys、vals、rtnKeys がセットされない場合
    091 *      　　　　 ポップアップ画面にリクエスト変数 XNAME に外側のカラム名、XVALUE にカラムの入力値、rtnKeys にカラム名を自動的にセットされます。
    092 *        &lt;og:column name="AAA" value="{&#064;AAA}" &gt;
    093 *            &lt;og:popup gamenId="GE0002" /&gt;
    094 *        &lt;/og:column&gt;
    095 *
    096 *    ・RESULTの入力フィールドに組み込む(viewMarker 経由)
    097 *      gamenId を指定しなければこの画面へのURLを作成します。
    098 *      このURLは、その画面の index.jsp に直接ジャンプするためのURLです。
    099 *        &lt;og:viewMarker command="{&#064;command}" isRenderer="false"&gt;
    100 *            &lt;og:popup gamenId="GE0002" column="ABC" onMark="[ABC]" markList="1|2|3"
    101 *                        keys="AAA,BBB,CCC" vals="[AAA],[BBB].value,{&#064;CCC}"
    102 *                        rtnKeys="DDD,EEE" /&gt;
    103 *        &lt;/og:viewMarker&gt;
    104 *
    105 *    ・ポップアップ側のJSPファイル(view 部分)
    106 *
    107 * @og.group 画面部品
    108 * @og.rev 3.8.6.1 (2006/10/20) 新規作成
    109 *
    110 * @version  0.9.0      2000/10/17
    111 * @author       Kazuhiko Hasegawa
    112 * @since        JDK1.1,
    113 */
    114public class PopupTag extends HTMLTagSupport {
    115        /** このプログラムのVERSION文字列を設定します。   {@value} */
    116        private static final String VERSION = "7.0.4.0 (2019/05/31)" ;
    117        private static final long serialVersionUID = 704020190531L ;
    118
    119        private static final String DEF_BODY  = "▼" ;
    120        private static final String DEF_STYLE = "width:20px;text-align:center;padding:0;" ; // 5.9.4.3 (2016/01/15) padding
    121
    122        /** command 引数に渡す事の出来る コマンド  新規 {@value} */
    123        private static final String CMD_NEW             = "NEW" ;                       // 5.1.7.0 (2010/06/01)
    124//      private static final String VALUE_PRE   = "this.form.";                                         // 5.9.6.0 (2016/03/01)  Spanはフォーム部品ではないのでthis.formが取れない
    125        private static final String VALUE_PRE = "$(this).closest('form').get(0).";      // 5.10.11.2 (2019/05/17) jQuery
    126//      private static final String VALUE_PRE = "this.closest('form').";                        // 7.0.3.0 (2019/05/13)   CSS3の機能
    127
    128        private String          command         = CMD_NEW;                      // 5.1.7.0 (2010/06/01)
    129
    130        private String          column          ;
    131        private String          gamenId         ;
    132        private boolean         useGamenId      = true;                         // 7.0.4.0 (2019/05/31)  … 初期値を他のタグと合わせる（互換性なし）
    133        private String          href            = "index.jsp";
    134        private String          target          = "CONTENTS";
    135        private String          onMark          = "true";                       // true または 1
    136        private String          markList        = "true|TRUE|1";        // true または 1
    137        private String          height          ;
    138        private String          width           ;
    139        private String          imgsrc          ;
    140        private String[]        keys            ;
    141        private String[]        vals            ;
    142        private String[]        rtnKeys         ;
    143        private String          append          = "false";                      // 5.8.5.0 (2015/03/06)
    144        private boolean         useSpan         ;                                       // 7.0.3.0 (2019/05/13)
    145
    146        /**
    147         * デフォルトコンストラクター
    148         *
    149         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    150         */
    151        public PopupTag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    152
    153        /**
    154         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    155         *
    156         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    157         *
    158         * @return      後続処理の指示
    159         */
    160        @Override
    161        public int doEndTag() {
    162                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
    163                if( useTag() ) {
    164                        makeGamenLink();
    165
    166                        // GAMENID属性のＵＲＬへの自動セットは行わない。
    167                        final ViewMarkerTag viewMark = (ViewMarkerTag)findAncestorWithClass( this,ViewMarkerTag.class );
    168                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    169                        if( viewMark == null ) {
    170                                if( markList.indexOf( onMark ) >= 0 ) {
    171                                        jspPrint( makePopup( false ) );
    172                                }
    173                        }
    174                        else {
    175                                set( "onMark"  ,onMark );
    176                                set( "markList",markList );
    177                                set( "body"    ,makePopup( true ) );
    178
    179                                if( column != null && column.length() > 0 ) {
    180                                        set( "column"  ,column );       // 4.0.0 (2005/08/31) 同一カラムの複数登録を許可します。
    181                                        viewMark.addAttribute( getAttributes() );
    182                                }
    183                        }
    184                }
    185                return EVAL_PAGE ;
    186        }
    187
    188        /**
    189         * 使用しません。
    190         *
    191         * @return      (null 固定)
    192         */
    193        @Override
    194        protected String makeTag() { return null; }
    195
    196        /**
    197         * タグリブオブジェクトをリリースします。
    198         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    199         *
    200         * @og.rev 7.0.3.0 (2019/05/13) GAMENIDの追加(useGamenIdで、GAMENID属性をhrefに追加)
    201         */
    202        @Override
    203        protected void release2() {
    204                super.release2();
    205                column          = null;
    206                gamenId         = null;
    207                useGamenId      = true;                         // 7.0.4.0 (2019/05/31) 初期値を true に変更
    208                href            = "index.jsp";
    209                target          = "CONTENTS";
    210                onMark          = "true";                       // true または 1
    211                markList        = "true|TRUE|1";        // true または 1
    212                keys            = null;
    213                vals            = null;
    214                rtnKeys         = null;
    215                height          = null;
    216                width           = null;
    217                imgsrc          = null;
    218                command         = CMD_NEW;                      // 5.1.7.0 (2010/06/01)
    219                append          = "false";                      // 5.8.5.0 (2015/03/66)
    220                useSpan         = false;                        // 7.0.3.0 (2019/05/13)
    221        }
    222
    223        /**
    224         * リンクを作成します。
    225         *
    226         * @og.rev 4.2.4.0 (2008/07/01) keys,vals,rtnKeysが設定されていない場合、外側のog:columnタグのname値を設定するように変更
    227         * @og.rev 5.1.7.0 (2010/06/01) 引数にcommandを追加
    228         * @og.rev 5.2.1.0 (2010/10/01) height、width には、"px" などの単位を付ける前提での対応
    229         * @og.rev 5.2.2.0 (2010/11/01) height、width が null の場合は、シングルクオートをつけない。
    230         * @og.rev 6.2.0.0 (2015/02/27) onClick パラメータを設定できるようにし、後ろに、popupを追記します。
    231         * @og.rev 5.8.5.0 (2015/03/06) append追加
    232         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    233         * @og.rev 5.9.16.1 (2017/01/20) this.formの追加
    234         * @og.rev 7.0.3.0 (2019/05/13) GAMENIDの追加(useGamenIdで、GAMENID属性をhrefに追加)
    235         *
    236         * @param       useKey リンク作成時のキー有無 [true:KEY付き/false:KEY無し]
    237         *
    238         * @return      リンクタグ文字列
    239         * @og.rtnNotNull
    240         */
    241        private String makePopup( final boolean useKey ) {
    242                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
    243                // 5.2.1.0 (2010/10/01)  px を付けると数字ではなくなるため、シングルクオーテーションでくくる。
    244                rtn.append( "ogPopup( '" ).append( get( "href" ) ).append( "'," );
    245                // 5.2.2.0 (2010/11/01) height、width が null の場合は、シングルクオートをつけない。
    246                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    247                if( height == null ) { rtn.append( "null" ); }
    248                else {                             rtn.append( '\'' ).append( height ).append( '\'' ); }
    249                rtn.append( ',' );                                                              // 6.0.2.5 (2014/10/31) char を append する。
    250                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    251                if( width == null ) {  rtn.append( "null" ); }
    252                else {                             rtn.append( '\'' ).append( width ).append( '\'' );  }
    253
    254                rtn.append( ',' );                                                              // 6.0.2.5 (2014/10/31) char を append する。
    255
    256                // 7.0.3.0 (2019/05/13) GAMENIDの追加
    257                final String GMN_KV = useGamenId && gamenId != null && !gamenId.isEmpty()
    258                                                ?       "'GAMENID','" + gamenId + "',"
    259                                                :       "" ;
    260
    261                String columnName = null;                                               // 4.2.4.0 2008/07/01
    262                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    263                if( keys != null && keys.length > 0 && vals != null ) {
    264                        rtn.append( "new Array(" )
    265                                .append( GMN_KV );                                              // 7.0.3.0 (2019/05/13) GAMENIDの追加
    266                        addQuote( rtn, keys[0], false );
    267                        rtn.append( ',' );                                                      // 6.0.2.5 (2014/10/31) char を append する。
    268                        addQuote( rtn, vals[0], false );
    269                        for( int i=1; i<keys.length; i++ ) {
    270                                rtn.append( ',' );                                              // 6.0.2.5 (2014/10/31) char を append する。
    271                                addQuote( rtn, keys[i], false );
    272                                rtn.append( ',' );                                              // 6.0.2.5 (2014/10/31) char を append する。
    273                                addQuote( rtn, vals[i], false );
    274                        }
    275                        rtn.append( ")," );
    276                }
    277                else {
    278                        final ColumnTag outerColumn = (ColumnTag) findAncestorWithClass( this, ColumnTag.class );
    279                        columnName = ( outerColumn == null ) ? null : outerColumn.getName();
    280                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    281                        if( columnName == null ) {
    282//                              rtn.append( "null," );
    283                                if( GMN_KV.isEmpty() ) {                                // 7.0.3.0 (2019/05/13) GAMENIDの追加
    284                                        rtn.append( "null," );
    285                                }
    286                                else {
    287                                        rtn.append( "new Array(" )
    288                                                .append( GMN_KV );                              // 7.0.3.0 (2019/05/13) GAMENIDの追加
    289                                        rtn.deleteCharAt( rtn.length()-1 )      // 最後の","を削除。（不要かも）
    290                                                .append( ")," );
    291                                }
    292                        }
    293                        else {
    294                                // 7.0.3.0 (2019/05/13) XNAME が使われていないので。
    295                                rtn.append( "new Array('" )
    296                                        .append( GMN_KV )                                       // 7.0.3.0 (2019/05/13) GAMENIDの追加
    297                                        .append( columnName )
    298                                        .append( "'," )
    299                                        .append( VALUE_PRE )                            // 5.9.16.1 (2017/01/20)
    300                                        .append( columnName )
    301                                        .append( ".value)," );
    302
    303//                              rtn.append( "new Array('XNAME','" )
    304//                                      .append( columnName )
    305//                                      .append( "','XVALUE'," )
    306//                                      .append( VALUE_PRE )                            // 5.9.16.1 (2017/01/20)
    307//                                      .append( columnName )
    308//                                      .append( ".value)," );
    309                        }
    310                }
    311                rtn.append( "" );
    312
    313                if( rtnKeys != null && rtnKeys.length > 0 ) {
    314                        rtn.append( "this,new Array(" );
    315                        addQuote( rtn, rtnKeys[0], useKey );
    316                        for( int i=1; i<rtnKeys.length; i++ ) {
    317                                rtn.append( ',' );                                              // 6.0.2.5 (2014/10/31) char を append する。
    318                                addQuote( rtn, rtnKeys[i], useKey );
    319                        }
    320                        rtn.append( ')' );                                                      // 6.0.2.5 (2014/10/31) char を append する。
    321                }
    322                else if( columnName != null ) {
    323                        rtn.append( "this,new Array('" )
    324                                .append( columnName )
    325                                .append( "')" );
    326                }
    327                else {
    328                        rtn.append( "null,null" );
    329                }
    330
    331                // 5.1.7.0 (2010/06/01) 引数にcommandを追加
    332                // 5.8.5.0 (2015/03/06) append追加
    333                rtn.append( ",'" ).append( command ).append( "','" ).append( append ).append( "');" );
    334
    335                // 7.0.3.0 (2019/05/13) 判定の順番変更と link タグ対応
    336                if( imgsrc != null ) {
    337                        set( "src"    , imgsrc );
    338                        set( "title"  , getMsglbl() );
    339                        add( "onClick", rtn.toString() , ";" );                         // 6.2.0.0 (2015/02/27) onClick を追記します。
    340                        set( "style"  , get( "style" ) );
    341                        return XHTMLTag.img( getAttributes() ) ;
    342                }
    343                // 7.0.4.0 (2019/05/31)
    344                else if( useSpan ) {
    345                        set( "body"   , nval( getMsglbl(),DEF_BODY) );
    346                        add( "onClick", rtn.toString() , ";" );
    347                        set( "style"  , nval( get( "style" ),DEF_STYLE) );
    348                        set( "class" , "spanPopup" );
    349                        return XHTMLTag.span( getAttributes() ) ;
    350                }
    351                else {
    352                        set( "type"   , "button" );
    353                        set( "body"   , nval( getMsglbl(),DEF_BODY) );
    354                        add( "onClick", rtn.toString() , ";" );                         // 6.2.0.0 (2015/02/27) onClick を追記します。
    355                        set( "style"  , nval( get( "style" ),DEF_STYLE) );
    356                        return XHTMLTag.button( getAttributes() ) ;
    357                }
    358
    359//              if( imgsrc == null ) {
    360//                      set( "type"   , "button" );
    361//                      set( "body"   , nval( getMsglbl(),DEF_BODY) );
    362//                      add( "onClick", rtn.toString() , ";" );                         // 6.2.0.0 (2015/02/27) onClick を追記します。
    363//                      set( "style"  , nval( get( "style" ),DEF_STYLE) );
    364//                      return XHTMLTag.button( getAttributes() ) ;
    365//              }
    366//              else {
    367//                      set( "src"    , imgsrc );
    368//                      set( "title"  , getMsglbl() );
    369//                      add( "onClick", rtn.toString() , ";" );                         // 6.2.0.0 (2015/02/27) onClick を追記します。
    370//                      set( "style"  , get( "style" ) );
    371//                      return XHTMLTag.img( getAttributes() ) ;
    372//              }
    373        }
    374
    375        /**
    376         * 引数 val の設定値を設定する簡易メソッド。
    377         *
    378         * @og.rev 5.9.6.0 (2016/03/01) valueの取得の形を少し変える処理をここに入れる
    379         *
    380         * @param       buf             結果を格納するStringBuilderオブジェクト
    381         * @param       val             設定値
    382         * @param       useKey リンク作成時のキー有無 [true:KEY付き/false:KEY無し]
    383         *
    384         * @return      (引数のバッファと同じオブジェクト)
    385         * @og.rtnNotNull
    386         */
    387        private StringBuilder addQuote( final StringBuilder buf, final String val, final boolean useKey ) {
    388                // 5.9.6.0 this.form.対応
    389                String val2 = "";
    390                if( val != null && val.endsWith( ".value" ) && val.indexOf( '.' ) == val.lastIndexOf( '.' ) ){
    391                        val2 = VALUE_PRE;
    392                }
    393
    394                if( useKey ) {
    395                        if( val != null && val.endsWith( ".value" ) ) {
    396                                buf.append( val2 ).append( val.substring( 0,val.length()-6 ) ).append( "__{I}.value" ); // 5.9.6.0
    397                        }
    398                        else {
    399                                buf.append( '\'' ).append( val ).append( "__{I}'" );
    400                        }
    401                }
    402                else {
    403                        if( val != null && val.endsWith( ".value" ) ) {
    404                                if( StringUtil.startsChar( val , '[' ) ) {                      // 6.2.0.0 (2015/02/27) １文字 String.startsWith
    405                                        buf.append( val2 ).append( val.substring( 1,val.length()-7 ) ).append( "__{I}.value" ); // 5.9.6.0
    406                                }
    407                                else {
    408                                        buf.append( val2 ).append( val ); // 5.9.6.0
    409                                }
    410                        }
    411                        else {
    412                                buf.append( '\'' ).append( val ).append( '\'' );
    413                        }
    414                }
    415                return buf ;
    416        }
    417
    418        /**
    419         * 画面ＩＤとhref から、指定のＵＲＬを作成します。
    420         */
    421        private void makeGamenLink() {
    422                if( gamenId == null || gamenId.isEmpty() ) { return ; }
    423
    424                final GUIInfo guiInfo = getGUIInfo( gamenId );          // 4.0.0 (2005/01/31)
    425                if( guiInfo == null ) { return ; }      // 見つからない場合は、アクセス不可
    426
    427                final String address = guiInfo.getRealAddress( get( "href" ) );
    428                final String url = getRequestParameter( address );
    429                set( "href",url );
    430
    431                if( get( "title" ) == null ) {
    432                        set( "title","To:" + guiInfo.getLabel() );
    433                }
    434        }
    435
    436        /**
    437         * 【TAG】この要素をリンクの対象とするための名前を指定します。
    438         *
    439         * @og.tag この要素をリンクの対象とするための名前を指定します。
    440         *
    441         * @param       name 名前
    442         */
    443        public void setName( final String name ) {
    444                set( "name",getRequestParameter( name ) );
    445        }
    446
    447        /**
    448         * 【TAG】リンクをつけたいカラムを指定します。
    449         *
    450         * @og.tag
    451         * このカラム名のTableModelに対して、 ViewLink タグが存在する場合は、
    452         * リンクを張ります。
    453         *
    454         * @param       clm カラム名
    455         */
    456        public void setColumn( final String clm ) {
    457                column = nval( getRequestParameter( clm ),column );
    458        }
    459
    460        /**
    461         * 【TAG】画面ID を指定します。
    462         *
    463         * @og.tag
    464         * gamenId 属性は、画面IDをキーに、実アドレスを求めるのに使用します。
    465         * 画面IDが指定された場合は、実アドレスに変換する。指定されない場合は、
    466         * href 属性をそのままリンク情報を作成します。
    467         * 画面IDを指定する場合の href は、JSPファイル名(例えば、index.jsp 等)です。
    468         *
    469         * @param       id      画面ID
    470         */
    471        public void setGamenId( final String id ) {
    472                gamenId = nval( getRequestParameter( id ),gamenId );
    473        }
    474
    475        /**
    476         * 【TAG】GAMENID 属性を付加するかどうか[true/false]を設定します(初期値:true)。
    477         *
    478         * @og.tag
    479         * "true"の場合は、GAMENID 属性を href に追加します。(?KEY1=VAL1&amp;KEY2=VAL2･･･)
    480         * "false"の場合は、付加しません。
    481         * popupなので、BACK_GAMENIDは付与しません。GAMENIDを付与することで、画面のロールやモードを
    482         * 考慮したポップアップが起動します。
    483         * 初期値を他のタグと合わせるため、true にしています（互換性はありません）
    484         *
    485         * @og.rev 7.0.3.0 (2019/05/13) GAMENIDの追加(useGamenIdで、GAMENID属性をhrefに追加)
    486         * @og.rev 7.0.4.0 (2019/05/31) 初期値を true に変更
    487         *
    488         * @param       flag GAMENID 属性を付加するかどうか [true:追加する/false:追加しない]
    489         */
    490        public void setUseGamenId( final String flag ) {
    491                useGamenId = nval( getRequestParameter( flag ),useGamenId );
    492        }
    493
    494        /**
    495         * 【TAG】ポップアップ先のURLを指定します(初期値:index.jsp)。
    496         *
    497         * @og.tag
    498         * 通常、gamenId を指定している場合は、それ以降(index.jsp , result.jsp など)を指定します。
    499         * 通常のリンクの場合、GAMENID/href というアドレスに合成されます。( GE0001/result.jsp など )
    500         * (正確には、画面IDではなく、対応する画面ADDRESSを使用します。)
    501         * ポップアップ専用のリンクなので、初期値は、index.jsp です。
    502         *
    503         * @param       href ポップアップ先のURL
    504         */
    505        public void setHref( final String href ) {
    506                set( "href",nval( getRequestParameter( href ),this.href ) );
    507        }
    508
    509        /**
    510         * 【TAG】ポップアップ先の文字コードセットを指定します。
    511         *
    512         * @og.tag ポップアップ先の文字コードセットを指定します。
    513         *
    514         * @param       charset 文字コードセット
    515         */
    516        public void setCharset( final String charset ) {
    517                set( "charset",getRequestParameter( charset ) );
    518        }
    519
    520        /**
    521         * 【TAG】ポップアップ先の表示ターゲットを指定します(初期値:CONTENTS)。
    522         *
    523         * @og.tag ポップアップ先の表示ターゲットを指定します。
    524         *
    525         * @param       target 表示ターゲット
    526         */
    527        public void setTarget( final String target ) {
    528                set( "target",nval( getRequestParameter( target ),this.target ) );
    529        }
    530
    531        /**
    532         * 【TAG】ポップアップ先に渡す入力キー配列をCSV形式で複数指定します。
    533         *
    534         * @og.tag ポップアップ先に渡す入力キー配列を指定します。
    535         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    536         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    537         *
    538         * @param       key 渡す入力キー配列(CSV形式)
    539         */
    540        public void setKeys( final String key ) {
    541                keys = getCSVParameter( key );
    542        }
    543
    544        /**
    545         * 【TAG】ポップアップ先に渡す値配列をCSV形式で複数指定します。
    546         *
    547         * @og.tag ポップアップ先に渡す値配列を指定します。
    548         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    549         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    550         *
    551         * @param       val 渡す値配列(CSV形式)
    552         */
    553        public void setVals( final String val ) {
    554                vals = getCSVParameter( val );
    555        }
    556
    557        /**
    558         * 【TAG】ポップアップ先より受け取るキー配列をCSV形式で複数指定します。
    559         *
    560         * @og.tag ポップアップ先より受け取るキー配列を指定します。
    561         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    562         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    563         *
    564         * @param       key 受け取るキー配列(CSV形式)
    565         */
    566        public void setRtnKeys( final String key ) {
    567                rtnKeys = getCSVParameter( key );
    568        }
    569
    570        /**
    571         * 【TAG】マークを処理する(true or 1)/処理しない(false or 0)の設定を指定します(初期値:true)。
    572         *
    573         * @og.tag
    574         * マークを処理する場合は、"true"(または "1")
    575         * 処理しない場合は、"true以外"(または "0")をセットします。
    576         * 初期値は、 "true"(マークを処理する)です。
    577         * さらに、[カラム名] で、動的にカラムの値で、マークをする、しないを
    578         * 選ぶ事が可能になります。値は、"true"(または "1") で、マークします。
    579         * 追記 3.5.2.0 (2003/10/20)：markList属性に、処理対象文字列郡を指定できます。
    580         * これにより、マークを処理するかどうかの判断が、true,1 以外にも使用できるようになりました。
    581         *
    582         * @og.rev 3.5.0.0 (2003/09/17) onMark に、[カラム名] の値をセットできるように修正。
    583         *
    584         * @param       flag マークの処理 [true,1:処理する/それ以外:処理しない]
    585         */
    586        public void setOnMark( final String flag ) {
    587                onMark = nval( getRequestParameter( flag ),onMark );
    588        }
    589
    590        /**
    591         * 【TAG】処理するマークを含むような文字列を、"|"区切りの文字列で指定します(初期値:"true|TRUE|1")。
    592         *
    593         * @og.tag
    594         * markListで与えられた文字列に、onMark文字列(大文字/小文字の区別あり)が
    595         * 含まれていれば、処理します。
    596         * 例えば、"A","B","C" という文字列が、onMark で指定された
    597         * 場合に処理するようにしたい場合は、"A|B|C" をセットします。
    598         * markList には、[カラム名]指定が可能です。(ただし、単独 linkタグ時は除く)
    599         * 初期値は、 "true|TRUE|1"です。
    600         *
    601         * @param       list 処理するマーク (indexOf による含む/含まない判定)
    602         */
    603        public void setMarkList( final String list ) {
    604                markList = nval( getRequestParameter( list ),markList );
    605        }
    606
    607        /**
    608         * 【TAG】ダイアログの縦幅をピクセル数で指定します。
    609         *
    610         * @og.tag
    611         * 縦幅を指定します。単位も含めて入力してください。
    612         * 設定しない場合は、ogPopup JavaScript の内部初期値が採用されます。
    613         *
    614         * @og.rev 5.2.1.0 (2010/10/01) height、width には、"px" などの単位を付ける前提での対応
    615         *
    616         * @param   ht ダイアログの縦幅(ピクセル数)
    617         */
    618        public void setHeight( final String ht ) {
    619                height = nval( getRequestParameter( ht ),height );
    620                if( height != null && ! height.endsWith( "px" ) ) { height += "px"; }   // 5.2.1.0 (2010/10/01)
    621        }
    622
    623        /**
    624         * 【TAG】ダイアログの横幅をピクセル数で指定します。
    625         *
    626         * @og.tag
    627         * 横幅を指定します。単位も含めて入力してください。
    628         * 設定しない場合は、ogPopup JavaScript の内部初期値が採用されます。
    629         *
    630         * @og.rev 5.2.1.0 (2010/10/01) height、width には、"px" などの単位を付ける前提での対応
    631         *
    632         * @param   wh ダイアログの横幅(ピクセル数)
    633         */
    634        public void setWidth( final String wh ) {
    635                width = nval( getRequestParameter( wh ),width );
    636                if( width != null && ! width.endsWith( "px" ) ) { width += "px"; }      // 5.2.1.0 (2010/10/01)
    637        }
    638
    639        /**
    640         * 【TAG】表示させる画像のURLを指定します。
    641         *
    642         * @og.tag
    643         * この属性を設定すると、自動的に イメージリンクでの onClick属性で
    644         * ポップアップの起動画面を作成します。
    645         * この属性が設定されていない場合は、button での起動になります。
    646         *
    647         * @param   src 画像のURL
    648         */
    649        public void setSrc( final String src ) {
    650                imgsrc = nval( getRequestParameter( src ),imgsrc );
    651        }
    652
    653        /**
    654         * 【TAG】(通常は使いません)処理の実行を指定する command を設定できます(初期値:NEW)。
    655         *
    656         * @og.tag
    657         * ここで指定されたcommandは、ポップアップ画面の引数として渡されます。
    658         * 初期値は、NEW です。
    659         *
    660         * @og.rev 5.1.7.0 (2010/06/01) 新規作成
    661         *
    662         * @param       cmd コマンド
    663         */
    664        public void setCommand( final String cmd ) {
    665                command = nval( getRequestParameter( cmd ),command );
    666        }
    667
    668        /**
    669         * 【TAG】返り値をキャレット位置に追記する(true)/しない(false)の設定を指定します(初期値:false)。
    670         *
    671         * @og.tag
    672         * ポップアップからの返り値を、元の値と置換するのではなく、キャレット位置に挿入するかどうかを指定します。
    673         *
    674         * @og.rev 5.8.5.0 (2015/02/06)
    675         *
    676         * @param       flg 返り値のキャレット位置に追記 [true:追記/それ以外:置換]
    677         */
    678        public void setAppend( final String flg ) {
    679                append = nval( getRequestParameter( flg ),append );
    680        }
    681
    682        /**
    683         * 【TAG】buttonではなくテキストでポップアップを指定するかどうか[true/false]を設定します(初期値:false)。
    684         *
    685         * @og.tag
    686         * "true"の場合は、spanタグでポップアップのベースとなるタグを作成します。
    687         * false は従来通り、ボタンでポップアップのベースを作成します。
    688         * srcを指定した場合は、imgタグでポップアップのベースを作成します。
    689         * 互換性の関係から、初期値は、false にしています。
    690         *
    691         * @og.rev 7.0.3.0 (2019/05/13) buttonではなくspanタグでpopupするかどうか[true/false]を決める属性を追加。
    692         *
    693         * @param       flag buttonではなくspanタグでポップアップするかどうか [true:する/false:しない]
    694         */
    695        public void setUseSpan( final String flag ) {
    696                useSpan = nval( getRequestParameter( flag ),useSpan );
    697        }
    698
    699        /**
    700         * このオブジェクトの文字列表現を返します。
    701         * 基本的にデバッグ目的に使用します。
    702         *
    703         * @return このクラスの文字列表現
    704         * @og.rtnNotNull
    705         */
    706        @Override
    707        public String toString() {
    708                return ToString.title( this.getClass().getName() )
    709                                .println( "VERSION"             ,VERSION        )
    710                                .println( "column"              ,column         )
    711                                .println( "gamenId"             ,gamenId        )
    712                                .println( "href"                ,href           )
    713                                .println( "target"              ,target         )
    714                                .println( "onMark"              ,onMark         )
    715                                .println( "markList"    ,markList       )
    716                                .println( "height"              ,height         )
    717                                .println( "width"               ,width          )
    718                                .println( "keys"                ,keys           )
    719                                .println( "vals"                ,vals           )
    720                                .println( "rtnKeys"             ,rtnKeys        )
    721                                .println( "Other..."    ,getAttributes().getAttribute() )
    722                                .fixForm().toString()
    723                        + CR
    724                        + super.toString() ;
    725        }
    726}