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.io;
017
018 import java.io.PrintWriter;
019 import java.util.List;
020 import java.util.Map ;
021 import java.util.LinkedHashMap ;
022
023 import org.odftoolkit.odfdom.OdfFileDom;
024 import org.odftoolkit.odfdom.doc.office.OdfOfficeAutomaticStyles;
025 import org.odftoolkit.odfdom.doc.office.OdfOfficeMasterStyles;
026 import org.odftoolkit.odfdom.doc.style.OdfStyle;
027 import org.odftoolkit.odfdom.doc.style.OdfStyleFooter;
028 import org.odftoolkit.odfdom.doc.style.OdfStyleFooterLeft;
029 import org.odftoolkit.odfdom.doc.style.OdfStyleHeader;
030 import org.odftoolkit.odfdom.doc.style.OdfStyleHeaderLeft;
031 import org.odftoolkit.odfdom.doc.style.OdfStyleMasterPage;
032 import org.odftoolkit.odfdom.doc.style.OdfStylePageLayout;
033 import org.odftoolkit.odfdom.doc.style.OdfStyleParagraphProperties;
034 import org.odftoolkit.odfdom.doc.style.OdfStyleTableCellProperties;
035 import org.odftoolkit.odfdom.doc.table.OdfTableCell;
036 import org.odftoolkit.odfdom.doc.table.OdfTableRow;
037 import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
038 import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
039 import org.w3c.dom.Node;
040
041 import org.opengion.fukurou.model.NativeType;
042 import org.opengion.fukurou.util.HybsEntry;
043 import org.opengion.hayabusa.common.HybsSystemException;
044 import org.opengion.hayabusa.db.DBColumn;
045 import org.opengion.hayabusa.db.DBTableModel;
046
047 /**
048 * Calcファイルの書き?しクラスです?
049 *
050 * こ?クラスでは??常の出力クラスと異なり???タ部?は、データではなく?
051 * {@カラ?_行番号}が?力されます?
052 *
053 * こ?出力結果は??常、Calc帳票シス?の雛形を作?するための、???として
054 * 利用することを想定して?す?
055 *
056 * writeTableParam タグで key="Size" を指定できます?これは、作?するレコード???タ件数です?
057 * 初期値は?5件です?
058 *
059 * @og.group ファイル出?
060 *
061 * @version 5.0
062 * @author Hiroki Nakamura
063 * @since JDK6.0,
064 */
065 public class TableWriter_CalcDef extends TableWriter_Calc {
066 //* こ?プログラ??VERSION??を設定します? {@value} */
067 private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
068
069 // 5.6.6.1 (2013/07/12) keys の整合?チェ?を行います?
070 private static final Map<String,String> keysMap = new LinkedHashMap<String,String>();
071
072 static {
073 keysMap.put( "SIZE" , "レコード???タ件数(初期値:25)" );
074 }
075
076 private static final int INIT_DATA_SIZE = 25;
077
078 private int dataSize = INIT_DATA_SIZE;
079
080 /**
081 * PrintWriter に DBTableModelの??ブル??を書き込みます?
082 * こ?クラスでは?データ??ルコー??ション(")で囲みます?
083 * PrintWriter に DBTableModelの??ブル??を書き込みます?
084 *
085 * @og.rev 5.1.8.0 (2010/07/01) コメント??CalcDefAno)追?よる対?
086 *
087 * @param table DBTableModelオブジェク?
088 * @param writer PrintWriterオブジェク?
089 */
090 @Override
091 protected void writeData( final DBTableModel table,final PrintWriter writer ) {
092 for( int r=0; r<dataSize; r++ ) {
093 OdfTableRow row = new OdfTableRow( contentDom );
094
095 if( useNumber ) {
096 // String val = "ROWNO_" + String.valueOf( r );
097 String val = "ROWNO_" + r ;
098 row.appendCell( createTextCell( contentDom, val, null, true, true ) );
099 }
100
101 boolean[] cellType = new boolean[numberOfColumns];
102 for( int i=0; i<numberOfColumns; i++ ) {
103 int clm = clmNo[i];
104 NativeType nativeType = dbColumn[clm].getNativeType();
105 switch( nativeType ) {
106 case INT :
107 case LONG :
108 case DOUBLE :
109 cellType[i] = true ;
110 break;
111 case STRING :
112 case CALENDAR :
113 default :
114 cellType[i] = false ;
115 break;
116 }
117 }
118
119 for( int i=0; i<numberOfColumns; i++ ) {
120 int clm = clmNo[i];
121 // String val = String.valueOf( table.getColumnName( clm ) ) + "_" + String.valueOf( r );
122 String val = table.getColumnName( clm ) + "_" + r ;
123 row.appendCell( createTextCell( contentDom, val, table.getDBColumn( clm ), cellType[i], false ) );
124 row.setStyleName( "ro1" );
125 }
126
127 sheet.appendRow( row );
128 }
129 }
130
131 /**
132 * ?ストコン??のセルを生成す?
133 *
134 * @og.rev 5.1.8.0 (2010/07/01) コメント??CalcDefAno)追?よる対?
135 *
136 * @param contentDom OdfFileDomオブジェク?
137 * @param content コン??
138 * @param col DBColumnオブジェク?
139 * @param isCellTypeNumber [true:数字型/false:?型]
140 * @param isNumberList [true:数字リス?999/false:通常]
141 *
142 * @return ?ストコン??のセル
143 */
144 // protected OdfTableCell createTextCell( final OdfFileDom contentDom, final String content, final Boolean isCellTypeNumber, final Boolean isNumberList ) {
145 protected OdfTableCell createTextCell( final OdfFileDom contentDom, final String content, final DBColumn col, final Boolean isCellTypeNumber, final Boolean isNumberList ) {
146 OdfTableCell cell = super.createTextCell( contentDom, "{@" + content + "}", false, isNumberList );
147 if( isNumberList ) {
148 OdfStyle style = contentAutoStyles.newStyle( OdfStyleFamily.TableCell );
149 style.setProperty( OdfStyleTableCellProperties.TextAlignSource, "fix" );
150 style.setProperty( OdfStyleTableCellProperties.RepeatContent, "false" );
151 style.setProperty( OdfStyleParagraphProperties.TextAlign, "end" );
152 style.setProperty( OdfStyleParagraphProperties.MarginRight, "0cm" );
153 String cellStyleName = style.getStyleNameAttribute();
154 cell.setStyleName( cellStyleName );
155 }
156
157 return cell;
158 }
159
160 /**
161 * ?ォルトで用意されて?Stylesを調整します?
162 *
163 * ヘッ??表示しな?
164 * フッターを数字?みにして、右端に出?
165 * ペ?ジレイアウトを横にする
166 * ペ?ジの設定を、拡大縮小モードを「印刷?を?ージ数に合わせる」に設?1ペ?ジ)
167 */
168 @Override
169 protected void resetAutoStylesAndMasterStyles() {
170 try {
171 // AutomaticStyles調整
172 OdfOfficeAutomaticStyles oas = wb.getStylesDom().getAutomaticStyles();
173 OdfStylePageLayout spl = oas.getPageLayout( "pm1" );
174 spl.setProperty( StylePageLayoutPropertiesElement.PageHeight, "21.00cm" );
175 spl.setProperty( StylePageLayoutPropertiesElement.PageWidth, "29.70cm" );
176 spl.setProperty( StylePageLayoutPropertiesElement.PrintOrientation, "landscape" );
177 spl.setProperty( StylePageLayoutPropertiesElement.ScaleToPages, "1" );
178
179 // MasterStyles調整
180 OdfOfficeMasterStyles oms = wb.getOfficeMasterStyles();
181 OdfStyleMasterPage smp = oms.getMasterPage( "Default" );
182
183 // MasterPageの?ォルトで用意されて?ノ?ドを削除
184 Node fcd = smp.getFirstChild();
185 while( fcd != null ) {
186 smp.removeChild( fcd );
187 fcd = smp.getFirstChild();
188 }
189
190 // MasterPageのノ?ドを定義と追?
191 OdfStyleHeader sh = new OdfStyleHeader( wb.getStylesDom() );
192 OdfStyleHeaderLeft shl = new OdfStyleHeaderLeft( wb.getStylesDom() );
193 sh.setStyleDisplayAttribute( false );
194 shl.setStyleDisplayAttribute( false );
195 smp.appendChild( sh );
196 smp.appendChild( shl );
197 OdfStyleFooter sf = new OdfStyleFooter( wb.getStylesDom() );
198 OdfStyleFooterLeft sfl = new OdfStyleFooterLeft( wb.getStylesDom() );
199 sf.newStyleRegionRightElement().newTextPElement().newTextPageNumberElement();
200 sfl.setStyleDisplayAttribute( false );
201 smp.appendChild( sf );
202 smp.appendChild( sfl );
203 }
204 catch( Exception ex ) {
205 String errMsg = "AutomaticStylesとMasterStyles調整できません";
206 throw new HybsSystemException( errMsg, ex );
207 }
208 }
209
210 /**
211 * パラメーターリストをセ?します?
212 * ?は、HybsEntry クラスを持って?す?
213 * 引数が?null の場合?、何もしません?
214 *
215 * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?を行います?
216 *
217 * @param listParam HybsEntryリス?
218 */
219 @Override
220 public void setParam( final List<HybsEntry> listParam ) {
221 if( listParam != null && !listParam.isEmpty() ) {
222 for( HybsEntry entry : listParam ) {
223
224 String key = entry.getKey() ; // 5.6.6.1 (2013/07/12) keys の整合?チェ?
225 checkParam( key , keysMap );
226
227 String val = entry.getValue() ; // 5.6.6.1 (2013/07/12) val を?に取?
228 if( val != null && val.length() > 0 ) {
229 if( "Size".equalsIgnoreCase( key ) ) {
230 dataSize = Integer.parseInt( val );
231 }
232 }
233
234 // if( "Size".equalsIgnoreCase( entry.getKey() ) ) {
235 // dataSize = Integer.parseInt( entry.getValue() );
236 // }
237 }
238 }
239 }
240 }