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.column; 017 018import java.util.StringTokenizer; 019 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.fukurou.util.TagBuffer; 022import org.opengion.hayabusa.common.HybsSystem; 023import org.opengion.hayabusa.db.AbstractRenderer; 024import org.opengion.hayabusa.db.CellRenderer; 025import org.opengion.hayabusa.db.DBColumn; 026 027/** 028 * AUTOAREA レンデラは、カラムのデータをテキストエリアで表示する場合に 029 * 使用するクラスです。 030 * readonlyのテキストエリアでclass=renderer-textareaとして出力し、 031 * name属性は付けません。(データは送信されません) 032 * エリアの縦、横サイズはエディタの自動拡張テキストエリア(AUTOAREA)と同様にして算出されます。 033 * 034 * カラムの表示に必要な属性は, DBColumn オブジェクト より取り出します。 035 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。 036 * 037 * @og.rev 5.3.4.0 (2011/04/01) 新規作成 038 * @og.group データ編集 039 * 040 * @version 4.0 041 * @author Hiroki Nakamura 042 * @since JDK5.0, 043 */ 044public class Renderer_AUTOAREA extends AbstractRenderer { 045 /** このプログラムのVERSION文字列を設定します。 {@value} */ 046 private static final String VERSION = "6.4.1.1 (2016/01/16)" ; 047 048 private final int COLUMNS_MAXSIZE = HybsSystem.sysInt( "HTML_COLUMNS_MAXSIZE" ); 049 // viewタグで表示する場合のカラムの大きさ 050 private final int VIEW_COLUMNS_MAXSIZE = HybsSystem.sysInt( "HTML_VIEW_COLUMNS_MAXSIZE" ); 051 052 private static final String CODE = "Windows-31J"; 053 054 private int cols1 ; 055 private int cols2 ; 056 private int rows1 ; 057 private int rows2 ; 058 private int maxColSize = HybsSystem.sysInt( "HTML_AUTOAREA_MAX_COL_SIZE" ); 059 private int maxRowSize = HybsSystem.sysInt( "HTML_AUTOAREA_MAX_ROW_SIZE" ); 060 061 private final TagBuffer tagBuffer = new TagBuffer(); 062 063 /** 064 * デフォルトコンストラクター。 065 * このコンストラクターで、基本オブジェクトを作成します。 066 * 067 * @og.rev 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor 068 */ 069 public Renderer_AUTOAREA() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 070 071 /** 072 * コンストラクター 073 * textareaのサイズを決めるため、sizeとrowを決定する 074 * editorの計算を移植。 075 * 076 * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする) 077 * 078 * @param clm DBColumnオブジェクト 079 */ 080 private Renderer_AUTOAREA( final DBColumn clm ) { 081 super(); // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor 082 083 // 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする) 084 final int size1 = clm.getFieldSize( COLUMNS_MAXSIZE ); 085 final int size2 = clm.getFieldSize( VIEW_COLUMNS_MAXSIZE ); 086 087 final int r1 = clm.getTotalSize()/size1 + 1; // 6.2.0.0 (2015/02/27) 088 if( r1 > 5 ) { rows1 = 5; } 089 else { rows1 = r1; } 090 091 final int r2 = clm.getTotalSize()/size2 + 1; // 6.2.0.0 (2015/02/27) 092 if( r2 > 5 ) { rows2 = 5; } 093 else { rows2 = r2; } 094 095 // 3.8.0.2 (2005/07/11) size に、"rows-maxRow,cols-maxCols" を指定 096 final String param = StringUtil.nval( clm.getRendererParam(),clm.getViewLength() ); 097 if( param != null && param.length() != 0 ) { 098 final int prmAdrs = param.indexOf( ',' ); 099 if( prmAdrs > 0 ) { 100 final String rowStr = param.substring( 0,prmAdrs ); 101 final String colStr = param.substring( prmAdrs+1 ); 102 103 final int rowAdrs = rowStr.indexOf( '-' ); // rows-maxRow 設定時 '-' がなければ、ただのrows 104 if( rowAdrs > 0 ) { 105 rows1 = Integer.parseInt( rowStr.substring( 0,rowAdrs ) ); 106 maxRowSize = Integer.parseInt( rowStr.substring( rowAdrs+1 ) ); 107 } 108 else { 109 rows1 = Integer.parseInt( rowStr ); 110 } 111 rows2 = rows1 ; 112 113 final int colAdrs = colStr.indexOf( '-' ); // cols-maxCols 設定時 '-' がなければ、ただのcols 114 if( colAdrs > 0 ) { 115 cols1 = Integer.parseInt( colStr.substring( 0,colAdrs ) ); 116 maxColSize = Integer.parseInt( colStr.substring( colAdrs+1 ) ); 117 } 118 else { 119 cols1 = Integer.parseInt( colStr ); 120 } 121 cols2 = cols1; 122 } 123 } 124 } 125 126 /** 127 * 各オブジェクトから自分のインスタンスを返します。 128 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に 129 * まかされます。 130 * 131 * @param clm DBColumnオブジェクト 132 * 133 * @return CellRendererオブジェクト 134 * @og.rtnNotNull 135 */ 136 public CellRenderer newInstance( final DBColumn clm ) { 137 return new Renderer_AUTOAREA( clm ); 138 } 139 140 /** 141 * データの表示用文字列を返します。 142 * 143 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 144 * 145 * @param value 入力値 146 * 147 * @return データの表示用文字列 148 * @og.rtnNotNull 149 */ 150 @Override 151 public String getValue( final String value ) { 152 return getRowsColsValue( value==null ? "" : value,cols1,rows1 ); 153 154 } 155 156 /** 157 * データの表示用文字列を返します。 158 * 159 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 160 * 161 * @param row 行番号 162 * @param value 入力値 163 * 164 * @return データ表示用の文字列 165 * @og.rtnNotNull 166 */ 167 @Override 168 public String getValue( final int row,final String value ) { 169 return getRowsColsValue( value==null ? "" : value,cols2,rows2 ); 170 171 } 172 173 /** 174 * データ出力用の文字列を作成します。 175 * ファイル等に出力する形式を想定しますので、HTMLタグを含まない 176 * データを返します。 177 * 基本は、#getValue( String ) をそのまま返します。 178 * 179 * @og.rev 6.0.4.0 (2014/11/28) データ出力用のレンデラー 180 * 181 * @param value 入力値 182 * 183 * @return データ出力用の文字列 184 * @og.rtnNotNull 185 * @see #getValue( String ) 186 */ 187 @Override 188 public String getWriteValue( final String value ) { 189 return value==null ? "" : value; 190 } 191 192 /** 193 * 自動表示する行列の数を求めて、値を返します。 194 * 行数は、引数の文字列中に含まれる 改行コードの個数を求めます。 195 * 列数は、各行数のなかの最大桁数より求めます。これには半角、全角が含まれる為、 196 * 半角換算での文字数ということになります。 197 * 行数と列数が、初期設定の行数と列数より小さい場合は、初期設定値が使用されます。 198 * 199 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 200 * 201 * @param value 入力値 表示文字列 202 * @param cols 最小カラム数 203 * @param rows 最小行数 204 * 205 * @return データ表示用の文字列 206 * @og.rtnNotNull 207 */ 208 private String getRowsColsValue( final String value,final int cols, final int rows ) { 209 // 6.0.4.0 (2014/11/28) null は引数に来ない。 210 211 final StringTokenizer token = new StringTokenizer( value, "\n", true ); 212 213 int cntRow = 1; 214 int maxCol = 0; 215 while( token.hasMoreTokens() ) { 216 final String val = token.nextToken(); 217 if( "\n".equals( val ) ) { cntRow++; } 218 else { 219 final byte[] byteValue = StringUtil.makeByte( val,CODE ); // 3.5.5.3 (2004/04/09) 220 final int byteSize = byteValue.length; 221 if( maxColSize > 0 && byteSize > maxColSize ) { // 最大列数 222 cntRow += byteSize / maxColSize; 223 maxCol = maxColSize ; 224 } 225 else if( byteSize > maxCol ) { maxCol = byteSize; } 226 } 227 if( maxRowSize > 0 && cntRow >= maxRowSize ) { // 最大行数 228 cntRow = maxRowSize; 229 break; 230 } 231 } 232 233 maxCol += 2; // マージン。フォントや画面サイズに影響する為、比率のほうがよい? 234 235 // 6.0.4.0 (2014/11/28) 配列にいれずに、直接設定する。 236 237 // 6.0.4.0 (2014/11/28) タグを作成する処理も、ここで行います。 238 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 239 return new TagBuffer( "textarea" ) 240 .add( "cols" , String.valueOf( Math.max( cols,maxCol ) ) ) // 6.1.1.0 (2015/01/17) ソースの見やすさ優先 241 .add( "rows" , String.valueOf( Math.max( rows,cntRow ) ) ) 242 .add( "readonly", "readonly" ) 243 .add( "class" , "renderer-textarea" ) 244 .add( tagBuffer.makeTag() ) 245 .addBody( value ) 246 .makeTag(); 247 248 } 249}