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.view;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.fukurou.util.StringUtil;
020    import org.opengion.fukurou.util.XHTMLTag;
021    import org.opengion.hayabusa.html.AbstractViewForm;
022    import org.opengion.hayabusa.html.ViewCalendarParam;
023    
024    import java.util.Calendar;
025    
026    /**
027     * ?‘ヶ月å?ã®ã‚«ãƒ¬ãƒ³ãƒ??å½¢å¼ã§ã€æ¤œç´¢çµæžœã‚’表示ã™ã‚‹ã€ã‚«ãƒ¬ãƒ³ãƒ??表示クラスã§ã™ã?
028     *
029     * AbstractViewForm ã«ã‚ˆã‚Šã€setter/getterメソãƒ?ƒ‰ã®ãƒ?ƒ•ォルト実è£?‚’æä¾›ã—ã¦ã?¾ã™ã?
030     * å„HTMLã®ã‚¿ã‚°ã«å¿?¦ãª setter/getterメソãƒ?ƒ‰ã®ã¿?Œè¿½åŠ?®šç¾©ã—ã¦ã?¾ã™ã?
031     *
032     * AbstractViewForm を継承ã—ã¦ã?‚‹ç‚º,ロケールã«å¿œã˜ãŸãƒ©ãƒ™ãƒ«ã‚’å?力ã•ã›ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
033     *
034     * @og.group ç”»é¢è¡¨ç¤º
035     *
036     * @version  4.0
037     * @author   Kazuhiko Hasegawa
038     * @since    JDK5.0,
039     */
040    public class ViewForm_HTMLCalendar extends AbstractViewForm {
041            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
042            private static final String VERSION = "5.1.6.0 (2010/05/01)" ;
043    
044            private static final String[] WEEK_ja = { "æ—¥" ,"æœ? ,"ç«" ,"æ°´" ,"木" ,"é‡? ,"åœ? ,"æ—¥" ,"æœ? };
045            private static final String[] WEEK_en = { "SUN","MON","TUE","WED","THU","FRI","SAT","SUN","MON" };
046            private static final String[] WEEK_MK = { "SUN","",   "",   "",   "",   "",   "SAT","SUN",""    };
047    
048            private String[] week              ;
049            private String[] viewKeys          ;            // カレンãƒ?‚’æŒ?®šã™ã‚‹ã‚­ãƒ¼é…å?       // 3.6.0.0 (2004/09/17)
050            private String   ymKey             ;            // 年月ã?カラãƒ?
051            private String   dayKey            ;            // 休日(0:通常ã€?:休日)ã®ã‚«ãƒ©ãƒ?
052            private String   valKey            ;            // カレンãƒ?«è¡¨ç¤ºã™ã‚‹å€¤ã®ã‚«ãƒ©ãƒ?
053            private boolean  valueBrFlag   ;                // 日付ã‘ã¨å€¤ã®é–“ã«ã€BRã‚¿ã‚°ã‚’å?れるã‹ã©ã?‹
054            private int              firstWeek         ;            // 曜日ã®é–‹å§?0:æ—¥æ›?1:月曜)
055            private int              columnSize        ;            // カレンãƒ??横方å‘ã?ç¹°ã‚Šè¿”ã—æ•°    // 3.6.0.0 (2004/09/17)
056    
057            // 4.3.4.4 (2009/01/01)
058    //      /**
059    //       * ãƒ?ƒ•ォルトコンストラクター
060    //       *
061    //       */
062    //      public ViewForm_HTMLCalendar() {
063    //              super();
064    //      }
065    
066            /**
067             * DBTableModel ã‹ã‚‰ HTMLæ–?­—å?を作æ?ã—ã¦è¿”ã—ã¾ã™ã?
068             * startNo(表示開始ä½ç½®)ã‹ã‚‰ã€pageSize(表示件数)ã¾ã§ã®Viewæ–?­—å?を作æ?ã—ã¾ã™ã?
069             * 表示残りãƒ??ã‚¿ã?pageSize 以下ã?å ´åˆã?,残りã®ãƒ??ã‚¿ã‚’ã™ã¹ã¦å‡ºåŠ›ã—ã¾ã™ã?
070             *
071             * @og.rev 3.5.2.1 (2003/10/27) 属æ?å€¤ã®æŒ?®šã?シングルクオートをãƒ?ƒ–ルクオートã«å¤‰æ›´ã€?
072             * @og.rev 3.6.0.0 (2004/09/17) è¤?•°ã‚«ãƒ¬ãƒ³ãƒ?«å¯¾å¿?
073             * @og.rev 3.6.0.5 (2004/10/18) calenderParam ã® viewKeys ãƒã‚°å¯¾å¿œã?
074             * @og.rev 3.7.0.1 (2005/01/31) 全件ãƒã‚§ãƒ?‚¯ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«å‡¦ç?¤‰æ›´
075             *
076             * @param  startNo    表示開始ä½ç½®
077             * @param  pageSize   表示件数
078             *
079             * @return  DBTableModelã‹ã‚‰ä½œæ?ã•れã?HTMLæ–?­—å?
080             */
081            public String create( final int startNo, final int pageSize )  {
082                    if( getRowCount() == 0 ) { return ""; } // 暫定å?ç½®
083    
084                    paramInit();
085    
086                    int lastNo = getLastNo( startNo, pageSize );
087    
088                    StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE );
089                    out.append( "<table><tr>" ).append( HybsSystem.CR );
090    
091                    boolean onlyOne = ( ( lastNo - startNo ) == 1 );        // äº’æ›æ€§ã®ãŸã‚ã€?¼‘ä»¶ã®å‡¦ç??ã¿å¤‰æ›´
092    
093                    // 3.7.0.1 (2005/01/31) 全件ãƒã‚§ãƒ?‚¯ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«å‡¦ç?¤‰æ›´
094                    if( ! onlyOne && isUseCheckControl() && "checkbox".equals( getSelectedType() ) ) {
095                            out.append( "<tr><td>" ).append( getAllCheckControl() ).append( "</td></tr>");
096                    }
097    
098                    for( int row=startNo; row<lastNo; row++ ) {
099                            out.append( "<td valign=\"top\">" );
100    
101                            if( isWritable( row ) ) {
102                                    if( onlyOne ) {
103                                            out.append( XHTMLTag.hidden( HybsSystem.ROW_SEL_KEY,String.valueOf( row ) ) );
104                                            out.append( HybsSystem.CR );
105                                    }
106                                    else {
107                                            out.append( "<input type=\"" ).append( getSelectedType() ).append( "\" " );
108                                            out.append( "name=\"" ).append( HybsSystem.ROW_SEL_KEY ).append( "\" " );
109                                            if( isChecked( row ) ) { out.append( " checked=\"checked\"" ); }
110                                            out.append( "value=\"" ).append( row ).append( "\" />" );
111                                    }
112                            }
113    
114                            // 3.6.0.5 (2004/10/18)
115                            for( int col = 0; col < viewKeys.length; col++ ) {
116                                    if( "_".equals( viewKeys[col] ) ) { continue; }
117                                    int newCol = getColumnNo( viewKeys[col] );
118                                    out.append("<span id=\"label\">");
119                                    out.append( getColumnLabel( newCol ) );
120                                    out.append( ":</span>" );
121                                    out.append( getValueLabel(row,newCol) );
122                                    out.append( "&nbsp;" );
123                            }
124                            out.append( HybsSystem.BR );
125    
126                            out.append( makeCalendarData( row ) );
127                            out.append( "</td>" );
128                            if( (row+1) % columnSize == 0 ) {
129                                    out.append( "</tr><tr>" ).append( HybsSystem.CR );
130                            }
131                    }
132                    out.append( "</tr></table>" ).append( HybsSystem.CR );
133    
134                    return out.toString();
135            }
136    
137            /**
138             * DBTableModel ã®æŒ?®šã?行番å·ã‚ˆã‚Šã€ã‚«ãƒ¬ãƒ³ãƒ??HTMLæ–?­—å?を作æ?ã—ã¦è¿”ã—ã¾ã™ã?
139             *
140             * @og.rev 3.6.0.0 (2004/09/17) create( int startNo, int pageSize ) ã®ãƒ­ã‚¸ãƒ?‚¯ã‚’ç§»å‹?
141             * @og.rev 3.6.0.5 (2004/10/18) å°åˆ·æ™‚ã?罫線å?力関連機è?ã®è¿½åŠ??id 属æ?ã‚’å?力ã—ã¾ã™ã?
142             *
143             * @param  row    æŒ?®šã?行番å·
144             *
145             * @return  æŒ?®šã?行番å·ã®ã‚«ãƒ¬ãƒ³ãƒ??HTMLæ–?­—å?
146             */
147            private String makeCalendarData( final int row ) {
148                    String yyyymm = getValue( row,getColumnNo( ymKey ));
149                    Calendar currentCal = getCalendar( yyyymm );
150    
151                    StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE );
152    
153                    out.append( "<table id=\"viewCalendar\" border=\"0\" cellpadding=\"1\" cellspacing=\"2\">" ).append( HybsSystem.CR );     // 3.6.0.5 (2004/10/18)
154                    out.append( "  <tr><td class=\"titleStyle\" colspan=\"7\">" ).append( HybsSystem.CR );
155                    out.append( getValueLabel( row,getColumnNo( ymKey )) ).append( HybsSystem.CR );
156                    out.append( "  </td></tr>" ).append( HybsSystem.CR );
157    
158                    // ä»Šæœˆã®æœ?µ‚æ—¥
159                    int daysInMonth = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
160                    // カレンãƒ??ã®é€±ã®åˆã‚を設定ã™ã‚‹ã?月曜開始ã?カレンãƒ??を作æ?ã™ã‚‹ã¨ãã«åˆ©ç”¨
161                    currentCal.setFirstDayOfWeek( Calendar.SUNDAY + firstWeek );
162    
163                    // 週を表ã™ç•ªå·  ?~ï¼?ã®é–?
164                    int culDay = (currentCal.get(Calendar.DAY_OF_WEEK)
165                                            + ( 7 - currentCal.getFirstDayOfWeek() )) % 7 ;
166    
167                    // 曜日æ¬?‚’記述ã—ã¾ã™ã?
168                    out.append("  <tr>").append( HybsSystem.CR );
169                    for( int i=0; i<7; i++ ) {
170                            out.append("    <td width=\"14%\" class=\"dayHead" );
171                            out.append( WEEK_MK[i+firstWeek] ).append( "\">" );
172                            out.append( week[i+firstWeek] ).append( "</td>" );
173                            out.append( HybsSystem.CR );
174                    }
175                    out.append("  </tr>").append( HybsSystem.CR );
176    
177                    // 第ä¸??ã®æ—¥ä»˜æ¬??空ãスペã?スã®è¨ˆç®?
178                    if( culDay != 0 ) {
179                            out.append("    <td colspan=\"" ).append( culDay ).append( "\">&nbsp;</td>" );
180                    }
181    
182                    // 日付æ¬?‚’埋ã‚ã¾ã™ã?
183                    String BR = (valueBrFlag) ? "<br />" : "" ;
184                    for(int day=1; day <= daysInMonth; day++) {
185                            int    daycol = getColumnNo( dayKey + day );    // 動的日付ã‘カラãƒ?•ªå·å–å¾?
186                            String daylbl = getValueLabel( row,daycol,day );        // ãƒ­ãƒ¼ã‚«ãƒ«ã®æ—¥ä»˜ã‘ラベルを求ã‚るメソãƒ?ƒ‰
187                            String vallbl = "" ;
188                            if( valKey != null ) {
189                                    int valcol = getColumnNo( valKey + day );       // 動的値カラãƒ?•ªå·å–å¾?
190                                    vallbl = BR + getValueLabel( row,valcol );              // 通常ã®å€¤ã‚’ラベルを求ã‚るメソãƒ?ƒ‰
191                            }
192    
193                            if( "1".equals( getValue( row,daycol ))) {
194                                    out.append("    <td class=\"holyday\">" );
195                                    out.append( daylbl );
196                                    out.append( vallbl );
197                                    out.append("</td>");
198                            } else {
199                                    out.append("    <td class=\"day" );
200                                    out.append( WEEK_MK[culDay+firstWeek] );
201                                    out.append("\">");
202                                    out.append( daylbl );
203                                    out.append( vallbl );
204                                    out.append("</td>");
205                            }
206                            out.append( HybsSystem.CR );
207    
208                            // 週ã®çµ‚ã‚りã§ã€è¡Œã‚’折り返ã™ã€?
209                            if( culDay == 6 ) {
210                                    out.append("  </tr>\n  <tr>").append( HybsSystem.CR );
211                                    culDay = 0;
212                            } else {
213                                    culDay++;
214                            }
215                    }
216    
217                    // æœ?µ‚é?ã®æ—¥ä»˜æ¬??空ãスペã?スã®è¨ˆç®?
218                    if((7-culDay) != 0) {
219                            out.append("    <td colspan=\"" ).append( (7-culDay) ).append( "\">&nbsp;</td>" );
220                    }
221                    out.append( HybsSystem.CR );
222    
223                    out.append( "</tr>" ).append( HybsSystem.CR );
224                    out.append( "</table>" ).append( HybsSystem.CR );
225    
226                    return out.toString();
227            }
228    
229            /**
230             * ã“ã?ビã?ã«å¯¾ã™ã‚‹ç‰¹åˆ¥ãªåˆæœŸåŒ–を行ã†ã€?
231             *
232             * @og.rev 3.5.4.0 (2003/11/25) TableFormatter クラスを使用ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€?
233             * @og.rev 3.5.5.9 (2004/06/07) ヘッãƒ??ã®æ—¥ä»˜ã‘表示ã«ã€Locale を加味ã§ãるよã†ã«å¤‰æ›´
234             * @og.rev 3.6.0.0 (2004/09/17) viewKeys , columnSize 属æ?ã®è¿½åŠ?
235             *
236             */
237            private void paramInit() {
238    
239                    String viewKeysCd       = getParam( ViewCalendarParam.VIEW_KEYS                 ,ViewCalendarParam.VIEW_VALUES                  );      // 3.6.0.0 (2004/09/17)
240                    ymKey                           = getParam( ViewCalendarParam.YM_KEY                    ,ViewCalendarParam.YM_VALUE                             );
241                    dayKey                          = getParam( ViewCalendarParam.DAY_KEY                   ,ViewCalendarParam.DAY_VALUE                    );
242                    valKey                          = getParam( ViewCalendarParam.VALUE_KEY                 ,null                                                                   );
243                    String valueBrCd        = getParam( ViewCalendarParam.VALUE_BR_FLAG_KEY ,ViewCalendarParam.VALUE_BR_FLAG_VALUE  );
244                    String firstWeekCd      = getParam( ViewCalendarParam.FIRSTWEEK_KEY             ,ViewCalendarParam.FIRSTWEEK_VALUE              );
245                    String headerLocale     = getParam( ViewCalendarParam.HEADER_LOCALE_KEY ,ViewCalendarParam.HEADER_LOCALE_VALUE  );
246                    String columnSizeCd     = getParam( ViewCalendarParam.COLUMN_SIZE_KEY   ,ViewCalendarParam.COLUMN_SIZE_VALUE    );      // 3.6.0.0 (2004/09/17)
247    
248                    viewKeys    = StringUtil.csv2Array( viewKeysCd );
249                    firstWeek   = Integer.parseInt( firstWeekCd );
250                    valueBrFlag = Boolean.valueOf( valueBrCd ).booleanValue() ;
251                    columnSize  = Integer.parseInt( columnSizeCd );                 // 3.6.0.0 (2004/09/17)
252    
253                    // 曜日ヘッãƒ??をコピã?ã—ã¦ä½œæ?ã—ã¾ã™ã?
254                    if( "ja".equals( headerLocale ) ) {
255                            week = WEEK_ja;
256                    }
257                    else {
258                            week = WEEK_en;
259                    }
260            }
261    
262            /**
263             * row行,columåˆ?ã®ãƒ??ã‚¿ã®å€¤ã‚’HTMLæ–?­—å?ã«å¤‰æ›ã—ã¦è¿”ã—ã¾ã™ã?
264             * リソースãƒãƒ³ãƒ‰ãƒ«ãŒç™»éŒ²ã•れã¦ã?‚‹å ´åˆã?,リソースã«å¿œã˜ã?
265             * HTMLæ–?­—å?を作æ?ã—ã¾ã™ã?
266             * カレンãƒ??Viewã«ç‰¹åŒ–ã—ãŸã?ラベル値を返ã—ã¾ã™ã?
267             *
268             * @og.rev 3.8.0.9 (2005/10/17) writableControl 追åŠ?«ã‚ˆã‚‹å¼•数変更
269             *
270             * @param       row             行番å·
271             * @param       column  カラãƒ?•ªå·
272             * @param       day             日�
273             *
274             * @return      row行,columåˆ?ã®ãƒ??ã‚¿ã®å€¤
275             */
276            private String getValueLabel( final int row, final int column, final int day ) {
277                    if( isColumnWritable( column ) && isWritable( row ) ) {
278                            String val = getValue( row,column ) ;
279                            return day + getEditorValue( row,column,val );
280                    }
281                    else {
282                            return String.valueOf( day );
283                    }
284            }
285    
286            /**
287             * æŒ?®šã?YYYYMMæ–?­—å?ã‹ã‚‰ã€ã‚«ãƒ¬ãƒ³ãƒ??オブジェクトを作æ?ã—ã¦è¿”ã—ã¾ã™ã?
288             * æ—¥ã«ã¡ã¯ã€?¼‘æ—¥ã«ã‚»ãƒ?ƒˆã•れã¾ã™ã?
289             *
290             * @param   ym YYYYMMæ–?­—å?
291             *
292             * @return  カレン�?オブジェク�
293             */
294            private Calendar getCalendar( final String ym ) {
295                    Calendar cal = Calendar.getInstance();
296    
297                    if( ym != null && ym.length() == 6 ) {
298                            int yyyy = Integer.parseInt( ym.substring( 0,4 ) );
299                            int mm   = Integer.parseInt( ym.substring( 4,6 ) ) - 1;
300                            int dd   = 1;
301                            cal.set( yyyy,mm,dd,0,0,0 );
302                    }
303                    else {
304                            // カレンãƒ??を今月ã®?‘æ—¥ã«è¨­å®šã™ã‚‹ã?
305                            cal.set(Calendar.DAY_OF_MONTH, 1);
306                    }
307    
308                    return cal ;
309            }
310    
311            /**
312             * フォーマットメソãƒ?ƒ‰ã‚’使用ã§ãã‚‹ã‹ã©ã?‹ã‚’å•ã?ˆã‚ã›ã¾ã™ã?
313             *
314             * @og.rev 3.6.0.0 (2004/09/17) 親クラス変更ã«ä¼´ãªã??追åŠ?
315             *
316             * @return  使用å¯èƒ½(true)/ 使用ä¸å¯èƒ½ (false)
317             */
318            public boolean canUseFormat() {
319                    return false;
320            }
321    
322            /**
323             * 表示é ?›®ã®ç·¨é›?ä¸¦ã³æ›¿ã?ãŒå¯èƒ½ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã?
324             *
325             * @og.rev 5.1.6.0 (2010/05/01) æ–°è¦è¿½åŠ?
326             *
327             * @return      表示é ?›®ã®ç·¨é›?ä¸¦ã³æ›¿ã?ãŒå¯èƒ½ã‹ã©ã?‹(false:ä¸å¯èƒ½)
328             */
329            @Override
330            public boolean isEditable() {
331                    return false;
332            }
333    }