/////////////////////////////////////////////////////////////////////////////
//
// 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;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.lang.ObjectUtils;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.plugins.poll.attendee.PollAttendeeDO;
import org.projectforge.plugins.poll.attendee.PollAttendeeDao;
import org.projectforge.plugins.poll.attendee.PollAttendeeDisabledChoiceProvider;
import org.projectforge.plugins.poll.attendee.PollAttendeePage;
import org.projectforge.plugins.poll.event.PollEventDO;
import org.projectforge.plugins.poll.event.PollEventDao;
import org.projectforge.plugins.poll.event.PollEventDisabledChoiceProvider;
import org.projectforge.user.PFUserDO;
import org.projectforge.web.common.MultiChoiceListHelper;
import org.projectforge.web.user.UsersComparator;
import org.projectforge.web.user.UsersProvider;
import org.projectforge.web.wicket.flowlayout.FieldsetPanel;
import com.vaynberg.wicket.select2.Select2MultiChoice;
/**
* @author M. Lauterbach (m.lauterbach@micromata.de)
*
*/
public class NewPollOverviewPage extends PollBasePage
{
private static final long serialVersionUID = 7667632498760754905L;
@SpringBean(name = "pollDao")
private PollDao pollDao;
@SpringBean(name = "pollAttendeeDao")
private PollAttendeeDao pollAttendeeDao;
@SpringBean(name = "pollEventDao")
private PollEventDao pollEventDao;
private final NewPollFrontendModel model;
private boolean isModified;
/**
*
*/
public NewPollOverviewPage(final PageParameters parameters)
{
super(parameters);
if (parameters == null) {
NewPollPage.redirectToNewPollPage(parameters);
this.model = null;
} else {
final Integer id = new Integer(parameters.get("id").toString());
this.model = new NewPollFrontendModel(pollDao.getById(id));
this.model.initModelByPoll();
}
}
public NewPollOverviewPage(final PageParameters parameters, final NewPollFrontendModel model)
{
super(parameters);
this.model = model;
}
/**
* @see org.apache.wicket.Component#onInitialize()
*/
@Override
protected void onInitialize()
{
super.onInitialize();
if (model.isNew() == false) {
isModified = isModelModified();
}
final FieldsetPanel fsTitle = gridBuilder.newFieldset(getString("plugins.poll.new.title"));
final TextField<String> title = new TextField<String>(fsTitle.getTextFieldId(), new PropertyModel<String>(model.getPollDo(), "title"));
title.setEnabled(this.model.isNew());
fsTitle.add(title);
final FieldsetPanel fsLocation = gridBuilder.newFieldset(getString("plugins.poll.new.location")).setLabelFor(this);
final TextField<String> location = new TextField<String>(fsLocation.getTextFieldId(),
new PropertyModel<String>(model.getPollDo(), "location"));
location.setEnabled(this.model.isNew());
fsLocation.add(location);
final FieldsetPanel fsDescription = gridBuilder.newFieldset(getString("plugins.poll.new.description"));
final TextArea<String> description = new TextArea<String>(fsDescription.getTextAreaId(), new PropertyModel<String>(this.model.getPollDo(),
"description"));
description.setEnabled(this.model.isNew());
fsDescription.add(description);
gridBuilder.newGridPanel();
// if (this.model.isNew() == true) {
final FieldsetPanel fsUsers = gridBuilder.newFieldset(getString("plugins.poll.attendee.users"));
// if (model.isNew() == false && isModified == false) {
createDisabledChoices(fsUsers, model.getPollAttendeeList(), true);
// } else {
// createDisabledChoices(fsUsers, model.getCalculatedAttendeeList(), true);
// }
// } else {
// createEnabledChoices();
// }
final FieldsetPanel fsEMails = gridBuilder.newFieldset(getString("plugins.poll.attendee.emails"));
// if (model.isNew() == false && isModified == false) {
createDisabledChoices(fsEMails, model.getPollAttendeeList(), false);
// } else {
// createDisabledChoices(fsEMails, model.getCalculatedAttendeeList(), false);
// }
final FieldsetPanel fsEvents = gridBuilder.newFieldset(getString("plugins.poll.attendee.events"));
createDisabledChoices(fsEvents, model.getAllEvents());
}
/**
* @param fieldset
* @param modelList
* @param b
*/
private void createDisabledChoices(final FieldsetPanel fieldset, final List<PollAttendeeDO> rawList, final boolean isUser)
{
final List<PollAttendeeDO> modelList = new LinkedList<PollAttendeeDO>();
for (final PollAttendeeDO attendee : rawList) {
if (attendee.getUser() != null && isUser == true) {
modelList.add(attendee);
} else if (attendee.getEmail() != null && isUser == false) {
modelList.add(attendee);
}
}
final MultiChoiceListHelper<PollAttendeeDO> assignHelper = new MultiChoiceListHelper<PollAttendeeDO>().setAssignedItems(modelList);
final Select2MultiChoice<PollAttendeeDO> multiChoices = new Select2MultiChoice<PollAttendeeDO>(fieldset.getSelect2MultiChoiceId(),
new PropertyModel<Collection<PollAttendeeDO>>(assignHelper, "assignedItems"), new PollAttendeeDisabledChoiceProvider(modelList));
fieldset.add(multiChoices);
multiChoices.setEnabled(false);
}
private void createEnabledChoices()
{
final UsersProvider usersProvider = new UsersProvider();
// User select
final FieldsetPanel fsUserSelect = gridBuilder.newFieldset(getString("plugins.poll.attendee.users"));
final MultiChoiceListHelper<PFUserDO> assignUsersListHelper = new MultiChoiceListHelper<PFUserDO>().setComparator(new UsersComparator())
.setFullList(usersProvider.getSortedUsers());
final HashSet<PFUserDO> attendeess = new HashSet<PFUserDO>();
for (final PollAttendeeDO attendee : model.getPollAttendeeList()) {
if (attendee.getUser() != null) {
attendeess.add(attendee.getUser());
} else {
// TODO email list
}
}
assignUsersListHelper.setAssignedItems(attendeess);
final Select2MultiChoice<PFUserDO> users = new Select2MultiChoice<PFUserDO>(fsUserSelect.getSelect2MultiChoiceId(),
new PropertyModel<Collection<PFUserDO>>(assignUsersListHelper, "assignedItems"), usersProvider);
fsUserSelect.add(users);
}
/**
* @param fieldset
* @param modelList
* @param b
*/
private void createDisabledChoices(final FieldsetPanel fieldset, final List<PollEventDO> modelList)
{
final MultiChoiceListHelper<PollEventDO> assignHelper = new MultiChoiceListHelper<PollEventDO>().setAssignedItems(modelList);
final Select2MultiChoice<PollEventDO> multiChoices = new Select2MultiChoice<PollEventDO>(fieldset.getSelect2MultiChoiceId(),
new PropertyModel<Collection<PollEventDO>>(assignHelper, "assignedItems"), new PollEventDisabledChoiceProvider(modelList));
fieldset.add(multiChoices);
multiChoices.setEnabled(false);
}
/**
* @see org.projectforge.web.wicket.AbstractUnsecureBasePage#getTitle()
*/
@Override
protected String getTitle()
{
return getString("plugins.poll.result");
}
/**
* @see org.projectforge.plugins.poll.PollBasePage#onConfirm()
*/
@Override
protected void onConfirm()
{
final boolean isNew = model.isNew();
pollDao.saveOrUpdate(model.getPollDo());
// relate elements with poll
if (isNew == true || isModified == true) {
for (final PollEventDO event : model.getAllEvents()) {
if (event.getPoll() == null) {
event.setPoll(model.getPollDo());
}
}
for (final PollAttendeeDO attendee : model.getPollAttendeeList()) {
if (attendee.getPoll() == null) {
attendee.setPoll(model.getPollDo());
}
}
pollEventDao.saveOrUpdate(model.getAllEvents());
pollAttendeeDao.saveOrUpdate(model.getPollAttendeeList());
}
setResponsePage(PollListPage.class);
}
/**
* @see org.projectforge.plugins.poll.PollBasePage#onCancel()
*/
@Override
protected void onCancel()
{
setResponsePage(PollListPage.class);
}
/**
* @see org.projectforge.plugins.poll.PollBasePage#onBack()
*/
@Override
protected void onBack()
{
setResponsePage(new PollAttendeePage(getPageParameters(), model));
}
/**
* @see org.projectforge.plugins.poll.PollBasePage#onDelete()
*/
@Override
protected void onDelete()
{
if (model != null && model.getPollDo() != null) {
model.getPollDo().setDeleted(true);
pollDao.save(model.getPollDo());
}
}
/**
* Validate if something was changed.
*
* @return
*/
private boolean isModelModified() {
if (model.getPollDo().getId() != null) {
final PollDO poll = model.getPollDo();
final PollDO pollOld = pollDao.getById(model.getPollDo().getId());
final List<PollAttendeeDO> attendees = pollAttendeeDao.getListByPoll(poll);
final List<PollEventDO> events = pollEventDao.getListByPoll(poll);
// compare attendees
final boolean compareAttendees = compareLists(attendees, model.getPollAttendeeList());
// compare events
final boolean compareEvents = compareLists(events, model.getAllEvents());
// compare poll
final boolean comparePoll = ObjectUtils.equals(pollOld, poll);
if (compareAttendees == false || compareEvents == false || comparePoll == false) {
return true;
} else {
return false;
}
} else {
return false;
}
}
/**
* compare lists and their elements.
* returns true, if lists are identical, false else.
*
* @param listA
* @param listB
* @return
*/
private boolean compareLists(final List<?> listA, final List<?> listB) {
if (listA.size() == listB.size()) {
for (final Object obj : listB){
if (listA.contains(obj) == false) {
return false;
}
}
return true;
} else {
return false;
}
}
}