Package m.szajowski.schedule

Source Code of m.szajowski.schedule.Main

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);
  }

}
TOP

Related Classes of m.szajowski.schedule.Main

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.