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 */
016 package org.opengion.plugin.view;
017
018 import java.util.List;
019
020 import org.opengion.fukurou.util.StringUtil;
021 import org.opengion.fukurou.util.TagBuffer;
022 import org.opengion.fukurou.util.XHTMLTag;
023 import org.opengion.hayabusa.common.HybsSystem;
024 import org.opengion.hayabusa.common.HybsSystemException;
025 import org.opengion.hayabusa.html.FormatterType;
026 import org.opengion.hayabusa.html.TableFormatter;
027 import org.opengion.hayabusa.html.ViewAjaxTreeTableParam;
028
029 /**
030 * JavaScript の?ー階層を持ったテーブル表示を行う、ツリー??ブル表示クラスです?
031 *
032 * AbstractViewForm により、setter/getterメソ?の?ォルト実?提供して?す?
033 * 各HTMLのタグに?な setter/getterメソ?のみ?追?義して?す?
034 *
035 * AbstractViewForm を継承して?為,ロケールに応じたラベルを?力させる事が出来ます?
036 *
037 * @og.group 画面表示
038 *
039 * @version 4.0
040 * @author Hiroki Nakamura
041 * @since JDK5.0,
042 */
043 public class ViewForm_HTMLAjaxTreeTable extends ViewForm_HTMLCustomTable {
044 //* こ?プログラ??VERSION??を設定します? {@value} */
045 private static final String VERSION = "4.3.7.4 (2009/07/01)" ;
046
047 private static final String JSP = HybsSystem.sys( "JSP" );
048
049 private int[] childSearchKeys = null;
050 private String childSearchJsp = null;
051 private String levelClm = null;
052 private int levelClmPos = -1;
053 private String imgCollapsed = null;
054 private String imgExpanded = null;
055 private String imgNoSub = null;
056 private boolean expandAll = false; // 4.3.3.0 (2008/10/01)
057 private int childViewStartNo= -1; // 4.3.3.0 (2008/10/01)
058 // private String expCtrlClm = null; // 4.3.5.0 (2008/02/01)
059 private int expCtrlClmPos = -1; // 4.3.5.0 (2008/02/01)
060
061 // 4.3.4.4 (2009/01/01)
062 // /**
063 // * ?ォルトコンストラクター
064 // *
065 // */
066 // public ViewForm_HTMLAjaxTreeTable() {
067 // super();
068 // }
069
070 /**
071 * DBTableModel から HTML??を作?して返します?
072 * startNo(表示開始位置)から、pageSize(表示件数)までのView??を作?します?
073 * 表示残り??タ?pageSize 以下?場合?,残りの??タをすべて出力します?
074 *
075 * @og.rev 4.3.3.0 (2008/10/01) noTransition属?,childViewStartNo属?対?
076 * @og.rev 4.3.7.4 (2009/07/01) tbodyタグの入れ子を解?FireFox対?
077 *
078 * @param strNo 表示開始位置
079 * @param pageSize 表示件数
080 *
081 * @return DBTableModelから作?され?HTML??
082 */
083 @Override
084 public String create( final int strNo, final int pageSize ) {
085 if( getRowCount() == 0 ) { return ""; } // 暫定?置
086
087 initParam();
088
089 // 4.3.3.0 (2008/10/01) 子データ差?得用
090 int startNo = 0;
091 if( childViewStartNo >= 0 ) { startNo = childViewStartNo; }
092 else { startNo = strNo; }
093
094 int lastNo = getLastNo( startNo, pageSize );
095
096 StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE );
097
098 if( headerFormat == null ) {
099 makeDefaultFormat();
100 }
101
102 headerFormat.makeFormat( getDBTableModel() );
103
104 out.append( getCountForm( startNo,pageSize ) );
105 out.append( getHeader() );
106
107 if( bodyFormatsCount == 0 ) {
108 bodyFormats = new TableFormatter[BODYFORMAT_MAX_COUNT];
109 bodyFormats[0] = headerFormat ;
110 bodyFormatsCount ++ ;
111 }
112 else {
113 for( int i=0; i<bodyFormatsCount; i++ ) {
114 bodyFormats[i].makeFormat( getDBTableModel() );
115 }
116 }
117
118 // out.append("<tbody>").append( HybsSystem.CR ); // 4.3.7.4 (2009/07/01)
119 int bgClrCnt = 0;
120 for( int row=startNo; row<lastNo; row++ ) {
121 // if( isSkip( row ) ) { continue; } // 3.5.3.1 (2003/10/31)
122 if( isSkip( row ) || isSkipNoEdit( row ) ) { continue; } // 4.3.1.0 (2008/09/08)
123 for( int i=0; i<bodyFormatsCount; i++ ) {
124 TableFormatter bodyFormat = bodyFormats[i];
125 if( ! bodyFormat.isUse( row,getDBTableModel() ) ) { continue; } // 3.5.4.0 (2003/11/25)
126 out.append("<tbody").append( getBgColorCycleClass( bgClrCnt++,row ) );
127 if( isNoTransition() ) { // 4.3.3.0 (2008/10/01)
128 out.append( getHiddenRowValue( row ) );
129 }
130 out.append(">"); // 3.7.0.3 (2005/03/01)
131 out.append( bodyFormat.getTrTag() );
132
133 if( isNumberDisplay() ) {
134 String ckboxTD = "<td" + bodyFormat.getRowspan() + ">";
135 out.append( makeCheckbox( ckboxTD,row,0 ) );
136 }
137
138 int cl = 0;
139 for( ; cl < bodyFormat.getLocationSize(); cl++ ) {
140 String fmt = bodyFormat.getFormat(cl);
141 int loc = bodyFormat.getLocation(cl);
142 if( ! bodyFormat.isNoClass() && loc >= 0 ) {
143 StringBuilder newtg = new StringBuilder( HybsSystem.BUFFER_LARGE );
144 newtg.append("<td class=\"");
145 newtg.append( getColumnDbType(loc) );
146 newtg.append("\" ");
147 String tdclass = newtg.toString();
148 fmt = StringUtil.replace( bodyFormat.getFormat(cl) ,"<td", tdclass );
149 }
150 out.append( fmt );
151 if( loc >= 0 ) {
152 if( levelClm != null && levelClm.equals( getDBColumn( loc ).getName() ) ) {
153 out.append( getLvlClmTag( row ) );
154 }
155 else {
156 switch( bodyFormat.getType(cl) ) {
157 case '#' : out.append( getColumnLabel(loc) ); break;
158 case '$' : out.append( getRendererValue(row,loc) ); break;
159 case '!' : out.append( getValue(row,loc) ); break;
160 default : out.append( getValueLabel(row,loc) ); break;
161 }
162 }
163 }
164 else {
165 out.append( bodyFormat.getSystemFormat(row,loc) );
166 }
167 }
168 out.append( bodyFormat.getFormat(cl) );
169 out.append("</tbody>").append( HybsSystem.CR );
170 }
171
172 // if( hsc > 0 && hscCnt % hsc == 0 ) {
173 // out.append("<tbody class=\"row_h\"").append(" >");
174 // out.append( getHeadLine() );
175 // out.append("</tbody>");
176 // hscCnt = 1;
177 // }
178 // else {
179 // hscCnt ++ ;
180 // }
181 }
182
183 if( footerFormat != null ) {
184 out.append( getTableFoot() );
185 }
186
187 // out.append("</tbody>").append( HybsSystem.CR ); // 4.3.7.4 (2009/07/01)
188 out.append("</table>").append( HybsSystem.CR );
189
190 out.append( getScrollBarEndDiv() );
191
192 out.append( getParameterTag() );
193
194 return out.toString();
195 }
196
197 /**
198 * フォーマットを設定します?
199 *
200 * @param list TableFormatterのリス?
201 */
202 @Override
203 public void setFormatterList( final List<TableFormatter> list ) { // 4.3.3.6 (2008/11/15) Generics警告対?
204 bodyFormats = new TableFormatter[BODYFORMAT_MAX_COUNT];
205
206 bodyFormatsCount = 0;
207 for( int i=0; i<list.size(); i++ ) {
208 TableFormatter format = list.get( i ); // 4.3.3.6 (2008/11/15) Generics警告対?
209 switch( format.getFormatType() ) {
210 case TYPE_HEAD : headerFormat = format; break;
211 case TYPE_BODY : bodyFormats[bodyFormatsCount++] = format; break;
212 case TYPE_FOOT : footerFormat = format; break;
213 default : String errMsg = "FormatterType の定義外?値が指定されました?;
214 // 4.3.4.4 (2009/01/01)
215 throw new HybsSystemException( errMsg );
216 }
217 }
218
219 // if( headerFormat == null ) {
220 // String errMsg = "og:thead タグの、フォーマット?????です?";
221 // throw new HybsSystemException( errMsg );
222 // }
223 }
224
225 /**
226 * フォーマッターが設定されて???合?、DBTableModelの??から?ォルト?
227 * フォーマッターを作?します?
228 *
229 * @og.rev 4.3.3.6 (2008/11/15) columnDisplay,noDisplay対?
230 * @og.rev 4.3.5.0 (2008/02/01) 全展開コントロール用カラ?の対?
231 */
232 private void makeDefaultFormat() {
233 StringBuilder buf = new StringBuilder();
234 String[] clms = getDBTableModel().getNames();
235 buf.append( "<tr>" );
236 for ( int i = 0; i < clms.length; i++ ) {
237 if( isColumnDisplay( i ) && i != expCtrlClmPos ) { // 4.3.3.6 (2008/11/15) // 4.3.5.0 (2008/02/01)
238 buf.append( "<td>[" + clms[i] + "]</td>" );
239 }
240 }
241 buf.append( "</tr>" );
242
243 TableFormatter formatter = new TableFormatter();
244 formatter.setFormat( buf.toString() );
245 formatter.setFormatType( FormatterType.TYPE_HEAD );
246
247 headerFormat = formatter;
248 }
249
250 /**
251 * フォーマットメソ?を使用できるかど?を問?わせます?
252 *
253 * @return フォーマットメソ?を使用できる?
254 */
255 @Override
256 public boolean canUseFormat() {
257 return true;
258 }
259
260 /**
261 * 初期パラメーターを設定します?
262 *
263 * @og.rev 4.3.3.0 (2008/10/01) 初期全展開の属?追?
264 * @og.rev 4.3.5.0 (2008/02/01) 全展開時?状態をコントロールするためのフラグを追?
265 */
266 private void initParam() {
267 String[] tmp = StringUtil.csv2Array( getParam( ViewAjaxTreeTableParam.CHILD_SEARCH_KEYS, "" ) );
268 childSearchKeys = new int[tmp.length];
269 for( int i=0; i<tmp.length; i++ ) {
270 childSearchKeys[i] = getDBTableModel().getColumnNo( tmp[i] );
271 }
272 childSearchJsp = getParam( ViewAjaxTreeTableParam.CHILD_SEARCH_JSP, "getChildTag.jsp" );
273 levelClm = getParam( ViewAjaxTreeTableParam.LVL_CLM_KEY, "LVL" );
274 levelClmPos = getDBTableModel().getColumnNo( levelClm );
275 imgCollapsed = getParam( ViewAjaxTreeTableParam.IMG_COLLAPSED, "collapsed.gif" );
276 imgExpanded = getParam( ViewAjaxTreeTableParam.IMG_EXPANDED, "expanded.gif" );
277 imgNoSub = getParam( ViewAjaxTreeTableParam.IMG_NO_SUB, "nosub.gif" );
278 expandAll = Boolean.valueOf( getParam( ViewAjaxTreeTableParam.EXPAND_ALL, "false" ) ); // 4.3.2.0 (2008/09/11)
279 childViewStartNo= Integer.valueOf( getParam( ViewAjaxTreeTableParam.CHILD_VIEW_START_NO, "-1" ) ); // 4.3.3.0 (2008/10/01)
280 // expCtrlClm = getParam( ViewAjaxTreeTableParam.EXPAND_CONTROL_CLM_KEY, "EXPAND_CONTROL" ); // 4.3.5.0 (2008/02/01)
281 String expCtrlClm = getParam( ViewAjaxTreeTableParam.EXPAND_CONTROL_CLM_KEY, "EXPAND_CONTROL" ); // 4.3.5.0 (2008/02/01)
282 expCtrlClmPos = getDBTableModel().getColumnNo( expCtrlClm, false );
283 }
284
285 /**
286 * JavaScriptに渡すため?パラメータをhiddenタグで出力します?
287 *
288 * @og.rev 4.3.3.0 (2008/10/01) 初期全展開対?
289 * @og.rev 4.3.5.0 (2008/02/01) 全展開時?状態をコントロールするためのフラグを追?
290 *
291 * @param row 行番号
292 *
293 * @return HTMLタグ
294 */
295 private String getLvlClmTag( final int row ) {
296 StringBuilder keys = new StringBuilder();
297 keys.append( "command," + levelClm );
298 for( int i=0; i<childSearchKeys.length; i++ ) {
299 keys.append( "," ).append( getColumnName( childSearchKeys[i] ) );
300 }
301
302 StringBuilder vals = new StringBuilder();
303 vals.append( "NEW," + getValue( row, levelClmPos ) );
304 for( int i=0; i<childSearchKeys.length; i++ ) {
305 vals.append( "," ).append( getValue( row, childSearchKeys[i] ) );
306 }
307
308 String imgsrc = null;
309 StringBuilder clazz = new StringBuilder();
310 clazz.append( "lvlctl unreplaceable" );
311 if( expandAll ) { // 4.3.3.0 (2008/10/01)
312 if( row == getRowCount() - 1
313 || Integer.parseInt( getValue( row, levelClmPos ) ) >= Integer.parseInt( getValue( row+1, levelClmPos ) ) ) {
314 boolean isExp = ( expCtrlClmPos > -1 && StringUtil.nval( getValue( row, expCtrlClmPos ), false ) );
315 if( isExp ) {
316 imgsrc = JSP + "/image/" + imgCollapsed;
317 }
318 else {
319 imgsrc = JSP + "/image/" + imgNoSub;
320 clazz.append( " fetched nosub" );
321 }
322 }
323 else {
324 imgsrc = JSP + "/image/" + imgExpanded;
325 clazz.append( " fetched expanded" );
326 }
327 }
328 else {
329 imgsrc = JSP + "/image/" + imgCollapsed;
330 }
331
332 TagBuffer tag = new TagBuffer( "img" );
333 tag.add( "class", clazz.toString() );
334 tag.add( "src" , imgsrc );
335 tag.add( "alt" , "Level " + getValue( row, levelClmPos ) );
336 tag.add( "lvl" , getValue( row, levelClmPos ) );
337 tag.add( "keys" , keys.toString() );
338 tag.add( "vals" , vals.toString() );
339
340 return getRendererValue( row, levelClmPos ) + tag.makeTag();
341 }
342
343 /**
344 * JavaScriptに渡すため?パラメーターをhiddenタグをして出力します?
345 *
346 * @return hiddenタグ
347 */
348 private String getParameterTag() {
349 StringBuilder buf = new StringBuilder();
350 buf.append( XHTMLTag.hidden( ViewAjaxTreeTableParam.CHILD_SEARCH_JSP, childSearchJsp ) );
351 buf.append( XHTMLTag.hidden( ViewAjaxTreeTableParam.IMG_COLLAPSED, JSP + "/image/" + imgCollapsed ) );
352 buf.append( XHTMLTag.hidden( ViewAjaxTreeTableParam.IMG_EXPANDED, JSP + "/image/" + imgExpanded ) );
353 buf.append( XHTMLTag.hidden( ViewAjaxTreeTableParam.IMG_NO_SUB, JSP + "/image/" + imgNoSub ) );
354 return buf.toString();
355 }
356 }