前回のつづき、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;}