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/12/03 08:53:09 UTC
[3/5] isis git commit: ISIS-963: primary,
secondary and tertiary menu support.
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
index aa40774..b7f1127 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
@@ -75,8 +75,8 @@ import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.AdditionalLinksPanel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
import org.apache.isis.viewer.wicket.ui.components.widgets.containers.UiHintPathSignificantWebMarkupContainer;
import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
index ed4389a..2bd7cf1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
@@ -50,7 +50,7 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
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.components.additionallinks.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
import org.apache.isis.viewer.wicket.ui.util.Components;
import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index ad93822..5aaeddc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -43,7 +43,7 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -168,7 +168,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
* Bit of a hack, but is an API to force the eager building of this component such that focus can be placed on it.
*
* <p>
- * This is used in {@link org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactoryAbstract}
+ * This is used in {@link org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLinkFactoryAbstract}
* when creating the action prompt parameters panel.
* </p>
*/
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index f47e54d..6e41fd5 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -38,7 +38,7 @@ import org.apache.isis.core.metamodel.facets.objpropparam.typicallen.TypicalLeng
import org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacet;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
index b6c6c8e..617f24d 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
@@ -51,7 +51,7 @@ import org.apache.isis.core.commons.lang.CloseableExtensions;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
import org.apache.isis.viewer.wicket.ui.util.Components;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index cd57534..ff670f9 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -33,7 +33,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index e580d77..7f925dc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -46,7 +46,7 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
import org.apache.isis.viewer.wicket.ui.ComponentFactory;
import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index 89e7b50..101f26e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@ -37,7 +37,7 @@ 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.actionprompt.ActionPromptModalWindow;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsHelper;
import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsLinkFactory;
import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsProvider;
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java
deleted file mode 100644
index 9e3ca0a..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java
+++ /dev/null
@@ -1,33 +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.widgets.cssmenu;
-
-import java.io.Serializable;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-public interface ActionLinkFactory extends Serializable {
-
- LinkAndLabel newLink(
- final ObjectAdapterMemento adapter,
- final ObjectAction noAction,
- final String linkId);
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java
deleted file mode 100644
index 1142d14..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java
+++ /dev/null
@@ -1,233 +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.widgets.cssmenu;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
-import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
-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.app.registry.ComponentFactoryRegistryAccessor;
-import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptHeaderPanel;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.AjaxDeferredBehaviour.OpenUrlStrategy;
-import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
-import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
-
- private static final long serialVersionUID = 1L;
-
- protected AbstractLink newLink(
- final String linkId,
- final ObjectAdapter objectAdapter,
- final ObjectAction action) {
-
- final ActionModel actionModel = ActionModel.create(objectAdapter, action);
-
- final AjaxDeferredBehaviour ajaxDeferredBehaviour = determineDeferredBehaviour(action, actionModel);
-
- final AbstractLink link = new AjaxLink<Object>(linkId) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onClick(AjaxRequestTarget target) {
-
- if(ajaxDeferredBehaviour != null) {
- ajaxDeferredBehaviour.initiate(target);
- } else {
- final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(getPage());
- final ActionPrompt actionPrompt = promptProvider.getActionPrompt();
- ActionPromptHeaderPanel titlePanel = new ActionPromptHeaderPanel(actionPrompt.getTitleId(), actionModel);
- final ActionPanel actionPanel =
- (ActionPanel) getComponentFactoryRegistry().createComponent(
- ComponentType.ACTION_PROMPT, actionPrompt.getContentId(), actionModel);
-
- actionPanel.setShowHeader(false);
-
- actionPrompt.setTitle(titlePanel, target);
- actionPrompt.setPanel(actionPanel, target);
- actionPanel.setActionPrompt(actionPrompt);
- actionPrompt.showPrompt(target);
-
- focusOnFirstParameter(target, actionPanel);
- }
- }
-
- private void focusOnFirstParameter(AjaxRequestTarget target, ActionPanel actionPanel) {
-
- // first, force all parameters to build themselves...
- actionPanel.visitChildren(new IVisitor<Component, Component>() {
- @Override
- public void component(Component object, IVisit<Component> visit) {
- if (object instanceof ScalarPanelAbstract) {
- ScalarPanelAbstract spa = (ScalarPanelAbstract) object;
- spa.forceBuildGui();
- visit.dontGoDeeper();
- }
- }
- });
-
- // second, go searching for the first <input> in the action panel.
- final Component actionPanelFirstParam = actionPanel.visitChildren(new IVisitor<Component, Component>() {
- @Override
- public void component(Component object, IVisit<Component> visit) {
- if (object instanceof FormComponent &&
- !"scalarIfCompact".equals(object.getId()) &&
- object.getOutputMarkupId()) {
- // there are components for 'compact' and 'regular'; we want the 'regular' one
- // also double check that has outputMarkupId enabled (prereq for setting focus)
- visit.stop(object);
- }
- }
- });
-
- // third, if found then use Wicket API to focus on this component
- if(actionPanelFirstParam != null) {
- target.focusComponent(actionPanelFirstParam);
- }
- }
-
- @Override
- protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
- super.updateAjaxAttributes(attributes);
-
- // allow the event to bubble so the menu is hidden after click on an item
- attributes.setEventPropagation(AjaxRequestAttributes.EventPropagation.BUBBLE);
- }
-
- @Override
- protected void onComponentTag(ComponentTag tag) {
- super.onComponentTag(tag);
-
- Buttons.fixDisabledState(this, tag);
- }
- };
-
- if(ajaxDeferredBehaviour != null) {
- link.add(ajaxDeferredBehaviour);
- }
-
- link.add(new CssClassAppender("noVeil"));
-
- return link;
- }
-
- private static AjaxDeferredBehaviour determineDeferredBehaviour(final ObjectAction action, final ActionModel actionModel) {
- // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
- if(isNoArgReturnTypeRedirect(action)) {
- /**
- * adapted from:
- * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
- */
- return new AjaxDeferredBehaviour(OpenUrlStrategy.NEW_WINDOW) {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected IRequestHandler getRequestHandler() {
- ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
- final Object value = resultAdapter.getObject();
- return ActionModel.redirectHandler(value);
- }
- };
- }
- if(isNoArgReturnTypeDownload(action)) {
-
- /**
- * adapted from:
- * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
- */
- return new AjaxDeferredBehaviour(OpenUrlStrategy.SAME_WINDOW) {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected IRequestHandler getRequestHandler() {
- final ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
- final Object value = resultAdapter.getObject();
- return ActionModel.downloadHandler(value);
- }
- };
- }
- return null;
- }
-
- // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
- private static boolean isNoArgReturnTypeRedirect(final ObjectAction action) {
- return action.getParameterCount() == 0 &&
- action.getReturnType() != null &&
- action.getReturnType().getCorrespondingClass() == java.net.URL.class;
- }
-
- // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
- private static boolean isNoArgReturnTypeDownload(final ObjectAction action) {
- return action.getParameterCount() == 0 && action.getReturnType() != null &&
- (action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Blob.class ||
- action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Clob.class);
- }
-
- protected LinkAndLabel newLinkAndLabel(final ObjectAction objectAction, final AbstractLink link, final String disabledReasonIfAny) {
-
- final String label = ObjectAction.Utils.nameFor(objectAction);
- final boolean blobOrClob = ObjectAction.Utils.returnsBlobOrClob(objectAction);
- final boolean prototype = ObjectAction.Utils.isExplorationOrPrototype(objectAction);
- final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
- final String description = ObjectAction.Utils.descriptionOf(objectAction);
- final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
- final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
- final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
-
- return new LinkAndLabel(link, label, disabledReasonIfAny, description, blobOrClob, prototype, actionIdentifier, cssClass, cssClassFa, position);
- }
-
-
- // ////////////////////////////////////////////////////////////
- // Dependencies
- // ////////////////////////////////////////////////////////////
-
- protected ComponentFactoryRegistry getComponentFactoryRegistry() {
- return ((ComponentFactoryRegistryAccessor)Application.get()).getComponentFactoryRegistry();
- }
-
- protected PageClassRegistry getPageClassRegistry() {
- return ((PageClassRegistryAccessor) Application.get()).getPageClassRegistry();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java
deleted file mode 100644
index cdf06ca..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java
+++ /dev/null
@@ -1,84 +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.widgets.cssmenu;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.behavior.AbstractAjaxBehavior;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.UrlRenderer;
-import org.apache.wicket.request.cycle.RequestCycle;
-
-import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
-
-public abstract class AjaxDeferredBehaviour extends AbstractAjaxBehavior {
- private static final long serialVersionUID = 1L;
-
- public static enum OpenUrlStrategy {
- NEW_WINDOW {
- @Override
- public String javascriptFor(AjaxDeferredBehaviour deferredBehaviour, String url) {
- final Url parsedUrl = Url.parse(url);
- final RequestCycle requestCycle = deferredBehaviour.getComponent().getRequestCycle();
- final UrlRenderer urlRenderer = requestCycle.getUrlRenderer();
- String fullUrl = urlRenderer.renderFullUrl(parsedUrl);
- return "function(){Wicket.Event.publish(Isis.Topic.OPEN_IN_NEW_TAB, '" + fullUrl + "');}";
- }
- },
- SAME_WINDOW {
- @Override
- public String javascriptFor(AjaxDeferredBehaviour deferredBehaviour, String url) {
- return "\"window.location.href='" + url + "'\"";
- }
- };
-
- public abstract String javascriptFor(AjaxDeferredBehaviour deferredBehaviour, String url);
- }
-
- private final OpenUrlStrategy openUrlStrategy;
-
- protected AjaxDeferredBehaviour(final OpenUrlStrategy openUrlStrategy) {
- this.openUrlStrategy = openUrlStrategy;
- }
-
- /**
- * Call this method to initiate the download.
- */
- public void initiate(AjaxRequestTarget target) {
- String url = getCallbackUrl().toString();
-
- url = ActionResultResponseHandlingStrategy.expanded(url);
- String func = openUrlStrategy.javascriptFor(this, url);
-
- // the timeout is needed to let Wicket release the channel
- String javascriptFor = "setTimeout(" + func + ", 100);";
- target.appendJavaScript(javascriptFor);
- }
-
- @Override
- public void onRequest() {
- IRequestHandler handler = getRequestHandler();
- if(handler != null) {
- getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
- }
- }
-
- protected abstract IRequestHandler getRequestHandler();
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css
deleted file mode 100644
index 87a8864..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css
+++ /dev/null
@@ -1,340 +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.
- */
-
-
-/* copied from CssMenuPanel.css (since deleted that panel */
-
-
-
-.cssMenuPanel span.clear {
- line-height: 3px;
-}
-
-.cssMenuPanel .menuh .small {
- float: none;
- display: inline;
-}
-
-.cssMenuPanel .menuh p .small {
- float: none;
- display: inline;
-}
-
-.menuh a,.menuh p {
- text-align: left;
- display: block;
- white-space: nowrap;
- margin: 0;
- padding: 1px;
- padding-right: 1.6em;
- padding-left: 0.4em;
- font-weight: normal;
- cursor: default;
-}
-
-.cssMenuPanel .menuh a:hover {
- text-decoration: underline;
-}
-
-.cssMenuPanel .menuh a.top-parent,.cssMenuPanel .menuh p.top-parent {
- background-position: right center;
- background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh a.top-parent:hover,.cssMenuPanel .menuh p.top-parent:hover {
- background-position: right center;
- background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh a.parent,.cssMenuPanel .menuh p.parent {
- background-position: right center;
- background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh a.parent:hover,.cssMenuPanel .menuh p.parent:hover {
- background-position: right center;
- background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh ul {
- list-style: none;
- margin: 0;
- padding: 0;
- float: left;
- display: inline;
-}
-
-.cssMenuPanel .menuh li {
- position: relative;
- min-height: 1px;
-}
-
-.cssMenuPanel .menuh ul ul {
- position: absolute;
- z-index: 500;
- top: auto;
- display: none;
- padding: 1em;
- margin: -1em 0 0 -1em;
-}
-
-.cssMenuPanel .menuh ul ul ul {
- top: 0;
- left: 100%;
-}
-
-.cssMenuPanel span.menuh a:hover {
- cursor: pointer;
- z-index: 100;
-}
-
-.cssMenuPanel span.menuh li:hover ul ul,.cssMenuPanel span.menuh li li:hover ul ul,.cssMenuPanel span.menuh li li li:hover ul ul,.cssMenuPanel span.menuh li li li li:hover ul ul {
- display: none;
-}
-
-.cssMenuPanel span.menuh li:hover ul,.cssMenuPanel span.menuh li li:hover ul,.cssMenuPanel span.menuh li li li:hover ul,.cssMenuPanel span.menuh li li li li:hover ul {
- display: block;
-}
-
-.cssMenuPanel li.cssSubMenuItem p.disabled {
- cursor: not-allowed;
-}
-
-.cssMenuPanel li.cssSubMenuItem {
- margin-left:0;
-}
-
-/******** overrides for grouped actions and entity actions ***************/
-.groupedActions .cssMenuPanel li.cssMenuItemPanel>p.top-parent {
- display: none;
-}
-
-.groupedActions .cssMenuPanel .menuh ul {
- position: relative;
- display: block;
- float: right;
- margin: 0;
- padding: 0;
-}
-
-.groupedActions .cssMenuPanel .menuh ul ul {
- position: relative;
- display: block;
- float: right;
- margin: 0;
- padding: 0;
-}
-
-.groupedActions .cssMenuPanel .menuh li,
-.groupedActions .cssMenuPanel .menuh li p {
- float:left;
- display:block;
- margin-left:10px;
-}
-
-.groupedActions .cssMenuPanel .menuh a,.groupedActions .cssMenuPanel .menuh p
-{
- display: inline-block;
- border: none;
-}
-
-.groupedActions .cssMenuPanel .menuh a:link,
-.groupedActions .cssMenuPanel .menuh a:visited,
-.groupedActions .cssMenuPanel .menuh a:active,
-.groupedActions .cssMenuPanel .menuh p {
- display: block;
- float: left;
- height: 30px;
- line-height: 30px;
- padding: 0 10px;
- font-weight: bold;
- /*font-size: 0.85em;*/
- border-radius: 4px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- text-decoration: none;
-}
-
-.entityActions .cssMenuPanel li.cssMenuItemPanel>p.top-parent {
- display: none;
-}
-
-.entityActions .cssMenuPanel .menuh ul {
- position: relative;
- display: block;
- float: right;
- margin: 0 0 10px;
- padding: 0;
-}
-
-.entityActions .cssMenuPanel .menuh ul ul {
- position: relative;
- display: block;
- float: right;
- margin: 0;
- padding: 0;
-}
-
-.entityActions .cssMenuPanel .menuh li {
- float:left;
- display:block;
- margin-left:10px;
-}
-
-.entityActions .cssMenuPanel .menuh li p {
- float:left;
- display:block;
- margin-left:0;
-}
-
-.entityActions .cssMenuPanel .menuh a,
-.entityActions .cssMenuPanel .menuh p {
- display: inline-block;
- /*border: none;*/
-}
-
-.entityActions .cssMenuPanel .menuh a,
-.entityActions .cssMenuPanel .menuh a:link,
-.entityActions .cssMenuPanel .menuh a:visited,
-.entityActions .cssMenuPanel .menuh a:active,
-.entityActions .cssMenuPanel .menuh p {
- display: block;
- float: left;
- height: 30px;
- /*line-height: 30px;*/
- padding: 4px 10px 0;
- /*font-size:0.85em;*/
- border-radius:4px;
- -moz-border-radius:4px;
- -webkit-border-radius:4px;
- text-decoration:none;
-}
-
-.additionalLinkList {
- float:left;
- margin:0;
- padding:0;
- list-style:none;
-}
-
-.entityCollectionsPanel .panel-heading .additionalLinkList {
- margin-right: 10px;
-}
-
-.additionalLinkList li {
- float:left;
- margin-right:10px;
- /* margin-bottom: 2px;*/
-}
-.entityPropertiesPanel .additionalLinkList li {
- margin-right:0px;
-}
-.entityPropertiesPanel .properties .panel-heading .additionalLinkList {
- margin-right: -5px;
-}
-
-
-
-
-
-/**
- * Borrowed from http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3
- */
-
-.dropdown-submenu {
- position: relative;
-}
-
-.dropdown-submenu>.dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px;
- border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover>.dropdown-menu {
- display: block;
-}
-
-.dropdown-submenu>a:after {
- display: block;
- content: " ";
- float: right;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- border-left-color: #ccc;
- margin-top: 5px;
- margin-right: -10px;
-}
-
-.dropdown-submenu:hover>a:after {
- border-left-color: #fff;
-}
-
-.dropdown-submenu.pull-left {
- float: none;
-}
-
-.dropdown-submenu.pull-left>.dropdown-menu {
- left: -100%;
- margin-left: 10px;
- -webkit-border-radius: 6px 0 6px 6px;
- -moz-border-radius: 6px 0 6px 6px;
- border-radius: 6px 0 6px 6px;
-}
-
-.dropdown-menu > li > a.menuLink {
- padding-left: 0;
-}
-
-.dropdown-menu > li > span.fa {
- padding-left: 3px;
-}
-
-.dropdown-menu .fontAwesomeIcon {
- min-width: 20px;
-}
-
-.dropdown-menu > li > a.menuLink.btn-warning:hover {
- background-color: inherit;
- background-image: inherit;
-}
-
-.dropdown-menu > li > a.menuLink.menuLinkSpacer {
- padding-left: 24px;
-}
-
-.dropdown-menu > li > a.btn.btn-warning {
- text-align: start;
- border-radius: 0;
- color: initial;
-}
-
-.scrollable-menu {
- min-width: 250px;
- height: auto;
- max-height: 600px;
- overflow-x: hidden;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html
deleted file mode 100644
index 3a6dd5d..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
- <body>
- <wicket:panel>
- <li class="dropdown" wicket:id="menuItems">
- <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><span wicket:id="name"></span> <span class="caret"></span></a>
- <ul wicket:id="topMenu" class="dropdown-menu scrollable-menu multi-level" role="menu">
- <li wicket:id="subMenuItems">
- <wicket:container wicket:id="content"></wicket:container>
- </li>
- </ul>
- </li>
-
- <wicket:fragment wicket:id="leafItem">
- <a class="menuLink" wicket:id="menuLink">
- <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span> <span class="menuLinkLabel" wicket:id="menuLinkLabel"></span>
- </a>
- </wicket:fragment>
-
- <wicket:fragment wicket:id="folderItem">
- <a wicket:id="folderName" tabindex="-1"></a>
- <ul class="dropdown-menu">
- <li wicket:id="subMenuItems">
- <wicket:container wicket:id="content"></wicket:container>
- </li>
- </ul>
- </wicket:fragment>
-
- <wicket:fragment wicket:id="empty">
- </wicket:fragment>
-
-
- </wicket:panel>
- </body>
-</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java
deleted file mode 100644
index 5208189..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipBehavior;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.button.DropdownAutoOpenJavaScriptReference;
-
-import java.util.List;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.head.CssHeaderItem;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
-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.link.ExternalLink;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.request.resource.CssResourceReference;
-import org.apache.isis.viewer.wicket.ui.util.Components;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-/**
- * A panel responsible to render the application actions as menu in a navigation bar.
- *
- * <p>
- * The multi-level sub menu support is borrowed from
- * <a href="http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3">Bootsnip</a>
- * </p>
- */
-public class ApplicationActionsPanel extends Panel {
-
- /**
- * Constructor.
- *
- * @param id
- * the Wicket component id
- * @param menuItems
- * the menu items with their sub menu items
- */
- public ApplicationActionsPanel(String id, List<CssMenuItem> menuItems) {
- super(id);
-
- ListView<CssMenuItem> menuItemsView = new ListView<CssMenuItem>("menuItems", menuItems) {
-
- @Override
- protected void populateItem(ListItem<CssMenuItem> listItem) {
- CssMenuItem menuItem = listItem.getModelObject();
- listItem.add(new Label("name", menuItem.getName()));
-
- MarkupContainer topMenu = new WebMarkupContainer("topMenu");
-
- topMenu.add(new CssClassAppender("top-menu-" + CssClassAppender.asCssStyle(menuItem.getName())));
- listItem.add(topMenu);
- List<CssMenuItem> subMenuItems = withSeparators(menuItem);
-
-// fake data to test multi-level menus
-// if (menuItem.getName().equals("ToDos")) {
-// CssMenuItem fakeItem = menuItem.newSubMenuItem("Fake item").build();
-//
-// fakeItem.newSubMenuItem("Fake item 1").link(new ExternalLink("menuLink", "http://abv.bg")).build();
-// CssMenuItem fakeMenu12 = fakeItem.newSubMenuItem("Fake item 2").link(new ExternalLink("menuLink", "http://google.com")).build();
-//
-// fakeMenu12.newSubMenuItem("Fake item 2.1").link(new ExternalLink("menuLink", "http://web.de")).build();
-// }
-
- ListView<CssMenuItem> subMenuItemsView = new ListView<CssMenuItem>("subMenuItems", subMenuItems) {
- @Override
- protected void populateItem(ListItem<CssMenuItem> listItem) {
- CssMenuItem subMenuItem = listItem.getModelObject();
-
- if (subMenuItem.hasSubMenuItems()) {
- addFolderItem(subMenuItem, listItem);
- } else {
- addLeafItem(subMenuItem, listItem);
- }
- }
- };
- topMenu.add(subMenuItemsView);
- }
- };
- add(menuItemsView);
- }
-
- private void addFolderItem(CssMenuItem subMenuItem, ListItem<CssMenuItem> listItem) {
-
- listItem.add(new CssClassAppender("dropdown-submenu"));
-
- Fragment folderItem = new Fragment("content", "folderItem", ApplicationActionsPanel.this);
- listItem.add(folderItem);
-
- folderItem.add(new Label("folderName", subMenuItem.getName()));
- final List<CssMenuItem> menuItems = withSeparators(subMenuItem);
- ListView<CssMenuItem> subMenuItemsView = new ListView<CssMenuItem>("subMenuItems",
- menuItems) {
- @Override
- protected void populateItem(ListItem<CssMenuItem> listItem) {
- CssMenuItem subMenuItem = listItem.getModelObject();
-
- if (subMenuItem.hasSubMenuItems()) {
- addFolderItem(subMenuItem, listItem);
- } else {
- addLeafItem(subMenuItem, listItem);
- }
- }
- };
- folderItem.add(subMenuItemsView);
- }
-
- private List<CssMenuItem> withSeparators(CssMenuItem subMenuItem) {
- final List<CssMenuItem> subMenuItems = subMenuItem.getSubMenuItems();
- final List<CssMenuItem> itemsWithSeparators = Lists.newArrayList();
- for (CssMenuItem menuItem : subMenuItems) {
- if(menuItem.isSeparator() ) {
- if(!itemsWithSeparators.isEmpty()) {
- // bit nasty... we add a new separator item
- itemsWithSeparators.add(
- CssMenuItem.newMenuItem(menuItem.getName() + "-separator")
- .separator(menuItem.isSeparator())
- .prototyping(menuItem.isPrototyping())
- .build());
- }
- menuItem.setSeparator(false);
- }
- itemsWithSeparators.add(menuItem);
- }
- return itemsWithSeparators;
- }
-
- private void addLeafItem(
- final CssMenuItem menuItem,
- final ListItem<CssMenuItem> listItem) {
-
- Fragment leafItem;
- if (!menuItem.isSeparator()) {
- leafItem = new Fragment("content", "leafItem", ApplicationActionsPanel.this);
-
- AbstractLink subMenuItemLink = menuItem.getLink();
-
- Label menuItemLabel = new Label("menuLinkLabel", menuItem.getName());
- subMenuItemLink.addOrReplace(menuItemLabel);
-
- if (!menuItem.isEnabled()) {
- listItem.add(new CssClassAppender("disabled"));
- subMenuItemLink.setEnabled(false);
- TooltipBehavior tooltipBehavior = new TooltipBehavior(Model.of(menuItem.getDisabledReason()));
- listItem.add(tooltipBehavior);
- }
- if (menuItem.isPrototyping()) {
- subMenuItemLink.add(new CssClassAppender("prototype"));
- }
- leafItem.add(subMenuItemLink);
-
- String cssClassFa = menuItem.getCssClassFa();
- if (Strings.isNullOrEmpty(cssClassFa)) {
- Components.permanentlyHide(subMenuItemLink, "menuLinkFontAwesome");
- subMenuItemLink.add(new CssClassAppender("menuLinkSpacer"));
- } else {
- Label dummy = new Label("menuLinkFontAwesome", "");
- dummy.add(new CssClassAppender(cssClassFa));
- subMenuItemLink.addOrReplace(dummy);
- }
- } else {
- leafItem = new Fragment("content", "empty", ApplicationActionsPanel.this);
- listItem.add(new CssClassAppender("divider"));
- }
- listItem.add(leafItem);
-
- }
-
- @Override
- public void renderHead(IHeaderResponse response) {
- super.renderHead(response);
-
- response.render(CssHeaderItem.forReference(new CssResourceReference(ApplicationActionsPanel.class, "ApplicationActionsPanel.css")));
- response.render(JavaScriptHeaderItem.forReference(DropdownAutoOpenJavaScriptReference.instance()));
- response.render(OnDomReadyHeaderItem.forScript("$('.dropdown-toggle').dropdownHover();"));
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
deleted file mode 100644
index 88caef5..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
+++ /dev/null
@@ -1,441 +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.widgets.cssmenu;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.List;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.SubmitLink;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.model.Model;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.ensure.Ensure;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-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.ActionModel;
-import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
-import org.apache.isis.viewer.wicket.ui.util.Components;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-import static org.hamcrest.CoreMatchers.is;
-
-;
-
-public class CssMenuItem implements Serializable {
-
-
- private static final long serialVersionUID = 1L;
-
- public static final String ID_MENU_LINK = "menuLink";
-
- public static class Builder {
- private final CssMenuItem cssMenuItem;
-
- private Builder(final String name) {
- cssMenuItem = new CssMenuItem(name);
- }
-
- public Builder parent(final CssMenuItem parent) {
- cssMenuItem.setParent(parent);
- return this;
- }
-
- public <T extends Page> Builder link() {
- final AbstractLink link = new SubmitLink(ID_MENU_LINK);
- return link(link);
- }
-
- public <T extends Page> Builder link(final AbstractLink link) {
- Ensure.ensureThatArg(link.getId(), is(ID_MENU_LINK));
- cssMenuItem.setLink(link);
- return this;
- }
-
- public <T extends Page> Builder enabled(final String disabledReasonIfAny) {
- cssMenuItem.setEnabled(disabledReasonIfAny == null);
- cssMenuItem.setDisabledReason(disabledReasonIfAny);
- return this;
- }
-
- public Builder describedAs(String descriptionIfAny) {
- cssMenuItem.setDescription(descriptionIfAny);
- return this;
- }
-
- public Builder returnsBlobOrClob(boolean blobOrClob) {
- cssMenuItem.setReturnsBlobOrClob(blobOrClob);
- return this;
- }
-
- public Builder prototyping(boolean prototype) {
- cssMenuItem.setPrototyping(prototype);
- return this;
- }
-
- public Builder separator(boolean separator) {
- cssMenuItem.setSeparator(separator);
- return this;
- }
-
- public Builder withActionIdentifier(String actionIdentifier) {
- cssMenuItem.setActionIdentifier(actionIdentifier);
- return this;
- }
-
- public Builder withFacet(CssClassFacet facet) {
- if(facet != null) {
- withCssClass(facet.value());
- }
- return this;
- }
-
- public Builder withCssClass(String cssClass) {
- cssMenuItem.setCssClass(cssClass);
- return this;
- }
-
- public Builder withFacet(CssClassFaFacet facet) {
- if(facet != null) {
- withCssClassFa(facet.value());
- }
- return this;
- }
-
- public Builder withCssClassFa(String cssClassFa) {
- cssMenuItem.setCssClassFa(cssClassFa);
- return this;
- }
-
- /**
- * Returns the built {@link CssMenuItem}, associating with
- * {@link #parent(CssMenuItem) parent} (if specified).
- */
- public CssMenuItem build() {
- if (cssMenuItem.parent != null) {
- cssMenuItem.parent.subMenuItems.add(cssMenuItem);
- }
- return cssMenuItem;
- }
-
- }
-
- private final String name;
- private final List<CssMenuItem> subMenuItems = Lists.newArrayList();
- private CssMenuItem parent;
-
- private AbstractLink link;
- private boolean enabled = true; // unless disabled
- private String disabledReason;
- private boolean blobOrClob = false; // unless set otherwise
- private boolean prototype = false; // unless set otherwise
- private boolean separator = false; // unless set otherwise
-
- static final String ID_MENU_LABEL = "menuLabel";
-
- static final String ID_SUB_MENU_ITEMS = "subMenuItems";
-
- private String actionIdentifier;
- private String cssClass;
- private String cssClassFa;
-
- private String description;
-
-
-
- /**
- * Factory method returning {@link Builder builder}.
- */
- public static Builder newMenuItem(final String name) {
- return new Builder(name);
- }
-
-
- public void setActionIdentifier(String actionIdentifier) {
- this.actionIdentifier = actionIdentifier;
- }
-
- public void setPrototyping(boolean prototype) {
- this.prototype = prototype;
- }
-
- public boolean isPrototyping() {
- return prototype;
- }
-
- public void setSeparator(boolean separator) {
- this.separator = separator;
- }
-
- /**
- * Requires a separator before it
- * @return
- */
- public boolean isSeparator() {
- return separator;
- }
-
- private CssMenuItem(final String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public boolean hasParent() {
- return parent != null;
- }
-
- private void setParent(final CssMenuItem parent) {
- this.parent = parent;
- }
-
- public Builder newSubMenuItem(final String name) {
- return CssMenuItem.newMenuItem(name).parent(this);
- }
-
- public List<CssMenuItem> getSubMenuItems() {
- return Collections.unmodifiableList(subMenuItems);
- }
-
- public boolean hasSubMenuItems() {
- return subMenuItems.size() > 0;
- }
-
- public AbstractLink getLink() {
- return link;
- }
-
- private void setLink(final AbstractLink link) {
- this.link = link;
- }
-
- public boolean isEnabled() {
- return enabled;
- }
-
- private void setEnabled(final boolean enabled) {
- this.enabled = enabled;
- }
-
- public void setReturnsBlobOrClob(boolean blobOrClob) {
- this.blobOrClob = blobOrClob;
- }
-
- public void setCssClass(String cssClass) {
- this.cssClass = cssClass;
- }
-
- public void setCssClassFa(String cssClassFa) {
- this.cssClassFa = cssClassFa;
- }
-
- public String getCssClassFa() {
- return cssClassFa;
- }
-
-
- /**
- * Only populated if not {@link #isEnabled() enabled}.
- */
- public String getDisabledReason() {
- return disabledReason;
- }
-
- public void setDisabledReason(final String disabledReason) {
- this.disabledReason = disabledReason;
- }
-
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
-
- // //////////////////////////////////////////////////////////////
- // To add submenu items
- // //////////////////////////////////////////////////////////////
-
- /**
- * Creates a {@link Builder} for a submenu item invoking an action on the provided
- * {@link ObjectAdapterMemento target adapter}.
- */
- public Builder newSubMenuItem(
- final ObjectAdapterMemento targetAdapterMemento,
- final ObjectAction objectAction,
- final boolean separator,
- final ActionLinkFactory actionLinkFactory) {
-
- // check visibility
- final AuthenticationSession session = getAuthenticationSession();
- final ObjectAdapter adapter = targetAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
- final Consent visibility = objectAction.isVisible(session, adapter, ActionModel.WHERE_FOR_ACTION_INVOCATION);
- if (visibility.isVetoed()) {
- return null;
- }
-
- // build the link
- final LinkAndLabel linkAndLabel = actionLinkFactory.newLink(
- targetAdapterMemento, objectAction, PageAbstract.ID_MENU_LINK
- );
- if(linkAndLabel==null) {
- // can only get a null if invisible, so this should not happen given guard above
- return null;
- }
- final AbstractLink link = linkAndLabel.getLink();
- final String actionLabel = linkAndLabel.getLabel();
-
- final Consent usability = objectAction.isUsable(session, adapter, ActionModel.WHERE_FOR_ACTION_INVOCATION);
- final String reasonDisabledIfAny = usability.getReason();
-
- final DescribedAsFacet describedAsFacet = objectAction.getFacet(DescribedAsFacet.class);
- final String descriptionIfAny = describedAsFacet != null? describedAsFacet.value(): null;
-
- Builder builder = newSubMenuItem(actionLabel)
- .link(link)
- .describedAs(descriptionIfAny)
- .enabled(reasonDisabledIfAny)
- .returnsBlobOrClob(ObjectAction.Utils.returnsBlobOrClob(objectAction))
- .prototyping(ObjectAction.Utils.isExplorationOrPrototype(objectAction))
- .separator(separator)
- .withActionIdentifier(ObjectAction.Utils.actionIdentifierFor(objectAction))
- .withCssClass(ObjectAction.Utils.cssClassFor(objectAction))
- .withCssClassFa(ObjectAction.Utils.cssClassFaFor(objectAction));
-
- return builder;
- }
-
-
- // //////////////////////////////////////////////////////////////
- // Build wicket components from the menu item.
- // //////////////////////////////////////////////////////////////
-
- void addTo(final MarkupContainer markupContainer) {
-
- final Component menuItemComponent = addMenuItemComponentTo(markupContainer);
- addSubMenuItemComponentsIfAnyTo(markupContainer);
-
- addCssClassAttributesIfRequired(menuItemComponent);
- }
-
- private Component addMenuItemComponentTo(final MarkupContainer markupContainer) {
- final AbstractLink link = getLink();
- final Label label = new Label(CssMenuItem.ID_MENU_LABEL, Model.of(this.getName()));
-
- if (link != null) {
-
- // show link...
- markupContainer.add(link);
- link.add(label);
-
- if(this.description != null) {
- label.add(new AttributeModifier("title", Model.of(description)));
- }
- if(this.blobOrClob) {
- link.add(new CssClassAppender("noVeil"));
- }
- if(this.prototype) {
- link.add(new CssClassAppender("prototype"));
- }
-
-
- if(this.cssClass != null) {
- link.add(new CssClassAppender(this.cssClass));
- }
- link.add(new CssClassAppender(this.actionIdentifier));
-
- String cssClassFa = getCssClassFa();
- if (Strings.isNullOrEmpty(cssClassFa)) {
- Components.permanentlyHide(link, "menuLinkFontAwesome");
- } else {
- Label dummy = new Label("menuLinkFontAwesome", "");
- dummy.add(new CssClassAppender(cssClassFa));
- link.add(dummy);
- }
-
- if(! this.isEnabled()) {
- link.add(new AttributeModifier("title", Model.of(this.getDisabledReason())));
- link.add(new CssClassAppender("disabled"));
-
- link.setEnabled(false);
- }
-
- // .. and hide label
- Components.permanentlyHide(markupContainer, CssMenuItem.ID_MENU_LABEL);
- return link;
- } else {
- // hide link...
- Components.permanentlyHide(markupContainer, ID_MENU_LINK);
- // ... and show label, along with disabled reason
- label.add(new AttributeModifier("title", Model.of(this.getDisabledReason())));
- label.add(new AttributeModifier("class", Model.of("disabled")));
-
- markupContainer.add(label);
-
- return label;
- }
- }
-
- private void addSubMenuItemComponentsIfAnyTo(final MarkupContainer menuItemMarkup) {
- final List<CssMenuItem> subMenuItems = getSubMenuItems();
- if (subMenuItems.isEmpty()) {
- Components.permanentlyHide(menuItemMarkup, CssMenuItem.ID_SUB_MENU_ITEMS);
- } else {
- menuItemMarkup.add(new CssSubMenuItemsPanel(CssMenuItem.ID_SUB_MENU_ITEMS, subMenuItems));
- }
- }
-
- private void addCssClassAttributesIfRequired(final Component linkComponent) {
- if (!hasSubMenuItems()) {
- return;
- }
- if (this.hasParent()) {
- linkComponent.add(new CssClassAppender("parent"));
- } else {
- linkComponent.add(new CssClassAppender("top-parent"));
- }
- }
-
- // //////////////////////////////////////////////////////////////
- // dependencies
- // //////////////////////////////////////////////////////////////
-
- protected AuthenticationSession getAuthenticationSession() {
- return IsisContext.getAuthenticationSession();
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java
deleted file mode 100644
index 832515b..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java
+++ /dev/null
@@ -1,47 +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.widgets.cssmenu;
-
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
-
-/**
- * Package-level adapter for menu items and submenu-items.
- */
-abstract class CssMenuItemPanelAbstract<T extends IModel<?>> extends PanelAbstract<T> {
-
- private static final long serialVersionUID = 1L;
-
- public CssMenuItemPanelAbstract(final String id, final T model) {
- super(id, model);
- setRenderBodyOnly(true);
- }
-
- protected void addSubMenuItems(final WebMarkupContainer markupContainer, final CssMenuItem cssMenuItem) {
- cssMenuItem.addTo(markupContainer);
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html
deleted file mode 100644
index 9c1e14f..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html
+++ /dev/null
@@ -1,35 +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.
--->
-<html xmlns:wicket="http://wicket.apache.org">
-<body>
-<wicket:panel>
- <ul class="cssSubMenuItemsPanel">
- <li wicket:id="subMenuItems" class="cssSubMenuItem">
- <a wicket:id="menuLink" class="btn btn-primary btn-sm">
- <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span>
- <span class="menuLabel" wicket:id="menuLabel">[menu label]</span>
- </a>
- <p wicket:id="menuLabel">[menu label]</p>
- <span wicket:id="subMenuItems">[subMenuItems]</span>
- </li>
- </ul>
-</wicket:panel>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java
deleted file mode 100644
index 092e1fe..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java
+++ /dev/null
@@ -1,59 +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.widgets.cssmenu;
-
-import java.util.List;
-
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.model.util.ListModel;
-
-/**
- * Panel containing a list of {@link CssMenuItem}s acting as submenus of a
- * parent {@link CssMenuItem}.
- */
-public class CssSubMenuItemsPanel extends CssMenuItemPanelAbstract<CssSubMenuItemsPanel.MyModel> {
-
- private static final long serialVersionUID = 1L;
-
- static class MyModel extends ListModel<CssMenuItem> {
-
- private static final long serialVersionUID = 1L;
-
- public MyModel(final List<CssMenuItem> cssMenuItems) {
- super(cssMenuItems);
- }
- }
-
- public CssSubMenuItemsPanel(final String id, final List<CssMenuItem> subMenuItems) {
- super(id, new MyModel(subMenuItems));
- setRenderBodyOnly(true);
-
- final RepeatingView menuItemRv = new RepeatingView(getId());
- add(menuItemRv);
- for (final CssMenuItem cssMenuItem : getModel().getObject()) {
- final WebMarkupContainer menuItemMarkup = new WebMarkupContainer(menuItemRv.newChildId());
- menuItemRv.add(menuItemMarkup);
-
- addSubMenuItems(menuItemMarkup, cssMenuItem);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java
new file mode 100644
index 0000000..6c07221
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.widgets.linkandlabel;
+
+import java.io.Serializable;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public interface ActionLinkFactory extends Serializable {
+
+ LinkAndLabel newLink(
+ final ObjectAdapterMemento adapter,
+ final ObjectAction noAction,
+ final String linkId);
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
new file mode 100644
index 0000000..dff6cd9
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -0,0 +1,232 @@
+/*
+ * 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.widgets.linkandlabel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.models.ActionModel;
+import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
+import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
+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.app.registry.ComponentFactoryRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptHeaderPanel;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
+import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
+
+ private static final long serialVersionUID = 1L;
+
+ protected AbstractLink newLink(
+ final String linkId,
+ final ObjectAdapter objectAdapter,
+ final ObjectAction action) {
+
+ final ActionModel actionModel = ActionModel.create(objectAdapter, action);
+
+ final AjaxDeferredBehaviour ajaxDeferredBehaviour = determineDeferredBehaviour(action, actionModel);
+
+ final AbstractLink link = new AjaxLink<Object>(linkId) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+
+ if(ajaxDeferredBehaviour != null) {
+ ajaxDeferredBehaviour.initiate(target);
+ } else {
+ final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(getPage());
+ final ActionPrompt actionPrompt = promptProvider.getActionPrompt();
+ ActionPromptHeaderPanel titlePanel = new ActionPromptHeaderPanel(actionPrompt.getTitleId(), actionModel);
+ final ActionPanel actionPanel =
+ (ActionPanel) getComponentFactoryRegistry().createComponent(
+ ComponentType.ACTION_PROMPT, actionPrompt.getContentId(), actionModel);
+
+ actionPanel.setShowHeader(false);
+
+ actionPrompt.setTitle(titlePanel, target);
+ actionPrompt.setPanel(actionPanel, target);
+ actionPanel.setActionPrompt(actionPrompt);
+ actionPrompt.showPrompt(target);
+
+ focusOnFirstParameter(target, actionPanel);
+ }
+ }
+
+ private void focusOnFirstParameter(AjaxRequestTarget target, ActionPanel actionPanel) {
+
+ // first, force all parameters to build themselves...
+ actionPanel.visitChildren(new IVisitor<Component, Component>() {
+ @Override
+ public void component(Component object, IVisit<Component> visit) {
+ if (object instanceof ScalarPanelAbstract) {
+ ScalarPanelAbstract spa = (ScalarPanelAbstract) object;
+ spa.forceBuildGui();
+ visit.dontGoDeeper();
+ }
+ }
+ });
+
+ // second, go searching for the first <input> in the action panel.
+ final Component actionPanelFirstParam = actionPanel.visitChildren(new IVisitor<Component, Component>() {
+ @Override
+ public void component(Component object, IVisit<Component> visit) {
+ if (object instanceof FormComponent &&
+ !"scalarIfCompact".equals(object.getId()) &&
+ object.getOutputMarkupId()) {
+ // there are components for 'compact' and 'regular'; we want the 'regular' one
+ // also double check that has outputMarkupId enabled (prereq for setting focus)
+ visit.stop(object);
+ }
+ }
+ });
+
+ // third, if found then use Wicket API to focus on this component
+ if(actionPanelFirstParam != null) {
+ target.focusComponent(actionPanelFirstParam);
+ }
+ }
+
+ @Override
+ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
+ super.updateAjaxAttributes(attributes);
+
+ // allow the event to bubble so the menu is hidden after click on an item
+ attributes.setEventPropagation(AjaxRequestAttributes.EventPropagation.BUBBLE);
+ }
+
+ @Override
+ protected void onComponentTag(ComponentTag tag) {
+ super.onComponentTag(tag);
+
+ Buttons.fixDisabledState(this, tag);
+ }
+ };
+
+ if(ajaxDeferredBehaviour != null) {
+ link.add(ajaxDeferredBehaviour);
+ }
+
+ link.add(new CssClassAppender("noVeil"));
+
+ return link;
+ }
+
+ private static AjaxDeferredBehaviour determineDeferredBehaviour(final ObjectAction action, final ActionModel actionModel) {
+ // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+ if(isNoArgReturnTypeRedirect(action)) {
+ /**
+ * adapted from:
+ * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
+ */
+ return new AjaxDeferredBehaviour(AjaxDeferredBehaviour.OpenUrlStrategy.NEW_WINDOW) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected IRequestHandler getRequestHandler() {
+ ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
+ final Object value = resultAdapter.getObject();
+ return ActionModel.redirectHandler(value);
+ }
+ };
+ }
+ if(isNoArgReturnTypeDownload(action)) {
+
+ /**
+ * adapted from:
+ * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
+ */
+ return new AjaxDeferredBehaviour(AjaxDeferredBehaviour.OpenUrlStrategy.SAME_WINDOW) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected IRequestHandler getRequestHandler() {
+ final ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
+ final Object value = resultAdapter.getObject();
+ return ActionModel.downloadHandler(value);
+ }
+ };
+ }
+ return null;
+ }
+
+ // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+ private static boolean isNoArgReturnTypeRedirect(final ObjectAction action) {
+ return action.getParameterCount() == 0 &&
+ action.getReturnType() != null &&
+ action.getReturnType().getCorrespondingClass() == java.net.URL.class;
+ }
+
+ // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+ private static boolean isNoArgReturnTypeDownload(final ObjectAction action) {
+ return action.getParameterCount() == 0 && action.getReturnType() != null &&
+ (action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Blob.class ||
+ action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Clob.class);
+ }
+
+ protected LinkAndLabel newLinkAndLabel(final ObjectAction objectAction, final AbstractLink link, final String disabledReasonIfAny) {
+
+ final String label = ObjectAction.Utils.nameFor(objectAction);
+ final boolean blobOrClob = ObjectAction.Utils.returnsBlobOrClob(objectAction);
+ final boolean prototype = ObjectAction.Utils.isExplorationOrPrototype(objectAction);
+ final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
+ final String description = ObjectAction.Utils.descriptionOf(objectAction);
+ final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
+ final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
+ final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
+
+ return new LinkAndLabel(link, label, disabledReasonIfAny, description, blobOrClob, prototype, actionIdentifier, cssClass, cssClassFa, position);
+ }
+
+
+ // ////////////////////////////////////////////////////////////
+ // Dependencies
+ // ////////////////////////////////////////////////////////////
+
+ protected ComponentFactoryRegistry getComponentFactoryRegistry() {
+ return ((ComponentFactoryRegistryAccessor)Application.get()).getComponentFactoryRegistry();
+ }
+
+ protected PageClassRegistry getPageClassRegistry() {
+ return ((PageClassRegistryAccessor) Application.get()).getPageClassRegistry();
+ }
+
+}