/* * #! * Ontopoly Editor * #- * Copyright (C) 2001 - 2013 The Ontopia Project * #- * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * !# */ package ontopoly.components; import java.util.Collection; import ontopoly.images.ImageResource; import ontopoly.model.FieldInstance; import ontopoly.model.RoleField; import ontopoly.model.Topic; import ontopoly.model.TopicType; import ontopoly.models.FieldInstanceModel; import ontopoly.models.FieldsViewModel; import ontopoly.models.PlayerTypesModel; import ontopoly.models.RoleFieldModel; import ontopoly.models.TopicModel; import ontopoly.models.TopicTypeModel; import ontopoly.pages.AbstractOntopolyPage; import ontopoly.pages.ModalInstancePage; import org.apache.wicket.Component; import org.apache.wicket.ResourceReference; 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.markup.ComponentTag; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.Link; 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.AbstractReadOnlyModel; import org.apache.wicket.model.ResourceModel; public abstract class FieldInstanceCreatePlayerPanel extends Panel { public static final int CREATE_ACTION_NONE = 1; public static final int CREATE_ACTION_POPUP = 2; public static final int CREATE_ACTION_NAVIGATE = 4; protected AbstractFieldInstancePanel fieldInstancePanel; protected FieldInstanceModel fieldInstanceModel; protected FieldsViewModel fieldsViewModel; protected RoleFieldModel roleFieldModel; protected TopicTypeModel topicTypeModel; int createAction; public FieldInstanceCreatePlayerPanel(String id, FieldInstanceModel _fieldInstanceModel, FieldsViewModel fieldsViewModel, RoleFieldModel _roleFieldModel, AbstractFieldInstancePanel fieldInstancePanel, int createAction) { super(id); this.fieldInstanceModel = _fieldInstanceModel; this.fieldsViewModel = fieldsViewModel; this.roleFieldModel = _roleFieldModel; this.fieldInstancePanel = fieldInstancePanel; this.createAction = createAction; RoleField associationField = roleFieldModel.getRoleField(); Collection<TopicType> allowedValueTypes = associationField.getAllowedPlayerTypes(_fieldInstanceModel.getFieldInstance().getInstance()); if (allowedValueTypes.isEmpty()) { setVisible(false); OntopolyImageLink button = new OntopolyImageLink("button", "create.gif", new ResourceModel("icon.create.player")) { @Override public void onClick(AjaxRequestTarget target) { } }; add(button); add(new Label("createMenu")); add(new Label("createModal")); } else if (allowedValueTypes.size() == 1) { this.topicTypeModel = new TopicTypeModel((TopicType)allowedValueTypes.iterator().next()); OntopolyImageLink button = new OntopolyImageLink("button", "create.gif", new ResourceModel("icon.create.player")) { @Override public void onClick(AjaxRequestTarget target) { FieldInstanceCreatePlayerPanel.this.onClick(target, topicTypeModel.getTopicType()); } }; add(button); add(new Label("createMenu").setVisible(false)); add(new Label("createModal").setVisible(false)); } else { final String menuId = id + "_" + associationField.getId() + "_" + _fieldInstanceModel.getFieldInstance().getInstance().getId(); Link<Object> button = new Link<Object>("button") { { add(new Image("image", new AbstractReadOnlyModel<ResourceReference>() { @Override public ResourceReference getObject() { return new ResourceReference(ImageResource.class, "create.gif"); } })); } @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); tag.put("onclick", "menuItemPopup(this)"); tag.put("id", "main" + menuId); tag.put("href", "#"); } @Override public void onClick() { } }; add(button); add(new ContextMenuPanel<TopicType>("createMenu", menuId) { @Override protected ListView<TopicType> createListView(final String menuId, final String menuItemId) { return new ListView<TopicType>(menuId, new PlayerTypesModel(fieldInstanceModel, roleFieldModel)) { @Override public void populateItem(final ListItem<TopicType> item) { AjaxLink<Object> createLink = new AjaxLink<Object>(menuItemId) { @Override public void onClick(AjaxRequestTarget target) { FieldInstanceCreatePlayerPanel.this.onClick(target, item.getModelObject()); } }; createLink.add(new Label("label", item.getModelObject().getName())); item.add(createLink); } }; } }); add(new Label("createModal").setVisible(false)); } } protected void onClick(AjaxRequestTarget target, TopicType selectedTopicType) { // create instance and redirect Topic instance = createInstance(selectedTopicType); if (instance == null) { hideInstancePage(target); } else if (createAction == CREATE_ACTION_POPUP) { showInstancePage(target, instance, selectedTopicType, this); } else if (createAction == CREATE_ACTION_NAVIGATE) { AbstractOntopolyPage page = (AbstractOntopolyPage)getPage(); setResponsePage(page.getPageClass(instance), page.getPageParameters(instance)); setRedirect(true); } else { hideInstancePage(target); } } protected Topic createInstance(TopicType topicType) { FieldInstance fieldInstance = fieldInstanceModel.getFieldInstance(); Topic currentTopic = fieldInstance.getInstance(); RoleField currentField = (RoleField)fieldInstance.getFieldAssignment().getFieldDefinition(); Topic createdTopic = null; RoleField createField = roleFieldModel.getRoleField(); // check with page to see if create is allowed AbstractOntopolyPage page = (AbstractOntopolyPage)getPage(); if (page.isCreateAllowed(currentTopic, currentField, topicType, createField)) { // create a new topic instance createdTopic = topicType.createInstance(null); performNewSelection(roleFieldModel, createdTopic); // // create association; selected player // RoleField.ValueIF value = RoleField.createValue(2); // value.addPlayer(createField, createdTopic); // // // create association; parent player // value.addPlayer(currentField, currentTopic); // // // create association and return instance // fieldInstance.addValue(value); } return createdTopic; } protected abstract void performNewSelection(RoleFieldModel ofieldModel, Topic selectedTopic); protected void showInstancePage(AjaxRequestTarget target, Topic topic, TopicType topicType, Component c) { // open modal window final ModalWindow createModal = new ModalWindow("createModal"); TopicModel<Topic> topicModel = new TopicModel<Topic>(topic); TopicTypeModel topicTypeModel = new TopicTypeModel(topicType); createModal.setContent(new ModalInstancePage(createModal.getContentId(), topicModel, topicTypeModel, fieldsViewModel) { @Override protected void onCloseOk(AjaxRequestTarget target) { // close modal and update parent createModal.close(target); FieldInstanceCreatePlayerPanel.this.hideInstancePage(target); } }); createModal.setTitle(new ResourceModel("ModalWindow.title.edit.new").getObject().toString() + topicType.getName() + "..."); createModal.setCookieName("createModal"); createModal.setCloseButtonCallback(new ModalWindow.CloseButtonCallback() { public boolean onCloseButtonClicked(AjaxRequestTarget target) { // modal already closed, now update parent FieldInstanceCreatePlayerPanel.this.hideInstancePage(target); return true; } }); replace(createModal); createModal.show(target); target.addComponent(this); } protected void hideInstancePage(AjaxRequestTarget target) { fieldInstancePanel.onUpdate(target); } @Override protected void onDetach() { fieldInstanceModel.detach(); fieldsViewModel.detach(); roleFieldModel.detach(); if (topicTypeModel != null) topicTypeModel.detach(); super.onDetach(); } }