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
018/**
019 * テーブルレイアウトで column タグ等の存在しない空欄箇所に挿入して、
020 * テーブルの行列の個数を合わせるタグです。
021 *
022 * 通常の空欄は、ラベルと値という2つの項目を別々のカラムに登録するように
023 * <td></td>タグが、2つ続いた形式をしていますが、一般に、
024 * 個数は表示上の都合で任意の個数の<td>タグを使用したいケースが
025 * あります。
026 * その場合、このSpaceTag を使っておけば,大量の作成済み画面を修正しなくても
027 * このクラスを修正するだけで,すべての空欄のデザインがキープできます。
028 *
029 * @og.formSample
030 * ●形式:<og:space />
031 * ●body:なし
032 *
033 * ●Tag定義:
034 *   <og:space
035 *       width              【TAG】全体の大きさ(width 属性)を指定します
036 *       colspan            【TAG】全体の大きさ(width 属性)を指定します
037 *       labelWidth         【TAG】ラベル部分(前半部分)の大きさ(width 属性)を指定します
038 *       valueWidth         【TAG】値部分(後半部分)の大きさ(width 属性)を指定します
039 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
040 *   />
041 *
042 * ●使用例
043 *      通常の、ラベル部、フィールド部が空の td タグを生成します。
044 *      <og:space />
045 *
046 *      td タグの大きさを指定することができます。
047 *      <og:space
048 *         labelWidth = "ラベル部分(前半部分)の大きさ(width 属性)を指定します。"
049 *         valueWidth = "値部分(後半部分)の大きさ(width 属性)を指定します。"
050 *      />
051 *
052 * @og.group 画面部品
053 *
054 * @version  4.0
055 * @author   Kazuhiko Hasegawa
056 * @since    JDK5.0,
057 */
058public class SpaceTag extends CommonTagSupport {
059        //* このプログラムのVERSION文字列を設定します。   {@value} */
060        private static final String VERSION = "5.1.9.0 (2010/08/01)" ;
061
062        private static final long serialVersionUID = 519020100801L ;
063
064        private String labelWidth = null ;
065        private String valueWidth = null ;
066        private String width      = null ;              // 5.1.9.0 (2010/08/01) 追加
067        private String colspan    = null ;              // 5.1.9.0 (2010/08/01) 追加
068
069        /**
070         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
071         *
072         * @return      後続処理の指示( SKIP_BODY )
073         */
074        @Override
075        public int doStartTag() {
076                jspPrint( makeTag() );
077                return SKIP_BODY ;
078        }
079
080        /**
081         * タグリブオブジェクトをリリースします。
082         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
083         *
084         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
085         * @og.rev 5.1.9.0 (2010/08/01) width , colspan 属性追加
086         */
087        @Override
088        protected void release2() {
089                super.release2();
090                labelWidth = null ;
091                valueWidth = null ;
092                width      = null ;             // 5.1.9.0 (2010/08/01) 追加
093                colspan    = null ;             // 5.1.9.0 (2010/08/01) 追加
094        }
095
096        /**
097         * 検索条件の入力用のテキストフィールドを作成します。
098         *
099         * テーブルタグによりフィールドは分割されます。
100         * 使用時は、テーブルタグを前後に使用して下さい。
101         *
102         * @og.rev 5.1.9.0 (2010/08/01) width , colspan 属性追加
103         *
104         * @return  入力用のテキストフィールドタグ
105         */
106        private String makeTag() {
107                StringBuilder rtn = new StringBuilder();
108
109                // width 指定
110                if( width != null && width.length() > 0  ) {
111                        // width が指定されると、強制的に colspan を設定する。
112                        if( colspan == null || colspan.length() == 0  ) {
113                                colspan = "2";
114                        }
115                        rtn.append( "<td width=\"" );
116                        rtn.append( width );
117                        rtn.append( "\" colspan=\"" );
118                        rtn.append( colspan );
119                        rtn.append( "\"></td>" );
120                }
121                // すでに、width は未指定なので、colspan のみ出力
122                else if( colspan != null && colspan.length() > 0  ) {
123                        rtn.append( "<td colspan=\"" );
124                        rtn.append( colspan );
125                        rtn.append( "\"></td>" );
126                }
127                // width も colspan も未指定の場合のみ、labelWidth、valueWidth を出力
128                else {
129                        if( labelWidth == null || labelWidth.length() == 0  ) {
130                                rtn.append( "<td></td>" );
131                        }
132                        else {
133                                rtn.append( "<td width=\"" );
134                                rtn.append( labelWidth );
135                                rtn.append( "\"></td>" );
136                        }
137
138                        if( valueWidth == null || valueWidth.length() == 0  ) {
139                                rtn.append( "<td></td>" );
140                        }
141                        else {
142                                rtn.append( "<td width=\"" );
143                                rtn.append( valueWidth );
144                                rtn.append( "\"></td>" );
145                        }
146                }
147                return rtn.toString() ;
148        }
149
150        /**
151         * 【TAG】全体の大きさ(width 属性)を指定します。
152         *
153         * @og.tag
154         * 通常の space タグは、td 2個分のタグを出力しますが、width 属性を
155         * 指定した場合は、colspan="2" をセット下上で、width 属性に設定されます。
156         *
157         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
158         *
159         * @param   width 属性
160         */
161        public void setWidth( final String width ) {
162                this.width = getRequestParameter( width );
163        }
164
165        /**
166         * 【TAG】全体の大きさ(width 属性)を指定します。
167         *
168         * @og.tag
169         * 属性は td タグの colspan 属性に設定されます。
170         *
171         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
172         *
173         * @param   colspan 属性
174         */
175        public void setColspan( final String colspan ) {
176                this.colspan = getRequestParameter( colspan );
177        }
178
179        /**
180         * 【TAG】ラベル部分(前半部分)の大きさ(width 属性)を指定します。
181         *
182         * @og.tag
183         * 属性は td タグの width 属性に設定されます。
184         *
185         * @param   width 属性
186         */
187        public void setLabelWidth( final String width ) {
188                labelWidth = getRequestParameter( width );
189        }
190
191        /**
192         * 【TAG】値部分(後半部分)の大きさ(width 属性)を指定します。
193         *
194         * @og.tag
195         * 属性は td タグの width 属性に設定されます。
196         *
197         * @param   width 属性
198         */
199        public void setValueWidth( final String width ) {
200                valueWidth = getRequestParameter( width );
201        }
202
203        /**
204         * このオブジェクトの文字列表現を返します。
205         * 基本的にデバッグ目的に使用します。
206         *
207         * @return このクラスの文字列表現
208         */
209        @Override
210        public String toString() {
211                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
212                                .println( "VERSION"                     ,VERSION        )
213                                .println( "width"                       ,width          )
214                                .println( "colspan"                     ,colspan        )
215                                .println( "labelWidth"          ,labelWidth     )
216                                .println( "valueWidth"          ,valueWidth     )
217                                .println( "Other..."    ,getAttributes().getAttribute() )
218                                .fixForm().toString() ;
219        }
220}