de.elatexam.editor.pages.taskdef.AddElementLink.java Source code

Java tutorial

Introduction

Here is the source code for de.elatexam.editor.pages.taskdef.AddElementLink.java

Source

/*
    
Copyright (C) 2010 Steffen Dienst
    
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 2 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, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package de.elatexam.editor.pages.taskdef;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.model.IModel;

import com.google.common.collect.ImmutableMap;

import de.elatexam.editor.TaskEditorSession;
import de.elatexam.editor.components.panels.tree.ComplexTaskDefTree;
import de.elatexam.editor.user.BasicUser;
import de.elatexam.editor.util.Stuff;
import de.elatexam.model.Category;
import de.elatexam.model.ClozeSubTaskDef;
import de.elatexam.model.ClozeTaskBlock;
import de.elatexam.model.ClozeTaskBlock.ClozeConfig;
import de.elatexam.model.ComplexTaskDef;
import de.elatexam.model.ComplexTaskDef.Config;
import de.elatexam.model.ComplexTaskDef.Config.CorrectionMode;
import de.elatexam.model.ComplexTaskDef.Config.CorrectionMode.Regular;
import de.elatexam.model.Indexed;
import de.elatexam.model.MappingSubTaskDef;
import de.elatexam.model.MappingTaskBlock;
import de.elatexam.model.MappingTaskBlock.MappingConfig;
import de.elatexam.model.McSubTaskDef;
import de.elatexam.model.McTaskBlock;
import de.elatexam.model.McTaskBlock.McConfig;
import de.elatexam.model.PaintSubTaskDef;
import de.elatexam.model.PaintTaskBlock;
import de.elatexam.model.SubTaskDef;
import de.elatexam.model.TaskBlock;
import de.elatexam.model.TaskblockConfig;
import de.elatexam.model.TextSubTaskDef;
import de.elatexam.model.TextTaskBlock;
import de.elatexam.model.manual.HomogeneousTaskBlock;

/**
 * @author Steffen Dienst
 *
 */
public class AddElementLink extends AjaxLink<Indexed> {
    final static ImmutableMap<Class<?>, Integer> childMap = new ImmutableMap.Builder<Class<?>, Integer>()

            .put(BasicUser.class, 0).put(ComplexTaskDef.class, 1).put(Category.class, 2).put(McTaskBlock.class, 3)
            .put(MappingTaskBlock.class, 4).put(ClozeTaskBlock.class, 5).put(TextTaskBlock.class, 6)
            .put(PaintTaskBlock.class, 7).build();

    private ComplexTaskDefTree<Indexed> tree;

    private ModalWindow selectTaskBlockModal;
    private TaskSelectorModalWindow selectTaskModal;

    public AddElementLink(String id, ModalWindow selectTaskBlockModal, TaskSelectorModalWindow selectTaskModal,
            ComplexTaskDefTree<Indexed> tree) {
        super(id);
        this.tree = tree;
        this.selectTaskBlockModal = selectTaskBlockModal;
        this.selectTaskModal = selectTaskModal;
    }

    @Override
    public void onClick(AjaxRequestTarget target) {
        IModel<Indexed> selectedModel = tree.getSelected();
        Indexed selectedObject = null;

        // nothing selected --> use root element
        if (selectedModel == null) {
            selectedObject = TaskEditorSession.get().getUser();
        } else {
            selectedObject = selectedModel.getObject();
        }
        Object newObj = null;

        switch (childMap.get(selectedObject.getClass())) {
        case 0: // create a new complextaskdef
            ComplexTaskDef newtaskdef = new ComplexTaskDef();
            newtaskdef.setTitle("<Neue Prfung>");
            Config config = new Config();
            config.setCorrectionMode(new CorrectionMode());
            config.getCorrectionMode().setRegular(new Regular());
            newtaskdef.setConfig(config);
            ((BasicUser) selectedObject).getTaskdefs().add(newtaskdef);
            newObj = newtaskdef;
            break;
        case 1: // create a new category
            Category cat = new Category();
            cat.setTitle("<Neue Kategorie>");
            cat.setId(Long.toString(System.nanoTime()));
            ((ComplexTaskDef) selectedObject).getCategory().add(cat);
            newObj = cat;
            break;
        case 2: // show taskblock selection modal window
            selectTaskBlockModal.show(target);
            break;
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
            selectTaskModal.showFor((Class<? extends SubTaskDef>) selectedObject.getClass(), target);
            break;
        default:
            break;
        }
        Stuff.saveAll(newObj, selectedObject);
    }

    /**
     * Create a new instance of the given taskblock type. Configure child
     * objects.
     *
     * @param taskblockclass
     */
    public void createTaskblock(Class<? extends TaskBlock> taskblockclass) {
        Object selectedObject = tree.getSelected().getObject();
        if (selectedObject instanceof Category) {
            try {
                TaskBlock taskblock = taskblockclass.newInstance();
                taskblock.setConfig(new TaskblockConfig());

                ((Category) selectedObject).getTaskBlocks().add((HomogeneousTaskBlock) taskblock);

                // set subclass specific config
                switch (childMap.get(taskblockclass)) {
                case 3:
                    ((McTaskBlock) taskblock).setMcConfig(new McConfig(new McConfig.Regular(), null));
                    break;
                case 4:
                    ((MappingTaskBlock) taskblock).setMappingConfig(new MappingConfig());
                    break;
                case 5:
                    ((ClozeTaskBlock) taskblock).setClozeConfig(new ClozeConfig());
                    break;
                default:
                    break;
                }

                Stuff.saveAll(selectedObject);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * Add all {@link SubTaskDef}s to an appropriate subtype of
     * {@link TaskBlock}.
     *
     * @param subtaskdef
     */
    public void addTasks(SubTaskDef... subtaskdefs) {
        Object o = tree.getSelected().getObject();
        if (o instanceof TaskBlock) {
            for (SubTaskDef std : subtaskdefs) {
                switch (childMap.get(o.getClass())) {
                case 3:
                    ((McTaskBlock) o).getMcSubTaskDef().add((McSubTaskDef) std);
                    break;
                case 4:
                    ((MappingTaskBlock) o).getMappingSubTaskDef().add((MappingSubTaskDef) std);
                    break;
                case 5:
                    ((ClozeTaskBlock) o).getClozeSubTaskDef().add((ClozeSubTaskDef) std);
                    break;
                case 6:
                    ((TextTaskBlock) o).getTextSubTaskDef().add((TextSubTaskDef) std);
                    break;
                case 7:
                    ((PaintTaskBlock) o).getPaintSubTaskDef().add((PaintSubTaskDef) std);
                    break;
                default:
                    throw new RuntimeException(
                            "Unknown taskblock type, can't add subtaskdef of type " + std.getClass());
                }
            }
            Stuff.saveAll(o);
        }

    }

}