package org.sigmah.offline.js;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.sigmah.shared.command.result.Calendar;
import org.sigmah.shared.dto.calendar.Event;
import org.sigmah.shared.dto.calendar.PersonalCalendarIdentifier;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import org.sigmah.shared.dto.calendar.CalendarIdentifier;
/**
*
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
public final class PersonalCalendarJS extends JavaScriptObject {
protected PersonalCalendarJS() {
}
public static PersonalCalendarJS toJavaScript(Calendar calendar) {
final PersonalCalendarJS personalCalendarJS = Values.createJavaScriptObject(PersonalCalendarJS.class);
personalCalendarJS.setId(calendar.getIdentifier());
personalCalendarJS.setName(calendar.getName());
personalCalendarJS.setEvents(calendar.getEvents());
return personalCalendarJS;
}
public Calendar toCalendar() {
final Calendar calendar = new Calendar();
calendar.setIdentifier(new PersonalCalendarIdentifier(getId()));
calendar.setName(getName());
calendar.setEvents(getEventsByDate(calendar));
calendar.setEditable(true);
return calendar;
}
public native int getId() /*-{
return this.id;
}-*/;
public native void setId(int id) /*-{
this.id = id;
}-*/;
public void setId(CalendarIdentifier identifier) {
if(identifier instanceof PersonalCalendarIdentifier) {
final PersonalCalendarIdentifier personalCalendarIdentifier = (PersonalCalendarIdentifier) identifier;
setId(personalCalendarIdentifier.getId());
}
}
public native String getName() /*-{
return this.name;
}-*/;
public native void setName(String name) /*-{
this.name = name;
}-*/;
public native JsArray<PersonalEventJS> getEvents() /*-{
return this.events;
}-*/;
public Map<Date, List<Event>> getEventsByDate(Calendar parent) {
final Map<Date, List<Event>> eventsByDate;
final JsArray<PersonalEventJS> events = getEvents();
if(events != null) {
eventsByDate = new HashMap<Date, List<Event>>();
for(int index = 0; index < events.length(); index++) {
final Event event = events.get(index).toEvent();
event.setParent(parent);
final Date key = normalize(event.getDtstart());
List<Event> eventList = eventsByDate.get(key);
if(eventList == null) {
eventList = new ArrayList<Event>();
eventsByDate.put(key, eventList);
}
eventList.add(event);
}
} else {
eventsByDate = null;
}
return eventsByDate;
}
private Date normalize(Date date) {
return new Date(date.getYear(), date.getMonth(), date.getDate());
}
public native void setEvents(JsArray<PersonalEventJS> events) /*-{
this.events = events;
}-*/;
public void setEvents(Map<Date, List<Event>> eventsByDates) {
if(eventsByDates != null) {
final JsArray<PersonalEventJS> array = (JsArray<PersonalEventJS>) JavaScriptObject.createArray();
for(final List<Event> events : eventsByDates.values()) {
for(final Event event : events) {
array.push(PersonalEventJS.toJavaScript(event));
}
}
setEvents(array);
}
}
}