Java tutorial
/* * Copyright (C) 2013 lichtflut Forschungs- und Entwicklungsgesellschaft mbH * * 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 de.lichtflut.glasnost.is.components.devops.perceptions; import java.util.List; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.event.Broadcast; import org.apache.wicket.event.IEvent; 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.link.AbstractLink; 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.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; import de.lichtflut.glasnost.is.dialog.CreatePerceptionsWizzardDialog; import de.lichtflut.glasnost.is.events.ModelChangeEvent; import de.lichtflut.glasnost.is.model.logic.Perception; import de.lichtflut.glasnost.is.model.logic.PerceptionOrder; import de.lichtflut.glasnost.is.model.ui.PerceptionModel; import de.lichtflut.glasnost.is.pages.PerceptionDisplayPage; import de.lichtflut.glasnost.is.pages.PerceptionEditPage; import de.lichtflut.glasnost.is.services.PerceptionDefinitionService; import de.lichtflut.rb.application.common.CommonParams; import de.lichtflut.rb.webck.behaviors.ConditionalBehavior; import de.lichtflut.rb.webck.behaviors.CssModifier; import de.lichtflut.rb.webck.common.DisplayMode; import de.lichtflut.rb.webck.common.RBAjaxTarget; import de.lichtflut.rb.webck.components.common.DialogHoster; import de.lichtflut.rb.webck.components.dialogs.ConfirmationDialog; import de.lichtflut.rb.webck.models.ConditionalModel; import de.lichtflut.rb.webck.models.resources.ResourceLabelModel; /** * <p> * This panel lists all registered perceptions and allows creation and editing. * </p> * * <p> * Created 16.11.12 * </p> * * @author Oliver Tigges */ public class PerceptionManagementPanel extends Panel { @SpringBean private PerceptionDefinitionService perceptionDefinitionService; // ---------------------------------------------------- public PerceptionManagementPanel(final String id) { this(id, new PerceptionModel()); } public PerceptionManagementPanel(final String id, final IModel<List<Perception>> model) { super(id, model); add(createTabelHeader("tableHeader", model)); final ListView<Perception> perceptionView = createListView(model); add(perceptionView); add(createNoPerceptionsInfo("noPerceptions", model)); add(createNewLink()); add(createPerceptionWizzardLink("openWizzardLink")); setOutputMarkupId(true); } // ---------------------------------------------------- private Component createTabelHeader(final String id, final IModel<List<Perception>> model) { // Contains static HTML. We determin its visibility only. Component container = new WebMarkupContainer(id); container.add(ConditionalBehavior.visibleIf(ConditionalModel.isNotEmpty(model))); return container; } private Component createNoPerceptionsInfo(final String id, final IModel<List<Perception>> model) { Label label = new Label(id, new ResourceModel("label.no-perceptions")); label.add(ConditionalBehavior.visibleIf(ConditionalModel.isEmpty(model))); return label; } private ListView<Perception> createListView(final IModel<List<Perception>> model) { ListView<Perception> view = new ListView<Perception>("perceptionView", model) { @Override protected void populateItem(final ListItem<Perception> item) { Perception perception = item.getModelObject(); Label id = new Label("id", perception.getID()); id.add(new AttributeModifier("title", perception.getContext())); item.add(id); Label name = new Label("name", perception.getName()); item.add(name); Label owner = new Label("owner", new ResourceLabelModel(perception.getOwner())); item.add(owner); Label color = new Label("color", ""); color.add(CssModifier.appendStyle("background-color : #" + perception.getColor())); item.add(color); item.add(createViewLink(item.getModel())); item.add(createDeleteLink(item.getModel())); item.add(createUpLink(item.getModel(), model)); item.add(createDownLink(item.getModel(), model)); } }; view.add(ConditionalBehavior.visibleIf(ConditionalModel.isNotEmpty(model))); return view; } // ---------------------------------------------------- private AbstractLink createNewLink() { return new AjaxLink<Void>("createPerceptionLink") { @Override public void onClick(final AjaxRequestTarget target) { PageParameters parameters = new PageParameters(); parameters.add(DisplayMode.PARAMETER, DisplayMode.CREATE); setResponsePage(PerceptionEditPage.class, parameters); } }; } private AbstractLink createPerceptionWizzardLink(final String id) { return new AjaxLink<Void>(id) { @Override public void onClick(final AjaxRequestTarget target) { final DialogHoster dialogHoster = findParent(DialogHoster.class); dialogHoster.openDialog(new CreatePerceptionsWizzardDialog(dialogHoster.getDialogID()) { @Override protected void onUpdate(final AjaxRequestTarget target, final Form<?> form) { dialogHoster.closeDialog(this); } }); } }; } private AjaxLink<?> createDeleteLink(final IModel<Perception> model) { final AjaxLink<?> link = new AjaxLink<Void>("delete") { @Override public void onClick(final AjaxRequestTarget target) { openConfirmationDialog(model); } private void openConfirmationDialog(final IModel<Perception> model) { final String confirmation = getString("dialog.confirmation.delete") + " '" + model.getObject().getID() + "'"; final DialogHoster hoster = findParent(DialogHoster.class); hoster.openDialog(new ConfirmationDialog(hoster.getDialogID(), Model.of(confirmation)) { @Override public void onConfirm() { removePerception(model); send(getPage(), Broadcast.BREADTH, new ModelChangeEvent<Void>(ModelChangeEvent.PERCEPTION)); } @Override public void onCancel() { hoster.closeDialog(this); } }); } }; return link; } private void removePerception(final IModel<Perception> model) { perceptionDefinitionService.delete(model.getObject()); PerceptionModel perceptions = (PerceptionModel) getDefaultModel(); perceptions.remove(model.getObject()); } private AjaxLink<?> createViewLink(final IModel<Perception> model) { return new AjaxLink<Void>("view") { @Override public void onClick(final AjaxRequestTarget target) { PageParameters parameters = new PageParameters(); parameters.add(CommonParams.PARAM_RESOURCE_ID, model.getObject().toURI()); parameters.add(DisplayMode.PARAMETER, DisplayMode.VIEW); setResponsePage(PerceptionDisplayPage.class, parameters); } }; } private AjaxLink<?> createUpLink(final IModel<Perception> model, final IModel<List<Perception>> perceptions) { final AjaxLink<?> link = new AjaxLink<Void>("up") { @Override public void onClick(final AjaxRequestTarget target) { swapAndStore(model, perceptions, -1); update(); } }; return link; } private AjaxLink<?> createDownLink(final IModel<Perception> model, final IModel<List<Perception>> perceptions) { final AjaxLink<?> link = new AjaxLink<Void>("down") { @Override public void onClick(final AjaxRequestTarget target) { swapAndStore(model, perceptions, +1); update(); } }; return link; } private void swapAndStore(final IModel<Perception> model, final IModel<List<Perception>> perceptions, final int positions) { List<Perception> list = perceptions.getObject(); int pos = list.indexOf(model.getObject()); if (checkRange(pos, positions, list)) { swap(positions, list, pos); perceptionDefinitionService.store(list); } } private void swap(final int positions, final List<Perception> list, final int pos) { Perception actual = list.get(pos); Perception wanted = list.get(pos + positions); new PerceptionOrder(list).swap(actual, wanted); } private boolean checkRange(final int pos, final int positions, final List<Perception> list) { boolean valid = false; if (pos > 0 || positions > pos) { if (list.size() - 1 > pos || positions < 1) { valid = true; } } return valid; } private void update() { RBAjaxTarget.add(PerceptionManagementPanel.this); } // ---------------------------------------------------- @Override public void onEvent(final IEvent<?> event) { ModelChangeEvent<?> mce = ModelChangeEvent.from(event); if (mce.isAbout(ModelChangeEvent.PERCEPTION)) { update(); } } }