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 org.opengion.fukurou.util.StringUtil; 019import org.opengion.hayabusa.common.HybsSystem; 020import org.opengion.hayabusa.common.HybsSystemException; 021 022/** 023 * 検索結果を自動的に表形式に変換する、テーブル作成クラスです。 024 * 025 * ユーザー単位に表示するカラムの順番、表示可非を指定できるように対応します。 026 * setColumnDisplay( final String columnName ) に、指定された順番に 027 * 表示するというHTMLFormatTable の簡易版として用意します。 028 * 各HTMLのタグに必要な setter/getterメソッドのみ,追加定義しています。 029 * 030 * AbstractViewForm を継承している為,ロケールに応じたラベルを出力させる事が出来ます。 031 * 032 * @og.group 画面表示 033 * @og.rev 5.1.6.0 (2010/05/01) 新規作成 034 * 035 * @version 4.0 036 * @author Kazuhiko Hasegawa 037 * @since JDK5.0, 038 */ 039public class ViewForm_HTMLSeqClmTable extends ViewForm_HTMLTable { 040 //* このプログラムのVERSION文字列を設定します。 {@value} */ 041 private static final String VERSION = "5.5.4.2 (2012/07/13)" ; 042 043 private int[] clmNo = null; // 5.1.6.0 (2010/05/01) 044 private int clmCnt = -1; // 5.1.6.0 (2010/05/01) 045 046 private String viewClms = null; // 047 048 /** 049 * DBTableModel から HTML文字列を作成して返します。 050 * startNo(表示開始位置)から、pageSize(表示件数)までのView文字列を作成します。 051 * 表示残りデータが pageSize 以下の場合は,残りのデータをすべて出力します。 052 * 053 * @og.rev 5.5.4.2 (2012/07/13) editName指定時の編集対応 054 * 055 * @param startNo 表示開始位置 056 * @param pageSize 表示件数 057 * 058 * @return DBTableModelから作成された HTML文字列 059 */ 060 @Override 061 public String create( final int startNo, final int pageSize ) { 062 if( getRowCount() == 0 ) { return ""; } // 暫定処置 063 064 if( clmCnt < 0 ) { 065 String errMsg = "ViewForm_HTMLSeqClmTable クラスの実行前に、setColumnDisplay しておく必要があります。"; 066 throw new HybsSystemException( errMsg ); 067 } 068 069 headerLine = null; 070 int lastNo = getLastNo( startNo, pageSize ); 071 int blc = getBackLinkCount(); 072 int hsc = getHeaderSkipCount(); // 3.5.2.0 (2003/10/20) 073 int hscCnt = 1; // 3.5.2.0 (2003/10/20) 074 075 StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE ); 076 077 out.append( getCountForm( startNo,pageSize ) ); 078 out.append( getHeader() ); 079 080 String ckboxTD = " <td>"; 081 082 out.append("<tbody>").append( HybsSystem.CR ); 083 int bgClrCnt = 0; 084 for( int row=startNo; row<lastNo; row++ ) { 085 if( isSkip( row ) || isSkipNoEdit( row ) ) { continue; } // 4.3.1.0 (2008/09/08) 086 out.append("<tr").append( getBgColorCycleClass( bgClrCnt++,row ) ); 087 if( isNoTransition() ) { // 4.3.3.0 (2008/10/01) 088 out.append( getHiddenRowValue( row ) ); 089 } 090 out.append(">"); // 3.7.0.3 (2005/03/01) 091 out.append( HybsSystem.CR ); 092 // 3.5.5.0 (2004/03/12) No 欄そのものの作成判断追加 093 if( isNumberDisplay() ) { 094 out.append( makeCheckbox( ckboxTD, row, blc ) ).append( HybsSystem.CR ); 095 } 096 // 5.1.6.0 (2010/05/01) 097 for(int clm = 0; clm < clmCnt; clm++) { 098 int column = clmNo[clm]; 099 if( isColumnDisplay( column ) ) { 100 out.append(" <td>"); 101 out.append( getValueLabel(row,column) ); 102 out.append("</td>").append( HybsSystem.CR ); 103 } 104 } 105 106 107 // 5.5.4.2 (2012/07/13) mustとmuntAnyでwritableのものはdisplay:noneで出力する(可能な限り余分なものは出力しない) 108 for(int column = 0; column < clmCnt; column++) { 109 if( !isColumnDisplay( column ) && ( isMustColumn( column ) || isMustAnyColumn(column) ) && isColumnWritable( column) ) { 110 out.append(" <td style=\"display:none\">"); 111 out.append( getValueLabel(row,column) ); 112 out.append("</td>").append( HybsSystem.CR ); 113 } 114 } 115 116 117 out.append("</tr>").append( HybsSystem.CR ); 118 119 // 3.5.2.0 (2003/10/20) ヘッダー繰り返し属性( headerSkipCount )を採用 120 if( hsc > 0 && hscCnt % hsc == 0 ) { 121 out.append( getHeadLine() ); 122 hscCnt = 1; 123 } 124 else { 125 hscCnt ++ ; 126 } 127 } 128 out.append("</tbody>").append( HybsSystem.CR ); 129 out.append("</table>").append( HybsSystem.CR ); 130 131 out.append( getScrollBarEndDiv() ); // 3.8.0.3 (2005/07/15) 132 133 return out.toString(); 134 } 135 136 /** 137 * DBTableModel から テーブルのタグ文字列を作成して返します。 138 * 139 * @og.rev 3.5.1.0 (2003/10/03) Noカラムに、numberType 属性を追加 140 * @og.rev 3.5.2.0 (2003/10/20) ヘッダー繰り返し部をgetHeadLine()へ移動 141 * @og.rev 3.5.3.1 (2003/10/31) VERCHAR2 を VARCHAR2 に修正。 142 * @og.rev 3.5.5.0 (2004/03/12) No 欄そのものの作成判断ロジックを追加 143 * @og.rev 3.5.6.5 (2004/08/09) thead に、id="header" を追加 144 * @og.rev 4.0.0.0 (2005/01/31) DBColumn の 属性(CLS_NM)から、DBTYPEに変更 145 * @og.rev 4.0.0.0 (2005/01/31) 新規作成(getColumnClassName ⇒ getColumnDbType) 146 * 147 * @return テーブルのタグ文字列 148 */ 149 @Override 150 protected String getTableHead() { 151 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 152 153 // 3.5.5.0 (2004/03/12) No 欄そのものの作成判断追加 154 if( isNumberDisplay() ) { 155 buf.append("<colgroup class=\"X\" />"); // 4.0.0 (2005/01/31) 156 buf.append("<colgroup class=\"BIT\" />"); 157 buf.append("<colgroup class=\"S9\" />"); // 4.0.0 (2005/01/31) 158 buf.append( HybsSystem.CR ); 159 } 160 161 // 5.1.6.0 (2010/05/01) 162 for(int clm = 0; clm < clmCnt; clm++) { 163 int column = clmNo[clm]; 164 if( isColumnDisplay( column ) ) { 165 buf.append("<colgroup class=\"" ); 166 buf.append( getColumnDbType(column) ); // 4.0.0 (2005/01/31) 167 buf.append("\"/>"); 168 buf.append( HybsSystem.CR ); 169 } 170 } 171 172 // 3.5.2.0 (2003/10/20) ヘッダー繰り返し部をgetHeadLine()へ移動 173 buf.append("<thead id=\"header\">").append( HybsSystem.CR ); // 3.5.6.5 (2004/08/09) 174 buf.append( getHeadLine() ); 175 buf.append("</thead>").append( HybsSystem.CR ); 176 177 return buf.toString(); 178 } 179 180 /** 181 * ヘッダー繰り返し部を、getTableHead()メソッドから分離。 182 * 183 * @og.rev 3.5.2.0 (2003/10/20) 新規作成 184 * @og.rev 3.5.4.3 (2004/01/05) useCheckControl 属性の機能を追加 185 * @og.rev 3.5.4.5 (2004/01/23) thタグの属性設定出来る様に新規追加。 186 * @og.rev 3.5.4.6 (2004/01/30) numberType="none" 時の処理を追加(Noラベルを出さない) 187 * @og.rev 3.5.4.7 (2004/02/06) ヘッダーにソート機能用のリンクを追加します。 188 * @og.rev 3.7.0.1 (2005/01/31) 全件チェックコントロール処理変更 189 * 190 * @param thTag タグの文字列 191 * 192 * @return テーブルのタグ文字列 193 */ 194 @Override 195 protected String getHeadLine( final String thTag ) { 196 if( headerLine != null ) { return headerLine; } // キャッシュを返す。 197 198 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 199 200 buf.append("<tr class=\"row_hu\"").append(" >").append( HybsSystem.CR ); 201 202 // 3.5.5.0 (2004/03/12) No 欄そのものの作成判断追加 203 if( isNumberDisplay() ) { 204 // 3.5.4.3 (2004/01/05) 追加分 205 if( isUseCheckControl() && "checkbox".equals( getSelectedType() ) ) { 206 // 3.5.4.5 (2004/01/23) thタグの属性設定出来る様に変更。 207 buf.append( thTag ).append("></th>"); 208 buf.append( thTag ).append(">").append( getAllCheckControl() ).append("</th>"); 209 buf.append( thTag ).append(">").append( getNumberHeader() ).append("</th>"); // 3.5.4.6 (2004/01/30) 210 } 211 else { 212 // 3.5.4.5 (2004/01/23) thタグの属性設定出来る様に変更。 213 buf.append( thTag ).append(" colspan='3'>").append( getNumberHeader() ).append("</th>"); // 3.5.4.6 (2004/01/30) 214 } 215 } 216 217 buf.append( HybsSystem.CR ); 218 // 5.1.6.0 (2010/05/01) 219 for(int clm = 0; clm < clmCnt; clm++) { 220 int column = clmNo[clm]; 221 if( isColumnDisplay( column ) ) { 222 // 3.5.4.5 (2004/01/23) thタグの属性設定出来る様に変更。 223 buf.append( thTag ).append(">"); 224 buf.append( getSortedColumnLabel(column) ); 225 buf.append("</th>").append( HybsSystem.CR ); 226 } 227 } 228 buf.append("</tr>").append( HybsSystem.CR ); 229 230 headerLine = buf.toString(); 231 return headerLine; 232 } 233 234 /** 235 * 表示可能カラム名を、カンマ区切りで与えます。 236 * 例:"OYA,KO,HJO,SU,DYSET,DYUPD" 237 * setColumnDisplay( int column,boolean rw ) の簡易版です。 238 * null を与えた場合は,なにもしません。 239 * 240 * @param columnName カラム名 241 */ 242 @Override 243 public void setColumnDisplay( final String columnName ) { 244 super.setColumnDisplay( columnName ); 245 246 if( columnName != null ) { 247 String[] clmNames = StringUtil.csv2Array( columnName ); 248 clmCnt = clmNames.length; 249 clmNo = new int[clmCnt]; 250 for( int i=0; i<clmCnt; i++ ) { 251 clmNo[i] = getColumnNo( clmNames[i] ); 252 } 253 } 254 this.viewClms = columnName; 255 } 256 257 /** 258 * ビューで表示したカラムの一覧をカンマ区切りで返します。 259 * 260 * @og.rev 5.1.6.0 (2010/05/01) 新規追加 261 * 262 * @return ビューで表示したカラムの一覧 263 */ 264 @Override 265 public String getViewClms() { 266 return viewClms; 267 } 268}