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.plugin.view; 017 018import java.util.List; 019 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.hayabusa.common.HybsSystem; 022import org.opengion.hayabusa.common.HybsSystemException; 023import org.opengion.hayabusa.db.DBTableModel; 024import org.opengion.hayabusa.html.TableFormatter; 025 026/** 027 * JavaScript のツリー階層を持ったテーブル表示を行う、ツリーテーブル表示クラスです。 028 * 029 * AbstractViewForm により、setter/getterメソッドのデフォルト実装を提供しています。 030 * 各HTMLのタグに必要な setter/getterメソッドのみ,追加定義しています。 031 * 032 * AbstractViewForm を継承している為,ロケールに応じたラベルを出力させる事が出来ます。 033 * 034 * @og.group 画面表示 035 * 036 * @version 4.0 037 * @author Hiroki Nakamura 038 * @since JDK5.0, 039 */ 040public class ViewForm_HTMLCustomTreeBOM extends ViewForm_HTMLTable { 041 //* このプログラムのVERSION文字列を設定します。 {@value} */ 042 private static final String VERSION = "5.1.6.0 (2010/05/01)" ; 043 044 private TableFormatter headerFormat = null; 045 private TableFormatter[] bodyFormats = null; 046 private int bodyFormatsCount = 0; 047 048 private static final int BODYFORMAT_MAX_COUNT = 10; 049 050 /** 051 * DBTableModel から HTML文字列を作成して返します。 052 * startNo(表示開始位置)から、pageSize(表示件数)までのView文字列を作成します。 053 * 表示残りデータが pageSize 以下の場合は,残りのデータをすべて出力します。 054 * 055 * @og.rev 4.3.1.0 (2008/09/08) フォーマットが設定されていない場合のエラー追加 056 * 057 * @param stNo 表示開始位置 058 * @param pgSize 表示件数 059 * 060 * @return DBTableModelから作成された HTML文字列 061 */ 062 @Override 063 public String create( final int stNo, final int pgSize ) { 064 // このクラスでは、テーブル全データを使用します。 065 if( getRowCount() == 0 ) { return ""; } // 暫定処置 066 067 // 4.3.1.0 (2008/09/08) 068 if( headerFormat == null ) { 069 String errMsg = "ViewTagで canUseFormat() = true の場合、Formatter は必須です。"; 070 throw new HybsSystemException( errMsg ); 071 } 072 073 int startNo = 0; 074 int pageSize = getRowCount(); 075 076 int lastNo = getLastNo( startNo, pageSize ); 077 078 StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE ); 079 080 headerFormat.makeFormat( getDBTableModel() ); 081 082 if( bodyFormatsCount == 0 ) { 083 bodyFormats[0] = headerFormat ; 084 bodyFormatsCount ++ ; 085 } 086 else { 087 for( int i=0; i<bodyFormatsCount; i++ ) { 088 bodyFormats[i].makeFormat( getDBTableModel() ); 089 } 090 } 091 092 out.append( getHeader() ); 093 094 int level; 095 boolean isFld; 096 for( int row=startNo; row<lastNo; row++ ) { 097 // カラム==0は、レベルを指定する。 098 level = Integer.parseInt( getValueLabel(row,0) ); 099 isFld = false; 100 if( row+1<lastNo ) { 101 int nextLevel = Integer.parseInt( getValueLabel(row+1,0) ); 102 isFld = level < nextLevel ; 103 } 104 out.append( getLevelScript( level,isFld ) ); 105 106 // 開始 107 for( int i=0; i<bodyFormatsCount; i++ ) { 108 TableFormatter bodyFormat = bodyFormats[i]; 109 110 int cl = 0; 111 for( ; cl < bodyFormat.getLocationSize(); cl++ ) { 112 String fmt = bodyFormat.getFormat(cl); 113 int loc = bodyFormat.getLocation(cl); 114 if( ! bodyFormat.isNoClass() && loc >= 0 ) { 115 StringBuilder newtg = new StringBuilder( HybsSystem.BUFFER_LARGE ); 116 newtg.append("<td class=\""); 117 newtg.append( getColumnDbType(loc) ); 118 newtg.append("\" "); 119 String tdclass = newtg.toString(); 120 fmt = StringUtil.replace( bodyFormat.getFormat(cl) ,"<td", tdclass ); 121 } 122 out.append( fmt ); 123 if( loc >= 0 ) { 124 switch( bodyFormat.getType(cl) ) { 125 case '#' : out.append( getColumnLabel(loc) ); break; 126 case '$' : out.append( getRendererValue(row,loc) ); break; 127 case '!' : out.append( getValue(row,loc) ); break; 128 default : out.append( getValueLabel(row,loc) ); break; 129 } 130 } 131 } 132 out.append( StringUtil.replace( bodyFormat.getFormat(cl), "</tr>", "" ) ); 133 } 134 // 終了 135 136 out.append( "', '', 'gold')" ); 137 if( level != 0 ) { 138 out.append( ")" ); 139 } 140 out.append( HybsSystem.CR ); 141 } 142 out.append( getFutter() ); 143 144 return out.toString(); 145 } 146 147 /** 148 * DBTableModel から テーブルのヘッダータグ文字列を作成して返します。 149 * JavaScript の TreeBody では、JavaScriptに関連する定義もこのヘッダーに 150 * 含めます。 151 * 152 * @return テーブルのヘッダータグ文字列 153 */ 154 @Override 155 protected String getHeader() { 156 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 157 158 buf.append("<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\" summary=\"bomTable\" id=\"viewTable\">"); // 3.9.0.1 (2007/12/18) 159 buf.append( HybsSystem.CR ); 160 buf.append("<script type=\"text/javascript\">"); 161 buf.append( HybsSystem.CR ); 162 buf.append("<!--"); 163 buf.append( HybsSystem.CR ); 164 buf.append("aux0 = gFld('"); 165 // 開始 166 int cl = 0; 167 for( ; cl < headerFormat.getLocationSize(); cl++ ) { 168 buf.append( StringUtil.replace( headerFormat.getFormat(cl) ,"td","th" )); 169 int loc = headerFormat.getLocation(cl); 170 if( loc >= 0 ) { buf.append( getColumnLabel(loc) ); } 171 // ヘッダーフォーマット部では、何もしません。 172 } 173 buf.append( StringUtil.replace( StringUtil.replace( headerFormat.getFormat(cl) ,"td","th" ), "</tr>", "" ) ); 174 // 終了 175 176 buf.append("', '', 'gold')"); 177 buf.append( HybsSystem.CR ); 178 179 return buf.toString(); 180 } 181 182 /** 183 * DBTableModel から テーブルのフッタータグ文字列を作成して返します。 184 * JavaScript の TreeBody では、JavaScriptに関連する定義もこのフッターに 185 * 含めます。 186 * 187 * @return テーブルのフッタータグ文字列 188 */ 189 protected String getFutter() { 190 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 191 192 buf.append("initializeDocument()").append( HybsSystem.CR ); 193 buf.append("//-->").append( HybsSystem.CR ); 194 buf.append("</script>").append( HybsSystem.CR ); 195 buf.append("</table>").append( HybsSystem.CR ); 196 197 return buf.toString(); 198 } 199 200 /** 201 * 行のレベルに応じた JavaScript関数のヘッダー部分を返します。 202 * 203 * @og.rev 3.5.2.1 (2003/10/27) JavaScript 内のダブルコーテーションをシングルコーテーションに変更する。 204 * 205 * @param lvl ツリーのレベル 206 * @param isFld フォルダかどうか[true:フォルダ/false:最下層] 207 * 208 * @return JavaScript関数のヘッダー部分 209 */ 210 private String getLevelScript( final int lvl,final boolean isFld ) { 211 212 String auxX = "\taux" + ( lvl ); 213 String auxY = "aux" + ( lvl-1 ); 214 215 final String rtn ; 216 if( isFld ) { 217 rtn = auxX + " = insFld(" + auxY + ", gFld('"; 218 } 219 else { 220 rtn = "\tinsFld(" + auxY + ", gLnk('CONTENTS','"; 221 } 222 223 return rtn; 224 } 225 226 /** 227 * フォーマットを設定します。 228 * 229 * @param list TableFormatterのリスト 230 */ 231 @Override 232 public void setFormatterList( final List<TableFormatter> list ) { // 4.3.3.6 (2008/11/15) Generics警告対応 233 bodyFormats = new TableFormatter[BODYFORMAT_MAX_COUNT]; 234 235 bodyFormatsCount = 0; 236 for( int i=0; i<list.size(); i++ ) { 237 TableFormatter format = list.get( i ); // 4.3.3.6 (2008/11/15) Generics警告対応 238 switch( format.getFormatType() ) { 239 case TYPE_HEAD : headerFormat = format; break; 240 case TYPE_BODY : bodyFormats[bodyFormatsCount++] = format; break; 241 default : String errMsg = "FormatterType の定義外の値が指定されました。"; 242 // 4.3.4.4 (2009/01/01) 243 throw new HybsSystemException( errMsg ); 244 } 245 } 246 247 if( headerFormat == null ) { 248 String errMsg = "og:thead タグの、フォーマットの指定は必須です。"; 249 throw new HybsSystemException( errMsg ); 250 } 251 } 252 253 /** 254 * フォーマットメソッドを使用できるかどうかを問い合わせます。 255 * 256 * @return 使用可能(true)/ 使用不可能 (false) 257 */ 258 @Override 259 public boolean canUseFormat() { 260 return true; 261 } 262 263 /** 264 * ビューで表示したカラムの一覧をカンマ区切りで返します。 265 * 266 * @og.rev 5.1.6.0 (2010/05/01) 新規追加 267 * 268 * @return ビューで表示したカラムの一覧 269 */ 270 @Override 271 public String getViewClms() { 272 DBTableModel table = getDBTableModel(); 273 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 274 for( int i=0; i<headerFormat.getLocationSize(); i++ ) { 275 if( buf.length() > 0 ) { buf.append( ',' ); } 276 buf.append( table.getColumnName( headerFormat.getLocation( i ) ) ); 277 } 278 return buf.toString(); 279 } 280}