This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new ec8ff74  EMPIREDB-350 extended LinkTag for custom content
ec8ff74 is described below

commit ec8ff74048b1cf1b5a05e705649f6a1cb23a9db7
Author: Rainer Döbele <[email protected]>
AuthorDate: Fri May 7 15:36:43 2021 +0200

    EMPIREDB-350
    extended LinkTag for custom content
---
 .../src/main/webapp/resources/empire/link.xhtml    |  1 +
 .../org/apache/empire/jsf2/components/LinkTag.java | 76 +++++++++++++++++++---
 .../apache/empire/jsf2/components/MenuItemTag.java |  7 +-
 3 files changed, 73 insertions(+), 11 deletions(-)

diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
index 49fb850..614f7b0 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
@@ -34,6 +34,7 @@
        
        <!-- Implementation -->
        <cc:implementation>
+               <cc:insertChildren/>
        </cc:implementation>
        
 </html>
\ No newline at end of file
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java
index 53312f7..9663518 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java
@@ -45,6 +45,7 @@ import org.apache.empire.jsf2.utils.ParameterMap;
 import org.apache.empire.jsf2.utils.StringResponseWriter;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
 import org.apache.empire.jsf2.utils.TagEncodingHelperFactory;
+import org.apache.myfaces.shared.renderkit.html.HTML;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,6 +69,10 @@ public class LinkTag extends UIOutput // implements 
NamingContainer
 
     private boolean creatingComponents = false;
     
+    private boolean encodeLinkChildren = false;
+    
+    private String disabledTagName;
+    
     public LinkTag()
     {
         log.trace("component link created");
@@ -127,16 +132,19 @@ public class LinkTag extends UIOutput // implements 
NamingContainer
     {
         // add label and input components when the view is loaded for the 
first time
         super.encodeBegin(context);
-
+        
         // begin
         helper.encodeBegin();
         if (isLinkDisabled())
-        {   // render as span
-            // render components
+        {   // render disabled
             ResponseWriter writer = context.getResponseWriter();
-            String tag = writeStartElement(writer);
-            
writer.write(StringUtils.toString(getLinkValue(helper.hasColumn()), ""));
-            writer.endElement(tag);
+            Object linkValue = getLinkValue(helper.hasColumn());
+            this.disabledTagName = writeStartElement(writer);
+            this.encodeLinkChildren = isEncodeLinkChildren(linkValue); 
+            if (!encodeLinkChildren)
+            {   writer.write(StringUtils.toString(linkValue, ""));
+                writer.endElement(this.disabledTagName);
+            }
         }
         else
         {   // Add component
@@ -195,18 +203,56 @@ public class LinkTag extends UIOutput // implements 
NamingContainer
             setLinkProperties(linkComponent);
             addOrSetParam(linkComponent, "idparam", "id");
             // encode link
-            linkComponent.setRendered(true);
-            linkComponent.encodeAll(context);
-            linkComponent.setRendered(false); // Don't render twice!
+            this.encodeLinkChildren = 
isEncodeLinkChildren(linkComponent.getChildCount()>0 ? null : 
linkComponent.getValue());
+            if (this.encodeLinkChildren)
+                linkComponent.encodeBegin(context);
+            else
+            {   // default rendering (no children)
+                linkComponent.setRendered(true);
+                linkComponent.encodeAll(context);
+                linkComponent.setRendered(false); // Don't render twice!
+            }
         }
     }
     
     @Override 
     public void encodeChildren(FacesContext context) throws IOException 
     {
-        if (!isLinkDisabled())
+        // render
+        if (this.encodeLinkChildren)
             super.encodeChildren(context);
     }
+
+    /**
+     * required for MenuItemTag
+     * @param context
+     * @throws IOException
+     */
+    public void forceEncodeChildren(FacesContext context) throws IOException 
+    {
+        super.encodeChildren(context);
+    }
+    
+    @Override 
+    public void encodeEnd(FacesContext context) throws IOException 
+    {
+        if (this.encodeLinkChildren)
+        {
+            if (isLinkDisabled())
+            {   // Disabled
+                ResponseWriter writer = context.getResponseWriter();
+                writer.endElement(StringUtils.coalesce(this.disabledTagName, 
HTML.SPAN_ELEM));
+            }
+            else
+            {   // Enabled
+                HtmlOutcomeTargetLink link = getLinkComponent();
+                if (link!=null && link.isRendered())
+                    link.encodeEnd(context);
+            }
+        }
+        // done
+        super.encodeEnd(context);
+    }
     
     protected String getLinkStyleClass()
     {
@@ -357,4 +403,14 @@ public class LinkTag extends UIOutput // implements 
NamingContainer
      * return (String) getAttributes().get("action");
      * }
      */
+    
+    protected boolean isEncodeLinkChildren(Object linkValue)
+    {
+        return ObjectUtils.isEmpty(linkValue);
+    }
+    
+    protected HtmlOutcomeTargetLink getLinkComponent()
+    {
+        return (getChildCount()>0 ? 
(HtmlOutcomeTargetLink)getChildren().get(0) : null);
+    }
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
index d4026bc..e5c4ab5 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/MenuItemTag.java
@@ -105,7 +105,7 @@ public class MenuItemTag extends LinkTag
             else
                 log.warn("WARN: Unexpected child element as first child of 
MenuItemTag!");
             // encode children
-            super.encodeChildren(context);
+            super.forceEncodeChildren(context);
         }
     }
 
@@ -258,4 +258,9 @@ public class MenuItemTag extends LinkTag
         return (styleClass==null) ? newClass : styleClass+" "+newClass;
     }
     
+    @Override
+    protected boolean isEncodeLinkChildren(Object linkValue)
+    {
+        return false;
+    }
 }

Reply via email to