    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.ToString;                                              // 6.1.1.0 (2015/01/17)
    019import static org.opengion.fukurou.util.StringUtil.nval;
    020
    021/**
    022 * テーブルレイアウトで column タグ等の存在しない空欄箇所に挿入して、
    023 * テーブルの行列の個数を合わせるタグです。
    024 *
    025 * 通常の空欄は、ラベルと値という２つの項目を別々のカラムに登録するように
    026 * &lt;td&gt;&lt;/td&gt;タグが、２つ続いた形式をしていますが、一般に、
    027 * 個数は表示上の都合で任意の個数の&lt;td&gt;タグを使用したいケースが
    028 * あります。
    029 * その場合、このSpaceTag を使っておけば、大量の作成済み画面を修正しなくても
    030 * このクラスを修正するだけで、すべての空欄のデザインがキープできます。
    031 *
    032 * @og.formSample
    033 * ●形式：&lt;og:space /&gt;
    034 * ●body：なし
    035 *
    036 * ●Tag定義：
    037 *   &lt;og:space
    038 *       width              【TAG】全体の大きさ(width 属性)を指定します
    039 *       colspan            【TAG】td部分の colspan を指定します
    040 *       rowspan            【TAG】ラベル、フィールド共に rowspan を指定します
    041 *       labelWidth         【TAG】ラベル部分(前半部分)の大きさ(width 属性)を指定します
    042 *       valueWidth         【TAG】値部分(後半部分)の大きさ(width 属性)を指定します
    043 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    044 *   /&gt;
    045 *
    046 * ●使用例
    047 *      通常の、ラベル部、フィールド部が空の td タグを生成します。(tdタグを２つ作成します)
    048 *      &lt;og:space /&gt;
    049 *
    050 *      td タグの大きさを指定することができます。
    051 *      &lt;og:space
    052 *         labelWidth = &quot;ラベル部分(前半部分)の大きさ(width 属性)を指定します。&quot;
    053 *         valueWidth = &quot;値部分(後半部分)の大きさ(width 属性)を指定します。&quot;
    054 *      /&gt;
    055 *
    056 * @og.group 画面部品
    057 *
    058 * @version  4.0
    059 * @author   Kazuhiko Hasegawa
    060 * @since    JDK5.0,
    061 */
    062public class SpaceTag extends CommonTagSupport {
    063        /** このプログラムのVERSION文字列を設定します。   {@value} */
    064        private static final String VERSION = "8.2.0.2 (2022/06/24)" ;
    065        private static final long serialVersionUID = 820220220624L ;
    066
    067        // 6.2.0.0 (2015/02/27) 初期値見直し
    068        private String labelWidth       = "";
    069        private String valueWidth       = "";
    070        private String width            = "";           // 5.1.9.0 (2010/08/01) 追加
    071        private String colspan          = "";           // 5.1.9.0 (2010/08/01) 追加
    072        private String rowspan          = "";           // 6.2.0.0 (2015/02/27) rowspan 属性を追加。
    073
    074        /**
    075         * デフォルトコンストラクター
    076         *
    077         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    078         */
    079        public SpaceTag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    080
    081        /**
    082         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    083         *
    084         * @return      後続処理の指示( SKIP_BODY )
    085         */
    086        @Override
    087        public int doStartTag() {
    088                jspPrint( makeTag() );
    089                return SKIP_BODY ;
    090        }
    091
    092        /**
    093         * タグリブオブジェクトをリリースします。
    094         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    095         *
    096         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    097         * @og.rev 5.1.9.0 (2010/08/01) width , colspan 属性追加
    098         * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加。初期値見直し
    099         */
    100        @Override
    101        protected void release2() {
    102                super.release2();
    103                labelWidth      = "";
    104                valueWidth      = "";
    105                width           = "";                   // 5.1.9.0 (2010/08/01) 追加
    106                colspan         = "";                   // 5.1.9.0 (2010/08/01) 追加
    107                rowspan         = "";                   // 6.2.0.0 (2015/02/27) rowspan 属性を追加
    108        }
    109
    110        /**
    111         * 検索条件の入力用のテキストフィールドを作成します。
    112         *
    113         * テーブルタグによりフィールドは分割されます。
    114         * 使用時は、テーブルタグを前後に使用して下さい。
    115         *
    116         * @og.rev 5.1.9.0 (2010/08/01) width , colspan 属性追加
    117         * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加
    118         *
    119         * @return  入力用のテキストフィールドタグ
    120         * @og.rtnNotNull
    121         */
    122        private String makeTag() {
    123                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
    124
    125                // width が未指定の場合のみ、labelWidth、valueWidth を出力
    126                if( width.isEmpty() ) {
    127                        rtn.append( "<td" )
    128                                .append( labelWidth )
    129                                .append( rowspan )
    130                                .append( "></td><td" )
    131                                .append( valueWidth )
    132                                .append( colspan )
    133                                .append( rowspan )
    134                                .append( "></td>" );
    135                }
    136                // width 指定あり
    137                else {
    138                        // width が指定されると、強制的に colspan を設定する。
    139                        if( colspan.isEmpty() ) {
    140                                colspan = " colspan=\"2\" ";
    141                        }
    142                        rtn.append( "<td" )                             // width が指定された場合のみ、td タグは一つしか出力されない。
    143                                .append( width )
    144                                .append( colspan )
    145                                .append( rowspan )
    146                                .append( "></td>" );
    147                }
    148                return rtn.toString() ;
    149        }
    150
    151        /**
    152         * 【TAG】全体の大きさ(width 属性)を指定します。
    153         *
    154         * @og.tag
    155         * 通常の space タグは、td ２個分のタグを出力しますが、width 属性を
    156         * 指定した場合は、colspan="2" を自動セットして、width 属性を設定します。
    157         * (colspan属性が未設定の場合。設定されていれば、その値が使用されます。)
    158         * width 属性を設定した場合は、labelWidth、valueWidth は無視されます。
    159         * 単位(px,% など)は、引数で付けて下さい。
    160         *
    161         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
    162         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    163         * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応
    164         *
    165         * @param   wd 幅
    166         */
    167        public void setWidth( final String wd ) {
    168                width = nval( getRequestParameter( wd ),width );
    169                if( width.length() > 0 ) {
    170//                      width = " width=\"" + width + "\" ";
    171                        width = " style=\"width:" + width + ";\" ";                                                     // 8.2.0.2 (2022/06/24) Modify
    172                }
    173        }
    174
    175        /**
    176         * 【TAG】フィールド部分の colspan を指定します。
    177         *
    178         * @og.tag
    179         * 何も指定しない場合は、tdタグを２つ作成しますが、colspan を指定すると、
    180         * 後ろの td に、ここで指定された、colspan 属性を付与します。
    181         * ただし、width 属性を指定した場合だけ特殊で、td を一つだけ出力し、
    182         * そこに、colspan 属性を付けます。(併用の場合のみ)
    183         *
    184         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
    185         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    186         *
    187         * @param   sp フィールド部分のcolspan
    188         */
    189        public void setColspan( final String sp ) {
    190                //
    191                colspan = nval( getRequestParameter( sp ),colspan );
    192                if( colspan != null && colspan.length() > 0 ) {
    193                        colspan = " colspan=\"" + colspan + "\" ";
    194                }
    195        }
    196
    197        /**
    198         * 【TAG】ラベル、フィールド共に rowspan を指定します。
    199         *
    200         * @og.tag
    201         * 通常は、ラベルとフィールドが、別のtdで囲われます。rowspan は、
    202         * そのどちらの TDフィールドにも、設定します。
    203         * 初期値は、rowspan を付けないです。
    204         *
    205         * &lt;og:space rowspan="3" /&gt;
    206         *
    207         * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加
    208         *
    209         * @param   sp ラベル、フィールド部分のrowspan
    210         */
    211        public void setRowspan( final String sp ) {
    212                rowspan = nval( getRequestParameter( sp ),rowspan );
    213                if( rowspan.length() > 0 ) {
    214                        rowspan = " rowspan=\"" + rowspan + "\" ";
    215                }
    216        }
    217
    218        /**
    219         * 【TAG】ラベル部分(前半部分)の大きさ(width 属性)を指定します。
    220         *
    221         * @og.tag
    222         * 属性は td タグのラベル部分(前半部分)に、 width 属性で設定されます。
    223         * colspan 属性は、このlabelWidth属性と同じ TD にはセットされません。
    224         * ただし、通常のwidth 属性を使用した場合は、このlabelWidth属性は無視されます。
    225         *
    226         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    227         * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応
    228         *
    229         * @param   width 属性
    230         */
    231        public void setLabelWidth( final String width ) {
    232                labelWidth = nval( getRequestParameter( width ),labelWidth );
    233                if( labelWidth.length() > 0 ) {
    234//                      labelWidth = " width=\"" + labelWidth + "\" ";
    235                        labelWidth = " style=\"width:" + labelWidth + ";\" ";                           // 8.2.0.2 (2022/06/24) Modify
    236                }
    237        }
    238
    239        /**
    240         * 【TAG】値部分(後半部分)の大きさ(width 属性)を指定します。
    241         *
    242         * @og.tag
    243         * 属性は td タグの width 属性に設定されます。
    244         * colspan 属性を同時に指定した場合は、このvalueWidth属性と同じ TD にセットされます。
    245         * ただし、通常のwidth 属性を使用した場合は、このvalueWidth属性は無視されます。
    246         *
    247         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    248         * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応
    249         *
    250         * @param   width 属性
    251         */
    252        public void setValueWidth( final String width ) {
    253                valueWidth = nval( getRequestParameter( width ),valueWidth );
    254                if( valueWidth.length() > 0 ) {
    255//                      valueWidth = " width=\"" + valueWidth + "\" ";
    256                        valueWidth = " style=\"width:" + valueWidth + ";\" ";                           // 8.2.0.2 (2022/06/24) Modify
    257                }
    258        }
    259
    260        /**
    261         * このオブジェクトの文字列表現を返します。
    262         * 基本的にデバッグ目的に使用します。
    263         *
    264         * @return このクラスの文字列表現
    265         * @og.rtnNotNull
    266         */
    267        @Override
    268        public String toString() {
    269                return ToString.title( this.getClass().getName() )
    270                                .println( "VERSION"                     ,VERSION        )
    271                                .println( "width"                       ,width          )
    272                                .println( "colspan"                     ,colspan        )
    273                                .println( "rowspan"                     ,rowspan        )
    274                                .println( "labelWidth"          ,labelWidth     )
    275                                .println( "valueWidth"          ,valueWidth     )
    276                                .println( "Other..."    ,getAttributes().getAttribute() )
    277                                .fixForm().toString() ;
    278        }
    279}