ISIS-537: factoring out BulkActionsProvider interface.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/276472f9 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/276472f9 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/276472f9 Branch: refs/heads/master Commit: 276472f96301ab5c971879bd18c91ad1320a086e Parents: 5022f85 Author: Dan Haywood <[email protected]> Authored: Mon Nov 10 18:40:52 2014 +0000 Committer: Dan Haywood <[email protected]> Committed: Mon Nov 10 18:40:52 2014 +0000 ---------------------------------------------------------------------- .../ajaxtable/BulkActionsLinkFactory.java | 8 +- .../ajaxtable/BulkActionsProvider.java | 28 +++ .../CollectionContentsAsAjaxTablePanel.java | 186 ++++++++++--------- .../widgets/cssmenu/CssMenuBuilder.java | 5 +- 4 files changed, 138 insertions(+), 89 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java index 4d7a9a8..826aebf 100644 --- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java @@ -61,14 +61,16 @@ final class BulkActionsLinkFactory implements ActionLinkFactory { @SuppressWarnings("unused") private final DataTable<ObjectAdapter,String> dataTable; - private final ObjectAdapterToggleboxColumn toggleboxColumn; + private ObjectAdapterToggleboxColumn toggleboxColumn; BulkActionsLinkFactory( final EntityCollectionModel model, - final DataTable<ObjectAdapter,String> dataTable, - final ObjectAdapterToggleboxColumn toggleboxColumn) { + final DataTable<ObjectAdapter,String> dataTable) { this.model = model; this.dataTable = dataTable; + } + + public void setToggleboxColumn(ObjectAdapterToggleboxColumn toggleboxColumn) { this.toggleboxColumn = toggleboxColumn; } http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java new file mode 100644 index 0000000..697f556 --- /dev/null +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java @@ -0,0 +1,28 @@ +/* + * 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.collectioncontents.ajaxtable; + +import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider; +import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactory; + +public interface BulkActionsProvider { + + public void configureBulkActionsProvider(ActionLinkFactory linkFactory, ActionPromptProvider actionPromptProvider); + +} http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java index aca3535..74ec5d9 100644 --- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java @@ -19,10 +19,8 @@ package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable; -import java.util.Collections; import java.util.List; import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Inject; import org.apache.wicket.Component; @@ -40,16 +38,16 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking; import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException; import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet; -import org.apache.isis.core.metamodel.spec.ActionType; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.Contributed; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; -import org.apache.isis.core.runtime.system.context.IsisContext; import org.apache.isis.viewer.wicket.model.common.SelectionHandler; import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant; import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings; +import org.apache.isis.viewer.wicket.model.links.LinkAndLabel; import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento; +import org.apache.isis.viewer.wicket.model.models.ActionPrompt; import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider; import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel; import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow; @@ -68,7 +66,7 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelUtil; * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel * collection of entity}s rendered using {@link AjaxFallbackDefaultDataTable}. */ -public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityCollectionModel> implements CollectionCountProvider, ActionPromptProvider, UiHintPathSignificant { +public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityCollectionModel> implements CollectionCountProvider, ActionPromptProvider, BulkActionsProvider, UiHintPathSignificant { private static final long serialVersionUID = 1L; @@ -81,9 +79,12 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl private static final Predicate<ObjectAction> BULK = Filters.asPredicate(ObjectAction.Filters.bulk()); private IsisAjaxFallbackDataTable<ObjectAdapter,String> dataTable; + private final BulkActionsHelper bulkActionsHelper; + public CollectionContentsAsAjaxTablePanel(final String id, final EntityCollectionModel model) { super(id, model); + bulkActionsHelper = new BulkActionsHelper(model); } @Override @@ -97,23 +98,47 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl final List<IColumn<ObjectAdapter,String>> columns = Lists.newArrayList(); - List<ObjectAction> bulkActions = determineBulkActions(); + List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions(); + + final ObjectAdapterToggleboxColumn toggleboxColumn = addToggleboxColumnIfRequired(columns, bulkActions); - ObjectAdapterToggleboxColumn toggleboxColumn = addToggleboxColumnIfRequired(columns, bulkActions); addTitleColumn(columns, model.getParentObjectAdapterMemento(), getSettings().getMaxTitleLengthInStandaloneTables(), getSettings().getMaxTitleLengthInStandaloneTables()); addPropertyColumnsIfRequired(columns); final SortableDataProvider<ObjectAdapter,String> dataProvider = new CollectionContentsSortableDataProvider(model); dataTable = new IsisAjaxFallbackDataTable<>(ID_TABLE, columns, dataProvider, model.getPageSize()); - - addActionPromptModalWindow(); - buildEntityActionsGui(bulkActions, this, toggleboxColumn); - addOrReplace(dataTable); dataTable.honourHints(); + + addActionPromptModalWindow(); + + // bulkactions + if(bulkActions.isEmpty() || getModel().isParented()) { + permanentlyHide(ID_ENTITY_ACTIONS); + } else { + BulkActionsLinkFactory linkFactory = new BulkActionsLinkFactory(getModel(), dataTable); + linkFactory.setToggleboxColumn(toggleboxColumn); + + actionLinkFactoryDelegating = new ActionLinkFactoryDelegating(); + actionPromptProviderDelegating = new ActionPromptProviderDelegating(); + + getBulkActionsProvider().configureBulkActionsProvider(linkFactory, this); + + final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, bulkActions, actionLinkFactoryDelegating, actionPromptProviderDelegating, null); + final CssMenuPanel cssMenuPanel = cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions"); + + this.addOrReplace(cssMenuPanel); + + } } - private ObjectAdapterToggleboxColumn addToggleboxColumnIfRequired(final List<IColumn<ObjectAdapter,String>> columns, List<ObjectAction> bulkActions) { + private BulkActionsProvider getBulkActionsProvider() { + return this; + } + + private ObjectAdapterToggleboxColumn addToggleboxColumnIfRequired( + final List<IColumn<ObjectAdapter,String>> columns, + final List<ObjectAction> bulkActions) { final EntityCollectionModel entityCollectionModel = getModel(); if(bulkActions.isEmpty() || entityCollectionModel.isParented()) { return null; @@ -149,58 +174,6 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl return toggleboxColumn; } - private void buildEntityActionsGui( - final List<ObjectAction> bulkActions, - final ActionPromptProvider actionPromptProvider, - final ObjectAdapterToggleboxColumn toggleboxColumn) { - final EntityCollectionModel model = getModel(); - - if(bulkActions.isEmpty() || model.isParented()) { - permanentlyHide(ID_ENTITY_ACTIONS); - return; - } - - if(!bulkActions.isEmpty()) { - final ActionLinkFactory linkFactory = new BulkActionsLinkFactory(model, dataTable, toggleboxColumn); - - final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, bulkActions, linkFactory, actionPromptProvider, null); - // TODO: i18n - final CssMenuPanel cssMenuPanel = cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions"); - - this.addOrReplace(cssMenuPanel); - } else { - permanentlyHide(ID_ENTITY_ACTIONS); - } - } - - private List<ObjectAction> determineBulkActions() { - final EntityCollectionModel model = getModel(); - - if(model.isParented()) { - return Collections.emptyList(); - } - - final ObjectSpecification typeSpec = model.getTypeOfSpecification(); - - List<ObjectAction> objectActions = typeSpec.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any()); - - if ( isExploring() || isPrototyping()) { - List<ObjectAction> explorationActions = typeSpec.getObjectActions(ActionType.EXPLORATION, Contributed.INCLUDED, Filters.<ObjectAction>any()); - List<ObjectAction> prototypeActions = typeSpec.getObjectActions(ActionType.PROTOTYPE, Contributed.INCLUDED, Filters.<ObjectAction>any()); - objectActions.addAll(explorationActions); - objectActions.addAll(prototypeActions); - } - if (isDebugMode()) { - List<ObjectAction> debugActions = typeSpec.getObjectActions(ActionType.DEBUG, Contributed.INCLUDED, Filters.<ObjectAction>any()); - objectActions.addAll(debugActions); - } - - List<ObjectAction> flattenedActions = objectActions; - - return Lists.newArrayList(Iterables.filter(flattenedActions, BULK)); - } - - private void addTitleColumn(final List<IColumn<ObjectAdapter,String>> columns, ObjectAdapterMemento parentAdapterMementoIfAny, int maxTitleParented, int maxTitleStandalone) { int maxTitleLength = getModel().isParented()? maxTitleParented: maxTitleStandalone; @@ -270,10 +243,13 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl return model.getCount(); } - - // /////////////////////////////////////////////////////////////////// - // ActionPromptModalWindowProvider - // /////////////////////////////////////////////////////////////////// + + //region > BulkActionsProvider + + //endregion + + + //region > ActionPromptModalWindowProvider private ActionPromptModalWindow actionPromptModalWindow; public ActionPromptModalWindow getActionPrompt() { @@ -285,26 +261,10 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl addOrReplace(actionPromptModalWindow); } + //endregion // ////////////////////////////////////// - public boolean isExploring() { - return IsisContext.getDeploymentType().isExploring(); - } - public boolean isPrototyping() { - return IsisContext.getDeploymentType().isPrototyping(); - } - - /** - * Protected so can be overridden in testing if required. - */ - protected boolean isDebugMode() { - // TODO: need to figure out how to switch into debug mode; - // probably call a Debug toggle page, and stuff into - // Session.getMetaData() - return true; - } - @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); @@ -323,4 +283,60 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl protected MessageBroker getMessageBroker() { return getAuthenticationSession().getMessageBroker(); } + + // ////////////////////////////////////// + + + private ActionPromptProviderDelegating actionPromptProviderDelegating; + private ActionLinkFactoryDelegating actionLinkFactoryDelegating; + + @Override + public void configureBulkActionsProvider( + final ActionLinkFactory linkFactory, + final ActionPromptProvider actionPromptProvider) { + actionLinkFactoryDelegating.setDelegate(linkFactory); + actionPromptProviderDelegating.setDelegate(actionPromptProvider); + } + + public static class ActionLinkFactoryDelegating implements ActionLinkFactory { + + private ActionLinkFactory delegate; + + public ActionLinkFactory getDelegate() { + return delegate; + } + + public void setDelegate(ActionLinkFactory delegate) { + this.delegate = delegate; + } + + @Override + public LinkAndLabel newLink( + final ObjectAdapterMemento adapter, + final ObjectAction noAction, + final String linkId, + final ActionPromptProvider actionPromptProvider) { + return delegate.newLink(adapter, noAction, linkId, actionPromptProvider); + } + } + + public static class ActionPromptProviderDelegating implements ActionPromptProvider { + + private ActionPromptProvider delegate; + + public ActionPromptProvider getDelegate() { + return delegate; + } + + public void setDelegate(ActionPromptProvider delegate) { + this.delegate = delegate; + } + + @Override + public ActionPrompt getActionPrompt() { + return delegate.getActionPrompt(); + } + } + + } http://git-wip-us.apache.org/repos/asf/isis/blob/276472f9/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java index c9f54e9..6b9189f 100644 --- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java +++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java @@ -55,7 +55,10 @@ public class CssMenuBuilder { private final ActionPromptProvider actionPromptProvider; private final Predicate<ObjectAction> objectActionPredicate; - public CssMenuContext(ActionLinkFactory cssMenuLinkFactory, ActionPromptProvider actionPromptProvider, Predicate<ObjectAction> objectActionPredicate) { + public CssMenuContext( + final ActionLinkFactory cssMenuLinkFactory, + final ActionPromptProvider actionPromptProvider, + final Predicate<ObjectAction> objectActionPredicate) { this.cssMenuLinkFactory = cssMenuLinkFactory; this.actionPromptProvider = actionPromptProvider; this.objectActionPredicate = objectActionPredicate != null? objectActionPredicate: Predicates.<ObjectAction>alwaysTrue();
