You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2012/07/05 13:38:05 UTC
svn commit: r1357561 -
/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/
Author: danhaywood
Date: Thu Jul 5 11:38:05 2012
New Revision: 1357561
URL: http://svn.apache.org/viewvc?rev=1357561&view=rev
Log:
pull from origin
Modified:
incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.html
incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.java
incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanelFactory.java
incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesAndOrCollectionsPanel.java
Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.html
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.html?rev=1357561&r1=1357560&r2=1357561&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.html (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.html Thu Jul 5 11:38:05 2012
@@ -1,38 +1,38 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you 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.
--->
-<html>
- <body>
- <wicket:panel>
- <div class="entityPropertiesAndOrCollections">
-
-
-
- <form wicket:id="entityPropertiesAndOrCollections">
-
- <div wicket:id="propertiesAndOrCollections">
- <div wicket:id="propertyOrCollection" class="propertyOrCollection">[property or collection]</div>
- </div>
-
-
- </form>
- </div>
- </wicket:panel>
- </body>
-</html>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you 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.
+-->
+<html>
+ <body>
+ <wicket:panel>
+ <div class="entityPropertiesAndOrCollections">
+
+
+
+ <form wicket:id="entityPropertiesAndOrCollections">
+
+ <div wicket:id="propertiesAndOrCollections">
+ <div wicket:id="propertyOrCollection" class="propertyOrCollection">[property or collection]</div>
+ </div>
+
+
+ </form>
+ </div>
+ </wicket:panel>
+ </body>
+</html>
Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.java?rev=1357561&r1=1357560&r2=1357561&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanel.java Thu Jul 5 11:38:05 2012
@@ -1,249 +1,249 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
-
-import java.util.List;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.Session;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.feedback.FeedbackMessage;
-import org.apache.wicket.feedback.IFeedbackMessageFilter;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Button;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.form.IFormVisitorParticipant;
-import org.apache.wicket.markup.html.form.FormComponent.IVisitor;
-import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
-import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.model.Model;
-
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.progmodel.facets.object.validate.ValidateObjectFacet;
-import org.apache.isis.runtimes.dflt.runtime.memento.Memento;
-import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
-import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
-import org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll.EntityPropertiesAndOrCollectionsPanel.PropCollForm;
-import org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll.EntityPropertiesAndOrCollectionsPanel.Render;
-import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
-import org.apache.isis.viewer.wicket.ui.panels.FormAbstract;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-import org.apache.isis.viewer.wicket.ui.util.EvenOrOddCssClassAppenderFactory;
-
-/**
- * {@link PanelAbstract Panel} representing the properties of an entity, as per
- * the provided {@link EntityModel}.
- */
-public class EntityCollectionsReadOnlyFormPanel extends PanelAbstract<EntityModel> {
-
- private static final long serialVersionUID = 1L;
-
- private static final String ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS = "entityPropertiesAndOrCollections";
-
- private PropCollForm form;
-
- public EntityCollectionsReadOnlyFormPanel(final String id, final EntityModel entityModel) {
- super(id, entityModel);
- buildGui();
- form.toViewMode(null);
- }
-
- private void buildGui() {
- buildEntityPropertiesAndOrCollectionsGui();
- setOutputMarkupId(true); // so can repaint via ajax
- }
-
- private void buildEntityPropertiesAndOrCollectionsGui() {
- final EntityModel model = getModel();
- final ObjectAdapter adapter = model.getObject();
- if (adapter != null) {
- form = new PropCollForm(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS, model, this);
- addOrReplace(form);
- } else {
- permanentlyHide(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS);
- }
- }
-
- static class PropCollForm extends FormAbstract<ObjectAdapter> {
-
- private static final long serialVersionUID = 1L;
-
- private static final String ID_PROPERTIES_AND_OR_COLLECTIONS = "propertiesAndOrCollections";
- private static final String ID_PROPERTY_OR_COLLECTION = "propertyOrCollection";
-
- private final Component owningPanel;
-
- public PropCollForm(final String id, final EntityModel entityModel, final Component owningPanel) {
- super(id, entityModel);
- this.owningPanel = owningPanel; // for repainting
-
- buildGui();
- }
-
- private void buildGui() {
- addPropertiesAndOrCollections();
-
- addValidator();
- }
-
- private void addPropertiesAndOrCollections() {
- final EntityModel entityModel = (EntityModel) getModel();
- final ObjectAdapter adapter = entityModel.getObject();
- final ObjectSpecification noSpec = adapter.getSpecification();
-
- final List<ObjectAssociation> associations = visibleAssociations(adapter, noSpec);
-
- final RepeatingView rv = new RepeatingView(ID_PROPERTIES_AND_OR_COLLECTIONS);
- final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
- add(rv);
-
- @SuppressWarnings("unused")
- Component component;
- for (final ObjectAssociation association : associations) {
- if (association instanceof OneToOneAssociation) {
- final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
- rv.add(container);
- container.add(eo.nextClass());
-
- addPropertyToForm(entityModel, association, container);
- } else {
- final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
- rv.add(container);
- container.add(eo.nextClass());
-
- addCollectionToForm(entityModel, association, container);
- }
- }
-
- // massive hack: an empty property line to get CSS correct...!
- final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
- rv.add(container);
- container.add(new Label(ID_PROPERTY_OR_COLLECTION, Model.of(" ")));
- container.add(eo.nextClass());
- }
-
- private void addPropertyToForm(final EntityModel entityModel,
- final ObjectAssociation association,
- final WebMarkupContainer container) {
- @SuppressWarnings("unused")
- Component component;
- final OneToOneAssociation otoa = (OneToOneAssociation) association;
- final PropertyMemento pm = new PropertyMemento(otoa);
-
- final ScalarModel scalarModel = entityModel.getPropertyModel(pm);
- component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
- }
-
- private void addCollectionToForm(final EntityModel entityModel,
- final ObjectAssociation association,
- final WebMarkupContainer container) {
- @SuppressWarnings("unused")
- Component component;
- final OneToManyAssociation otma = (OneToManyAssociation) association;
-
- final EntityCollectionModel entityCollectionModel = EntityCollectionModel.createParented(entityModel, otma);
- final CollectionPanel collectionPanel = new CollectionPanel(ID_PROPERTY_OR_COLLECTION, entityCollectionModel);
- container.addOrReplace(collectionPanel);
-
- component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.COLLECTION_NAME_AND_CONTENTS, entityCollectionModel);
- }
-
- private List<ObjectAssociation> visibleAssociations(final ObjectAdapter adapter, final ObjectSpecification noSpec) {
- return noSpec.getAssociations(visibleAssociationFilter(adapter));
- }
-
- @SuppressWarnings("unchecked")
- private Filter<ObjectAssociation> visibleAssociationFilter(final ObjectAdapter adapter) {
- return Filters.and(ObjectAssociationFilters.COLLECTIONS, ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter));
- }
-
-
- private void requestRepaintPanel(final AjaxRequestTarget target) {
- if (target != null) {
- target.addComponent(owningPanel);
- }
- }
-
- private void addValidator() {
- add(new AbstractFormValidator() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public FormComponent<?>[] getDependentFormComponents() {
- return new FormComponent<?>[0];
- }
-
- @Override
- public void validate(final Form<?> form) {
- final EntityModel entityModel = (EntityModel) getModel();
- final ObjectAdapter adapter = entityModel.getObject();
- final ValidateObjectFacet facet = adapter.getSpecification().getFacet(ValidateObjectFacet.class);
- if (facet == null) {
- return;
- }
- final String invalidReasonIfAny = facet.invalidReason(adapter);
- if (invalidReasonIfAny != null) {
- Session.get().getFeedbackMessages().add(new FeedbackMessage(form, invalidReasonIfAny, FeedbackMessage.ERROR));
- }
- }
- });
- }
-
- private EntityModel getEntityModel() {
- return (EntityModel) getModel();
- }
-
- void toViewMode(final AjaxRequestTarget target) {
- getEntityModel().toViewMode();
- requestRepaintPanel(target);
- }
-
- @Override
- protected void onValidate() {
- Session.get().getFeedbackMessages().clear(new IFeedbackMessageFilter() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public boolean accept(final FeedbackMessage message) {
- return message.getReporter() == owningPanel;
- }
- });
- super.onValidate();
- }
- }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
+
+import java.util.List;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.Session;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.feedback.FeedbackMessage;
+import org.apache.wicket.feedback.IFeedbackMessageFilter;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.markup.html.form.IFormVisitorParticipant;
+import org.apache.wicket.markup.html.form.FormComponent.IVisitor;
+import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
+import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.Model;
+
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.progmodel.facets.object.validate.ValidateObjectFacet;
+import org.apache.isis.runtimes.dflt.runtime.memento.Memento;
+import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
+import org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll.EntityPropertiesAndOrCollectionsPanel.PropCollForm;
+import org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll.EntityPropertiesAndOrCollectionsPanel.Render;
+import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
+import org.apache.isis.viewer.wicket.ui.panels.FormAbstract;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.EvenOrOddCssClassAppenderFactory;
+
+/**
+ * {@link PanelAbstract Panel} representing the properties of an entity, as per
+ * the provided {@link EntityModel}.
+ */
+public class EntityCollectionsReadOnlyFormPanel extends PanelAbstract<EntityModel> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS = "entityPropertiesAndOrCollections";
+
+ private PropCollForm form;
+
+ public EntityCollectionsReadOnlyFormPanel(final String id, final EntityModel entityModel) {
+ super(id, entityModel);
+ buildGui();
+ form.toViewMode(null);
+ }
+
+ private void buildGui() {
+ buildEntityPropertiesAndOrCollectionsGui();
+ setOutputMarkupId(true); // so can repaint via ajax
+ }
+
+ private void buildEntityPropertiesAndOrCollectionsGui() {
+ final EntityModel model = getModel();
+ final ObjectAdapter adapter = model.getObject();
+ if (adapter != null) {
+ form = new PropCollForm(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS, model, this);
+ addOrReplace(form);
+ } else {
+ permanentlyHide(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS);
+ }
+ }
+
+ static class PropCollForm extends FormAbstract<ObjectAdapter> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String ID_PROPERTIES_AND_OR_COLLECTIONS = "propertiesAndOrCollections";
+ private static final String ID_PROPERTY_OR_COLLECTION = "propertyOrCollection";
+
+ private final Component owningPanel;
+
+ public PropCollForm(final String id, final EntityModel entityModel, final Component owningPanel) {
+ super(id, entityModel);
+ this.owningPanel = owningPanel; // for repainting
+
+ buildGui();
+ }
+
+ private void buildGui() {
+ addPropertiesAndOrCollections();
+
+ addValidator();
+ }
+
+ private void addPropertiesAndOrCollections() {
+ final EntityModel entityModel = (EntityModel) getModel();
+ final ObjectAdapter adapter = entityModel.getObject();
+ final ObjectSpecification noSpec = adapter.getSpecification();
+
+ final List<ObjectAssociation> associations = visibleAssociations(adapter, noSpec);
+
+ final RepeatingView rv = new RepeatingView(ID_PROPERTIES_AND_OR_COLLECTIONS);
+ final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
+ add(rv);
+
+ @SuppressWarnings("unused")
+ Component component;
+ for (final ObjectAssociation association : associations) {
+ if (association instanceof OneToOneAssociation) {
+ final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
+ rv.add(container);
+ container.add(eo.nextClass());
+
+ addPropertyToForm(entityModel, association, container);
+ } else {
+ final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
+ rv.add(container);
+ container.add(eo.nextClass());
+
+ addCollectionToForm(entityModel, association, container);
+ }
+ }
+
+ // massive hack: an empty property line to get CSS correct...!
+ final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
+ rv.add(container);
+ container.add(new Label(ID_PROPERTY_OR_COLLECTION, Model.of(" ")));
+ container.add(eo.nextClass());
+ }
+
+ private void addPropertyToForm(final EntityModel entityModel,
+ final ObjectAssociation association,
+ final WebMarkupContainer container) {
+ @SuppressWarnings("unused")
+ Component component;
+ final OneToOneAssociation otoa = (OneToOneAssociation) association;
+ final PropertyMemento pm = new PropertyMemento(otoa);
+
+ final ScalarModel scalarModel = entityModel.getPropertyModel(pm);
+ component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
+ }
+
+ private void addCollectionToForm(final EntityModel entityModel,
+ final ObjectAssociation association,
+ final WebMarkupContainer container) {
+ @SuppressWarnings("unused")
+ Component component;
+ final OneToManyAssociation otma = (OneToManyAssociation) association;
+
+ final EntityCollectionModel entityCollectionModel = EntityCollectionModel.createParented(entityModel, otma);
+ final CollectionPanel collectionPanel = new CollectionPanel(ID_PROPERTY_OR_COLLECTION, entityCollectionModel);
+ container.addOrReplace(collectionPanel);
+
+ component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.COLLECTION_NAME_AND_CONTENTS, entityCollectionModel);
+ }
+
+ private List<ObjectAssociation> visibleAssociations(final ObjectAdapter adapter, final ObjectSpecification noSpec) {
+ return noSpec.getAssociations(visibleAssociationFilter(adapter));
+ }
+
+ @SuppressWarnings("unchecked")
+ private Filter<ObjectAssociation> visibleAssociationFilter(final ObjectAdapter adapter) {
+ return Filters.and(ObjectAssociationFilters.COLLECTIONS, ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter));
+ }
+
+
+ private void requestRepaintPanel(final AjaxRequestTarget target) {
+ if (target != null) {
+ target.addComponent(owningPanel);
+ }
+ }
+
+ private void addValidator() {
+ add(new AbstractFormValidator() {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public FormComponent<?>[] getDependentFormComponents() {
+ return new FormComponent<?>[0];
+ }
+
+ @Override
+ public void validate(final Form<?> form) {
+ final EntityModel entityModel = (EntityModel) getModel();
+ final ObjectAdapter adapter = entityModel.getObject();
+ final ValidateObjectFacet facet = adapter.getSpecification().getFacet(ValidateObjectFacet.class);
+ if (facet == null) {
+ return;
+ }
+ final String invalidReasonIfAny = facet.invalidReason(adapter);
+ if (invalidReasonIfAny != null) {
+ Session.get().getFeedbackMessages().add(new FeedbackMessage(form, invalidReasonIfAny, FeedbackMessage.ERROR));
+ }
+ }
+ });
+ }
+
+ private EntityModel getEntityModel() {
+ return (EntityModel) getModel();
+ }
+
+ void toViewMode(final AjaxRequestTarget target) {
+ getEntityModel().toViewMode();
+ requestRepaintPanel(target);
+ }
+
+ @Override
+ protected void onValidate() {
+ Session.get().getFeedbackMessages().clear(new IFeedbackMessageFilter() {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public boolean accept(final FeedbackMessage message) {
+ return message.getReporter() == owningPanel;
+ }
+ });
+ super.onValidate();
+ }
+ }
+}
Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanelFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanelFactory.java?rev=1357561&r1=1357560&r2=1357561&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanelFactory.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityCollectionsReadOnlyFormPanelFactory.java Thu Jul 5 11:38:05 2012
@@ -1,48 +1,48 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
-
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-
-/**
- * {@link ComponentFactory} for {@link EntityPropertiesAndOrCollectionsPanel}.
- */
-public class EntityCollectionsReadOnlyFormPanelFactory extends EntityComponentFactoryAbstract {
-
- private static final long serialVersionUID = 1L;
-
- public EntityCollectionsReadOnlyFormPanelFactory() {
- super(ComponentType.ENTITY_COLLECTIONS_READ_ONLY_FORM);
- }
-
- @Override
- public Component createComponent(final String id, final IModel<?> model) {
- final EntityModel entityModel = (EntityModel) model;
- return new EntityCollectionsReadOnlyFormPanel(id, entityModel);
- }
-}
-
-
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
+
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+/**
+ * {@link ComponentFactory} for {@link EntityPropertiesAndOrCollectionsPanel}.
+ */
+public class EntityCollectionsReadOnlyFormPanelFactory extends EntityComponentFactoryAbstract {
+
+ private static final long serialVersionUID = 1L;
+
+ public EntityCollectionsReadOnlyFormPanelFactory() {
+ super(ComponentType.ENTITY_COLLECTIONS_READ_ONLY_FORM);
+ }
+
+ @Override
+ public Component createComponent(final String id, final IModel<?> model) {
+ final EntityModel entityModel = (EntityModel) model;
+ return new EntityCollectionsReadOnlyFormPanel(id, entityModel);
+ }
+}
+
+
+
Modified: incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesAndOrCollectionsPanel.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesAndOrCollectionsPanel.java?rev=1357561&r1=1357560&r2=1357561&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesAndOrCollectionsPanel.java (original)
+++ incubator/isis/trunk/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/blocks/propcoll/EntityPropertiesAndOrCollectionsPanel.java Thu Jul 5 11:38:05 2012
@@ -1,398 +1,398 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
-
-import java.util.List;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.Session;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.feedback.FeedbackMessage;
-import org.apache.wicket.feedback.IFeedbackMessageFilter;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Button;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.form.IFormVisitorParticipant;
-import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
-import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.model.Model;
-
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.progmodel.facets.object.validate.ValidateObjectFacet;
-import org.apache.isis.runtimes.dflt.runtime.memento.Memento;
-import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
-import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
-import org.apache.isis.viewer.wicket.ui.panels.FormAbstract;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-import org.apache.isis.viewer.wicket.ui.util.EvenOrOddCssClassAppenderFactory;
-
-/**
- * {@link PanelAbstract Panel} representing the properties of an entity, as per
- * the provided {@link EntityModel}.
- */
-public class EntityPropertiesAndOrCollectionsPanel extends PanelAbstract<EntityModel> {
-
- private static final long serialVersionUID = 1L;
-
- private static final String ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS = "entityPropertiesAndOrCollections";
-
- public enum Render {
- PROPERTIES_ONLY {
- @Override
- public Filter<ObjectAssociation> getFilters() {
- return ObjectAssociationFilters.PROPERTIES;
- }
- },
- COLLECTIONS_ONLY {
- @Override
- public Filter<ObjectAssociation> getFilters() {
- return ObjectAssociationFilters.COLLECTIONS;
- }
- },
- PROPERTIES_AND_COLLECTIONS {
- @Override
- public Filter<ObjectAssociation> getFilters() {
- return Filters.or(PROPERTIES_ONLY.getFilters(), COLLECTIONS_ONLY.getFilters());
- }
- };
-
- public abstract Filter<ObjectAssociation> getFilters();
- }
-
- private final Render render;
- private PropCollForm form;
-
- public EntityPropertiesAndOrCollectionsPanel(final String id, final EntityModel entityModel, final Render render) {
- super(id, entityModel);
- this.render = render;
- buildGui();
- form.toViewMode(null);
- }
-
- private void buildGui() {
- buildEntityPropertiesAndOrCollectionsGui();
- setOutputMarkupId(true); // so can repaint via ajax
- }
-
- private void buildEntityPropertiesAndOrCollectionsGui() {
- final EntityModel model = getModel();
- final ObjectAdapter adapter = model.getObject();
- if (adapter != null) {
- form = new PropCollForm(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS, model, render, this);
- addOrReplace(form);
- } else {
- permanentlyHide(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS);
- }
- }
-
- static class PropCollForm extends FormAbstract<ObjectAdapter> {
-
- private static final long serialVersionUID = 1L;
-
- private static final String ID_PROPERTIES_AND_OR_COLLECTIONS = "propertiesAndOrCollections";
- private static final String ID_PROPERTY_OR_COLLECTION = "propertyOrCollection";
- private static final String ID_EDIT_BUTTON = "edit";
- private static final String ID_OK_BUTTON = "ok";
- private static final String ID_CANCEL_BUTTON = "cancel";
- private static final String ID_FEEDBACK = "feedback";
-
- private final Render render;
-
- private final Component owningPanel;
- private Button editButton;
- private Button okButton;
- private Button cancelButton;
- private FeedbackPanel feedback;
-
- public PropCollForm(final String id, final EntityModel entityModel, final Render render, final Component owningPanel) {
- super(id, entityModel);
- this.owningPanel = owningPanel; // for repainting
- this.render = render;
-
- buildGui();
- }
-
- private void buildGui() {
- addPropertiesAndOrCollections();
- addButtons();
- addFeedbackGui();
-
- addValidator();
- }
-
- private void addPropertiesAndOrCollections() {
- final EntityModel entityModel = (EntityModel) getModel();
- final ObjectAdapter adapter = entityModel.getObject();
- final ObjectSpecification noSpec = adapter.getSpecification();
-
- final List<ObjectAssociation> associations = visibleAssociations(adapter, noSpec);
-
- final RepeatingView rv = new RepeatingView(ID_PROPERTIES_AND_OR_COLLECTIONS);
- final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
- add(rv);
-
- @SuppressWarnings("unused")
- Component component;
- for (final ObjectAssociation association : associations) {
- if (association instanceof OneToOneAssociation) {
- final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
- rv.add(container);
- container.add(eo.nextClass());
-
- addPropertyToForm(entityModel, association, container);
- } else {
- final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
- rv.add(container);
- container.add(eo.nextClass());
-
- addCollectionToForm(entityModel, association, container);
- }
- }
-
- // massive hack: an empty property line to get CSS correct...!
- final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
- rv.add(container);
- container.add(new Label(ID_PROPERTY_OR_COLLECTION, Model.of(" ")));
- container.add(eo.nextClass());
- }
-
- private void addPropertyToForm(final EntityModel entityModel,
- final ObjectAssociation association,
- final WebMarkupContainer container) {
- @SuppressWarnings("unused")
- Component component;
- final OneToOneAssociation otoa = (OneToOneAssociation) association;
- final PropertyMemento pm = new PropertyMemento(otoa);
-
- final ScalarModel scalarModel = entityModel.getPropertyModel(pm);
- component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
- }
-
- private void addCollectionToForm(final EntityModel entityModel,
- final ObjectAssociation association,
- final WebMarkupContainer container) {
- @SuppressWarnings("unused")
- Component component;
- final OneToManyAssociation otma = (OneToManyAssociation) association;
-
- final EntityCollectionModel entityCollectionModel = EntityCollectionModel.createParented(entityModel, otma);
- final CollectionPanel collectionPanel = new CollectionPanel(ID_PROPERTY_OR_COLLECTION, entityCollectionModel);
- container.addOrReplace(collectionPanel);
-
- component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.COLLECTION_NAME_AND_CONTENTS, entityCollectionModel);
- }
-
- @SuppressWarnings("unchecked")
- private List<ObjectAssociation> visibleAssociations(final ObjectAdapter adapter, final ObjectSpecification noSpec) {
- return noSpec.getAssociations(visibleAssociationFilter(adapter));
- }
-
- private Filter<ObjectAssociation> visibleAssociationFilter(final ObjectAdapter adapter) {
- return Filters.and(render.getFilters(), ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter));
- }
-
- private void addButtons() {
- editButton = new AjaxButton(ID_EDIT_BUTTON, Model.of("Edit")) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
- toEditMode(target);
- }
-
- @Override
- protected void onError(final AjaxRequestTarget target, final Form<?> form) {
- toEditMode(target);
- }
- };
- add(editButton);
-
- okButton = new Button(ID_OK_BUTTON, Model.of("OK")) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onSubmit() {
- if (!getForm().hasError()) {
- final ObjectAdapter object = getEntityModel().getObject();
- final Memento snapshotToRollbackToIfInvalid = new Memento(object);
- // to perform object-level validation, we must apply the
- // changes first
- // contrast this with ActionPanel (for validating action
- // arguments) where
- // we do the validation prior to the execution of the
- // action
- getEntityModel().apply();
- final String invalidReasonIfAny = getEntityModel().getReasonInvalidIfAny();
- if (invalidReasonIfAny != null) {
- getForm().error(invalidReasonIfAny);
- snapshotToRollbackToIfInvalid.recreateObject();
- return;
- } else {
- toViewMode(null);
- }
- } else {
- // stay in edit mode
- }
- }
- };
- add(okButton);
-
- cancelButton = new AjaxButton(ID_CANCEL_BUTTON, Model.of("Cancel")) {
- private static final long serialVersionUID = 1L;
- {
- setDefaultFormProcessing(false);
- }
-
- @Override
- protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
- Session.get().getFeedbackMessages().clear();
- getForm().clearInput();
- getForm().visitFormComponentsPostOrder(new IVisitor() {
-
- @Override
- public Object formComponent(final IFormVisitorParticipant formComponent) {
- if (formComponent instanceof CancelHintRequired) {
- final CancelHintRequired cancelHintRequired = (CancelHintRequired) formComponent;
- cancelHintRequired.onCancel();
- }
- return null;
- }
- });
- getEntityModel().resetPropertyModels();
- toViewMode(target);
- }
-
- @Override
- protected void onError(final AjaxRequestTarget target, final Form<?> form) {
- toViewMode(target);
- }
- };
- add(cancelButton);
-
- editButton.setOutputMarkupPlaceholderTag(true);
- cancelButton.setOutputMarkupPlaceholderTag(true);
- }
-
- private void requestRepaintPanel(final AjaxRequestTarget target) {
- if (target != null) {
- target.addComponent(owningPanel);
- // TODO: is it necessary to add these too?
- target.addComponent(editButton);
- target.addComponent(okButton);
- target.addComponent(cancelButton);
- target.addComponent(feedback);
- }
- }
-
- private void addValidator() {
- add(new AbstractFormValidator() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public FormComponent<?>[] getDependentFormComponents() {
- return new FormComponent<?>[0];
- }
-
- @Override
- public void validate(final Form<?> form) {
- final EntityModel entityModel = (EntityModel) getModel();
- final ObjectAdapter adapter = entityModel.getObject();
- final ValidateObjectFacet facet = adapter.getSpecification().getFacet(ValidateObjectFacet.class);
- if (facet == null) {
- return;
- }
- final String invalidReasonIfAny = facet.invalidReason(adapter);
- if (invalidReasonIfAny != null) {
- Session.get().getFeedbackMessages().add(new FeedbackMessage(form, invalidReasonIfAny, FeedbackMessage.ERROR));
- }
- }
- });
- }
-
- private EntityModel getEntityModel() {
- return (EntityModel) getModel();
- }
-
- void toViewMode(final AjaxRequestTarget target) {
- getEntityModel().toViewMode();
- editButton.setVisible(true);
- okButton.setVisible(false);
- cancelButton.setVisible(false);
- requestRepaintPanel(target);
- }
-
- private void toEditMode(final AjaxRequestTarget target) {
- getEntityModel().toEditMode();
- editButton.setVisible(false);
- okButton.setVisible(true);
- cancelButton.setVisible(true);
- requestRepaintPanel(target);
- }
-
- @Override
- protected void onValidate() {
- Session.get().getFeedbackMessages().clear(new IFeedbackMessageFilter() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public boolean accept(final FeedbackMessage message) {
- return message.getReporter() == owningPanel;
- }
- });
- super.onValidate();
- }
-
- private void addFeedbackGui() {
- final FeedbackPanel feedback = addOrReplaceFeedback();
-
- final ObjectAdapter adapter = getEntityModel().getObject();
- if (adapter == null) {
- feedback.error("cannot locate object:" + getEntityModel().getObjectAdapterMemento().toString());
- }
- }
-
- private FeedbackPanel addOrReplaceFeedback() {
- feedback = new ComponentFeedbackPanel(ID_FEEDBACK, this);
- feedback.setOutputMarkupPlaceholderTag(true);
- addOrReplace(feedback);
- return feedback;
- }
- }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.isis.viewer.wicket.ui.components.entity.blocks.propcoll;
+
+import java.util.List;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.Session;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.feedback.FeedbackMessage;
+import org.apache.wicket.feedback.IFeedbackMessageFilter;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.markup.html.form.IFormVisitorParticipant;
+import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
+import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.Model;
+
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.progmodel.facets.object.validate.ValidateObjectFacet;
+import org.apache.isis.runtimes.dflt.runtime.memento.Memento;
+import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
+import org.apache.isis.viewer.wicket.ui.panels.FormAbstract;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.EvenOrOddCssClassAppenderFactory;
+
+/**
+ * {@link PanelAbstract Panel} representing the properties of an entity, as per
+ * the provided {@link EntityModel}.
+ */
+public class EntityPropertiesAndOrCollectionsPanel extends PanelAbstract<EntityModel> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS = "entityPropertiesAndOrCollections";
+
+ public enum Render {
+ PROPERTIES_ONLY {
+ @Override
+ public Filter<ObjectAssociation> getFilters() {
+ return ObjectAssociationFilters.PROPERTIES;
+ }
+ },
+ COLLECTIONS_ONLY {
+ @Override
+ public Filter<ObjectAssociation> getFilters() {
+ return ObjectAssociationFilters.COLLECTIONS;
+ }
+ },
+ PROPERTIES_AND_COLLECTIONS {
+ @Override
+ public Filter<ObjectAssociation> getFilters() {
+ return Filters.or(PROPERTIES_ONLY.getFilters(), COLLECTIONS_ONLY.getFilters());
+ }
+ };
+
+ public abstract Filter<ObjectAssociation> getFilters();
+ }
+
+ private final Render render;
+ private PropCollForm form;
+
+ public EntityPropertiesAndOrCollectionsPanel(final String id, final EntityModel entityModel, final Render render) {
+ super(id, entityModel);
+ this.render = render;
+ buildGui();
+ form.toViewMode(null);
+ }
+
+ private void buildGui() {
+ buildEntityPropertiesAndOrCollectionsGui();
+ setOutputMarkupId(true); // so can repaint via ajax
+ }
+
+ private void buildEntityPropertiesAndOrCollectionsGui() {
+ final EntityModel model = getModel();
+ final ObjectAdapter adapter = model.getObject();
+ if (adapter != null) {
+ form = new PropCollForm(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS, model, render, this);
+ addOrReplace(form);
+ } else {
+ permanentlyHide(ID_ENTITY_PROPERTIES_AND_OR_COLLECTIONS);
+ }
+ }
+
+ static class PropCollForm extends FormAbstract<ObjectAdapter> {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String ID_PROPERTIES_AND_OR_COLLECTIONS = "propertiesAndOrCollections";
+ private static final String ID_PROPERTY_OR_COLLECTION = "propertyOrCollection";
+ private static final String ID_EDIT_BUTTON = "edit";
+ private static final String ID_OK_BUTTON = "ok";
+ private static final String ID_CANCEL_BUTTON = "cancel";
+ private static final String ID_FEEDBACK = "feedback";
+
+ private final Render render;
+
+ private final Component owningPanel;
+ private Button editButton;
+ private Button okButton;
+ private Button cancelButton;
+ private FeedbackPanel feedback;
+
+ public PropCollForm(final String id, final EntityModel entityModel, final Render render, final Component owningPanel) {
+ super(id, entityModel);
+ this.owningPanel = owningPanel; // for repainting
+ this.render = render;
+
+ buildGui();
+ }
+
+ private void buildGui() {
+ addPropertiesAndOrCollections();
+ addButtons();
+ addFeedbackGui();
+
+ addValidator();
+ }
+
+ private void addPropertiesAndOrCollections() {
+ final EntityModel entityModel = (EntityModel) getModel();
+ final ObjectAdapter adapter = entityModel.getObject();
+ final ObjectSpecification noSpec = adapter.getSpecification();
+
+ final List<ObjectAssociation> associations = visibleAssociations(adapter, noSpec);
+
+ final RepeatingView rv = new RepeatingView(ID_PROPERTIES_AND_OR_COLLECTIONS);
+ final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
+ add(rv);
+
+ @SuppressWarnings("unused")
+ Component component;
+ for (final ObjectAssociation association : associations) {
+ if (association instanceof OneToOneAssociation) {
+ final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
+ rv.add(container);
+ container.add(eo.nextClass());
+
+ addPropertyToForm(entityModel, association, container);
+ } else {
+ final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
+ rv.add(container);
+ container.add(eo.nextClass());
+
+ addCollectionToForm(entityModel, association, container);
+ }
+ }
+
+ // massive hack: an empty property line to get CSS correct...!
+ final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
+ rv.add(container);
+ container.add(new Label(ID_PROPERTY_OR_COLLECTION, Model.of(" ")));
+ container.add(eo.nextClass());
+ }
+
+ private void addPropertyToForm(final EntityModel entityModel,
+ final ObjectAssociation association,
+ final WebMarkupContainer container) {
+ @SuppressWarnings("unused")
+ Component component;
+ final OneToOneAssociation otoa = (OneToOneAssociation) association;
+ final PropertyMemento pm = new PropertyMemento(otoa);
+
+ final ScalarModel scalarModel = entityModel.getPropertyModel(pm);
+ component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
+ }
+
+ private void addCollectionToForm(final EntityModel entityModel,
+ final ObjectAssociation association,
+ final WebMarkupContainer container) {
+ @SuppressWarnings("unused")
+ Component component;
+ final OneToManyAssociation otma = (OneToManyAssociation) association;
+
+ final EntityCollectionModel entityCollectionModel = EntityCollectionModel.createParented(entityModel, otma);
+ final CollectionPanel collectionPanel = new CollectionPanel(ID_PROPERTY_OR_COLLECTION, entityCollectionModel);
+ container.addOrReplace(collectionPanel);
+
+ component = getComponentFactoryRegistry().addOrReplaceComponent(container, ID_PROPERTY_OR_COLLECTION, ComponentType.COLLECTION_NAME_AND_CONTENTS, entityCollectionModel);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<ObjectAssociation> visibleAssociations(final ObjectAdapter adapter, final ObjectSpecification noSpec) {
+ return noSpec.getAssociations(visibleAssociationFilter(adapter));
+ }
+
+ private Filter<ObjectAssociation> visibleAssociationFilter(final ObjectAdapter adapter) {
+ return Filters.and(render.getFilters(), ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter));
+ }
+
+ private void addButtons() {
+ editButton = new AjaxButton(ID_EDIT_BUTTON, Model.of("Edit")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ toEditMode(target);
+ }
+
+ @Override
+ protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+ toEditMode(target);
+ }
+ };
+ add(editButton);
+
+ okButton = new Button(ID_OK_BUTTON, Model.of("OK")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onSubmit() {
+ if (!getForm().hasError()) {
+ final ObjectAdapter object = getEntityModel().getObject();
+ final Memento snapshotToRollbackToIfInvalid = new Memento(object);
+ // to perform object-level validation, we must apply the
+ // changes first
+ // contrast this with ActionPanel (for validating action
+ // arguments) where
+ // we do the validation prior to the execution of the
+ // action
+ getEntityModel().apply();
+ final String invalidReasonIfAny = getEntityModel().getReasonInvalidIfAny();
+ if (invalidReasonIfAny != null) {
+ getForm().error(invalidReasonIfAny);
+ snapshotToRollbackToIfInvalid.recreateObject();
+ return;
+ } else {
+ toViewMode(null);
+ }
+ } else {
+ // stay in edit mode
+ }
+ }
+ };
+ add(okButton);
+
+ cancelButton = new AjaxButton(ID_CANCEL_BUTTON, Model.of("Cancel")) {
+ private static final long serialVersionUID = 1L;
+ {
+ setDefaultFormProcessing(false);
+ }
+
+ @Override
+ protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ Session.get().getFeedbackMessages().clear();
+ getForm().clearInput();
+ getForm().visitFormComponentsPostOrder(new IVisitor() {
+
+ @Override
+ public Object formComponent(final IFormVisitorParticipant formComponent) {
+ if (formComponent instanceof CancelHintRequired) {
+ final CancelHintRequired cancelHintRequired = (CancelHintRequired) formComponent;
+ cancelHintRequired.onCancel();
+ }
+ return null;
+ }
+ });
+ getEntityModel().resetPropertyModels();
+ toViewMode(target);
+ }
+
+ @Override
+ protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+ toViewMode(target);
+ }
+ };
+ add(cancelButton);
+
+ editButton.setOutputMarkupPlaceholderTag(true);
+ cancelButton.setOutputMarkupPlaceholderTag(true);
+ }
+
+ private void requestRepaintPanel(final AjaxRequestTarget target) {
+ if (target != null) {
+ target.addComponent(owningPanel);
+ // TODO: is it necessary to add these too?
+ target.addComponent(editButton);
+ target.addComponent(okButton);
+ target.addComponent(cancelButton);
+ target.addComponent(feedback);
+ }
+ }
+
+ private void addValidator() {
+ add(new AbstractFormValidator() {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public FormComponent<?>[] getDependentFormComponents() {
+ return new FormComponent<?>[0];
+ }
+
+ @Override
+ public void validate(final Form<?> form) {
+ final EntityModel entityModel = (EntityModel) getModel();
+ final ObjectAdapter adapter = entityModel.getObject();
+ final ValidateObjectFacet facet = adapter.getSpecification().getFacet(ValidateObjectFacet.class);
+ if (facet == null) {
+ return;
+ }
+ final String invalidReasonIfAny = facet.invalidReason(adapter);
+ if (invalidReasonIfAny != null) {
+ Session.get().getFeedbackMessages().add(new FeedbackMessage(form, invalidReasonIfAny, FeedbackMessage.ERROR));
+ }
+ }
+ });
+ }
+
+ private EntityModel getEntityModel() {
+ return (EntityModel) getModel();
+ }
+
+ void toViewMode(final AjaxRequestTarget target) {
+ getEntityModel().toViewMode();
+ editButton.setVisible(true);
+ okButton.setVisible(false);
+ cancelButton.setVisible(false);
+ requestRepaintPanel(target);
+ }
+
+ private void toEditMode(final AjaxRequestTarget target) {
+ getEntityModel().toEditMode();
+ editButton.setVisible(false);
+ okButton.setVisible(true);
+ cancelButton.setVisible(true);
+ requestRepaintPanel(target);
+ }
+
+ @Override
+ protected void onValidate() {
+ Session.get().getFeedbackMessages().clear(new IFeedbackMessageFilter() {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public boolean accept(final FeedbackMessage message) {
+ return message.getReporter() == owningPanel;
+ }
+ });
+ super.onValidate();
+ }
+
+ private void addFeedbackGui() {
+ final FeedbackPanel feedback = addOrReplaceFeedback();
+
+ final ObjectAdapter adapter = getEntityModel().getObject();
+ if (adapter == null) {
+ feedback.error("cannot locate object:" + getEntityModel().getObjectAdapterMemento().toString());
+ }
+ }
+
+ private FeedbackPanel addOrReplaceFeedback() {
+ feedback = new ComponentFeedbackPanel(ID_FEEDBACK, this);
+ feedback.setOutputMarkupPlaceholderTag(true);
+ addOrReplace(feedback);
+ return feedback;
+ }
+ }
+
+}