/*
* OpenFaces - JSF Component Library 2.0
* Copyright (C) 2007-2013, TeamDev Ltd.
* licensing@openfaces.org
* Unless agreed in writing the contents of this file are subject to
* the GNU Lesser General Public License Version 2.1 (the "LGPL" License).
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* Please visit http://openfaces.org/licensing/ for more details.
*/
package org.openfaces.testapp.daytable;
import org.openfaces.component.timetable.AbstractTimetableEvent;
import org.openfaces.component.timetable.EventActionEvent;
import org.openfaces.component.timetable.ReservedTimeEvent;
import org.openfaces.component.timetable.TimetableChangeEvent;
import org.openfaces.component.timetable.TimetableEvent;
import org.openfaces.util.Faces;
import javax.faces.event.ActionEvent;
import java.awt.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author Dmitry Pikhulya
*/
public class DayTableBean1 extends DayTableBean implements Serializable {
private static int eventIdCounter = 0;
List<AbstractTimetableEvent> events = new ArrayList<AbstractTimetableEvent>();
List<AbstractTimetableEvent> reservedTimes = new ArrayList<AbstractTimetableEvent>();
public DayTableBean1() {
Color red1 = new Color(220, 0, 0);
Color red2 = new Color(230, 100, 100);
Color green = new Color(0, 180, 0);
Color blue = new Color(51, 102, 255);
Color orange = new Color(247, 103, 24);
// today
events.add(new TimetableEvent(generateEventId(), DayTableBean.todayAt(6, 50), DayTableBean.todayAt(8, 0), "Yoga, Level 1",
"Instructor: Ivan Doe <br/>Fee: $40", red1));
events.add(new TimetableEvent(generateEventId(), DayTableBean.todayAt(10, 50), DayTableBean.todayAt(12, 0), "Power Yoga, Level 1",
"Instructor: Gregory House <br/>Fee: $30", blue));
events.add(new TimetableEvent(generateEventId(), DayTableBean.todayAt(13, 0), DayTableBean.todayAt(14, 55), "Yoga, Level 2",
"Instructor: Melany Scott <br/>Fee: $25", red1));
events.add(new TimetableEvent(generateEventId(), DayTableBean.todayAt(15, 30), DayTableBean.todayAt(17, 30), "Intro to Yoga",
"Instructor: Tony Bricks <br/>Fee: Free", orange));
events.add(new TimetableEvent(generateEventId(), DayTableBean.todayAt(17, 55), DayTableBean.todayAt(19, 25), "Gentle Yoga, Level 1",
"Instructor: Alex West <br/>Fee: $30", blue));
ReservedTimeEvent reservedTimeEvent1 = new ReservedTimeEvent(generateEventId(), null, DayTableBean.todayAt(19, 45), DayTableBean.todayAt(20, 15));
events.add(reservedTimeEvent1);
reservedTimes.add(reservedTimeEvent1);
events.add(new TimetableEvent(generateEventId(), DayTableBean.todayAt(21, 40), DayTableBean.todayAt(23, 30), "Meditation",
"Instructor: Gregory House <br/>Fee: $20", green));
//yesterday
events.add(new TimetableEvent(generateEventId(), DayTableBean.yesterdayAt(7, 0), DayTableBean.yesterdayAt(8, 20), "Yoga, Level 1",
"Instructor: Ivan Doe <br/>Fee: $40", red1));
events.add(new TimetableEvent(generateEventId(), DayTableBean.yesterdayAt(9, 0), DayTableBean.yesterdayAt(11, 30), "Meditation",
"Instructor: Tony Bricks <br/>Fee: $20", green));
events.add(new TimetableEvent(generateEventId(), DayTableBean.yesterdayAt(13, 0), DayTableBean.yesterdayAt(14, 55), "Yoga, Level 3",
"Instructor: Melany Scott <br/>Fee: $25", red2));
events.add(new TimetableEvent(generateEventId(), DayTableBean.yesterdayAt(19, 55), DayTableBean.yesterdayAt(19, 25), "Gentle Yoga For Those with Special Considerations",
"Instructor: Alex West <br/>Fee: $25", blue));
ReservedTimeEvent reservedTimeEvent2 = new ReservedTimeEvent(generateEventId(), null, DayTableBean.yesterdayAt(21, 5), DayTableBean.yesterdayAt(24, 0));
events.add(reservedTimeEvent2);
reservedTimes.add(reservedTimeEvent2);
//tomorrow
events.add(new TimetableEvent(generateEventId(), DayTableBean.tomorrowAt(8, 30), DayTableBean.tomorrowAt(11, 30), "Meditation",
"Instructor: Tony Bricks <br/>Fee: $20", green));
events.add(new TimetableEvent(generateEventId(), DayTableBean.tomorrowAt(13, 0), DayTableBean.tomorrowAt(14, 30), "Yoga, Level 2/3",
"Instructor: Ivan Doe <br/>Fee: $40", red1));
events.add(new TimetableEvent(generateEventId(), DayTableBean.tomorrowAt(16, 0), DayTableBean.tomorrowAt(17, 55), "Yoga and Meditation, Level 2/3",
"Instructor: Melany Scott <br/>Fee: $45", red2));
events.add(new TimetableEvent(generateEventId(), DayTableBean.tomorrowAt(20, 30), DayTableBean.tomorrowAt(22, 0), "Gentle Yoga and Meditation",
"Instructor: Matt Hunt <br/>Fee: $55", blue));
//next week
events.add(new TimetableEvent(generateEventId(), DayTableBean.weekLaterAt(10, 10), DayTableBean.weekLaterAt(20, 20), "Something",
"DIY (free)", green));
//next month
events.add(new TimetableEvent(generateEventId(), DayTableBean.monthLaterAt(12, 30), DayTableBean.monthLaterAt(23, 45), "Something Else",
"Priceless", green));
//7 weeks later
events.add(new TimetableEvent(generateEventId(), DayTableBean.nWeeksLaterAt(7, 14, 00), DayTableBean.nWeeksLaterAt(7, 16, 00), "Even More",
"No comments", green));
}
public void postponeEventActionListener(EventActionEvent event) {
AbstractTimetableEvent localEvent = eventById(events, event.getEventId());
if(localEvent != null) {
Date start = modifyDate(localEvent.getStart(), Calendar.DAY_OF_YEAR, 1);
Date end = modifyDate(localEvent.getEnd(), Calendar.DAY_OF_YEAR, 1);
if(isTimeAvailable(start, end)) {
localEvent.setStart(start);
localEvent.setEnd(end);
}
}
}
private String generateEventId() {
return String.valueOf(eventIdCounter++);
}
public List<AbstractTimetableEvent> getEvents() {
return events;
}
public void removeEvent(List<AbstractTimetableEvent> events, String id) {
events.remove(eventById(events, id));
}
public void addEvent(List<AbstractTimetableEvent> events, TimetableEvent event) {
event.setId(generateEventId());
events.add(event);
}
public void updateEvent(List<AbstractTimetableEvent> events, TimetableEvent editedEvent) {
TimetableEvent event = (TimetableEvent) eventById(events, editedEvent.getId());
event.setName(editedEvent.getName());
event.setStart(editedEvent.getStart());
event.setEnd(editedEvent.getEnd());
event.setDescription(editedEvent.getDescription());
event.setResourceId(editedEvent.getResourceId());
event.setColor(editedEvent.getColor());
}
public void processTimetableChanges(TimetableChangeEvent tce) {
TimetableEvent[] addedEvents = tce.getAddedEvents();
for (TimetableEvent event : addedEvents) {
addEvent(events, event);
}
TimetableEvent[] editedEvents = tce.getChangedEvents();
for (TimetableEvent event : editedEvents) {
updateEvent(events, event);
}
String[] removedEventIds = tce.getRemovedEventIds();
for (String eventId : removedEventIds) {
removeEvent(events, eventId);
}
}
public void doLater(ActionEvent actionEvent) {
TimetableEvent modifiedEvent = getEvent();
if (modifiedEvent != null) {
AbstractTimetableEvent event = eventById(events, modifiedEvent.getId());
if (event != null) {
Date startDate = modifyDate(event.getStart(), Calendar.HOUR_OF_DAY, 1);
Date endDate = modifyDate(event.getEnd(), Calendar.HOUR_OF_DAY, 1);
if(isTimeAvailable(startDate, endDate)) {
event.setStart(startDate);
event.setEnd(endDate);
}
}
}
}
private boolean isTimeAvailable(Date startDate, Date endDate) {
for (AbstractTimetableEvent reservedTime : reservedTimes) {
if ((reservedTime.getStart().after(startDate) && reservedTime.getStart().before(endDate)) ||
(reservedTime.getStart().before(startDate) && reservedTime.getEnd().after(startDate))) {
return false;
}
}
return true;
}
private TimetableEvent getEvent() {
return Faces.var("event", TimetableEvent.class);
}
}