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