package m.szajowski.schedule;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TimeZone;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.invient.vaadin.charts.InvientCharts;
import com.invient.vaadin.charts.InvientCharts.DecimalPoint;
import com.invient.vaadin.charts.InvientCharts.Series;
import com.invient.vaadin.charts.InvientCharts.SeriesType;
import com.invient.vaadin.charts.InvientCharts.XYSeries;
import com.invient.vaadin.charts.InvientChartsConfig;
import com.invient.vaadin.charts.InvientChartsConfig.AxisBase.AxisTitle;
import com.invient.vaadin.charts.InvientChartsConfig.AxisBase.NumberPlotLine;
import com.invient.vaadin.charts.InvientChartsConfig.AxisBase.NumberPlotLine.NumberValue;
import com.invient.vaadin.charts.InvientChartsConfig.CategoryAxis;
import com.invient.vaadin.charts.InvientChartsConfig.Legend;
import com.invient.vaadin.charts.InvientChartsConfig.Legend.Layout;
import com.invient.vaadin.charts.InvientChartsConfig.LineConfig;
import com.invient.vaadin.charts.InvientChartsConfig.NumberYAxis;
import com.invient.vaadin.charts.InvientChartsConfig.Position;
import com.invient.vaadin.charts.InvientChartsConfig.XAxis;
import com.invient.vaadin.charts.InvientChartsConfig.YAxis;
import com.vaadin.Application;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.terminal.Sizeable;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.terminal.gwt.server.HttpServletRequestListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.DateField;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import de.jollyday.HolidayCalendar;
import de.jollyday.HolidayManager;
/**
* The Application's "main" class
*/
@SuppressWarnings("serial")
public class Main extends Application implements HttpServletRequestListener {
private Window mainWindow;
BeanItem<UserData> userData = new BeanItem<UserData>(new UserData());
BeanItemContainer<Day> days = new BeanItemContainer<Day>(Day.class);
Table daysTable;
String month;
InvientCharts chart;
private HttpServletRequest request;
private HttpServletResponse response;
Map<Integer, Map<Integer, DecimalPoint>> points = new LinkedHashMap<Integer, Map<Integer, DecimalPoint>>();
Main main;
@Override
public void init() {
main = this;
// setTheme("custom");
mainWindow = new Window("Schedule");
setMainWindow(mainWindow);
Button button = new Button("Dodaj");
button.setIcon(new ThemeResource("../runo/icons/16/document-add.png"));
mainWindow.addComponent(button);
button.addListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
UserDataSettings userDataSettings = new UserDataSettings(main, request, response);
userDataSettings.showUValue();
}
});
mainWindow.addComponent(showUTrend());
((VerticalLayout) mainWindow.getContent()).setComponentAlignment(button,
Alignment.TOP_RIGHT);
HorizontalLayout horizontalLayout = new HorizontalLayout();
horizontalLayout.setMargin(true);
horizontalLayout.setWidth(98, Sizeable.UNITS_PERCENTAGE);
mainWindow.addComponent(horizontalLayout);
addUserDetails(horizontalLayout);
addScheduleTable(horizontalLayout);
}
private InvientCharts showUTrend() {
InvientChartsConfig chartConfig = new InvientChartsConfig();
chartConfig.getGeneralChartConfig().setType(SeriesType.LINE);
// chartConfig.getGeneralChartConfig().setMargin(new Margin());
// chartConfig.getGeneralChartConfig().getMargin().setRight(130);
// chartConfig.getGeneralChartConfig().getMargin().setBottom(30);
chartConfig.getTitle().setX(-20);
chartConfig.getTitle().setText("Wartość U w podziale na lata");
// chartConfig.getSubtitle().setText("Source: WorldClimate.com");
CategoryAxis categoryAxis = new CategoryAxis();
categoryAxis.setCategories(Arrays
.asList("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec",
"Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"));
LinkedHashSet<XAxis> xAxesSet = new LinkedHashSet<InvientChartsConfig.XAxis>();
xAxesSet.add(categoryAxis);
chartConfig.setXAxes(xAxesSet);
NumberYAxis numberYAxis = new NumberYAxis();
numberYAxis.setTitle(new AxisTitle("Wartość U"));
NumberPlotLine plotLine = new NumberPlotLine("TempAt0");
plotLine.setValue(new NumberValue(0.0));
plotLine.setWidth(1);
plotLine.setZIndex(1);
// plotLine.setColor(new RGB(128, 128, 128));
numberYAxis.addPlotLine(plotLine);
LinkedHashSet<YAxis> yAxesSet = new LinkedHashSet<InvientChartsConfig.YAxis>();
yAxesSet.add(numberYAxis);
chartConfig.setYAxes(yAxesSet);
Legend legend = new Legend();
legend.setLayout(Layout.VERTICAL);
Position legendPos = new Position();
// legendPos.setAlign(HorzAlign.CENTER);
// legendPos.setVertAlign(VertAlign.BOTTOM);
// legendPos.setX(-50);
legendPos.setY(-250);
legend.setPosition(legendPos);
// legend.setBorderWidth(0);
// chartConfig.setLegend(legend);
chartConfig.setCredit(null);
chartConfig.setSubtitle(null);
// Series data label formatter
LineConfig lineCfg = new LineConfig();
chartConfig.addSeriesConfig(lineCfg);
// Tooltip formatter
chartConfig
.getTooltip()
.setFormatterJsFunc(
"function() { "
+ " return '<b>' + this.series.name + '</b><br/>' + this.x + ': '+ this.y +' U'"
+ "}");
chart = new InvientCharts(chartConfig);
add2008(chart);
add2009(chart);
add2010(chart);
add2011(chart);
refreshGraph();
// seriesData = new XYSeries("New York");
// seriesData.setSeriesPoints(getPoints(seriesData, -0.2, 0.8, 5.7,
// 11.3, 17.0, 22.0, 24.8,
// 24.1, 20.1, 14.1, 8.6, 2.5));
// chart.addSeries(seriesData);
//
// seriesData = new XYSeries("Berlin");
// seriesData.setSeriesPoints(getPoints(seriesData, -0.9, 0.6, 3.5, 8.4,
// 13.5, 17.0, 18.6,
// 17.9, 14.3, 9.0, 3.9, 1.0));
// chart.addSeries(seriesData);
//
// seriesData = new XYSeries("London");
// seriesData.setSeriesPoints(getPoints(seriesData, 3.9, 4.2, 5.7, 8.5,
// 11.9, 15.2, 17.0,
// 16.6, 14.2, 10.3, 6.6, 4.8));
// chart.addSeries(seriesData);
chart.setSizeFull();
return chart;
}
public void refreshGraph() {
LinkedHashSet<Series> allSeries = chart.getAllSeries();
HashSet<Series> hashSet = new HashSet<Series>(allSeries);
for (Series series : hashSet) {
chart.removeSeries(series);
}
for (Integer key : points.keySet()) {
Map<Integer, DecimalPoint> map = points.get(key);
int quantity = 0;
double sum = 0;
DecimalFormat format = new DecimalFormat("#.##");
for (Entry<Integer, DecimalPoint> decimalPoint : map.entrySet()) {
quantity++;
sum += decimalPoint.getValue().getY();
}
Double result = sum / quantity;
XYSeries seriesData = new XYSeries(key + " (średnia = " + format.format(result) + ")");
for (Entry<Integer, DecimalPoint> decimalPoint : map.entrySet()) {
seriesData.addPoint(new DecimalPoint(seriesData, decimalPoint.getKey(),
decimalPoint.getValue().getY()));
}
chart.addSeries(seriesData);
}
}
private void add2008(final InvientCharts chart) {
XYSeries seriesData = new XYSeries("2008");
seriesData.addPoint(new DecimalPoint(seriesData, 0, 153.13));
seriesData.addPoint(new DecimalPoint(seriesData, 1, 195.23));
seriesData.addPoint(new DecimalPoint(seriesData, 2, 102.62));
seriesData.addPoint(new DecimalPoint(seriesData, 3, 102.15));
seriesData.addPoint(new DecimalPoint(seriesData, 4, 70.74));
seriesData.addPoint(new DecimalPoint(seriesData, 5, 145.47));
seriesData.addPoint(new DecimalPoint(seriesData, 6, 127.92));
seriesData.addPoint(new DecimalPoint(seriesData, 7, 87.08));
seriesData.addPoint(new DecimalPoint(seriesData, 8, 101.99));
seriesData.addPoint(new DecimalPoint(seriesData, 9, 123.28));
seriesData.addPoint(new DecimalPoint(seriesData, 10, 89.85));
seriesData.addPoint(new DecimalPoint(seriesData, 11, 145.01));
int quantity = 0;
points.put(2008, new LinkedHashMap<Integer, DecimalPoint>());
for (DecimalPoint decimalPoint : seriesData.getPoints()) {
points.get(2008).put(quantity, decimalPoint);
quantity++;
}
}
private void add2009(final InvientCharts chart) {
XYSeries seriesData = new XYSeries("2009");
seriesData.addPoint(new DecimalPoint(seriesData, 0, 128.74));
seriesData.addPoint(new DecimalPoint(seriesData, 1, 152.73));
seriesData.addPoint(new DecimalPoint(seriesData, 2, 78.31));
seriesData.addPoint(new DecimalPoint(seriesData, 3, 77.18));
seriesData.addPoint(new DecimalPoint(seriesData, 4, 79.87));
seriesData.addPoint(new DecimalPoint(seriesData, 5, 85.6));
seriesData.addPoint(new DecimalPoint(seriesData, 6, 147.74));
seriesData.addPoint(new DecimalPoint(seriesData, 7, 82.74));
seriesData.addPoint(new DecimalPoint(seriesData, 8, 110.16));
seriesData.addPoint(new DecimalPoint(seriesData, 9, 68.84));
seriesData.addPoint(new DecimalPoint(seriesData, 10, 113.38));
seriesData.addPoint(new DecimalPoint(seriesData, 11, 125.15));
int quantity = 0;
points.put(2009, new LinkedHashMap<Integer, DecimalPoint>());
for (DecimalPoint decimalPoint : seriesData.getPoints()) {
points.get(2009).put(quantity, decimalPoint);
quantity++;
}
}
private void add2010(final InvientCharts chart) {
XYSeries seriesData = new XYSeries("2010");
seriesData.addPoint(new DecimalPoint(seriesData, 0, 135.14));
seriesData.addPoint(new DecimalPoint(seriesData, 1, 139.89));
seriesData.addPoint(new DecimalPoint(seriesData, 2, 95.3));
seriesData.addPoint(new DecimalPoint(seriesData, 3, 100.73));
seriesData.addPoint(new DecimalPoint(seriesData, 4, 65.45));
seriesData.addPoint(new DecimalPoint(seriesData, 5, 108.8));
seriesData.addPoint(new DecimalPoint(seriesData, 6, 136.7));
seriesData.addPoint(new DecimalPoint(seriesData, 7, 116.23));
seriesData.addPoint(new DecimalPoint(seriesData, 8, 86.58));
seriesData.addPoint(new DecimalPoint(seriesData, 9, 135.5));
seriesData.addPoint(new DecimalPoint(seriesData, 10, 124.43));
seriesData.addPoint(new DecimalPoint(seriesData, 11, 173.33));
int quantity = 0;
points.put(2010, new LinkedHashMap<Integer, DecimalPoint>());
for (DecimalPoint decimalPoint : seriesData.getPoints()) {
points.get(2010).put(quantity, decimalPoint);
quantity++;
}
}
private void add2011(final InvientCharts chart) {
XYSeries seriesData = new XYSeries("2011");
seriesData.addPoint(new DecimalPoint(seriesData, 0, 246.64));
seriesData.addPoint(new DecimalPoint(seriesData, 1, 127.54));
seriesData.addPoint(new DecimalPoint(seriesData, 2, 110.07));
seriesData.addPoint(new DecimalPoint(seriesData, 3, 94.34));
seriesData.addPoint(new DecimalPoint(seriesData, 4, 94.56));
seriesData.addPoint(new DecimalPoint(seriesData, 5, 173.29));
seriesData.addPoint(new DecimalPoint(seriesData, 6, 151.85));
seriesData.addPoint(new DecimalPoint(seriesData, 7, 106.48));
seriesData.addPoint(new DecimalPoint(seriesData, 8, 145.24));
seriesData.addPoint(new DecimalPoint(seriesData, 9, 111.31));
seriesData.addPoint(new DecimalPoint(seriesData, 10, 122.77));
seriesData.addPoint(new DecimalPoint(seriesData, 11, 100.00));
int quantity = 0;
points.put(2011, new LinkedHashMap<Integer, DecimalPoint>());
for (DecimalPoint decimalPoint : seriesData.getPoints()) {
points.get(2011).put(quantity, decimalPoint);
quantity++;
}
}
private static LinkedHashSet<DecimalPoint> getPoints(final Series series,
final double... values) {
LinkedHashSet<DecimalPoint> points = new LinkedHashSet<DecimalPoint>();
for (double value : values) {
points.add(new DecimalPoint(series, value));
}
return points;
}
private void addScheduleTable(final HorizontalLayout horizontalLayout) {
daysTable = new Table();
daysTable.setWriteThrough(true);
daysTable.setCaption("Harmonogram");
daysTable.setTableFieldFactory(new DaysTableFieldFactory(this));
addDays(new Date());
horizontalLayout.addComponent(daysTable);
// daysTable.setWidth(800, Sizeable.UNITS_PIXELS);
daysTable.setSizeFull();
daysTable.setHeight(600, Sizeable.UNITS_PIXELS);
horizontalLayout.setExpandRatio(daysTable, 85);
// horizontalLayout.setComponentAlignment(daysTable,
// Alignment.TOP_CENTER);
}
private void addDays(final Date date) {
HolidayManager m = HolidayManager.getInstance(HolidayCalendar.POLAND);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
days.removeAllItems();
for (int i = 1; i <= actualMaximum; i++) {
Day day = new Day();
day.setDay(i);
calendar.set(Calendar.DAY_OF_MONTH, i);
if (m.isHoliday(calendar)) {
day.setAbsenceTime(8);
day.setAbsenceReason("Święto");
day.setWeekend(true);
} else {
int ac = calendar.get(Calendar.DAY_OF_WEEK);
if (ac == Calendar.SATURDAY || ac == Calendar.SUNDAY) {
day.setWeekend(true);
} else {
day.setWorkTime(8);
day.setProgram(userData.getBean().getDefaultWork());
}
}
days.addBean(day);
}
daysTable.setColumnReorderingAllowed(true);
daysTable.setColumnCollapsingAllowed(true);
daysTable.setContainerDataSource(days);
daysTable.setEditable(true);
daysTable.setInvalidAllowed(true);
daysTable.setVisibleColumns(new Object[] { "day", "workTime", "program", "absenceTime",
"absenceReason" });
daysTable.setColumnHeader("day", "Dzień miesiąca");
daysTable.setColumnHeader("workTime", "Czas pracy");
daysTable.setColumnHeader("program", "Program");
daysTable.setColumnHeader("absenceTime", "Czas nieobecności");
daysTable.setColumnHeader("absenceReason", "Powód nieobecności");
}
private void addUserDetails(final HorizontalLayout layout) {
Panel userDetailsPanel = new Panel("Dane użytkownika");
layout.addComponent(userDetailsPanel);
layout.setExpandRatio(userDetailsPanel, 3);
layout.setComponentAlignment(userDetailsPanel, Alignment.TOP_LEFT);
Form form = new Form();
form.setItemDataSource(userData);
userData.getBean().addCaptions(form);
userDetailsPanel.addComponent(form);
userDetailsPanel.setWidth(350, Sizeable.UNITS_PIXELS);
for (String id : UserData.FIELDS_ORDER) {
form.getField(id).setReadOnly(true);
}
Button userSettings = new Button("Ustawienia");
userSettings.setIcon(new ThemeResource("../runo/icons/16/settings.png"));
final UserDataSettings userDataSettings = new UserDataSettings(this, request, response);
userDataSettings.checkData();
userSettings.addListener(new ClickListener() {
public void buttonClick(final ClickEvent event) {
userDataSettings.showSettingsWindow();
}
});
VerticalLayout verticalLayout = new VerticalLayout();
verticalLayout.setSpacing(true);
HorizontalLayout formLayout = new HorizontalLayout();
verticalLayout.addComponent(formLayout);
formLayout.setSpacing(true);
form.setFooter(verticalLayout);
formLayout.addComponent(userSettings);
Button c = new Button("Drukuj");
c.setIcon(new ThemeResource("../runo/icons/16/document-pdf.png"));
c.addListener(new Button.ClickListener() {
public void buttonClick(final ClickEvent event) {
SchedulePdf schedulePdf = new SchedulePdf(month, userData.getBean().getName(), days
.getItemIds());
schedulePdf.schowScheduleWindow(mainWindow.getApplication());
}
});
formLayout.addComponent(c);
final InlineDateField dateField = new InlineDateField("Miesiąc");
dateField.setResolution(DateField.RESOLUTION_MONTH);
dateField.setImmediate(true);
layout.addComponent(dateField);
dateField.setWidth(200, Sizeable.UNITS_PIXELS);
form.getFooter().addComponent(dateField);
dateField.addListener(new ValueChangeListener() {
@SuppressWarnings("deprecation")
public void valueChange(final ValueChangeEvent event) {
Date value = (Date) dateField.getValue();
Calendar gregorianCalendar = Calendar.getInstance();
gregorianCalendar.setTime(value);
gregorianCalendar.setTimeZone(TimeZone.getDefault());
addDays(value);
String displayName = gregorianCalendar.getDisplayName(Calendar.MONTH,
java.util.Calendar.LONG, new Locale("PL", "pl"));
month = displayName + " " + gregorianCalendar.get(Calendar.YEAR);
}
});
}
public void onRequestStart(final HttpServletRequest request, final HttpServletResponse response) {
this.request = request;
this.response = response;
}
public void onRequestEnd(final HttpServletRequest request, final HttpServletResponse response) {
}
@Override
public void terminalError(final com.vaadin.terminal.Terminal.ErrorEvent event) {
// getMainWindow().showNotification(event.getThrowable().toString(),
// Window.Notification.TYPE_ERROR_MESSAGE);
}
}