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 2014/11/11 09:24:56 UTC
[33/44] isis git commit: ISIS-537: tidy up of (entity) collections
panel;
standalone collections panel no longer failing (but still need to sort out CSS
and bulk actions)
ISIS-537: tidy up of (entity) collections panel; standalone collections panel no longer failing (but still need to sort out CSS and bulk actions)
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/92ffe2d2
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/92ffe2d2
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/92ffe2d2
Branch: refs/heads/master
Commit: 92ffe2d2c1a0a7771c5c822f94d1d60111a55e77
Parents: 3b39738
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Nov 10 09:59:43 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Nov 10 10:21:50 2014 +0000
----------------------------------------------------------------------
.../ComponentFactoryRegistrarDefault.java | 4 +-
.../wicket/ui/CollectionContentsAsFactory.java | 2 +-
.../collection/CollectionCountProvider.java | 21 --
.../components/collection/CollectionPanel.java | 67 ++---
.../count/CollectionCountProvider.java | 21 ++
.../selector/CollectionSelectorHelper.java | 174 +++++++++++++
.../selector/CollectionSelectorPanel.html | 44 ++++
.../selector/CollectionSelectorPanel.java | 220 +++++++++++++++++
.../selector/CollectionSelectorProvider.java | 23 ++
.../selector/UNUSED_CollectionSelectorPanel.css | 60 +++++
.../CollectionContentsAsAjaxTablePanel.java | 2 +-
.../CollectionContentsMultipleViewsPanel.css | 60 +++++
.../CollectionContentsMultipleViewsPanel.html | 41 ++++
.../CollectionContentsMultipleViewsPanel.java | 226 +++++++++++++++++
...ectionContentsMultipleViewsPanelFactory.java | 53 ++++
...CollectionContentsSelectorDropdownPanel.html | 44 ----
...CollectionContentsSelectorDropdownPanel.java | 222 -----------------
.../CollectionContentsSelectorHelper.java | 176 --------------
...ionContentsSelectorSelectorDropdownPanel.css | 60 -----
.../dropdown/HasSelectorDropdownPanel.java | 23 --
.../CollectionContentsLinksSelectorPanel.css | 60 -----
.../CollectionContentsLinksSelectorPanel.html | 41 ----
.../CollectionContentsLinksSelectorPanel.java | 243 -------------------
...ectionContentsLinksSelectorPanelFactory.java | 53 ----
.../summary/CollectionContentsAsSummary.java | 2 +-
.../collections/EntityCollectionsPanel.html | 22 --
.../collections/EntityCollectionsPanel.java | 24 +-
.../StandaloneCollectionPanel.css | 2 +-
.../StandaloneCollectionPanel.html | 17 ++
.../StandaloneCollectionPanel.java | 45 +++-
...ectionContentsSelectorDropdownPanelTest.java | 67 +++++
...ectionContentsSelectorDropdownPanelTest.java | 67 -----
32 files changed, 1081 insertions(+), 1105 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 21a3f2c..ed48dea 100644
--- a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -32,7 +32,7 @@ import org.apache.isis.viewer.wicket.ui.components.appactions.cssmenu.AppActions
import org.apache.isis.viewer.wicket.ui.components.bookmarkedpages.BookmarkedPagesPanelFactory;
import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanelFactory;
import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsAsAjaxTablePanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.collectioncontents.selector.links.CollectionContentsLinksSelectorPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.multiple.CollectionContentsMultipleViewsPanelFactory;
import org.apache.isis.viewer.wicket.ui.components.collectioncontents.summary.CollectionContentsAsSummaryFactory;
import org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsAsUnresolvedPanelFactory;
import org.apache.isis.viewer.wicket.ui.components.empty.EmptyCollectionPanelFactory;
@@ -96,7 +96,7 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
protected void addLinksSelectorFactories(final ComponentFactoryList componentFactories) {
componentFactories.add(new EntityLinksSelectorPanelFactory());
- componentFactories.add(new CollectionContentsLinksSelectorPanelFactory());
+ componentFactories.add(new CollectionContentsMultipleViewsPanelFactory());
}
protected void addComponentFactoriesUsingServiceLoader(final ComponentFactoryList componentFactories) {
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/CollectionContentsAsFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/CollectionContentsAsFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/CollectionContentsAsFactory.java
index 0e98a3f..440b0ff 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/CollectionContentsAsFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/CollectionContentsAsFactory.java
@@ -24,7 +24,7 @@ import org.apache.wicket.model.IModel;
* <p>
* An interface for all {@link org.apache.isis.viewer.wicket.ui.ComponentFactory component factories}
* (e.g. CollectionContentAsXyzFactory-ies) which want to provide specific title and CSS class(es)
- * for their representation in {@link org.apache.isis.viewer.wicket.ui.components.collectioncontents.selector.links.CollectionContentsLinksSelectorPanel}.
+ * for their representation in {@link org.apache.isis.viewer.wicket.ui.components.collectioncontents.multiple.CollectionContentsMultipleViewsPanel}.
* </p>
* <p>
* If the {@link org.apache.isis.viewer.wicket.ui.ComponentFactory} doesn't implement this interface or the implementation
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionCountProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionCountProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionCountProvider.java
deleted file mode 100644
index dd4beca..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionCountProvider.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * 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.collection;
-
-public interface CollectionCountProvider {
- Integer getCount();
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
index 0b10d9c..02e9ced 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
@@ -22,12 +22,9 @@ package org.apache.isis.viewer.wicket.ui.components.collection;
import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
import java.util.List;
-
import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
import org.apache.wicket.markup.html.basic.Label;
-
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.runtime.system.DeploymentType;
import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -38,8 +35,8 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
-import org.apache.isis.viewer.wicket.ui.components.collectioncontents.selector.dropdown.CollectionContentsSelectorDropdownPanel;
-import org.apache.isis.viewer.wicket.ui.components.collectioncontents.selector.dropdown.HasSelectorDropdownPanel;
+import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorPanel;
+import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorProvider;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
@@ -47,7 +44,7 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
* Panel for rendering entity collection; analogous to (any concrete subclass
* of) {@link ScalarPanelAbstract}.
*/
-public class CollectionPanel extends PanelAbstract<EntityCollectionModel> implements ActionPromptProvider, HasSelectorDropdownPanel {
+public class CollectionPanel extends PanelAbstract<EntityCollectionModel> implements ActionPromptProvider, CollectionSelectorProvider {
private static final long serialVersionUID = 1L;
@@ -57,7 +54,6 @@ public class CollectionPanel extends PanelAbstract<EntityCollectionModel> implem
private Component collectionContents;
- private String collectionName;
private Label label;
public CollectionPanel(final String id, final EntityModel entityModel, OneToManyAssociation otma) {
@@ -95,42 +91,26 @@ public class CollectionPanel extends PanelAbstract<EntityCollectionModel> implem
}
public Label createLabel(final String id, final String collectionName) {
- this.collectionName = collectionName;
this.label = new Label(id, collectionName);
- label.setOutputMarkupId(true);
- return this.label;
+ label.setOutputMarkupId(true);
+ return this.label;
}
- public void updateLabel(AjaxRequestTarget target) {
- target.add(label);
- }
+ //region > SelectorDropdownPanel (impl)
- /**
- * Returns true if a collection count is available from the rendered component
- * (ie an eagerly rendered/expanded view).
- */
- public boolean hasCount() {
- if(label == null) {
- return false;
- }
- final Integer count = getCount();
- label.setDefaultModelObject(collectionName);
- return count != null;
- }
+ private CollectionSelectorPanel selectorDropdownPanel;
- private Integer getCount() {
- if(collectionContents instanceof CollectionCountProvider) {
- final CollectionCountProvider collectionCountProvider = (CollectionCountProvider) collectionContents;
- return collectionCountProvider.getCount();
- } else {
- return null;
- }
+ @Override
+ public CollectionSelectorPanel getSelectorDropdownPanel() {
+ return selectorDropdownPanel;
+ }
+ public void setSelectorDropdownPanel(CollectionSelectorPanel selectorDropdownPanel) {
+ this.selectorDropdownPanel = selectorDropdownPanel;
}
+ //endregion
+
-
- // ///////////////////////////////////////////////////////////////////
- // ActionPromptModalWindowProvider
- // ///////////////////////////////////////////////////////////////////
+ //region > ActionPromptModalWindowProvider
private ActionPromptModalWindow actionPromptModalWindow;
public ActionPromptModalWindow getActionPrompt() {
@@ -141,26 +121,15 @@ public class CollectionPanel extends PanelAbstract<EntityCollectionModel> implem
this.actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW);
addOrReplace(actionPromptModalWindow);
}
+ //endregion
- // ///////////////////////////////////////////////////////////////////
+ //region > dependencies
protected DeploymentType getDeploymentType() {
return IsisContext.getDeploymentType();
}
-
- //region > SelectorDropdownPanel (impl)
-
- private CollectionContentsSelectorDropdownPanel selectorDropdownPanel;
-
- @Override
- public CollectionContentsSelectorDropdownPanel getSelectorDropdownPanel() {
- return selectorDropdownPanel;
- }
- public void setSelectorDropdownPanel(CollectionContentsSelectorDropdownPanel selectorDropdownPanel) {
- this.selectorDropdownPanel = selectorDropdownPanel;
- }
//endregion
}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/count/CollectionCountProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/count/CollectionCountProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/count/CollectionCountProvider.java
new file mode 100644
index 0000000..0ff411f
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/count/CollectionCountProvider.java
@@ -0,0 +1,21 @@
+/**
+ * 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.collection.count;
+
+public interface CollectionCountProvider {
+ Integer getCount();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
new file mode 100644
index 0000000..dfcdbf5
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
@@ -0,0 +1,174 @@
+/*
+ * 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.collection.selector;
+
+import java.util.ArrayList;
+import java.util.List;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+import org.apache.isis.applib.annotation.Render;
+import org.apache.isis.core.metamodel.facets.members.render.RenderFacet;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsAsAjaxTablePanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.multiple.CollectionContentsMultipleViewsPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsAsUnresolvedPanelFactory;
+
+public class CollectionSelectorHelper {
+
+ static final String UIHINT_EVENT_VIEW_KEY = "view";
+
+ private final ComponentType componentType;
+ private final ComponentFactoryRegistry componentFactoryRegistry;
+ private final EntityCollectionModel model;
+ private final ComponentFactory ignoreFactory;
+ private final List<ComponentFactory> componentFactories;
+
+
+ public CollectionSelectorHelper(
+ final EntityCollectionModel model,
+ final ComponentFactoryRegistry componentFactoryRegistry,
+ final ComponentFactory ignoreFactory) {
+ this.componentFactoryRegistry = componentFactoryRegistry;
+ this.model = model;
+ this.ignoreFactory = ignoreFactory;
+ this.componentType = ignoreFactory.getComponentType();
+
+ componentFactories = findOtherComponentFactories();
+ }
+
+ public List<ComponentFactory> findOtherComponentFactories() {
+ final List<ComponentFactory> componentFactories = componentFactoryRegistry.findComponentFactories(componentType, model);
+ ArrayList<ComponentFactory> otherFactories = Lists.newArrayList(Collections2.filter(componentFactories, new Predicate<ComponentFactory>() {
+ @Override
+ public boolean apply(final ComponentFactory input) {
+ return input != ignoreFactory && input.getClass() != CollectionContentsMultipleViewsPanelFactory.class;
+ }
+ }));
+ return ordered(otherFactories);
+ }
+
+ public int honourViewHintElseDefault(final Component component) {
+ // honour hints ...
+ final UiHintContainer hintContainer = getUiHintContainer(component);
+ if(hintContainer != null) {
+ String viewStr = hintContainer.getHint(component, UIHINT_EVENT_VIEW_KEY);
+ if(viewStr != null) {
+ try {
+ int view = Integer.parseInt(viewStr);
+ if(view >= 0 && view < componentFactories.size()) {
+ return view;
+ }
+ } catch(NumberFormatException ex) {
+ // ignore
+ }
+ }
+ }
+
+ // ... else default
+ int initialFactory = determineInitialFactory();
+ if(hintContainer != null) {
+ hintContainer.setHint(component, UIHINT_EVENT_VIEW_KEY, ""+initialFactory);
+ // don't broadcast (no AjaxRequestTarget, still configuring initial setup)
+ }
+ return initialFactory;
+ }
+
+ //region > helpers
+
+ private static List<ComponentFactory> ordered(List<ComponentFactory> componentFactories) {
+ return orderAjaxTableToEnd(componentFactories);
+ }
+
+ static List<ComponentFactory> orderAjaxTableToEnd(List<ComponentFactory> componentFactories) {
+ int ajaxTableIdx = findAjaxTable(componentFactories);
+ if(ajaxTableIdx>=0) {
+ List<ComponentFactory> orderedFactories = Lists.newArrayList(componentFactories);
+ ComponentFactory ajaxTableFactory = orderedFactories.remove(ajaxTableIdx);
+ orderedFactories.add(ajaxTableFactory);
+ return orderedFactories;
+ } else {
+ return componentFactories;
+ }
+ }
+
+ private static int findAjaxTable(List<ComponentFactory> componentFactories) {
+ for(int i=0; i<componentFactories.size(); i++) {
+ if(componentFactories.get(i) instanceof CollectionContentsAsAjaxTablePanelFactory) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
+
+
+
+ /**
+ * return the index of {@link org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsAsUnresolvedPanelFactory unresolved panel} if present and not eager loading;
+ * else the index of {@link org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsAsAjaxTablePanelFactory ajax table} if present,
+ * otherwise first factory.
+ */
+ protected int determineInitialFactory() {
+ if(!hasRenderEagerlyFacet(model)) {
+ for(int i=0; i<componentFactories.size(); i++) {
+ if(componentFactories.get(i) instanceof CollectionContentsAsUnresolvedPanelFactory) {
+ return i;
+ }
+ }
+ }
+ int ajaxTableIdx = CollectionSelectorHelper.findAjaxTable(componentFactories);
+ if(ajaxTableIdx>=0) {
+ return ajaxTableIdx;
+ }
+ return 0;
+ }
+
+ private static UiHintContainer getUiHintContainer(final Component component) {
+ return UiHintContainer.Util.hintContainerOf(component);
+ }
+
+
+ private static boolean hasRenderEagerlyFacet(IModel<?> model) {
+ if(!(model instanceof EntityCollectionModel)) {
+ return false;
+ }
+ final EntityCollectionModel entityCollectionModel = (EntityCollectionModel) model;
+ if(!entityCollectionModel.isParented()) {
+ return false;
+ }
+
+ final OneToManyAssociation collection =
+ entityCollectionModel.getCollectionMemento().getCollection();
+ RenderFacet renderFacet = collection.getFacet(RenderFacet.class);
+ return renderFacet != null && renderFacet.value() == Render.Type.EAGERLY;
+ }
+
+ //endregion
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.html
new file mode 100644
index 0000000..8bec51a
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.html
@@ -0,0 +1,44 @@
+<?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.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns:wicket="http://wicket.apache.org">
+<body>
+<wicket:panel>
+ <div class="linksSelectorPanel">
+ <div class="btn-group viewLinks" wicket:id="views">
+ <button type="button" class="btn btn-sm btn-info">
+ <span wicket:id="viewButtonIcon" class="ViewLinkItem"></span>
+ <span wicket:id="viewButtonTitle" class="ViewLinkItemTitle"></span>
+ </button>
+ <button type="button" class="btn btn-sm btn-info dropdown-toggle" data-toggle="dropdown">
+ <span class="caret"></span>
+ </button>
+ <ul wicket:id="viewList" class="dropdown-menu dropdown-menu-right" role="menu">
+ <li wicket:id="viewItem" class="viewItem">
+ <a href="#" wicket:id="viewLink">
+ <span wicket:id="viewItemIcon" class="ViewLinkItem"></span> <span wicket:id="viewItemTitle" class="ViewLinkItemTitle">[link title]</span>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+</wicket:panel>
+</body>
+</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
new file mode 100644
index 0000000..cb8d0f2
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
@@ -0,0 +1,220 @@
+/*
+ * 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.collection.selector;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+
+import java.util.List;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+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.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.viewer.wicket.model.hints.IsisUiHintEvent;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
+import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.CollectionContentsAsFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+/**
+ * Provides a list of links for selecting other views that support
+ * {@link org.apache.isis.viewer.wicket.ui.ComponentType#COLLECTION_CONTENTS} with a backing
+ * {@link org.apache.isis.viewer.wicket.model.models.EntityCollectionModel}.
+ */
+public class CollectionSelectorPanel
+ extends PanelAbstract<EntityCollectionModel> implements UiHintPathSignificant /*, CollectionCountProvider*/ {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String ID_VIEWS = "views";
+ private static final String ID_VIEW_LIST = "viewList";
+ private static final String ID_VIEW_LINK = "viewLink";
+ private static final String ID_VIEW_ITEM = "viewItem";
+ private static final String ID_VIEW_ITEM_TITLE = "viewItemTitle";
+ private static final String ID_VIEW_ITEM_ICON = "viewItemIcon";
+
+ private static final String ID_VIEW_BUTTON_TITLE = "viewButtonTitle";
+ private static final String ID_VIEW_BUTTON_ICON = "viewButtonIcon";
+
+ private final ComponentType componentType;
+ private final CollectionSelectorHelper selectorHelper;
+
+ private ComponentFactory selectedComponentFactory;
+
+ public CollectionSelectorPanel(final String id, final EntityCollectionModel model, final ComponentFactory ignoreFactory) {
+ super(id, model);
+ this.componentType = ignoreFactory.getComponentType();
+ selectorHelper = new CollectionSelectorHelper(model, getComponentFactoryRegistry(), ignoreFactory);
+ }
+
+ /**
+ * Build UI only after added to parent.
+ */
+ public void onInitialize() {
+ super.onInitialize();
+ addDropdown();
+ }
+
+
+
+ private void addDropdown() {
+ final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+ final int selected = selectorHelper.honourViewHintElseDefault(this);
+
+ // selector
+ if (componentFactories.size() <= 1) {
+ permanentlyHide(ID_VIEWS);
+ } else {
+ final Model<ComponentFactory> componentFactoryModel = new Model<>();
+
+ this.selectedComponentFactory = componentFactories.get(selected);
+ componentFactoryModel.setObject(this.selectedComponentFactory);
+
+ final WebMarkupContainer views = new WebMarkupContainer(ID_VIEWS);
+
+ final Label viewButtonTitle = new Label(ID_VIEW_BUTTON_TITLE, "Hidden");
+ views.addOrReplace(viewButtonTitle);
+
+ final Label viewButtonIcon = new Label(ID_VIEW_BUTTON_ICON, "");
+ views.addOrReplace(viewButtonIcon);
+
+ final WebMarkupContainer container = new WebMarkupContainer(ID_VIEW_LIST);
+
+ views.addOrReplace(container);
+ views.setOutputMarkupId(true);
+
+ this.setOutputMarkupId(true);
+
+ final ListView<ComponentFactory> listView = new ListView<ComponentFactory>(ID_VIEW_ITEM, componentFactories) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void populateItem(ListItem<ComponentFactory> item) {
+
+ final int underlyingViewNum = item.getIndex();
+
+ final ComponentFactory componentFactory = item.getModelObject();
+ final AbstractLink link = new AjaxLink<Void>(ID_VIEW_LINK) {
+ private static final long serialVersionUID = 1L;
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+ CollectionSelectorPanel linksSelectorPanel = CollectionSelectorPanel.this;
+ linksSelectorPanel.setViewHintAndBroadcast(underlyingViewNum, target);
+
+ CollectionSelectorPanel.this.selectedComponentFactory = componentFactory;
+ target.add(CollectionSelectorPanel.this, views);
+ }
+
+ @Override
+ protected void onComponentTag(ComponentTag tag) {
+ super.onComponentTag(tag);
+ Buttons.fixDisabledState(this, tag);
+ }
+ };
+
+ IModel<String> title = nameFor(componentFactory);
+ Label viewItemTitleLabel = new Label(ID_VIEW_ITEM_TITLE, title);
+ link.add(viewItemTitleLabel);
+
+ Label viewItemIcon = new Label(ID_VIEW_ITEM_ICON, "");
+ link.add(viewItemIcon);
+
+ boolean isEnabled = componentFactory != CollectionSelectorPanel.this.selectedComponentFactory;
+ if (!isEnabled) {
+ viewButtonTitle.setDefaultModel(title);
+ IModel<String> cssClass = cssClassFor(componentFactory, viewButtonIcon);
+ viewButtonIcon.add(AttributeModifier.replace("class", "ViewLinkItem " + cssClass.getObject()));
+ link.setVisible(false);
+ } else {
+ IModel<String> cssClass = cssClassFor(componentFactory, viewItemIcon);
+ viewItemIcon.add(new CssClassAppender(cssClass));
+ }
+
+ item.add(link);
+ }
+
+ private IModel<String> cssClassFor(final ComponentFactory componentFactory, Label viewIcon) {
+ IModel<String> cssClass = null;
+ if (componentFactory instanceof CollectionContentsAsFactory) {
+ CollectionContentsAsFactory collectionContentsAsFactory = (CollectionContentsAsFactory) componentFactory;
+ cssClass = collectionContentsAsFactory.getCssClass();
+ viewIcon.setDefaultModelObject("");
+ viewIcon.setEscapeModelStrings(true);
+ }
+ if (cssClass == null) {
+ String name = componentFactory.getName();
+ cssClass = Model.of(StringExtensions.asLowerDashed(name));
+ // Small hack: if there is no specific CSS class then we assume that background-image is used
+ // the span.ViewItemLink should have some content to show it
+ // FIX: find a way to do this with CSS (width and height don't seems to help)
+ viewIcon.setDefaultModelObject("     ");
+ viewIcon.setEscapeModelStrings(false);
+ }
+ return cssClass;
+ }
+
+ private IModel<String> nameFor(final ComponentFactory componentFactory) {
+ IModel<String> name = null;
+ if (componentFactory instanceof CollectionContentsAsFactory) {
+ CollectionContentsAsFactory collectionContentsAsFactory = (CollectionContentsAsFactory) componentFactory;
+ name = collectionContentsAsFactory.getTitleLabel();
+ }
+ if (name == null) {
+ name = Model.of(componentFactory.getName());
+ }
+ return name;
+ }
+ };
+ container.add(listView);
+ addOrReplace(views);
+ }
+ }
+
+
+ protected void setViewHintAndBroadcast(int viewNum, AjaxRequestTarget target) {
+ final UiHintContainer uiHintContainer = getUiHintContainer();
+ if(uiHintContainer == null) {
+ return;
+ }
+ uiHintContainer.setHint(CollectionSelectorPanel.this, CollectionSelectorHelper.UIHINT_EVENT_VIEW_KEY, ""+viewNum);
+ send(getPage(), Broadcast.EXACT, new IsisUiHintEvent(uiHintContainer, target));
+ }
+
+ @Override
+ public void renderHead(final IHeaderResponse response) {
+ super.renderHead(response);
+ //PanelUtil.renderHead(response, CollectionSelectorPanel.class);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorProvider.java
new file mode 100644
index 0000000..08132ec
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorProvider.java
@@ -0,0 +1,23 @@
+/*
+ * 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.collection.selector;
+
+public interface CollectionSelectorProvider {
+ CollectionSelectorPanel getSelectorDropdownPanel();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/UNUSED_CollectionSelectorPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/UNUSED_CollectionSelectorPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/UNUSED_CollectionSelectorPanel.css
new file mode 100644
index 0000000..8c3902e
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/UNUSED_CollectionSelectorPanel.css
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+.linksSelectorPanel .viewLinks {
+ float:right;
+ display:block;
+}
+
+.linksSelectorPanel ul.dropdown-menu {
+ min-width: 0;
+}
+
+.linksSelectorPanel ul.dropdown-menu li.viewItem {
+ min-width: 0;
+}
+
+.linksSelectorPanel ul.viewList li.viewItem:first-child span {
+ border-radius:4px 0 0 4px;
+ -moz-border-radius:4px 0 0 4px;
+ -webkit-border-radius:4px 0 0 4px;
+}
+
+.linksSelectorPanel ul.viewList li.viewItem:last-child span {
+ border-radius:0 4px 4px 0;
+ -moz-border-radius:0 4px 4px 0;
+ -webkit-border-radius:0 4px 4px 0;
+}
+
+
+.linksSelectorPanel .link-selector-panel-invisible {
+ display:none;
+}
+
+.linksSelectorPanel .list-inline {
+ margin-left: 0;
+}
+
+.linksSelectorPanel .list-inline li {
+ padding-left: 0;
+}
+
+
+.collectionContentsLinksSelectorPanel select {
+ margin-bottom: 1em;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/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 498751c..803a053 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
@@ -56,7 +56,7 @@ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
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;
-import org.apache.isis.viewer.wicket.ui.components.collection.CollectionCountProvider;
+import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ColumnAbstract;
import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterPropertyColumn;
import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterTitleColumn;
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.css
new file mode 100644
index 0000000..8c3902e
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.css
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+.linksSelectorPanel .viewLinks {
+ float:right;
+ display:block;
+}
+
+.linksSelectorPanel ul.dropdown-menu {
+ min-width: 0;
+}
+
+.linksSelectorPanel ul.dropdown-menu li.viewItem {
+ min-width: 0;
+}
+
+.linksSelectorPanel ul.viewList li.viewItem:first-child span {
+ border-radius:4px 0 0 4px;
+ -moz-border-radius:4px 0 0 4px;
+ -webkit-border-radius:4px 0 0 4px;
+}
+
+.linksSelectorPanel ul.viewList li.viewItem:last-child span {
+ border-radius:0 4px 4px 0;
+ -moz-border-radius:0 4px 4px 0;
+ -webkit-border-radius:0 4px 4px 0;
+}
+
+
+.linksSelectorPanel .link-selector-panel-invisible {
+ display:none;
+}
+
+.linksSelectorPanel .list-inline {
+ margin-left: 0;
+}
+
+.linksSelectorPanel .list-inline li {
+ padding-left: 0;
+}
+
+
+.collectionContentsLinksSelectorPanel select {
+ margin-bottom: 1em;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.html
new file mode 100644
index 0000000..0a6d242
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.html
@@ -0,0 +1,41 @@
+<?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.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns:wicket="http://wicket.apache.org">
+<body>
+<wicket:panel>
+ <div class="linksSelectorPanel">
+
+ <div class="views">
+ <div wicket:id="collectionContents-0" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-1" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-2" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-3" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-4" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-5" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-6" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-7" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-8" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ <div wicket:id="collectionContents-9" class="collectionContentsLinksSelectorPanel collectionContentsComponentType"></div>
+ </div>
+ </div>
+</wicket:panel>
+</body>
+</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
new file mode 100644
index 0000000..49db84a
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
@@ -0,0 +1,226 @@
+/*
+ * 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.multiple;
+
+import java.util.List;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.isis.viewer.wicket.model.hints.IsisEnvelopeEvent;
+import org.apache.isis.viewer.wicket.model.hints.IsisUiHintEvent;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
+import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
+import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorPanel;
+import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorHelper;
+import org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorProvider;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+import org.apache.isis.viewer.wicket.ui.util.CssClassRemover;
+
+/**
+ * Subscribes to events generated by {@link org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorPanel}, rendering the appropriate {@link ComponentType#COLLECTION_CONTENTS}
+ * view for a backing {@link EntityCollectionModel}.
+ */
+public class CollectionContentsMultipleViewsPanel
+ extends PanelAbstract<EntityCollectionModel> implements UiHintPathSignificant, CollectionCountProvider {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String INVISIBLE_CLASS = "link-selector-panel-invisible";
+ private static final int MAX_NUM_UNDERLYING_VIEWS = 10;
+
+ private static final String UIHINT_VIEW = "view";
+
+ private final ComponentFactory ignoreFactory;
+
+ private final ComponentType componentType;
+ private final String underlyingIdPrefix;
+ private final CollectionSelectorHelper selectorHelper;
+
+ private ComponentFactory selectedComponentFactory;
+ private Component selectedComponent;
+
+ private Component[] underlyingViews;
+ private CollectionSelectorPanel selectorDropdownPanel;
+
+ public CollectionContentsMultipleViewsPanel(
+ final String id,
+ final EntityCollectionModel model,
+ final ComponentFactory ignoreFactory) {
+ super(id, model);
+ this.ignoreFactory = ignoreFactory;
+ this.underlyingIdPrefix = ComponentType.COLLECTION_CONTENTS.toString();
+ this.componentType = ignoreFactory.getComponentType();
+ selectorHelper = new CollectionSelectorHelper(model, getComponentFactoryRegistry(), ignoreFactory);
+
+ }
+
+ /**
+ * Build UI only after added to parent.
+ */
+ public void onInitialize() {
+ super.onInitialize();
+ addUnderlyingViews();
+ }
+
+
+ private void addUnderlyingViews() {
+ final EntityCollectionModel model = getModel();
+
+ final int selected = selectorHelper.honourViewHintElseDefault(getSelectorDropdownPanel());
+ final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+
+ // create all, hide the one not selected
+ underlyingViews = new Component[MAX_NUM_UNDERLYING_VIEWS];
+ int i = 0;
+ final EntityCollectionModel emptyModel = model.asDummy();
+ for (ComponentFactory componentFactory : componentFactories) {
+ final String underlyingId = underlyingIdPrefix + "-" + i;
+
+ Component underlyingView = componentFactory.createComponent(underlyingId,i==selected? model: emptyModel);
+ underlyingViews[i++] = underlyingView;
+ this.addOrReplace(underlyingView);
+ }
+
+ // hide any unused placeholders
+ while(i<MAX_NUM_UNDERLYING_VIEWS) {
+ String underlyingId = underlyingIdPrefix + "-" + i;
+ permanentlyHide(underlyingId);
+ i++;
+ }
+
+ this.setOutputMarkupId(true);
+
+ for(i=0; i<MAX_NUM_UNDERLYING_VIEWS; i++) {
+ Component component = underlyingViews[i];
+ if(component != null) {
+ if(i != selected) {
+ component.add(new CssClassAppender(INVISIBLE_CLASS));
+ } else {
+ selectedComponent = component;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onEvent(IEvent<?> event) {
+ super.onEvent(event);
+
+ final IsisUiHintEvent uiHintEvent = IsisEnvelopeEvent.openLetter(event, IsisUiHintEvent.class);
+ if(uiHintEvent == null) {
+ return;
+ }
+ final UiHintContainer uiHintContainer = uiHintEvent.getUiHintContainer();
+
+ int underlyingViewNum = 0;
+ String viewStr = uiHintContainer.getHint(this.getSelectorDropdownPanel(), UIHINT_VIEW);
+
+ List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+
+ if(viewStr != null) {
+ try {
+ int view = Integer.parseInt(viewStr);
+ if(view >= 0 && view < componentFactories.size()) {
+ underlyingViewNum = view;
+ }
+ } catch(NumberFormatException ex) {
+ // ignore
+ }
+ }
+
+ final EntityCollectionModel dummyModel = getModel().asDummy();
+ for(int i=0; i<MAX_NUM_UNDERLYING_VIEWS; i++) {
+ final Component component = underlyingViews[i];
+ if(component == null) {
+ continue;
+ }
+ final boolean isSelected = i == underlyingViewNum;
+ applyCssVisibility(component, isSelected);
+ component.setDefaultModel(isSelected? getModel(): dummyModel);
+ }
+
+ this.selectedComponentFactory = ignoreFactory;
+ this.selectedComponent = underlyingViews[underlyingViewNum];
+
+
+ final AjaxRequestTarget target = uiHintEvent.getTarget();
+ if(target != null) {
+ target.add(this, getSelectorDropdownPanel());
+ }
+
+ }
+
+
+ protected static void applyCssVisibility(final Component component, final boolean visible) {
+ if(component == null) {
+ return;
+ }
+ AttributeModifier modifier = visible ? new CssClassRemover(INVISIBLE_CLASS) : new CssClassAppender(INVISIBLE_CLASS);
+ component.add(modifier);
+ }
+
+ @Override
+ public void renderHead(final IHeaderResponse response) {
+ super.renderHead(response);
+ PanelUtil.renderHead(response, CollectionContentsMultipleViewsPanel.class);
+ }
+
+
+
+ @Override
+ public Integer getCount() {
+ if(selectedComponent instanceof CollectionCountProvider) {
+ final CollectionCountProvider collectionCountProvider = (CollectionCountProvider) selectedComponent;
+ return collectionCountProvider.getCount();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Searches up the component hierarchy looking for a parent that implements
+ * {@link org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorProvider}.
+ * @return
+ */
+ private CollectionSelectorPanel getSelectorDropdownPanel() {
+ Component component = this;
+ while(component != null) {
+ if(component instanceof CollectionSelectorProvider) {
+ final CollectionSelectorPanel selectorDropdownPanel1 = ((CollectionSelectorProvider) component).getSelectorDropdownPanel();
+ if(selectorDropdownPanel1 == null) {
+ throw new IllegalStateException("Found parent that implements HasSelectorDropdownPanel, but no SelectorDropdownPanel available (is null)");
+
+ }
+ return selectorDropdownPanel1;
+ }
+ component = component.getParent();
+ }
+ throw new IllegalStateException("Could not locate parent that implements HasSelectorDropdownPanel");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanelFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanelFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanelFactory.java
new file mode 100644
index 0000000..53b8092
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanelFactory.java
@@ -0,0 +1,53 @@
+/*
+ * 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.multiple;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+
+/**
+ * {@link ComponentFactory} for {@link CollectionContentsMultipleViewsPanel}.
+ */
+public class CollectionContentsMultipleViewsPanelFactory extends ComponentFactoryAbstract {
+
+ private static final long serialVersionUID = 1L;
+
+ public CollectionContentsMultipleViewsPanelFactory() {
+ super(ComponentType.COLLECTION_CONTENTS,
+ CollectionContentsMultipleViewsPanel.class);
+ }
+
+ @Override
+ public ApplicationAdvice appliesTo(final IModel<?> model) {
+ return appliesIf(model instanceof EntityCollectionModel);
+ }
+
+ @Override
+ public Component createComponent(final String id, final IModel<?> model) {
+ final EntityCollectionModel collectionModel = (EntityCollectionModel) model;
+ return new CollectionContentsMultipleViewsPanel(id, collectionModel, this);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.html
deleted file mode 100644
index 8bec51a..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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.
--->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns:wicket="http://wicket.apache.org">
-<body>
-<wicket:panel>
- <div class="linksSelectorPanel">
- <div class="btn-group viewLinks" wicket:id="views">
- <button type="button" class="btn btn-sm btn-info">
- <span wicket:id="viewButtonIcon" class="ViewLinkItem"></span>
- <span wicket:id="viewButtonTitle" class="ViewLinkItemTitle"></span>
- </button>
- <button type="button" class="btn btn-sm btn-info dropdown-toggle" data-toggle="dropdown">
- <span class="caret"></span>
- </button>
- <ul wicket:id="viewList" class="dropdown-menu dropdown-menu-right" role="menu">
- <li wicket:id="viewItem" class="viewItem">
- <a href="#" wicket:id="viewLink">
- <span wicket:id="viewItemIcon" class="ViewLinkItem"></span> <span wicket:id="viewItemTitle" class="ViewLinkItemTitle">[link title]</span>
- </a>
- </li>
- </ul>
- </div>
- </div>
-</wicket:panel>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.java
deleted file mode 100644
index 37797c5..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorDropdownPanel.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * 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.selector.dropdown;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
-
-import java.util.List;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-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.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.isis.core.commons.lang.StringExtensions;
-import org.apache.isis.viewer.wicket.model.hints.IsisUiHintEvent;
-import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
-import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
-import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
-import org.apache.isis.viewer.wicket.ui.CollectionContentsAsFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-/**
- * Provides a list of links for selecting other views that support
- * {@link org.apache.isis.viewer.wicket.ui.ComponentType#COLLECTION_CONTENTS} with a backing
- * {@link org.apache.isis.viewer.wicket.model.models.EntityCollectionModel}.
- */
-public class CollectionContentsSelectorDropdownPanel
- extends PanelAbstract<EntityCollectionModel> implements UiHintPathSignificant /*, CollectionCountProvider*/ {
-
- private static final long serialVersionUID = 1L;
-
- private static final String ID_VIEWS = "views";
- private static final String ID_VIEW_LIST = "viewList";
- private static final String ID_VIEW_LINK = "viewLink";
- private static final String ID_VIEW_ITEM = "viewItem";
- private static final String ID_VIEW_ITEM_TITLE = "viewItemTitle";
- private static final String ID_VIEW_ITEM_ICON = "viewItemIcon";
-
- private static final String ID_VIEW_BUTTON_TITLE = "viewButtonTitle";
- private static final String ID_VIEW_BUTTON_ICON = "viewButtonIcon";
-
- private final ComponentType componentType;
- private final CollectionContentsSelectorHelper selectorHelper;
-
- private ComponentFactory selectedComponentFactory;
-
- public CollectionContentsSelectorDropdownPanel(final String id, final EntityCollectionModel model, final ComponentFactory ignoreFactory) {
- super(id, model);
- this.componentType = ignoreFactory.getComponentType();
- selectorHelper = new CollectionContentsSelectorHelper(model, getComponentFactoryRegistry(), ignoreFactory);
- }
-
- /**
- * Build UI only after added to parent.
- */
- public void onInitialize() {
- super.onInitialize();
- addDropdown();
- }
-
-
-
- private void addDropdown() {
- final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
- final int selected = selectorHelper.honourViewHintElseDefault(this);
-
- // selector
- if (componentFactories.size() <= 1) {
- permanentlyHide(ID_VIEWS);
- } else {
- final Model<ComponentFactory> componentFactoryModel = new Model<>();
-
- this.selectedComponentFactory = componentFactories.get(selected);
- componentFactoryModel.setObject(this.selectedComponentFactory);
-
- final WebMarkupContainer views = new WebMarkupContainer(ID_VIEWS);
-
- final Label viewButtonTitle = new Label(ID_VIEW_BUTTON_TITLE, "Hidden");
- views.addOrReplace(viewButtonTitle);
-
- final Label viewButtonIcon = new Label(ID_VIEW_BUTTON_ICON, "");
- views.addOrReplace(viewButtonIcon);
-
- final WebMarkupContainer container = new WebMarkupContainer(ID_VIEW_LIST);
-
- views.addOrReplace(container);
- views.setOutputMarkupId(true);
-
- this.setOutputMarkupId(true);
-
- final ListView<ComponentFactory> listView = new ListView<ComponentFactory>(ID_VIEW_ITEM, componentFactories) {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void populateItem(ListItem<ComponentFactory> item) {
-
- final int underlyingViewNum = item.getIndex();
-
- final ComponentFactory componentFactory = item.getModelObject();
- final AbstractLink link = new AjaxLink<Void>(ID_VIEW_LINK) {
- private static final long serialVersionUID = 1L;
- @Override
- public void onClick(AjaxRequestTarget target) {
- CollectionContentsSelectorDropdownPanel linksSelectorPanel = CollectionContentsSelectorDropdownPanel.this;
- linksSelectorPanel.setViewHintAndBroadcast(underlyingViewNum, target);
-
- CollectionContentsSelectorDropdownPanel.this.selectedComponentFactory = componentFactory;
- target.add(CollectionContentsSelectorDropdownPanel.this, views);
- }
-
- @Override
- protected void onComponentTag(ComponentTag tag) {
- super.onComponentTag(tag);
- Buttons.fixDisabledState(this, tag);
- }
- };
-
- IModel<String> title = nameFor(componentFactory);
- Label viewItemTitleLabel = new Label(ID_VIEW_ITEM_TITLE, title);
- link.add(viewItemTitleLabel);
-
- Label viewItemIcon = new Label(ID_VIEW_ITEM_ICON, "");
- link.add(viewItemIcon);
-
- boolean isEnabled = componentFactory != CollectionContentsSelectorDropdownPanel.this.selectedComponentFactory;
- if (!isEnabled) {
- viewButtonTitle.setDefaultModel(title);
- IModel<String> cssClass = cssClassFor(componentFactory, viewButtonIcon);
- viewButtonIcon.add(AttributeModifier.replace("class", "ViewLinkItem " + cssClass.getObject()));
- link.setVisible(false);
- } else {
- IModel<String> cssClass = cssClassFor(componentFactory, viewItemIcon);
- viewItemIcon.add(new CssClassAppender(cssClass));
- }
-
- item.add(link);
- }
-
- private IModel<String> cssClassFor(final ComponentFactory componentFactory, Label viewIcon) {
- IModel<String> cssClass = null;
- if (componentFactory instanceof CollectionContentsAsFactory) {
- CollectionContentsAsFactory collectionContentsAsFactory = (CollectionContentsAsFactory) componentFactory;
- cssClass = collectionContentsAsFactory.getCssClass();
- viewIcon.setDefaultModelObject("");
- viewIcon.setEscapeModelStrings(true);
- }
- if (cssClass == null) {
- String name = componentFactory.getName();
- cssClass = Model.of(StringExtensions.asLowerDashed(name));
- // Small hack: if there is no specific CSS class then we assume that background-image is used
- // the span.ViewItemLink should have some content to show it
- // FIX: find a way to do this with CSS (width and height don't seems to help)
- viewIcon.setDefaultModelObject("     ");
- viewIcon.setEscapeModelStrings(false);
- }
- return cssClass;
- }
-
- private IModel<String> nameFor(final ComponentFactory componentFactory) {
- IModel<String> name = null;
- if (componentFactory instanceof CollectionContentsAsFactory) {
- CollectionContentsAsFactory collectionContentsAsFactory = (CollectionContentsAsFactory) componentFactory;
- name = collectionContentsAsFactory.getTitleLabel();
- }
- if (name == null) {
- name = Model.of(componentFactory.getName());
- }
- return name;
- }
- };
- container.add(listView);
- addOrReplace(views);
- }
- }
-
-
-
- protected void setViewHintAndBroadcast(int viewNum, AjaxRequestTarget target) {
- final UiHintContainer uiHintContainer = getUiHintContainer();
- if(uiHintContainer == null) {
- return;
- }
- uiHintContainer.setHint(CollectionContentsSelectorDropdownPanel.this, CollectionContentsSelectorHelper.UIHINT_VIEW, ""+viewNum);
- send(getPage(), Broadcast.EXACT, new IsisUiHintEvent(uiHintContainer, target));
- }
-
- @Override
- public void renderHead(final IHeaderResponse response) {
- super.renderHead(response);
- PanelUtil.renderHead(response, CollectionContentsSelectorDropdownPanel.class);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorHelper.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorHelper.java
deleted file mode 100644
index 06eed95..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorHelper.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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.selector.dropdown;
-
-import java.util.ArrayList;
-import java.util.List;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-import org.apache.isis.applib.annotation.Render;
-import org.apache.isis.core.metamodel.facets.members.render.RenderFacet;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
-import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
-import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsAsAjaxTablePanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.collectioncontents.selector.links.CollectionContentsLinksSelectorPanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsAsUnresolvedPanelFactory;
-
-public class CollectionContentsSelectorHelper {
-
- static final String UIHINT_VIEW = "view";
- private static final long serialVersionUID = 1L;
-
- private final ComponentType componentType;
- private final ComponentFactoryRegistry componentFactoryRegistry;
- private final EntityCollectionModel model;
- private final ComponentFactory ignoreFactory;
- private final List<ComponentFactory> componentFactories;
-
-
- public CollectionContentsSelectorHelper(
- final EntityCollectionModel model,
- final ComponentFactoryRegistry componentFactoryRegistry,
- final ComponentFactory ignoreFactory) {
- this.componentFactoryRegistry = componentFactoryRegistry;
- this.model = model;
- this.ignoreFactory = ignoreFactory;
- this.componentType = ignoreFactory.getComponentType();
-
- componentFactories = findOtherComponentFactories();
-
- }
-
- public ComponentFactory getComponentFactory() {
- return componentFactoryRegistry.findComponentFactoryElseFailFast(componentType, model);
- }
-
- public List<ComponentFactory> findOtherComponentFactories() {
- final List<ComponentFactory> componentFactories = componentFactoryRegistry.findComponentFactories(componentType, model);
- ArrayList<ComponentFactory> otherFactories = Lists.newArrayList(Collections2.filter(componentFactories, new Predicate<ComponentFactory>() {
- @Override
- public boolean apply(final ComponentFactory input) {
- return input != ignoreFactory && input.getClass() != CollectionContentsLinksSelectorPanelFactory.class;
- }
- }));
- return ordered(otherFactories);
- }
-
- public int honourViewHintElseDefault(final Component component) {
- // honour hints ...
- final UiHintContainer hintContainer = getUiHintContainer(component);
- if(hintContainer != null) {
- String viewStr = hintContainer.getHint(component, UIHINT_VIEW);
- if(viewStr != null) {
- try {
- int view = Integer.parseInt(viewStr);
- if(view >= 0 && view < componentFactories.size()) {
- return view;
- }
- } catch(NumberFormatException ex) {
- // ignore
- }
- }
- }
-
- // ... else default
- int initialFactory = determineInitialFactory();
- if(hintContainer != null) {
- hintContainer.setHint(component, UIHINT_VIEW, ""+initialFactory);
- // don't broadcast (no AjaxRequestTarget, still configuring initial setup)
- }
- return initialFactory;
- }
-
- private static List<ComponentFactory> ordered(List<ComponentFactory> componentFactories) {
- return orderAjaxTableToEnd(componentFactories);
- }
-
- static List<ComponentFactory> orderAjaxTableToEnd(List<ComponentFactory> componentFactories) {
- int ajaxTableIdx = findAjaxTable(componentFactories);
- if(ajaxTableIdx>=0) {
- List<ComponentFactory> orderedFactories = Lists.newArrayList(componentFactories);
- ComponentFactory ajaxTableFactory = orderedFactories.remove(ajaxTableIdx);
- orderedFactories.add(ajaxTableFactory);
- return orderedFactories;
- } else {
- return componentFactories;
- }
- }
-
- private static int findAjaxTable(List<ComponentFactory> componentFactories) {
- for(int i=0; i<componentFactories.size(); i++) {
- if(componentFactories.get(i) instanceof CollectionContentsAsAjaxTablePanelFactory) {
- return i;
- }
- }
- return -1;
- }
-
-
-
-
-
- /**
- * return the index of {@link org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsAsUnresolvedPanelFactory unresolved panel} if present and not eager loading;
- * else the index of {@link org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsAsAjaxTablePanelFactory ajax table} if present,
- * otherwise first factory.
- */
- protected int determineInitialFactory() {
- if(!hasRenderEagerlyFacet(model)) {
- for(int i=0; i<componentFactories.size(); i++) {
- if(componentFactories.get(i) instanceof CollectionContentsAsUnresolvedPanelFactory) {
- return i;
- }
- }
- }
- int ajaxTableIdx = CollectionContentsSelectorHelper.findAjaxTable(componentFactories);
- if(ajaxTableIdx>=0) {
- return ajaxTableIdx;
- }
- return 0;
- }
-
- private static UiHintContainer getUiHintContainer(final Component component) {
- return UiHintContainer.Util.hintContainerOf(component);
- }
-
-
- private static boolean hasRenderEagerlyFacet(IModel<?> model) {
- if(!(model instanceof EntityCollectionModel)) {
- return false;
- }
- final EntityCollectionModel entityCollectionModel = (EntityCollectionModel) model;
- if(!entityCollectionModel.isParented()) {
- return false;
- }
-
- final OneToManyAssociation collection =
- entityCollectionModel.getCollectionMemento().getCollection();
- RenderFacet renderFacet = collection.getFacet(RenderFacet.class);
- return renderFacet != null && renderFacet.value() == Render.Type.EAGERLY;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/92ffe2d2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorSelectorDropdownPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorSelectorDropdownPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorSelectorDropdownPanel.css
deleted file mode 100644
index 8c3902e..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/dropdown/CollectionContentsSelectorSelectorDropdownPanel.css
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- */
-.linksSelectorPanel .viewLinks {
- float:right;
- display:block;
-}
-
-.linksSelectorPanel ul.dropdown-menu {
- min-width: 0;
-}
-
-.linksSelectorPanel ul.dropdown-menu li.viewItem {
- min-width: 0;
-}
-
-.linksSelectorPanel ul.viewList li.viewItem:first-child span {
- border-radius:4px 0 0 4px;
- -moz-border-radius:4px 0 0 4px;
- -webkit-border-radius:4px 0 0 4px;
-}
-
-.linksSelectorPanel ul.viewList li.viewItem:last-child span {
- border-radius:0 4px 4px 0;
- -moz-border-radius:0 4px 4px 0;
- -webkit-border-radius:0 4px 4px 0;
-}
-
-
-.linksSelectorPanel .link-selector-panel-invisible {
- display:none;
-}
-
-.linksSelectorPanel .list-inline {
- margin-left: 0;
-}
-
-.linksSelectorPanel .list-inline li {
- padding-left: 0;
-}
-
-
-.collectionContentsLinksSelectorPanel select {
- margin-bottom: 1em;
-}