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 * DBColumnオブジェクトを指定したprivateコンストラクター。 073 * 074 * textareaのサイズを決めるため、sizeとrowを決定する 075 * editorの計算を移植。 076 * 077 * @og.rev 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする) 078 * 079 * @param clm DBColumnオブジェクト 080 */ 081 private Renderer_AUTOAREA( final DBColumn clm ) { 082 super(); // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor 083 084 // 6.2.0.0 (2015/02/27) フィールドサイズ 追加(VIEW_LENGTHと分離して、役割を明確にする) 085 final int size1 = clm.getFieldSize( COLUMNS_MAXSIZE ); 086 final int size2 = clm.getFieldSize( VIEW_COLUMNS_MAXSIZE ); 087 088 final int r1 = clm.getTotalSize()/size1 + 1; // 6.2.0.0 (2015/02/27) 089 if( r1 > 5 ) { rows1 = 5; } 090 else { rows1 = r1; } 091 092 final int r2 = clm.getTotalSize()/size2 + 1; // 6.2.0.0 (2015/02/27) 093 if( r2 > 5 ) { rows2 = 5; } 094 else { rows2 = r2; } 095 096 // 3.8.0.2 (2005/07/11) size に、"rows-maxRow,cols-maxCols" を指定 097 final String param = StringUtil.nval( clm.getRendererParam(),clm.getViewLength() ); 098 if( param != null && param.length() != 0 ) { 099 final int prmAdrs = param.indexOf( ',' ); 100 if( prmAdrs > 0 ) { 101 final String rowStr = param.substring( 0,prmAdrs ); 102 final String colStr = param.substring( prmAdrs+1 ); 103 104 final int rowAdrs = rowStr.indexOf( '-' ); // rows-maxRow 設定時 '-' がなければ、ただのrows 105 if( rowAdrs > 0 ) { 106 rows1 = Integer.parseInt( rowStr.substring( 0,rowAdrs ) ); 107 maxRowSize = Integer.parseInt( rowStr.substring( rowAdrs+1 ) ); 108 } 109 else { 110 rows1 = Integer.parseInt( rowStr ); 111 } 112 rows2 = rows1 ; 113 114 final int colAdrs = colStr.indexOf( '-' ); // cols-maxCols 設定時 '-' がなければ、ただのcols 115 if( colAdrs > 0 ) { 116 cols1 = Integer.parseInt( colStr.substring( 0,colAdrs ) ); 117 maxColSize = Integer.parseInt( colStr.substring( colAdrs+1 ) ); 118 } 119 else { 120 cols1 = Integer.parseInt( colStr ); 121 } 122 cols2 = cols1; 123 } 124 } 125 } 126 127 /** 128 * 各オブジェクトから自分のインスタンスを返します。 129 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に 130 * まかされます。 131 * 132 * @param clm DBColumnオブジェクト 133 * 134 * @return CellRendererオブジェクト 135 * @og.rtnNotNull 136 */ 137 public CellRenderer newInstance( final DBColumn clm ) { 138 return new Renderer_AUTOAREA( clm ); 139 } 140 141 /** 142 * データの表示用文字列を返します。 143 * 144 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 145 * 146 * @param value 入力値 147 * 148 * @return データの表示用文字列 149 * @og.rtnNotNull 150 */ 151 @Override 152 public String getValue( final String value ) { 153 return getRowsColsValue( value==null ? "" : value,cols1,rows1 ); 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 * ファイル等に出力する形式を想定しますので、HTMLタグを含まない 175 * データを返します。 176 * 基本は、#getValue( String ) をそのまま返します。 177 * 178 * @og.rev 6.0.4.0 (2014/11/28) データ出力用のレンデラー 179 * 180 * @param value 入力値 181 * 182 * @return データ出力用の文字列 183 * @og.rtnNotNull 184 * @see #getValue( String ) 185 */ 186 @Override 187 public String getWriteValue( final String value ) { 188 return value==null ? "" : value; 189 } 190 191 /** 192 * 自動表示する行列の数を求めて、値を返します。 193 * 行数は、引数の文字列中に含まれる 改行コードの個数を求めます。 194 * 列数は、各行数のなかの最大桁数より求めます。これには半角、全角が含まれる為、 195 * 半角換算での文字数ということになります。 196 * 行数と列数が、初期設定の行数と列数より小さい場合は、初期設定値が使用されます。 197 * 198 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 199 * 200 * @param value 入力値 表示文字列 201 * @param cols 最小カラム数 202 * @param rows 最小行数 203 * 204 * @return データ表示用の文字列 205 * @og.rtnNotNull 206 */ 207 private String getRowsColsValue( final String value,final int cols, final int rows ) { 208 // 6.0.4.0 (2014/11/28) null は引数に来ない。 209 210 final StringTokenizer token = new StringTokenizer( value, "\n", true ); 211 212 int cntRow = 1; 213 int maxCol = 0; 214 while( token.hasMoreTokens() ) { 215 final String val = token.nextToken(); 216 if( "\n".equals( val ) ) { cntRow++; } 217 else { 218 final byte[] byteValue = StringUtil.makeByte( val,CODE ); // 3.5.5.3 (2004/04/09) 219 final int byteSize = byteValue.length; 220 if( maxColSize > 0 && byteSize > maxColSize ) { // 最大列数 221 cntRow += byteSize / maxColSize; 222 maxCol = maxColSize ; 223 } 224 else if( byteSize > maxCol ) { maxCol = byteSize; } 225 } 226 if( maxRowSize > 0 && cntRow >= maxRowSize ) { // 最大行数 227 cntRow = maxRowSize; 228 break; 229 } 230 } 231 232 maxCol += 2; // マージン。フォントや画面サイズに影響する為、比率のほうがよい? 233 234 // 6.0.4.0 (2014/11/28) 配列にいれずに、直接設定する。 235 236 // 6.0.4.0 (2014/11/28) タグを作成する処理も、ここで行います。 237 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 238 return new TagBuffer( "textarea" ) 239 .add( "cols" , String.valueOf( Math.max( cols,maxCol ) ) ) // 6.1.1.0 (2015/01/17) ソースの見やすさ優先 240 .add( "rows" , String.valueOf( Math.max( rows,cntRow ) ) ) 241 .add( "readonly", "readonly" ) 242 .add( "class" , "renderer-textarea" ) 243 .add( tagBuffer.makeTag() ) 244 .addBody( value ) 245 .makeTag(); 246 } 247}