カレンダー(2)

前回のつづき、CalendarDaysPanel を使ってみる。

public class CalendarDaysTestPage extends WebPage{

   public CalendarDaysTestPage(){
      // 対象月の決定
      CalenderHelper helper = new CalenderHelper(getRequestCycle());

      // カレンダーPanel  CalendarRequestの実装で表示する
      final WebMarkupContainer tbody = new WebMarkupContainer("tbody");
      tbody.add(
new CalendarDaysPanel("calendar",new Model<CalendarRequest>(
            new CalendarRequestImpl(helper.getTargetDate()
                                   ,FooPage.class
                                   ,new PageParameters())

      )));
      add(tbody);


      // 年の表示
      add(new Label("year",helper.year().toString()));

      // 月の表示
      add(new Label("month",helper.month().toString()));

      // 前月と翌月リンク
      add(new BookmarkablePageLink<Void>("prev"
,CalendarDaysTestPage.class
,helper.prevMonthParameters(new PageParameters())));

      add(new BookmarkablePageLink<Void>("next"
,CalendarDaysTestPage.class
,helper.nextMonthParameters(new PageParameters())));

   }
}

--------------------------------------------------------
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.model.IModel;

public final class CalenderHelper implements Serializable{
   private Integer year;
   private Integer month;
   private String prev;
   private String next;
   private Date targetDate;

   public CalenderHelper(RequestCycle requestCycle){
      PageParameters p = requestCycle.getPageParameters();
      String ymd = p.getString(CalendarRequest.CALENDAR_PARAM_KEY);
      Calendar cal = Calendar.getInstance();
      SimpleDateFormat yyyyMMddFormat 
= new SimpleDateFormat(CalendarRequest.CALENDAR_PARAM_FORMAT);
      if (ymd != null){
         try{
         cal.setTime(yyyyMMddFormat.parse(ymd));
         }catch(ParseException e){
            cal.setTime(new Date());
         }
      }
      this.year = cal.get(Calendar.YEAR);
      this.month = cal.get(Calendar.MONTH) + 1;
      cal.set(Calendar.DAY_OF_MONTH,1);
      this.targetDate = cal.getTime();
      cal.add(Calendar.DAY_OF_MONTH,-1);
      Date dt = cal.getTime();
      this.prev = yyyyMMddFormat.format(dt);
      cal.add(Calendar.DAY_OF_MONTH,1);
      cal.add(Calendar.MONTH,1);
      dt = cal.getTime();
      this.next = yyyyMMddFormat.format(dt);
   }
   public Date getTargetDate(){
      return this.targetDate;
   }
   public Integer year(){
      return this.year;
   }
   public Integer month(){
      return this.month;
   }
   /**
    * 前月リンクパラメータ取得 CALENDAR_PARAM_KEY が付与される
    * @param newparameters
    * @return
    */
   public PageParameters prevMonthParameters(PageParameters newparameters){
      newparameters.put(CalendarRequest.CALENDAR_PARAM_KEY,this.prev);
      return newparameters;
   }
   /**
    * 翌月リンクパラメータ取得 CALENDAR_PARAM_KEY が付与される
    * @param newparameters
    * @return
    */
   public PageParameters nextMonthParameters(PageParameters newparameters){
      newparameters.put(CalendarRequest.CALENDAR_PARAM_KEY,this.next);
      return newparameters;
   }
   /**
    * 前月の日付(前月リンクのパラメータに使用するため)
    * @param model IModel<Date>月の移動で変化させるDate
    * @return
    */
   public Date prevDate(IModel<Date> model){
      Calendar c = Calendar.getInstance();
      c.setTime(model.getObject());
      c.set(Calendar.DAY_OF_MONTH,1);
      c.add(Calendar.DAY_OF_MONTH,-1);
      return c.getTime();
   }
   /**
    * 翌月の日付(翌月リンクのパラメータに使用するため)
    * @param model IModel<Date>月の移動で変化させるDate
    * @return
    */
   public Date nextDate(IModel<Date> model){
      Calendar c = Calendar.getInstance();
      c.setTime(model.getObject());
      c.add(Calendar.MONTH, 1);
      c.add(Calendar.DAY_OF_MONTH, - c.get(Calendar.DAY_OF_MONTH));
      c.add(Calendar.DAY_OF_MONTH,1);
      return c.getTime();
   }
}

--------------------------------------------------------
public class CalendarRequestImpl implements CalendarRequest{
   private Calendar cal;
   private Date date;
   private Class<? extends WebPage> linkclass;
   private PageParameters params;

   public CalendarRequestImpl(Date dt
,Class<? extends WebPage> linkclass,PageParameters params){
      this.cal = Calendar.getInstance();
      this.date = dt;
      this.linkclass = linkclass;
      this.params = params;
   }
   @Override
   public boolean enable(Date dt){
      this.cal.setTime(dt);
      int d = this.cal.get(Calendar.DAY_OF_MONTH);
      return  d % 3 == 0 ? true : false;
   }
   @Override
   public String getDateParameterName(){
      return CalendarRequest.CALENDAR_PARAM_KEY;
   }
   @Override
   public Date getDate(){
      return this.date;
   }
   @Override
   public void setDate(Date dt){
      this.date = dt;
   }
   @Override
   public Class<? extends WebPage> getLinkClass(){
      return this.linkclass;
   }
   @Override
   public PageParameters getPageParameters(){
      return this.params;
   }
}
----------------- HTML ------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:wicket="">http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>calendar sample</title>
<link rel="stylesheet" type="text/css" href="css/calendar.css"/>
</head>
<body>

<table class="calendar">
<tr><td><a wicket:id="prev" class="calendar" href="#"><</a></td>
   <td colspan="5"><span wicket:id="year"></span>年  <span wicket:id="month"></span>月</td>
   <td><a wicket:id="next" class="calendar" href="#">></a></td>
</tr>

<tbody wicket:id="tbody">
<!-- span wicket:id="calendar" が 置き換わる -->
<span wicket:id="calendar"></span>
</tbody>

</table>

</body>
</html>


-------- CSS --------------------------
@CHARSET "UTF-8";

table.calendar {
border: 1px #000000 solid;
border-collapse: collapse;
text-align: center;
font-size: 8pt;
font-style: normal;
color: #000000;
}
table.calendar th,td {
border: 1px #000000 solid;
border-collapse: collapse;
padding: 10px 10px 10px 10px;
font-size: 8pt;
font-style: normal;
color: #000000;
}
table.calendar th.sun {
color: #FF0000;
}
table.calendar th.sat {
color: #0000FF;
}
span.calendar{
font-size: 8pt;
font-style: normal;
}
a.calendar        { font-weight: bold; color: #0000FF; text-decoration:none;}
a.calendar:link   { font-weight: bold; color: #0000FF; text-decoration:none;}
a.calendar:visited{ font-weight: bold; color: #0000FF; text-decoration:none;}
a.calendar:focus  { font-weight: bold; color: #66DDFF; text-decoration:none;}
a.calendar:hover  { font-weight: bold; color: #ff33aa; text-decoration:none;}