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 * 通常の空欄は、ラベルと値という2つの項目を別々のカラムに登録するように
026 * <td></td>タグが、2つ続いた形式をしていますが、一般に、
027 * 個数は表示上の都合で任意の個数の<td>タグを使用したいケースが
028 * あります。
029 * その場合、このSpaceTag を使っておけば,大量の作成済み画面を修正しなくても
030 * このクラスを修正するだけで,すべての空欄のデザインがキープできます。
031 *
032 * @og.formSample
033 * ●形式:<og:space />
034 * ●body:なし
035 *
036 * ●Tag定義:
037 *   <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 *   />
045 *
046 * ●使用例
047 *      通常の、ラベル部、フィールド部が空の td タグを生成します。(tdタグを2つ作成します)
048 *      <og:space />
049 *
050 *      td タグの大きさを指定することができます。
051 *      <og:space
052 *         labelWidth = "ラベル部分(前半部分)の大きさ(width 属性)を指定します。"
053 *         valueWidth = "値部分(後半部分)の大きさ(width 属性)を指定します。"
054 *      />
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 2個分のタグを出力しますが、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タグを2つ作成しますが、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}