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 static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.IOException;
021import java.io.ObjectInputStream;
022import java.io.ObjectOutputStream;
023
024import org.opengion.hayabusa.html.ViewAjaxTreeTableParam;
025
026/**
027 * viewタグの viewFormType が HTMLAjaxTreeTable の場合にパラメータを設定します。
028 *
029 * ツリービューを表示する、ViewForm_HTMLAjaxTreeTable クラスに対して、各種パラメータを
030 * 設定します。
031 * パラメータが設定されていない場合は、ViewAjaxTreeTableParam の初期値が使用されます。
032 * (パラメータを使用するには、viewタグのuseParam 属性をtrueに設定する必要があります。)
033 *
034 * ここで定義された子データを取得するためのJSPは、別に作成する必要があります。
035 *
036 * また、levelClmに設定されたカラムは、レベルと展開を表示するための画像イメージが表示されます。
037 * 展開レベルに応じて階層を視覚的に表示する場合は、levelClmに設定されたカラムのレンデラーを
038 * 定義して下さい。
039 * (例:LVLのコードリソースとして、1→- 2→-- 3→--- 等)
040 *
041 * 各属性は、{@XXXX} 変数が使用できます。
042 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
043 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
044 *
045 * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2
046 *
047 * のようなリクエストで、{@KEY1} とすれば、 VAL1 がセットされます。
048 *
049 * @og.formSample
050 * ●形式:<og:ajaxTreeParam keys="YYY,XXX,ZZZ" childJsp="getChildTag.jsp" />
051 * ●body:なし
052 *
053 * ●Tag定義:
054 *   <og:ajaxTreeParam
055 *       childSearchKeys    【TAG】子データを取得するためのJSPに渡す引数のカラム名をセットします(初期値:"")
056 *       childSearchJsp     【TAG】子データを取得するためのJSPをセットします(初期値:"getChildTag.jsp")
057 *       levelClm           【TAG】階層レベルとして処理(展開を制御するための画像イメージを表示)するカラム名をセットします(初期値:"LVL")
058 *       imgCollapsed       【TAG】折りたたまれた状態を表現するための画像ファイル名をセットします(初期値:"/jsp/image/collapsed.gif")
059 *       imgExpanded        【TAG】展開された状態を表現するための画像ファイル名をセットします(初期値:"/jsp/image/expanded.gif")
060 *       imgNoSub           【TAG】展開後子データが存在しない状態を表現するための画像ファイル名をセットします(初期値:"/jsp/image/nosub.gif")
061 *       expandAll          【TAG】初期状態で全展開を行うかを指定します(初期値:false=全展開しない)
062 *       childViewStartNo   【TAG】子データを表示するためのStartNoを指定します(初期値:-1)
063 *       expCtrlClm         【TAG】初期全展開した際に最下位の要素の状態(展開済 or 下位あり)を制御するためのカラムを指定します(初期値:EXPAND_CONTROL)
064 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
065 *   />
066 *
067 * ●使用例
068 *     ViewFormTag の viewFormType が、HTMLAjaxTreeTable の場合に使用します。
069 *     useParam 属性を設定しておかないと、使用されません。
070 *     <og:view
071 *         viewFormType = "HTMLAjaxTreeTable"
072 *         command      = "{@command}"
073 *         startNo      = "0"
074 *         pageSize     = "20"
075 *         <b>useParam     = &quot;true&quot;</b>
076 *     &gt;
077 *         &lt;og:ajaxTreeParam
078 *             childSearchkeys = "YYY,XXX,ZZZ"
079 *             childSearchJsp  = "getChildTag.jsp"
080 *             levelClm        = "LVL"
081 *             imgCollapsed    = "collapsed.gif"
082 *             imgExpanded     = "expanded.gif"
083 *             imgNoSub        = "nosub.gif"
084 *        /&gt;
085 *     &lt;/og:view &gt;
086 *
087 * @og.group 画面表示
088 *
089 * @version  4.0
090 * @author       Hiroki Nakamura
091 * @since    JDK5.0,
092 */
093public class ViewAjaxTreeParamTag extends ViewParamTag {
094        //* このプログラムのVERSION文字列を設定します。   {@value} */
095        private static final String VERSION = "4.3.5.0 (2008/02/01)" ;
096
097        private static final long serialVersionUID = 435020080201L ;
098
099        /**
100         * 【TAG】子データを取得するためのJSPに渡す引数のカラム名をセットします(初期値:"")。
101         *
102         * @og.tag
103         * 子データを取得するためのJSPに渡す引数のカラム名をセットします。
104         * 親データから子データを展開する際に、ここで設定されたキーの値をDBTableModelから
105         * 取得し、子データ検索用のJSPに渡します。
106         * 子データ検索用のJSPでは通常のリクエスト変数({&#064;カラム名})として値を取得することが可能です。
107         *
108         * @param       keys 引数として渡すカラム名
109         */
110        public void setChildSearchKeys( final String keys ) {
111                putParam( ViewAjaxTreeTableParam.CHILD_SEARCH_KEYS,
112                                  nval( getRequestParameter( keys ),"" ) );
113        }
114
115        /**
116         * 【TAG】子データを取得するためのJSPをセットします(初期値:"getChildTag.jsp")。
117         *
118         * @og.tag
119         * 子データを取得するためのJSPをセットします。
120         * このJSPで子データを取得し、viewタグでHTML出力した結果をパースし、子データとして
121         * 親データの直下に要素を挿入します。
122         * 子データ検索用のJSPでは通常のリクエスト変数({&#064;カラム名})として値を取得することが可能です。
123         *
124         * @param       jsp JSPファイル名
125         */
126        public void setChildSearchJsp( final String jsp ) {
127                putParam( ViewAjaxTreeTableParam.CHILD_SEARCH_JSP,
128                                  nval( getRequestParameter( jsp ),"getChildTag.jsp" ) );
129        }
130
131        /**
132         * 【TAG】階層レベルとして処理(展開を制御するための画像イメージを表示)するカラム名をセットします(初期値:"LVL")。
133         *
134         * @og.tag
135         * 階層レベルとして処理(展開を制御するための画像イメージを表示)するカラム名をセットします。
136         * 子データを取得した際に、ここで指定されたカラムは、親レベルに対して自動的に+1されます。
137         *
138         * @param       clm レベルカラム
139         */
140        public void setLevelClm( final String clm ) {
141                putParam( ViewAjaxTreeTableParam.LVL_CLM_KEY,
142                                  nval( getRequestParameter( clm ),"LVL" ) );
143        }
144
145        /**
146         * 【TAG】折りたたまれた状態を表現するための画像ファイル名をセットします(初期値:"/jsp/image/collapsed.gif")。
147         *
148         * @og.tag
149         * 折りたたまれた状態を表現するための画像ファイル名をセットします。
150         * 「折りたたまれた状態」とは、未展開の状態、及び展開後に折りたたんだ状態の両方を指します。
151         *
152         * @param       img 画像ファイル名
153         */
154        public void setImgCollapsed( final String img ) {
155                putParam( ViewAjaxTreeTableParam.IMG_COLLAPSED,
156                                  nval( getRequestParameter( img ),"collapsed.gif" ) );
157        }
158
159        /**
160         * 【TAG】展開された状態を表現するための画像ファイル名をセットします(初期値:"/jsp/image/expanded.gif")。
161         *
162         * @og.tag
163         * 展開された状態を表現するための画像ファイル名をセットします。
164         *
165         * @param       img 画像ファイル名
166         */
167        public void setImgExpanded( final String img ) {
168                putParam( ViewAjaxTreeTableParam.IMG_EXPANDED,
169                                  nval( getRequestParameter( img ),"expanded.gif" ) );
170        }
171
172        /**
173         * 【TAG】展開後子データが存在しない状態を表現するための画像ファイル名をセットします(初期値:"/jsp/image/nosub.gif")。
174         *
175         * @og.tag
176         * 展開後子データが存在しない状態を表現するための画像ファイル名をセットします。
177         *
178         * @param       img 画像ファイル名
179         */
180        public void setImgNoSub( final String img ) {
181                putParam( ViewAjaxTreeTableParam.IMG_NO_SUB,
182                                  nval( getRequestParameter( img ),"nosub.gif" ) );
183        }
184
185        /**
186         * 【TAG】初期状態で全展開を行うかを指定します(初期値:false=全展開しない)。
187         *
188         * @og.tag
189         * 初期状態で全展開を行うかを指定します。DBTableModel上のデータが展開済みのデータ
190         * であると仮定し、全展開を行った状態で表示します。
191         * ※ この属性をtrueに指定しても子データ取得用のJSPが再帰的に呼び出される訳では
192         *    ありません。子データの取得は、予めqueryで行っておく必要があります。
193         *
194         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
195         *
196         * @param       flg 初期状態で全展開を行うか
197         */
198        public void setExpandAll( final String flg ) {
199                putParam( ViewAjaxTreeTableParam.EXPAND_ALL,
200                                  nval( getRequestParameter( flg ),"false" ) );
201        }
202
203        /**
204         * 【TAG】子データを表示するためのStartNoを指定します(初期値:-1)。
205         *
206         * @og.tag
207         * 子データを取得するためのJSP内で使用します。
208         * 子データを取得し、元のDBTableModelにマージした後、子データのみを表示するため、
209         * ここでstartNoを指定して差分データを表示します。
210         *
211         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
212         *
213         * @param       no 子データを表示するためのStartNo
214         */
215        public void setChildViewStartNo( final String no ) {
216                putParam( ViewAjaxTreeTableParam.CHILD_VIEW_START_NO,
217                                  nval( getRequestParameter( no ),"-1" ) );
218        }
219
220        /**
221         * 【TAG】初期全展開した際に最下位の要素の状態(展開済 or 下位あり)を制御するためのカラムを指定します(初期値:EXPAND_CONTROL)。
222         *
223         * @og.tag
224         * 初期全展開した際に最下位の要素の状態(展開済 or 下位あり)を制御するためのカラムを指定します。
225         * ここで指定されたカラムの値により、全展開された結果の最下位の要素の状態指定することができます。
226         * この機能を利用することで、第3レベルまで存在するデータの内、第2レベルまでを展開しておく、
227         * ということを実現することができます。
228         * ここで指定したカラムが持つ値の意味は以下の通りです。
229         *  '0' or 'false' 展開済 (初期値)
230         *  '1' or 'true'  未展開 ※展開ボタンを押すことで更に下位展開が可能
231         *
232         * なお、この機能は、全展開時(expandAll="true")のみ有効であり、通常の第1レベル展開の場合は、
233         * このカラムは無視されます。
234         *
235         * @og.rev 4.3.5.0 (2008/02/01) 新規作成
236         *
237         * @param       key 全展開時に最下位の要素の状態を制御するためのカラム
238         */
239        public void setExpCtrlClm( final String key ) {
240                putParam( ViewAjaxTreeTableParam.EXPAND_CONTROL_CLM_KEY,
241                                  nval( getRequestParameter( key ),"EXPAND_CONTROL" ) );
242        }
243
244        /**
245         * タグの名称を、返します。
246         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
247         *
248         * @og.rev 4.3.1.0 (2008/09/03) 新規追加
249         *
250         * @return  タグの名称
251         */
252        @Override
253        protected String getTagName() {
254                return "ajaxTreeParam" ;
255        }
256
257        /**
258         * シリアライズ用のカスタムシリアライズ書き込みメソッド
259         *
260         * @og.rev 4.3.1.0 (2008/09/03) 新規追加
261         * @serialData 一部のオブジェクトは、シリアライズされません。
262         *
263         * @param       strm    ObjectOutputStreamオブジェクト
264         * @throws IOException  入出力エラーが発生した場合
265         */
266        private void writeObject( final ObjectOutputStream strm ) throws IOException {
267                strm.defaultWriteObject();
268        }
269
270        /**
271         * シリアライズ用のカスタムシリアライズ読み込みメソッド
272         *
273         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
274         *
275         * @og.rev 4.3.1.0 (2008/09/03) 新規追加
276         * @serialData 一部のオブジェクトは、シリアライズされません。
277         *
278         * @param       strm    ObjectInputStreamオブジェクト
279         * @see #release2()
280         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
281         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
282         */
283        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
284                strm.defaultReadObject();
285        }
286}