/*
@VaadinAddonLicenseForJavaFiles@
*/
package com.spaceapplications.vaadin.addon.eventtimeline.event;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
/**
* <p>
* Simple implementation of {@link TimelineEventProvider}. Use {@link #addEvent(BasicEvent)} and
* {@link #removeEvent(BasicEvent)} to add / remove events.
* </p>
*
* <p>
* {@link TimelineEventProvider.EventSetChangeNotifier EventSetChangeNotifier} and
* {@link TimelineEvent.EventChangeListener EventChangeListener} are also implemented, so the
* Calendar is notified when an event is added, changed or removed.
* </p>
*/
public class BasicEventProvider implements TimelineEventProvider,
TimelineEventProvider.EventSetChangeNotifier, TimelineEvent.EventChangeListener {
private static final long serialVersionUID = 1L;
protected Set<TimelineEvent> eventList = new TreeSet<TimelineEvent>(new EventComparator());
private static class EventComparator implements Comparator<TimelineEvent>, Serializable {
private static final long serialVersionUID = -3838480424724696804L;
@Override
public int compare(TimelineEvent o1, TimelineEvent o2) {
int diff = o1.getStart().compareTo(o2.getStart());
if (diff != 0) {
return diff;
} else {
diff = o1.getEnd().compareTo(o2.getEnd());
if (diff != 0) {
return diff;
} else {
return o1.getEventId().compareTo(o2.getEventId());
}
}
}
}
private List<EventSetChangeListener> listeners = new ArrayList<EventSetChangeListener>();
/**
* {@inheritDoc}
*/
public List<TimelineEvent> getEvents(Date startDate, Date endDate) {
ArrayList<TimelineEvent> activeEvents = new ArrayList<TimelineEvent>();
for (TimelineEvent ev : eventList) {
long from = startDate.getTime();
long to = endDate.getTime();
long f = ev.getStart().getTime();
long t = ev.getEnd().getTime();
// Select only events that overlaps with startDate and
// endDate.
if ((f <= to && f >= from) || (t >= from && t <= to) || (f <= from && t >= to)) {
activeEvents.add(ev);
}
}
return activeEvents;
}
/**
* Returns all events and ignores any date ranges.
*/
public List<TimelineEvent> getEvents() {
ArrayList<TimelineEvent> activeEvents = new ArrayList<TimelineEvent>(eventList);
return activeEvents;
}
/**
* Return the event with the given event Id if it is available.
*/
public TimelineEvent getEvent(String eventId) {
for (TimelineEvent ev : eventList) {
if (eventId.equals(ev.getEventId())) {
return ev;
}
}
return null;
}
public void addEvent(BasicEvent event) {
eventList.add(event);
event.addListener(this);
fireEventSetChange();
}
public void removeEvent(BasicEvent event) {
eventList.remove(event);
event.removeListener(this);
fireEventSetChange();
}
public boolean containsEvent(BasicEvent event) {
return eventList.contains(event);
}
/**
* {@inheritDoc}
*/
public void addListener(EventSetChangeListener listener) {
listeners.add(listener);
}
/**
* {@inheritDoc}
*/
public void removeListener(EventSetChangeListener listener) {
listeners.remove(listener);
}
protected void fireEventSetChange() {
EventSetChange event = new EventSetChange(this);
for (EventSetChangeListener listener : listeners) {
listener.eventSetChange(event);
}
}
/**
* {@inheritDoc}
*/
public void eventChange(TimelineEvent.EventChange changeEvent) {
// naive implementation
fireEventSetChange();
}
}