package scrum.client.calendar;
import ilarkesto.core.scope.Scope;
import ilarkesto.gwt.client.Date;
import ilarkesto.gwt.client.Gwt;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import scrum.client.ScrumGwt;
import scrum.client.common.AScrumWidget;
import scrum.client.common.BlockListSelectionManager;
import scrum.client.common.BlockListWidget;
import com.google.gwt.dom.client.Style;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class DayListWidget extends AScrumWidget {
private Calendar calendar;
private int visibleDays = 21;
private SimplePanel wrapper;
private BlockListSelectionManager selectionManager;
private Map<Date, BlockListWidget<SimpleEvent>> lists;
private Date date;
private Date begin;
private Date end;
public DayListWidget() {
date = Date.today();
updateBeginAndEnd();
}
@Override
protected Widget onInitialization() {
calendar = Scope.get().getComponent(Calendar.class);
selectionManager = new BlockListSelectionManager();
lists = new HashMap<Date, BlockListWidget<SimpleEvent>>();
wrapper = new SimplePanel();
showDate(Date.today());
return wrapper;
}
@Override
protected void onUpdate() {
for (Map.Entry<Date, BlockListWidget<SimpleEvent>> entry : lists.entrySet()) {
List<SimpleEvent> events = calendar.getEventsByDate(entry.getKey());
entry.getValue().setObjects(events);
}
}
private void updateBeginAndEnd() {
begin = date;
end = begin.addDays(visibleDays);
}
public void showDate(Date dateToShow) {
this.date = dateToShow;
updateBeginAndEnd();
lists.clear();
selectionManager.clear();
FlexTable table = new FlexTable();
table.setWidth("100%");
table.setCellPadding(2);
table.getColumnFormatter().setWidth(0, "25px");
table.getColumnFormatter().setWidth(1, "40px");
table.getColumnFormatter().setWidth(2, "30px");
table.getColumnFormatter().setWidth(3, "40px");
// table.setBorderWidth(1);
int row = 0;
Date d = begin;
int month = 0;
int week = 0;
while (d.compareTo(end) <= 0) {
int w = d.getWeek();
if (w != week) {
week = w;
Widget weekWidget = Gwt.createDiv("DayListWidget-week", String.valueOf(week));
table.setWidget(row, 0, weekWidget);
}
int m = d.getMonth();
if (m != month) {
month = m;
Widget monthWidget = Gwt.createDiv("DayListWidget-month", Gwt.getMonthShort(month));
table.setWidget(row, 1, monthWidget);
}
table.setWidget(row, 2, Gwt.createDiv("DayListWidget-date", Gwt.DTF_DAY.format(d.toJavaDate())));
table.setWidget(row, 3, Gwt.createDiv("DayListWidget-date", Gwt.DTF_WEEKDAY_SHORT.format(d.toJavaDate())));
table.setWidget(row, 4, createDayContent(d));
formatRow(table, row);
d = d.nextDay();
row++;
}
Widget downloadLink = ScrumGwt.createPdfLink("Download as PDF", "calendar", "from", begin.toString(), "to", end
.toString());
wrapper.setWidget(Gwt.createFlowPanel(table, Gwt.createSpacer(1, 10), downloadLink));
}
private void formatRow(FlexTable table, int row) {
String border = "1px solid #EEE";
for (int i = 0; i <= 4; i++) {
Element element = table.getCellFormatter().getElement(row, i);
Style style = element.getStyle();
style.setProperty("borderBottom", border);
if (row == 0) style.setProperty("borderTop", border);
if (i < 3 || i == 4) style.setProperty("borderLeft", border);
if (i == 4) style.setProperty("borderRight", border);
}
}
public void showEvent(SimpleEvent event) {
if (event == null) return;
showDate(event.getDate());
update();
selectionManager.select(event);
}
private Widget createDayContent(Date date) {
FlowPanel panel = new FlowPanel();
for (String info : calendar.getInfos(date)) {
panel.add(Gwt.createDiv("DayListWidget-date-info", info));
}
panel.add(createEventList(date));
return panel;
}
private Widget createEventList(Date date) {
BlockListWidget<SimpleEvent> list = new BlockListWidget<SimpleEvent>(SimpleEventBlock.FACTORY,
new ChangeSimpleEventDateDropAction(date));
list.setSelectionManager(selectionManager);
list.setAutoSorter(SimpleEvent.TIME_COMPARATOR);
lists.put(date, list);
return list;
}
public Date getDate() {
return date;
}
public Date getBegin() {
return begin;
}
public Date getEnd() {
return end;
}
}