/*
* Copyright (c) 2011-2015 Marat Gubaidullin.
*
* This file is part of HYBRIDBPM.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package com.hybridbpm.ui.component.bpm.calendar;
import com.hybridbpm.model.Translated;
import com.hybridbpm.core.data.bpm.Task;
import com.hybridbpm.core.data.development.Module;
import com.hybridbpm.ui.HybridbpmUI;
import com.hybridbpm.ui.component.AbstractTabLayout;
import com.hybridbpm.ui.component.bpm.TaskLayout;
import com.vaadin.data.Property;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.ui.Button;
import com.vaadin.ui.Calendar;
import com.vaadin.ui.Notification;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.components.calendar.CalendarComponentEvents;
import com.vaadin.ui.components.calendar.handler.BasicDateClickHandler;
import com.vaadin.ui.components.calendar.handler.BasicEventMoveHandler;
import com.vaadin.ui.components.calendar.handler.BasicWeekClickHandler;
import com.vaadin.ui.themes.ValoTheme;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
@SuppressWarnings("serial")
public class CalendarLayout extends AbstractTabLayout implements Property.ValueChangeListener {
private static final Logger logger = Logger.getLogger(CalendarLayout.class.getSimpleName());
private TabSheet tabSheet;
private Calendar calendar;
private BeanItemContainer<TaskEvent> calendarContainer;
private final OptionGroup calendarOptionGroup = new OptionGroup();
private enum TYPE {
TODAY, WEEK, MONTH;
}
public CalendarLayout() {
super();
btnAdd.setCaption("Add task");
btnAdd.setVisible(false);
tools.addComponent(calendarOptionGroup, 1);
setMargin(new MarginInfo(true, false, false, false));
addComponent(calendar);
setExpandRatio(calendar, 1f);
calendarOptionGroup.addItem(TYPE.TODAY);
calendarOptionGroup.setItemCaption(TYPE.TODAY, "Today");
calendarOptionGroup.addItem(TYPE.WEEK);
calendarOptionGroup.setItemCaption(TYPE.WEEK, "Week");
calendarOptionGroup.addItem(TYPE.MONTH);
calendarOptionGroup.setItemCaption(TYPE.MONTH, "Month");
calendarOptionGroup.addValueChangeListener(this);
calendarOptionGroup.setValue(TYPE.WEEK);
calendarOptionGroup.setStyleName(ValoTheme.OPTIONGROUP_HORIZONTAL);
calendarOptionGroup.addStyleName("small");
}
@Override
public void buttonClick(final Button.ClickEvent event) {
try {
if (event.getButton().equals(btnAdd)) {
addNew();
} else if (event.getButton().equals(btnRefresh)) {
refreshData();
}
} catch (Exception ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
Notification.show("Error", ex.getMessage(), Notification.Type.ERROR_MESSAGE);
}
}
@Override
public void prepareUI() {
calendarContainer = new BeanItemContainer<>(TaskEvent.class);
calendar = new Calendar();
calendar.setContainerDataSource(calendarContainer, "caption", "description", "start", "end", "styleName");
calendar.setSizeFull();
calendar.setImmediate(true);
calendar.setLocale(HybridbpmUI.getCurrent().getLocale());
calendar.setTimeFormat(Calendar.TimeFormat.Format24H);
calendar.setHandler(new BasicEventMoveHandler() {
@Override
public void eventMove(CalendarComponentEvents.MoveEvent event) {
super.eventMove(event);
if (event.getCalendarEvent() instanceof TaskEvent) {
Task task = ((TaskEvent) event.getCalendarEvent()).getTaskInstance();
task.setScheduleStartDate(event.getCalendarEvent().getStart());
task.setScheduleEndDate(event.getCalendarEvent().getEnd());
HybridbpmUI.getBpmAPI().saveTask(task, null, null, null);
}
}
});
calendar.setHandler(new BasicWeekClickHandler() {
@Override
public void weekClick(final CalendarComponentEvents.WeekClick event) {
calendarOptionGroup.setValue(TYPE.WEEK);
setWeekView(event.getWeek(), event.getYear());
}
});
calendar.setHandler(new CalendarComponentEvents.EventClickHandler() {
@Override
public void eventClick(final CalendarComponentEvents.EventClick event) {
if (event.getCalendarEvent() instanceof TaskEvent) {
Task task = ((TaskEvent) event.getCalendarEvent()).getTaskInstance();
TabSheet.Tab tab = tabSheet.addTab(new TaskLayout(task.getId().toString(), task.getProcessModelName(), task.getTaskName(), true), task.getTaskTitle());
tab.setClosable(true);
tabSheet.setSelectedTab(tab);
}
}
});
calendar.setHandler(new BasicDateClickHandler() {
@Override
public void dateClick(final CalendarComponentEvents.DateClickEvent event) {
setDayView(event.getDate());
}
});
calendar.setHandler(new CalendarComponentEvents.RangeSelectHandler() {
@Override
public void rangeSelect(final CalendarComponentEvents.RangeSelectEvent event) {
System.out.println(event.getComponent().isMonthlyMode());
setDayView(event.getStart());
}
});
}
@Override
public void refreshData() {
calendar.setFirstVisibleHourOfDay(HybridbpmUI.getUser().getFirstVisibleHourOfDay());
calendar.setLastVisibleHourOfDay(HybridbpmUI.getUser().getLastVisibleHourOfDay());
calendarContainer.removeAllItems();
for (Task task : HybridbpmUI.getBpmAPI().getMyTasksToDo(HybridbpmUI.getCurrent().getLocale())) {
if (task.getScheduleStartDate() != null && task.getScheduleEndDate() != null) {
calendarContainer.addBean(new TaskEvent(task, task.getTaskTitle(), task.getDescription(), task.getScheduleStartDate(), task.getScheduleEndDate()));
}
}
}
@Override
public void addNew() {
}
public void setTabSheet(TabSheet tabSheet) {
this.tabSheet = tabSheet;
}
private void setDayView(Date date) {
calendar.setStartDate(date);
calendar.setEndDate(date);
}
private void setWeekView(int week, int year) {
GregorianCalendar gc = new GregorianCalendar(HybridbpmUI.getCurrent().getLocale());
gc.set(GregorianCalendar.YEAR, year);
gc.set(GregorianCalendar.WEEK_OF_YEAR, week);
// starting at the beginning of the week
gc.set(GregorianCalendar.DAY_OF_WEEK, gc.getFirstDayOfWeek());
Date start = gc.getTime();
// ending at the end of the week
gc.add(GregorianCalendar.DATE, 6);
Date end = gc.getTime();
calendar.setStartDate(start);
calendar.setEndDate(end);
}
private void setMonthView() {
GregorianCalendar gc = new GregorianCalendar(HybridbpmUI.getCurrent().getLocale());
gc.setTime(new Date());
gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
gc.set(GregorianCalendar.MINUTE, 0);
gc.set(GregorianCalendar.SECOND, 0);
gc.set(GregorianCalendar.MILLISECOND, 0);
gc.set(GregorianCalendar.DAY_OF_MONTH, 1);
calendar.setStartDate(gc.getTime());
gc.add(GregorianCalendar.MONTH, 1);
gc.add(GregorianCalendar.DATE, -1);
calendar.setEndDate(gc.getTime());
}
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (Objects.equals(TYPE.TODAY, event.getProperty().getValue())) {
setDayView(new Date());
} else if (Objects.equals(TYPE.WEEK, event.getProperty().getValue())) {
GregorianCalendar gc = new GregorianCalendar(HybridbpmUI.getCurrent().getLocale());
gc.setTime(new Date());
setWeekView(gc.get(GregorianCalendar.WEEK_OF_YEAR), gc.get(GregorianCalendar.YEAR));
} else if (Objects.equals(TYPE.MONTH, event.getProperty().getValue())) {
setMonthView();
}
}
}