Package org.projectforge.plugins.teamcal.integration

Source Code of org.projectforge.plugins.teamcal.integration.TeamCalCalendarForm

/////////////////////////////////////////////////////////////////////////////
//
// 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.teamcal.integration;

import java.util.List;
import java.util.Set;

import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.Uid;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.common.StringHelper;
import org.projectforge.plugins.teamcal.admin.TeamCalListPage;
import org.projectforge.plugins.teamcal.dialog.TeamCalFilterDialog;
import org.projectforge.plugins.teamcal.event.TeamEventDO;
import org.projectforge.plugins.teamcal.event.TeamEventDao;
import org.projectforge.plugins.teamcal.event.TeamEventEditPage;
import org.projectforge.plugins.teamcal.event.TeamEventListPage;
import org.projectforge.plugins.teamcal.event.TeamEventUtils;
import org.projectforge.plugins.teamcal.event.importics.DropIcsPanel;
import org.projectforge.plugins.teamcal.event.importics.TeamCalImportPage;
import org.projectforge.web.calendar.CalendarForm;
import org.projectforge.web.calendar.CalendarPage;
import org.projectforge.web.calendar.CalendarPageSupport;
import org.projectforge.web.calendar.ICalendarFilter;
import org.projectforge.web.dialog.ModalMessageDialog;
import org.projectforge.web.wicket.components.LabelValueChoiceRenderer;
import org.projectforge.web.wicket.flowlayout.AjaxIconButtonPanel;
import org.projectforge.web.wicket.flowlayout.DivType;
import org.projectforge.web.wicket.flowlayout.DropDownChoicePanel;
import org.projectforge.web.wicket.flowlayout.IconButtonPanel;
import org.projectforge.web.wicket.flowlayout.IconType;

/**
* @author Johannes Unterstein (j.unterstein@micromata.de)
* @author M. Lauterbach (m.lauterbach@micromata.de)
*/
public class TeamCalCalendarForm extends CalendarForm
{
  private static final long serialVersionUID = -5838203593605203398L;

  private static final String MAGIC_FILTER_ENTRY = "__MAGIC-FILTER-ENTRY__";

  private ModalMessageDialog errorDialog;

  @SpringBean(name = "teamEventDao")
  private TeamEventDao teamEventDao;

  @SuppressWarnings("unused")
  private TemplateEntry activeTemplate;

  private DropDownChoicePanel<TemplateEntry> templateChoice;

  /**
   * @param parentPage
   */
  public TeamCalCalendarForm(final CalendarPage parentPage)
  {
    super(parentPage);
  }

  /**
   * @see org.projectforge.web.calendar.CalendarForm#createCalendarPageSupport()
   */
  @Override
  protected CalendarPageSupport createCalendarPageSupport()
  {
    return new CalendarPageSupport(parentPage).setShowOptions(false).setShowTimsheetsSelectors(false);
  }

  /**
   * @see org.projectforge.web.calendar.CalendarForm#init()
   */
  @SuppressWarnings("serial")
  @Override
  protected void init()
  {
    super.init();
    {
      final IconButtonPanel icsExportButtonPanel = new IconButtonPanel(buttonGroupPanel.newChildId(), IconType.LIST, new ResourceModel(
          "plugins.teamcal.calendar.listAndIcsExport.tooltip")) {
        /**
         * @see org.projectforge.web.wicket.flowlayout.IconButtonPanel#onSubmit()
         */
        @Override
        protected void onSubmit()
        {
          setResponsePage(TeamCalListPage.class);
        }
      };
      icsExportButtonPanel.setDefaultFormProcessing(false);
      buttonGroupPanel.addButton(icsExportButtonPanel);
    }
    {
      final IconButtonPanel searchButtonPanel = new IconButtonPanel(buttonGroupPanel.newChildId(), IconType.SEARCH, new ResourceModel(
          "search")) {
        /**
         * @see org.projectforge.web.wicket.flowlayout.IconButtonPanel#onSubmit()
         */
        @Override
        protected void onSubmit()
        {
          final Set<Integer> visibleCalsSet = ((TeamCalCalendarFilter) filter).getActiveVisibleCalendarIds();
          final String calendars = StringHelper.objectColToString(visibleCalsSet, ",");
          final TeamEventListPage teamEventListPage = new TeamEventListPage(new PageParameters().add(TeamEventListPage.PARAM_CALENDARS,
              calendars));
          setResponsePage(teamEventListPage);
        }
      };
      searchButtonPanel.setDefaultFormProcessing(false);
      buttonGroupPanel.addButton(searchButtonPanel);
    }

    final TeamCalFilterDialog dialog = new TeamCalFilterDialog(parentPage.newModalDialogId(), (TeamCalCalendarFilter) filter) {
      /**
       * @see org.projectforge.plugins.teamcal.dialog.TeamCalFilterDialog#onClose(org.apache.wicket.ajax.AjaxRequestTarget)
       */
      @Override
      protected void onClose(final AjaxRequestTarget target)
      {
        activeTemplate = ((TeamCalCalendarFilter) filter).getActiveTemplateEntry();
        target.add(templateChoice.getDropDownChoice());
      }
    };
    parentPage.add(dialog);
    dialog.init();
    final List<TemplateEntry> values = ((TeamCalCalendarFilter) filter).getTemplateEntries();
    final LabelValueChoiceRenderer<TemplateEntry> templateNamesChoiceRenderer = new LabelValueChoiceRenderer<TemplateEntry>();
    for (final TemplateEntry entry : values) {
      templateNamesChoiceRenderer.addValue(entry, entry.getName());
    }
    templateNamesChoiceRenderer.addValue(new TemplateEntry().setName(MAGIC_FILTER_ENTRY),
        getString("plugins.teamcal.calendar.filter.newEntry"));
    final IModel<TemplateEntry> activeModel = new PropertyModel<TemplateEntry>(this, "activeTemplate");
    this.activeTemplate = ((TeamCalCalendarFilter) filter).getActiveTemplateEntry();
    templateChoice = new DropDownChoicePanel<TemplateEntry>(fieldset.newChildId(), activeModel, templateNamesChoiceRenderer.getValues(),
        templateNamesChoiceRenderer, false);
    fieldset.add(templateChoice);
    templateChoice.setTooltip(getString("plugins.teamcal.calendar.filter.choose"));
    templateChoice.getDropDownChoice().setOutputMarkupId(true);

    templateChoice.getDropDownChoice().add(new AjaxFormComponentUpdatingBehavior("onChange") {
      private static final long serialVersionUID = 8999698636114154230L;

      /**
       * @see org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior#onUpdate(org.apache.wicket.ajax.AjaxRequestTarget)
       */
      @Override
      protected void onUpdate(final AjaxRequestTarget target)
      {
        final TemplateEntry selectedEntry = activeModel.getObject();
        if (MAGIC_FILTER_ENTRY.equals(selectedEntry.getName()) == false) {
          ((TeamCalCalendarFilter) filter).setActiveTemplateEntry(selectedEntry);
          filter.setSelectedCalendar(TemplateEntry.calcCalendarStringForCalendar(selectedEntry.getDefaultCalendarId()));
          setResponsePage(getParentPage().getClass());
        } else {
          final String newTemplateName = ((TeamCalCalendarFilter) filter)
              .getNewTemplateName(getString("plugins.teamcal.calendar.filterDialog.newTemplateName"));
          if (newTemplateName == null) {
            // New filter 9 is already reached.
            activeTemplate = ((TeamCalCalendarFilter) filter).getActiveTemplateEntry();
            target.add(templateChoice.getDropDownChoice());
            return;
          }
          dialog.openNew(target, newTemplateName);
          // Redraw the content:
          dialog.redraw().addContent(target);
        }
      }
    });

    final IconButtonPanel calendarButtonPanel = new AjaxIconButtonPanel(buttonGroupPanel.newChildId(), IconType.EDIT, new ResourceModel(
        "plugins.teamcal.calendar.filter.edit")) {
      /**
       * @see org.projectforge.web.wicket.flowlayout.AjaxIconButtonPanel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget)
       */
      @Override
      protected void onSubmit(final AjaxRequestTarget target)
      {
        dialog.open(target);
        // Redraw the content:
        dialog.redraw().addContent(target);
      }
    };
    calendarButtonPanel.setDefaultFormProcessing(false);
    buttonGroupPanel.addButton(calendarButtonPanel);

    fieldset.add(new DropIcsPanel(fieldset.newChildId()) {

      @Override
      protected void onIcsImport(final AjaxRequestTarget target, final Calendar calendar)
      {
        final List<VEvent> events = TeamEventUtils.getVEvents(calendar);
        if (events == null || events.size() == 0) {
          errorDialog.setMessage(getString("plugins.teamcal.import.ics.noEventsGiven")).open(target);
          return;
        }
        if (events.size() > 1) {
          // Can't import multiple entries, redirect to import page:
          redirectToImportPage(events, activeModel.getObject());
          return;
        }
        final VEvent event = events.get(0);
        final Uid uid = event.getUid();
        // 1. Check id/external id. If not yet given, create new entry and ask for calendar to add: Redirect to TeamEventEditPage.
        final TeamEventDO dbEvent = teamEventDao.getByUid(uid.getValue());
        if (dbEvent != null) {
          // Can't modify existing entry, redirect to import page:
          redirectToImportPage(events, activeModel.getObject());
          return;
        }
        final TeamEventDO teamEvent = TeamEventUtils.createTeamEventDO(event);
        final TemplateEntry activeTemplateEntry = ((TeamCalCalendarFilter) filter).getActiveTemplateEntry();
        if (activeTemplateEntry != null && activeTemplateEntry.getDefaultCalendarId() != null) {
          teamEventDao.setCalendar(teamEvent, activeTemplateEntry.getDefaultCalendarId());
        }
        final TeamEventEditPage editPage = new TeamEventEditPage(new PageParameters(), teamEvent);
        setResponsePage(editPage);
      }
    }.setTooltip(getString("plugins.teamcal.dropIcsPanel.tooltip")));
  }

  private void redirectToImportPage(final List<VEvent> events, final TemplateEntry activeTemplate)
  {
    final PageParameters parameters = new PageParameters();
    if (activeTemplate != null) {
      parameters.add(TeamCalImportPage.PARAM_KEY_TEAM_CAL_ID, activeTemplate.getDefaultCalendarId());
    }
    final TeamCalImportPage importPage = new TeamCalImportPage(parameters);
    importPage.setReturnToPage(parentPage);
    importPage.setEventsToImport(events);
    setResponsePage(importPage);
  }

  /**
   * @see org.apache.wicket.Component#onInitialize()
   */
  @Override
  protected void onInitialize()
  {
    errorDialog = new ModalMessageDialog(parentPage.newModalDialogId(), new ResourceModel("plugins.teamcal.import.ics.error"));
    errorDialog.setType(DivType.ALERT_ERROR);
    parentPage.add(errorDialog);
    errorDialog.init();
    super.onInitialize();
  }

  /**
   * @see org.projectforge.web.calendar.CalendarForm#getRefreshIconTooltip()
   */
  @Override
  protected String getRefreshIconTooltip()
  {
    return getString("plugins.teamcal.calendar.refresh.tooltip");
  }

  @Override
  public TeamCalCalendarFilter getFilter()
  {
    return (TeamCalCalendarFilter) filter;
  }

  @Override
  protected void setFilter(final ICalendarFilter filter)
  {
    this.filter = filter;
  }

  /**
   * @return the selectedCalendars
   */
  public Set<Integer> getSelectedCalendars()
  {
    return ((TeamCalCalendarFilter) filter).getActiveVisibleCalendarIds();
  }

}
TOP

Related Classes of org.projectforge.plugins.teamcal.integration.TeamCalCalendarForm

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.