    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 = "6.4.2.0 (2016/01/29)" ;
    065        private static final long serialVersionUID = 642020160129L ;
    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         *
    164         * @param   wd 幅
    165         */
    166        public void setWidth( final String wd ) {
    167                width = nval( getRequestParameter( wd ),width );
    168                if( width.length() > 0 ) {
    169                        width = " width=\"" + width + "\" ";
    170                }
    171        }
    172
    173        /**
    174         * 【TAG】フィールド部分の colspan を指定します。
    175         *
    176         * @og.tag
    177         * 何も指定しない場合は、tdタグを２つ作成しますが、colspan を指定すると、
    178         * 後ろの td に、ここで指定された、colspan 属性を付与します。
    179         * ただし、width 属性を指定した場合だけ特殊で、td を一つだけ出力し、
    180         * そこに、colspan 属性を付けます。(併用の場合のみ)
    181         *
    182         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
    183         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    184         *
    185         * @param   sp フィールド部分のcolspan
    186         */
    187        public void setColspan( final String sp ) {
    188                //
    189                colspan = nval( getRequestParameter( sp ),colspan );
    190                if( colspan != null && colspan.length() > 0 ) {
    191                        colspan = " colspan=\"" + colspan + "\" ";
    192                }
    193        }
    194
    195        /**
    196         * 【TAG】ラベル、フィールド共に rowspan を指定します。
    197         *
    198         * @og.tag
    199         * 通常は、ラベルとフィールドが、別のtdで囲われます。rowspan は、
    200         * そのどちらの TDフィールドにも、設定します。
    201         * 初期値は、rowspan を付けないです。
    202         *
    203         * &lt;og:space rowspan="3" /&gt;
    204         *
    205         * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加
    206         *
    207         * @param   sp ラベル、フィールド部分のrowspan
    208         */
    209        public void setRowspan( final String sp ) {
    210                rowspan = nval( getRequestParameter( sp ),rowspan );
    211                if( rowspan.length() > 0 ) {
    212                        rowspan = " rowspan=\"" + rowspan + "\" ";
    213                }
    214        }
    215
    216        /**
    217         * 【TAG】ラベル部分(前半部分)の大きさ(width 属性)を指定します。
    218         *
    219         * @og.tag
    220         * 属性は td タグのラベル部分(前半部分)に、 width 属性で設定されます。
    221         * colspan 属性は、このlabelWidth属性と同じ TD にはセットされません。
    222         * ただし、通常のwidth 属性を使用した場合は、このlabelWidth属性は無視されます。
    223         *
    224         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    225         *
    226         * @param   width 属性
    227         */
    228        public void setLabelWidth( final String width ) {
    229                labelWidth = nval( getRequestParameter( width ),labelWidth );
    230                if( labelWidth.length() > 0 ) {
    231                        labelWidth = " width=\"" + labelWidth + "\" ";
    232                }
    233        }
    234
    235        /**
    236         * 【TAG】値部分(後半部分)の大きさ(width 属性)を指定します。
    237         *
    238         * @og.tag
    239         * 属性は td タグの width 属性に設定されます。
    240         * colspan 属性を同時に指定した場合は、このvalueWidth属性と同じ TD にセットされます。
    241         * ただし、通常のwidth 属性を使用した場合は、このvalueWidth属性は無視されます。
    242         *
    243         * @og.rev 6.2.0.0 (2015/02/27) 初期値設定方法変更
    244         *
    245         * @param   width 属性
    246         */
    247        public void setValueWidth( final String width ) {
    248                valueWidth = nval( getRequestParameter( width ),valueWidth );
    249                if( valueWidth.length() > 0 ) {
    250                        valueWidth = " width=\"" + valueWidth + "\" ";
    251                }
    252        }
    253
    254        /**
    255         * このオブジェクトの文字列表現を返します。
    256         * 基本的にデバッグ目的に使用します。
    257         *
    258         * @return このクラスの文字列表現
    259         * @og.rtnNotNull
    260         */
    261        @Override
    262        public String toString() {
    263                return ToString.title( this.getClass().getName() )
    264                                .println( "VERSION"                     ,VERSION        )
    265                                .println( "width"                       ,width          )
    266                                .println( "colspan"                     ,colspan        )
    267                                .println( "rowspan"                     ,rowspan        )
    268                                .println( "labelWidth"          ,labelWidth     )
    269                                .println( "valueWidth"          ,valueWidth     )
    270                                .println( "Other..."    ,getAttributes().getAttribute() )
    271                                .fixForm().toString() ;
    272        }
    273}