com.userweave.module.methoden.questionnaire.page.grouping.QuestionnaireGroupingPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.userweave.module.methoden.questionnaire.page.grouping.QuestionnaireGroupingPanel.java

Source

/*******************************************************************************
 * This file is part of UserWeave.
 *
 *     UserWeave is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Affero General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     UserWeave 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 Affero General Public License for more details.
 *
 *     You should have received a copy of the GNU Affero General Public License
 *     along with UserWeave.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Copyright 2012 User Prompt GmbH | Psychologic IT Expertise
 *******************************************************************************/
package com.userweave.module.methoden.questionnaire.page.grouping;

import java.util.List;
import java.util.Locale;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import com.userweave.components.authorization.AuthOnlyDropDownChoice;
import com.userweave.dao.StudyGroupDao;
import com.userweave.dao.StudyLocalesGroupDao;
import com.userweave.domain.StudyGroup;
import com.userweave.module.methoden.questionnaire.dao.QuestionnaireConfigurationDao;
import com.userweave.module.methoden.questionnaire.dao.QuestionnaireGroupDao;
import com.userweave.module.methoden.questionnaire.domain.QuestionnaireConfigurationEntity;
import com.userweave.module.methoden.questionnaire.domain.group.QuestionnaireGroup;
import com.userweave.presentation.model.SpringLoadableDetachableModel;

/**
 * @author oma
 */
@SuppressWarnings("serial")
public class QuestionnaireGroupingPanel extends Panel {

    // FIXME: put Study Grouping details to different panel. This is a hack here!
    //private Question selectedQuestion;
    private GroupType selectedGroupType;

    private Component addGroupPanel;

    @SpringBean
    private QuestionnaireConfigurationDao questionnaireConfigurationDao;

    @SpringBean
    private QuestionnaireGroupDao questionnaireGroupDao;

    @SpringBean
    private StudyGroupDao studyGroupDao;

    @SpringBean
    private StudyLocalesGroupDao studyLocalesGroupDao;

    public QuestionnaireGroupingPanel(String id, final QuestionnaireConfigurationEntity configuration) {
        super(id);

        setOutputMarkupId(true);

        //final int configurationId = configuration.getId();

        final Locale locale = configuration.getStudy().getLocale();

        setDefaultModel(new SpringLoadableDetachableModel(questionnaireConfigurationDao, configuration));

        add(new ListView("moduleGroups", new PropertyModel(getDefaultModel(), "groups")) {

            @Override
            protected void populateItem(ListItem item) {

                if (item.getIndex() % 2 == 1) {
                    item.add(new AttributeModifier("class", true, new Model("oddRow")));
                }

                Panel groupingDescriptionPanel = new QuestionnaireGroupingPanelFactoryImpl()
                        .getGroupingDescriptionPanel(item.getModel(), locale);
                if (groupingDescriptionPanel != null) {
                    item.add(groupingDescriptionPanel);
                } else {
                    item.add(new Label("group", "EMPTY !"));
                }

                Form form = new Form("deleteForm");

                item.add(form);

                QuestionnaireGroup group = (QuestionnaireGroup) item.getModelObject();

                final Class<? extends QuestionnaireGroup> class1 = group.getClass();

                final Integer groupId = group.getId();

                form.add(new AjaxButton("delete", form) {

                    @Override
                    protected void onSubmit(AjaxRequestTarget target, Form form) {
                        QuestionnaireConfigurationEntity configuration = getConfiguration();
                        QuestionnaireGroup group = questionnaireGroupDao.findById(class1, groupId);
                        configuration.removeFromGroups(group);
                        questionnaireGroupDao.delete(group);
                        target.addComponent(QuestionnaireGroupingPanel.this);
                    }

                    @Override
                    protected void onError(AjaxRequestTarget target, Form<?> form) {
                    }

                });

            }

        });

        add(new ListView("studyGroups", new PropertyModel(getDefaultModel(), "study.groups")) {
            @Override
            protected void populateItem(ListItem item) {

                if (item.getIndex() % 2 == 1) {
                    item.add(new AttributeModifier("class", true, new Model("oddRow")));
                }

                Panel groupingDescriptionPanel = new StudyGroupingFactoryImpl()
                        .getGroupingDescriptionPanel(item.getModel(), locale);
                if (groupingDescriptionPanel != null) {
                    item.add(groupingDescriptionPanel);
                } else {
                    item.add(new Label("group", "EMPTY !"));
                }

                Form form = new Form("deleteForm");

                item.add(form);

                StudyGroup group = (StudyGroup) item.getModelObject();

                final Class<? extends StudyGroup> class1 = group.getClass();

                final Integer groupId = group.getId();

                form.add(new AjaxButton("delete", form) {

                    @Override
                    protected void onSubmit(AjaxRequestTarget target, Form form) {
                        StudyGroup group = studyGroupDao.findById(class1, groupId);
                        getConfiguration().getStudy().removeFromGroups(group);
                        studyGroupDao.delete(group);
                        target.add(QuestionnaireGroupingPanel.this);
                    }

                    @Override
                    protected void onError(AjaxRequestTarget target, Form<?> form) {
                    }

                });

            }

        });

        Form form = new Form("form") {
        };

        add(form);

        AuthOnlyDropDownChoice choice = new AuthOnlyDropDownChoice("groupTypes",
                new PropertyModel(this, "selectedGroupType"), getSelectionObjects(configuration, locale),
                new IChoiceRenderer() {

                    @Override
                    public Object getDisplayValue(Object object) {
                        return ((GroupType) object).getName().getObject();
                    }

                    @Override
                    public String getIdValue(Object object, int index) {
                        return Integer.toString(index);
                    }

                });

        choice.setRequired(true);

        choice.add(new AjaxFormComponentUpdatingBehavior("onchange") {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                if (selectedGroupType instanceof QuestionnaireGroupType) {
                    replaceGroupingPanel(target,
                            new QuestionnaireGroupingPanelFactoryImpl().createGroupingPanel("addGroupPanel",
                                    (QuestionnaireGroupType) selectedGroupType, locale,
                                    new GroupAddedCallback<QuestionnaireGroup>() {
                                        @Override
                                        public void onAdd(AjaxRequestTarget target, QuestionnaireGroup group) {
                                            addGroupAndSaveConfiguration(group);
                                            removeGroupingPanel(target);
                                        }
                                    }));
                } else if (selectedGroupType instanceof StudyGroupType) {
                    replaceGroupingPanel(target, new StudyGroupingFactoryImpl().createGroupingPanel("addGroupPanel",
                            (StudyGroupType) selectedGroupType, locale, new GroupAddedCallback<StudyGroup>() {
                                @Override
                                public void onAdd(AjaxRequestTarget target, StudyGroup group) {
                                    addGroupAndSaveStudy(group);
                                    removeGroupingPanel(target);
                                }
                            }));
                }
            }
        });

        form.add(choice);

        addGroupPanel = new WebMarkupContainer("addGroupPanel");

        add(addGroupPanel);

        addGroupPanel.setOutputMarkupId(true);

    }

    private List<GroupType> getSelectionObjects(QuestionnaireConfigurationEntity configuration, Locale locale) {
        List<GroupType> groupTypes = new QuestionnaireGroupingPanelFactoryImpl()
                .getGroupTypes(configuration.getQuestions(), locale);
        groupTypes.addAll(new StudyGroupingFactoryImpl().getGroupTypes(configuration.getStudy()));
        return groupTypes;
    }

    private QuestionnaireConfigurationEntity getConfiguration() {
        return (QuestionnaireConfigurationEntity) getDefaultModelObject();
    };

    private void addGroupAndSaveConfiguration(QuestionnaireGroup group) {
        getConfiguration().getGroups().add(group);
        questionnaireConfigurationDao.save(getConfiguration());
    }

    private void addGroupAndSaveStudy(StudyGroup group) {
        group.setStudy(getConfiguration().getStudy());
        studyLocalesGroupDao.save(group);
    }

    private void replaceGroupingPanel(AjaxRequestTarget target, Component replacement) {
        replacement.setOutputMarkupId(true);
        addGroupPanel.replaceWith(replacement);
        addGroupPanel = replacement;
        target.addComponent(addGroupPanel);
    }

    private void removeGroupingPanel(AjaxRequestTarget target) {
        replaceGroupingPanel(target, new WebMarkupContainer("addGroupPanel"));
        target.addComponent(QuestionnaireGroupingPanel.this);
    }

}