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.hayabusa.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020import org.opengion.fukurou.util.StringUtil ;
021import org.opengion.fukurou.util.ToString;
022
023import static org.opengion.fukurou.util.StringUtil.nval ;
024
025/**
026 * ExcelImageFileParamTag は、ExcelFileTagの画像挿入のパラメーターを渡す為のタグクラスです。
027 *
028 * ExcelFileTag は、EXCELを加工するための 入力、出力を備えたタグで、
029 * addImageFile 属性に相当するパラメータを複数指定するためのタグです。
030 *
031 * @og.formSample
032 * ●形式:<og:excelFile action="…" fileURL="…" ・・・ > lt;og:excelImageFileParam … /> </og:excelFile>
033 * ●body:あり
034 *
035 * ●Tag定義:
036 *  <og:excelImageFileParam
037 *       fileURL            【TAG】画像ファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
038 *       imageFile        ○【TAG】挿入するイメージファイル名
039 *       sheetName          【TAG】挿入するシート名(null=先頭シート)
040 *       sheetNo            【TAG】挿入するシート番号(初期値:0)
041 *       rowNo              【TAG】挿入する行(開始)(初期値:0)
042 *       colNo              【TAG】挿入する列(開始)(初期値:0)
043 *       colId              【TAG】挿入する列記号(A,B,C…)(開始)(null=先頭列)
044 *       rowEndNo           【TAG】挿入する行(終了-含まず)(初期値:0)
045 *       colEndNo           【TAG】挿入する列(終了-含まず)(初期値:0)
046 *       colEndId           【TAG】挿入する列記号(A,B,C…)(終了-含まず)(null=先頭列)
047 *       dx1                【TAG】開始セルのX軸座標のオフセット(ピクセル)(初期値:0)
048 *       dy1                【TAG】開始セルのY軸座標のオフセット(ピクセル)(初期値:0)
049 *       dx2                【TAG】終了セルのX軸座標のオフセット(ピクセル)(初期値:0)
050 *       dy2                【TAG】終了セルのY軸座標のオフセット(ピクセル)(初期値:0)
051 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
052 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
053 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
054 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
055 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
056 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
057 *  />
058 *
059 * ●使用例
060 *    ・【entry.jsp】
061 *         <og:excelFile file1="input.xls" file2="input.xls" addTitleSheet="Title" >
062 *            <og:excelImageFileParam
063 *               fileURL    = "{@USER.ID}"
064 *               imageFile  = "test.png"
065 *               sheetName  = "Sheet1"
066 *               rowNo      = "5"
067 *               colID      = "G"
068 *            />
069 *         </og:tableUpdate>
070 *
071 * @og.rev 7.2.9.0 (2020/10/12) 新規作成
072 * @og.group その他部品
073 *
074 * @version  7.2
075 * @author   Kazuhiko Hasegawa
076 * @since    JDK11.0,
077 */
078public class ExcelImageFileParamTag extends CommonTagSupport {
079        /** このプログラムのVERSION文字列を設定します。   {@value} */
080        private static final String VERSION = "7.2.9.0 (2020/10/12)" ;
081        private static final long serialVersionUID = 729020201012L ;
082
083        private String  fileURL                 = HybsSystem.sys( "FILE_URL" );         // 【TAG】画像ファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
084        private String  imageFile               ;               // 【TAG】挿入するイメージファイル名
085        private String  sheetName               ;               // 【TAG】挿入するシート名(null=先頭シート)
086        private int             sheetNo                 = -1;   // 【TAG】挿入するシート番号(初期値:0)
087        private int     rowNo                   ;               // 【TAG】挿入する行(開始)(初期値:0)
088        private int     colNo                   = -1;   // 【TAG】挿入する列(開始)(初期値:0)
089        private int     rowEndNo                ;               // 【TAG】挿入する行(終了-含まず)(初期値:0)
090        private int     colEndNo                = -1;   // 【TAG】挿入する列(終了-含まず)(初期値:0)
091        private int     dx1                             ;               // 【TAG】開始セルのX軸座標のオフセット(ピクセル)(初期値:0)
092        private int     dy1                             ;               // 【TAG】開始セルのY軸座標のオフセット(ピクセル)(初期値:0)
093        private int     dx2                             ;               // 【TAG】終了セルのX軸座標のオフセット(ピクセル)(初期値:0)
094        private int     dy2                             ;               // 【TAG】終了セルのY軸座標のオフセット(ピクセル)(初期値:0)
095
096        /**
097         * デフォルトコンストラクター
098         *
099         */
100        public ExcelImageFileParamTag() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
101
102        /**
103         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
104         *
105         * @return      後続処理の指示
106         */
107        @Override
108        public int doEndTag() {
109                debugPrint();
110                if( !useTag() || imageFile == null ) { return EVAL_PAGE ; }     // 6.3.4.0 (2015/08/01)
111
112                final ExcelFileTag excelTag = (ExcelFileTag)findAncestorWithClass( this,ExcelFileTag.class );
113                if( excelTag == null ) {
114                        final String errMsg = "<b>" + getTagName() + "タグは、ExcelFileTagの内側(要素)に記述してください。</b>";
115                        throw new HybsSystemException( errMsg );
116                }
117
118                final String directory = HybsSystem.url2dir( fileURL );
119                final String fname = StringUtil.urlAppend( directory,imageFile );
120
121                excelTag.addImgFile( fname,sheetName,sheetNo,rowNo,colNo,rowEndNo,colEndNo,dx1,dy1,dx2,dy2 ) ;
122
123                return EVAL_PAGE ;
124        }
125
126        /**
127         * タグリブオブジェクトをリリースします。
128         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
129         */
130        @Override
131        protected void release2() {
132                super.release2();                       // 3.5.6.0 (2004/06/18) 追加(抜けていた)
133                fileURL         = HybsSystem.sys( "FILE_URL" );         // 【TAG】画像ファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
134                imageFile       = null ;                // 【TAG】挿入するイメージファイル名
135                sheetName       = null ;                // 【TAG】挿入するシート名(null=先頭シート)
136                sheetNo         = -1 ;                  // 【TAG】挿入するシート番号(初期値:0)
137                rowNo           = 0 ;                   // 【TAG】挿入する行(開始)(初期値:0)
138                colNo           = -1 ;                  // 【TAG】挿入する列(開始)(初期値:0)
139                rowEndNo        = 0 ;                   // 【TAG】挿入する行(終了-含まず)(初期値:0)
140                colEndNo        = -1 ;                  // 【TAG】挿入する列(終了-含まず)(初期値:0)
141                dx1                     = 0 ;                   // 【TAG】開始セルのX軸座標のオフセット(ピクセル)(初期値:0)
142                dy1                     = 0 ;                   // 【TAG】開始セルのY軸座標のオフセット(ピクセル)(初期値:0)
143                dx2                     = 0 ;                   // 【TAG】終了セルのX軸座標のオフセット(ピクセル)(初期値:0)
144                dy2                     = 0 ;                   // 【TAG】終了セルのY軸座標のオフセット(ピクセル)(初期値:0)
145        }
146
147        /**
148         * 【TAG】画像ファイルのディレクトリを指定します
149         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
150         *
151         * @og.tag
152         * この属性で指定されるディレクトリからイメージファイルを取得します。
153         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
154         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
155         * fileURL = "{&#064;USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、
156         * さらに、各個人ID別のフォルダを作成して、そこから取得します。
157         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
158         *
159         * @param       url 画像ファイルのディレクトリ名
160         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
161         */
162        public void setFileURL( final String url ) {
163                final String furl = nval( getRequestParameter( url ),null );
164                if( furl != null ) {
165                        fileURL = StringUtil.urlAppend( fileURL,furl );
166                }
167        }
168
169        /**
170         * 【TAG】挿入するイメージファイル名をセットします(初期値:null)。
171         *
172         * @og.tag ファイル名が存在しない場合は、何も実行しません。
173         *
174         * @param   fname イメージファイル名
175         */
176        public void setImageFile( final String fname ) {
177                imageFile = nval( getRequestParameter( fname ),imageFile );
178        }
179
180        /**
181         * 【TAG】挿入するシート名を設定します(初期値:指定なし)。
182         *
183         * @og.tag
184         * EXCELファイルに画像を挿入する場合のシート名を指定します。
185         * sheetNo と sheetName が同時に指定された場合は、sheetNo が優先されます。
186         * エラーにはならないのでご注意ください。
187         * 初期値は、指定なしです。
188         *
189         * @param   sheet EXCELファイルのシート名
190         * @see         #setSheetNo( String )
191         */
192        public void setSheetName( final String sheet ) {
193                sheetName = nval( getRequestParameter( sheet ),sheetName );
194        }
195
196        /**
197         * 【TAG】挿入するシート番号を指定します(初期値:0)。
198         *
199         * @og.tag
200         * EXCELファイルに画像を挿入する場合のシート番号を指定します
201         * シート番号は、0 から始まる数字で表します。
202         *
203         * sheetNo と sheetName が同時に指定された場合は、sheetNo が優先されます。
204         * エラーにはならないのでご注意ください。
205         * 初期値は、0(第1シート) です。
206         *
207         * @param   sheet EXCELファイルのシート番号(0から始まる)
208         * @see         #setSheetName( String )
209         */
210        public void setSheetNo( final String sheet ) {
211                sheetNo = nval( getRequestParameter( sheet ),sheetNo );
212        }
213
214        /**
215         * 【TAG】挿入する行番号(開始)を指定します(初期値:0)。
216         *
217         * @og.tag
218         * EXCELファイルに画像を挿入する場合の左上端(アンカーの位置)の行番号を指定します
219         * 行番号は、0 から始まる数字で表します。
220         * 初期値は、0(先頭行) です。
221         *
222         * @param   row 挿入する行番号(開始)
223         * @see         #setColNo( String )
224         */
225        public void setRowNo( final String row ) {
226                rowNo = nval( getRequestParameter( row ),rowNo );
227        }
228
229        /**
230         * 【TAG】挿入する列番号(開始)を指定します(初期値:0)。
231         *
232         * @og.tag
233         * EXCELファイルに画像を挿入する場合の左上端(アンカーの位置)の列番号を指定します
234         * 列番号は、0 から始まる数字で表します。
235         * 初期値は、0(左先頭列) です。
236         *
237         * colNo と colID が同時に指定された場合は、colNo が優先されます。
238         * エラーにはならないのでご注意ください。
239         *
240         * @param   col 挿入する列番号(開始)
241         * @see         #setRowNo( String )
242         */
243        public void setColNo( final String col ) {
244                colNo = nval( getRequestParameter( col ),colNo );
245        }
246
247        /**
248         * 【TAG】挿入する列記号(A,B,C…)(開始)を指定します(初期値:0)。
249         *
250         * @og.tag
251         * EXCELファイルに画像を挿入する場合の左上端(アンカーの位置)の列記号(A,B,C…)を指定します
252         * 列記号は、A から始まる英字で表します。
253         * 初期値は、未指定です。
254         *
255         * colNo と colID が同時に指定された場合は、colNo が優先されます。
256         * エラーにはならないのでご注意ください。
257         *
258         * @param   col 挿入する列記号(A,B,C…)(開始)
259         * @see         #setColNo( String )
260         */
261        public void setColId( final String col ) {
262                final String colId = nval( getRequestParameter( col ),null );
263                if( colId != null && colNo < 0 ) {                                      // colNo の初期値は、-1。 +1 して、26 かける処理をしているので、辻褄合わせ
264                        for( int i=0; i<colId.length(); i++ ) {
265                                final char ch = colId.charAt(i);
266                                if( 'A' <= ch && ch <= 'Z' ) { colNo = (colNo+1)*26 + ch-'A'; }
267                        }
268                }
269        }
270
271        /**
272         * 【TAG】挿入する行番号(終了-含まず)を指定します(初期値:0)。
273         *
274         * @og.tag
275         * EXCELファイルに画像を挿入する場合の右下端の行番号を指定します
276         * 行番号は、0 から始まる数字で表します。
277         * 初期値は、0(未指定) です。
278         *
279         * @param   row 挿入する行番号(終了-含まず)
280         * @see         #setColEndNo( String )
281         */
282        public void setRowEndNo( final String row ) {
283                rowEndNo = nval( getRequestParameter( row ),rowEndNo );
284        }
285
286        /**
287         * 【TAG】挿入する列番号(終了-含まず)を指定します(初期値:0)。
288         *
289         * @og.tag
290         * EXCELファイルに画像を挿入する場合の右下端の列番号を指定します
291         * 列番号は、0 から始まる数字で表します。
292         * 初期値は、0(未指定) です。
293         *
294         * colNo と colID が同時に指定された場合は、colNo が優先されます。
295         * エラーにはならないのでご注意ください。
296         *
297         * @param   col 挿入する列番号(終了-含まず)
298         * @see         #setRowEndNo( String )
299         */
300        public void setColEndNo( final String col ) {
301                colEndNo = nval( getRequestParameter( col ),colEndNo );
302        }
303
304        /**
305         * 【TAG】挿入する列記号(A,B,C…)(終了-含まず)を指定します(初期値:0)。
306         *
307         * @og.tag
308         * EXCELファイルに画像を挿入する場合の右下端の列記号(A,B,C…)を指定します
309         * 列記号は、A から始まる英字で表します。
310         * 初期値は、未指定です。
311         *
312         * colEndNo と colID が同時に指定された場合は、colEndNo が優先されます。
313         * エラーにはならないのでご注意ください。
314         *
315         * @param   col 挿入する列記号(A,B,C…)(終了-含まず)
316         * @see         #setColEndNo( String )
317         */
318        public void setColEndId( final String col ) {
319                final String colId = nval( getRequestParameter( col ),null );
320                if( colId != null && colEndNo < 0 ) {                                   // colEndNo の初期値は、-1。 +1 して、26 かける処理をしているので、辻褄合わせ
321                        for( int i=0; i<colId.length(); i++ ) {
322                                final char ch = colId.charAt(i);
323                                if( 'A' <= ch && ch <= 'Z' ) { colEndNo = (colEndNo+1)*26 + ch-'A'; }
324                        }
325                }
326        }
327
328        /**
329         * 【TAG】開始セルのX軸座標のオフセット(ピクセル)を指定します(初期値:0)。
330         *
331         * @og.tag
332         * 開始セルのX軸座標のオフセット(ピクセル)を指定します(初期値:0)。
333         * 初期値は、0(未指定) です。
334         *
335         * @param   dx 開始セルのX軸座標のオフセット(ピクセル)
336         */
337        public void setDx1( final String dx ) {
338                dx1 = nval( getRequestParameter( dx ),dx1 );
339        }
340
341        /**
342         * 【TAG】開始セルのY軸座標のオフセット(ピクセル)を指定します(初期値:0)。
343         *
344         * @og.tag
345         * 開始セルのY軸座標のオフセット(ピクセル)を指定します(初期値:0)。
346         * 初期値は、0(未指定) です。
347         *
348         * @param   dy 開始セルのY軸座標のオフセット(ピクセル)
349         */
350        public void setDy1( final String dy ) {
351                dy1 = nval( getRequestParameter( dy ),dy1 );
352        }
353
354        /**
355         * 【TAG】終了セルのX軸座標のオフセット(ピクセル)を指定します(初期値:0)。
356         *
357         * @og.tag
358         * 終了セルのX軸座標のオフセット(ピクセル)を指定します(初期値:0)。
359         * 初期値は、0(未指定) です。
360         *
361         * @param   dx 終了セルのX軸座標のオフセット(ピクセル)
362         */
363        public void setDx2( final String dx ) {
364                dx2 = nval( getRequestParameter( dx ),dx2 );
365        }
366
367        /**
368         * 【TAG】終了セルのY軸座標のオフセット(ピクセル)を指定します(初期値:0)。
369         *
370         * @og.tag
371         * 終了セルのY軸座標のオフセット(ピクセル)を指定します(初期値:0)。
372         * 初期値は、0(未指定) です。
373         *
374         * @param   dy 終了セルのY軸座標のオフセット(ピクセル)
375         */
376        public void setdy2( final String dy ) {
377                dy2 = nval( getRequestParameter( dy ),dy2 );
378        }
379
380        /**
381         * このオブジェクトの文字列表現を返します。
382         * 基本的にデバッグ目的に使用します。
383         *
384         * @return このクラスの文字列表現
385         * @og.rtnNotNull
386         */
387        @Override
388        public String toString() {
389                return ToString.title( this.getClass().getName() )
390                                .println( "VERSION"                     ,VERSION                )
391                                .println( "fileURL"                     ,fileURL                )
392                                .println( "imageFile"           ,imageFile              )
393                                .println( "sheetName"           ,sheetName              )
394                                .println( "sheetNo"             ,sheetNo                )
395                                .println( "rowNo"                       ,rowNo                  )
396                                .println( "colNo"                       ,colNo                  )
397                                .println( "rowEndNo"            ,rowEndNo               )
398                                .println( "colEndNo"            ,colEndNo               )
399                                .println( "dx1"                         ,dx1                    )
400                                .println( "dy1"                         ,dy1                    )
401                                .println( "dx2"                         ,dx2                    )
402                                .println( "dy2"                         ,dy2                    )
403                                .fixForm().toString() ;
404        }
405}