Package org.projectforge.plugins.poll.event

Source Code of org.projectforge.plugins.poll.event.PollEventEventsProvider

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition 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; version 3 of the License.
//
// This community edition 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/.
//
/////////////////////////////////////////////////////////////////////////////

package org.projectforge.plugins.poll.event;

import java.sql.Timestamp;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import net.ftlines.wicket.fullcalendar.CalendarResponse;
import net.ftlines.wicket.fullcalendar.Event;
import net.ftlines.wicket.fullcalendar.callback.ClickedEvent;
import net.ftlines.wicket.fullcalendar.callback.DroppedEvent;
import net.ftlines.wicket.fullcalendar.callback.ResizedEvent;
import net.ftlines.wicket.fullcalendar.callback.SelectedRange;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.projectforge.plugins.poll.PollDO;
import org.projectforge.web.calendar.MyFullCalendarEventsProvider;

/**
* @author Johannes Unterstein (j.unterstein@micromata.de)
*
*/
public class PollEventEventsProvider extends MyFullCalendarEventsProvider
{
  private static final long serialVersionUID = -1869612916168574011L;

  private final Map<PollEventDO, Event> pollEventCache;

  private final PollDO poll;

  private final Random randomizer;

  /**
   */
  public PollEventEventsProvider( final PollDO poll)
  {
    this.poll = poll;
    pollEventCache = new HashMap<PollEventDO, Event>();
    randomizer = new Random(System.currentTimeMillis());
  }

  /**
   * @see org.projectforge.web.calendar.MyFullCalendarEventsProvider#getEvents(org.joda.time.DateTime, org.joda.time.DateTime)
   */
  @Override
  public Collection<Event> getEvents(final DateTime start, final DateTime end)
  {
    events.clear();
    for (final PollEventDO iterationEvent : pollEventCache.keySet()) {
      Event event = pollEventCache.get(iterationEvent);
      if (event == null) {
        event = new Event();
        // randomizer is needed if the system adds events and the machine is able to add
        // more than one element per millisecond -> double entries for one id is not allowed!
        event.setId("" + (System.currentTimeMillis() % randomizer.nextInt()));
        event.setStart(new DateTime(iterationEvent.getStartDate().getTime()));
        event.setEnd(new DateTime(iterationEvent.getEndDate().getTime()));
        event.setTitle("");
        pollEventCache.put(iterationEvent, event);
      }
      events.put("" + event.getId(), event);
    }
    return events.values();
  }

  /**
   * Just use getEvents, no caching enabled at this page!
   *
   * @see org.projectforge.web.calendar.MyFullCalendarEventsProvider#buildEvents(org.joda.time.DateTime, org.joda.time.DateTime)
   */
  @Override
  protected void buildEvents(final DateTime start, final DateTime end)
  {
    getEvents(start, end);
  }

  /**
   * @param range
   * @param response
   */
  public void addEvent(final SelectedRange range, final CalendarResponse response)
  {
    final PollEventDO newEvent = new PollEventDO();
    newEvent.setPoll(poll);
    newEvent.setStartDate(new Timestamp(range.getStart().getMillis()));
    newEvent.setEndDate(new Timestamp(range.getEnd().getMillis()));
    pollEventCache.put(newEvent, null);
    clearSelection(response);
  }

  /**
   * Clears the FullCalendar JS Selection and udpates the events
   * @param response
   */
  private void clearSelection(final CalendarResponse response)
  {
    if (response != null) {
      response.clearSelection().refetchEvents();
    }
  }

  /**
   * @param event
   * @param response
   * @return
   */
  public boolean resizeEvent(final ResizedEvent event, final CalendarResponse response)
  {
    return modifyEvent(event.getEvent(), null, event.getNewEndTime(), response);
  }

  /**
   * @param event
   * @param response
   * @return
   */
  public boolean dropEvent(final DroppedEvent event, final CalendarResponse response)
  {
    return modifyEvent(event.getEvent(), event.getNewStartTime(), event.getNewEndTime(), response);
  }

  /**
   * @param event
   * @param newEndTime
   * @param newStartTime
   * @param response
   * @return
   */
  private boolean modifyEvent(final Event event, final DateTime newStartTime, final DateTime newEndTime, final CalendarResponse response)
  {
    if (event != null) {
      final PollEventDO eventDO = searchById(event.getId());
      if (eventDO != null) {
        if (newStartTime != null) {
          eventDO.setStartDate(new Timestamp(newStartTime.getMillis()));
          event.setStart(newStartTime);
        }
        if (newEndTime != null) {
          eventDO.setEndDate(new Timestamp(newEndTime.getMillis()));
          event.setEnd(newEndTime);
        }
        clearSelection(response);
        return false;
      }
    }
    clearSelection(response);
    return true;
  }

  /**
   *
   * @param event
   */
  public void removeElement(final PollEventDO event)
  {
    pollEventCache.remove(event);
  }

  /**
   * @param event
   * @param response
   */
  public void eventClicked(final ClickedEvent event, final CalendarResponse response)
  {
    final PollEventDO clickEvent = searchById(event.getEvent().getId());
    if (clickEvent != null) {
      // TODO remove when side bar is ready
      pollEventCache.remove(clickEvent);
    }
    clearSelection(response);
  }

  private PollEventDO searchById(final String id)
  {
    PollEventDO result = null;
    Event temp = null;
    for (final PollEventDO key : pollEventCache.keySet()) {
      temp = pollEventCache.get(key);
      if (temp != null && StringUtils.equals(temp.getId(), id)) {
        result = key;
        break;
      }
    }
    return result;
  }

  public Collection<PollEventDO> getAllEvents()
  {
    return pollEventCache.keySet();
  }

  /**
   * @param pollEvent
   * @return
   */
  public Event getEventForPollEvent(final PollEventDO pollEvent)
  {
    return pollEventCache.get(pollEvent);
  }
}
TOP

Related Classes of org.projectforge.plugins.poll.event.PollEventEventsProvider

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.