You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2025/07/24 14:57:57 UTC

(empire-db) branch master updated: EMPIREDB-456 TabViewTag: add activePage attribute in order to use tabPage id instead of index

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 464bcda5 EMPIREDB-456 TabViewTag: add activePage attribute in order to use tabPage id instead of index
464bcda5 is described below

commit 464bcda57adecb9165e66386f9a9d53d6252405f
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Thu Jul 24 16:57:54 2025 +0200

    EMPIREDB-456
    TabViewTag: add activePage attribute in order to use tabPage id instead of index
---
 .../empire/jakarta/components/TabViewTag.java      | 100 ++++++++++++++++++---
 .../apache/empire/jsf2/components/TabViewTag.java  | 100 ++++++++++++++++++---
 2 files changed, 176 insertions(+), 24 deletions(-)

diff --git a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/TabViewTag.java b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/TabViewTag.java
index 51a65bca..40f09bb4 100644
--- a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/TabViewTag.java
+++ b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/TabViewTag.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.exceptions.InvalidArgumentException;
+import org.apache.empire.exceptions.InvalidOperationException;
 import org.apache.empire.jakarta.app.FacesUtils;
 import org.apache.empire.jakarta.controls.InputControl;
 import org.apache.empire.jakarta.controls.InputControlManager;
@@ -52,6 +53,10 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
     // Logger
     private static final Logger       log                    = LoggerFactory.getLogger(TabViewTag.class);
 
+    protected static String           TAB_PAGE_ID            = "pageId";
+    
+    protected static String           TAB_ACTIVE_PAGE        = "activePage";
+    
     protected static String           TAB_ACTIVE_INDEX       = "activeIndex";
 
     protected static String           TABLINK_ID_PREFIX      = "tabLink";
@@ -189,6 +194,58 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
         }
     }
 
+    public String getActivePageId()
+    {
+        Object active = this.helper.getTagAttributeValue(TAB_ACTIVE_PAGE);
+        return ObjectUtils.getString(active);
+    }
+
+    public void setActivePageId(String pageId)
+    {
+        ValueExpression ve = this.getValueExpression(TAB_ACTIVE_PAGE);
+        if (ve != null)
+        {   // set active index
+            FacesContext fc = FacesUtils.getContext();
+            ve.setValue(fc.getELContext(), pageId);
+        }
+    }
+
+    public TabPageTag getActiveTabPage()
+    {
+        Iterator<UIComponent> ci = getFacetsAndChildren();
+        if (ci.hasNext() == false)
+        {   log.warn("Invalid TabPage definition!");
+            return null;
+        }
+        UIComponent panel = ci.next();
+        int index = 0;
+        int activeIndex = getActivePageIndex();
+        String activePageId = getActivePageId();
+        for (UIComponent c : panel.getChildren())
+        {   // Find Tab pages
+            if (!(c instanceof TabPageTag))
+            {
+                continue;
+            }
+            // check visibility
+            TabPageTag page = (TabPageTag) c;
+            if (!isPageVisible(page))
+                continue; // don't count hidden pages
+            // found a page
+            boolean active = (activePageId!=null ? activePageId.equals(page.getId()) : (index == activeIndex));
+            if (active)
+                return page;
+            // next
+            index++;
+        }
+        // not found
+        if (activePageId!=null)
+            log.warn("No visible tab-page with pageId {} has been found!", activePageId);
+        else
+            log.warn("No visible tab-page with index {} has been found!", activeIndex);
+        return null;
+    }
+
     public void setActiveTab(ActionEvent event)
     {
         log.debug("setActiveTab");
@@ -202,20 +259,21 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             return;
         }
 
-        // set new Page
+        // set active index
         setActivePageIndex(pageIndex);
+        // set active pageId
+        String pageId = (String)comp.getAttributes().get(TAB_PAGE_ID);
+        setActivePageId(pageId);
 
         // TabChangeListener
         Object tcl = getAttributes().get("tabChangedListener");
         if (tcl != null)
-        {
+        {   // check Method expression
             if (!(tcl instanceof MethodExpression))
-            {
-                log.error("tabChangedListener is not a valid method expression!");
-                return;
-            }
+                throw new InvalidOperationException("tabChangedListener is not a valid method expression!");
+            // invoke
             FacesContext fc = FacesUtils.getContext();
-            MethodExpression methodExpression = (MethodExpression) tcl;
+            MethodExpression methodExpression = (MethodExpression)tcl;
             methodExpression.invoke(fc.getELContext(), new Object[] { pageIndex });
         }
     }
@@ -273,8 +331,11 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             {   // Bar padding item
                 writer.startElement(mode.BAR_PAD_TAG, this);
                 writer.writeAttribute(InputControl.HTML_ATTR_CLASS, TagStyleClass.TAB_BAR_PADDING.get(), null);
+                encodeTabPadding(context, writer);
                 writer.endElement(mode.BAR_PAD_TAG);
             }
+            else
+                encodeTabPadding(context, writer);
             // finish
             if (mode.BAR_ROW_TAG!=null)
                 writer.endElement(mode.BAR_ROW_TAG);
@@ -363,6 +424,7 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
         UIComponent panel = ci.next();
         int index = 0;
         int activeIndex = getActivePageIndex();
+        String activePageId = getActivePageId();
         // Patch for MOJARRA: Remove HtmlCommandLinks
         List<UIComponent> chk = panel.getChildren();
         for (int i = chk.size() - 1; i >= 0; i--)
@@ -378,17 +440,21 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
                 continue;
             }
             // found
-            boolean active = (index == activeIndex);
             TabPageTag page = (TabPageTag) c;
-
             // render tab-page? default is true
             boolean visible = isPageVisible(page);
             if (!visible)
-            {
-                // dont render content
+            {   // don't render content
                 page.setRendered(false);
                 continue;
             }
+            // check active
+            boolean active = (activePageId!=null ? activePageId.equals(page.getId()) : (index == activeIndex));
+            if (active && (index!=activeIndex))
+            {   // set index
+                setActivePageIndex(index);
+            }
+            // write tabs
             if (writer!=null)
             {   // encode Tab
                 boolean disabled = isPageDisabled(page);
@@ -414,7 +480,7 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             index++;
         }
     }
-
+    
     protected void encodeTabLink(FacesContext context, ResponseWriter writer, int index, TabPageTag pageTag, boolean disabled, String showTabBlindJs)
         throws IOException
     {
@@ -461,6 +527,7 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             link.addActionListener(tpal);
         }
         // init linkComponent
+        link.getAttributes().put(TAB_PAGE_ID, pageTag.getId());
         link.setValue(pageTag.getTabLabel());
         link.setTitle(pageTag.getTabTitle());
         link.setDisabled(disabled);
@@ -494,6 +561,15 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             link.encodeAll(context);
         }
     }
+    
+    protected void encodeTabPadding(FacesContext context, ResponseWriter writer) throws IOException
+    {
+        UIComponent paddingFacet = getFacet("tabPadding");
+        if (paddingFacet!=null)
+        {   // custom rendering
+            paddingFacet.encodeAll(context);
+        }
+    }
 
     protected void setRenderTabs(FacesContext context)
     {
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
index 76db3887..f25468fd 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabViewTag.java
@@ -36,6 +36,7 @@ import javax.faces.event.ActionListener;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.exceptions.InvalidArgumentException;
+import org.apache.empire.exceptions.InvalidOperationException;
 import org.apache.empire.jsf2.app.FacesUtils;
 import org.apache.empire.jsf2.controls.InputControl;
 import org.apache.empire.jsf2.controls.InputControlManager;
@@ -52,6 +53,10 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
     // Logger
     private static final Logger       log                    = LoggerFactory.getLogger(TabViewTag.class);
 
+    protected static String           TAB_PAGE_ID            = "pageId";
+    
+    protected static String           TAB_ACTIVE_PAGE        = "activePage";
+    
     protected static String           TAB_ACTIVE_INDEX       = "activeIndex";
 
     protected static String           TABLINK_ID_PREFIX      = "tabLink";
@@ -189,6 +194,58 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
         }
     }
 
+    public String getActivePageId()
+    {
+        Object active = this.helper.getTagAttributeValue(TAB_ACTIVE_PAGE);
+        return ObjectUtils.getString(active);
+    }
+
+    public void setActivePageId(String pageId)
+    {
+        ValueExpression ve = this.getValueExpression(TAB_ACTIVE_PAGE);
+        if (ve != null)
+        {   // set active index
+            FacesContext fc = FacesUtils.getContext();
+            ve.setValue(fc.getELContext(), pageId);
+        }
+    }
+
+    public TabPageTag getActiveTabPage()
+    {
+        Iterator<UIComponent> ci = getFacetsAndChildren();
+        if (ci.hasNext() == false)
+        {   log.warn("Invalid TabPage definition!");
+            return null;
+        }
+        UIComponent panel = ci.next();
+        int index = 0;
+        int activeIndex = getActivePageIndex();
+        String activePageId = getActivePageId();
+        for (UIComponent c : panel.getChildren())
+        {   // Find Tab pages
+            if (!(c instanceof TabPageTag))
+            {
+                continue;
+            }
+            // check visibility
+            TabPageTag page = (TabPageTag) c;
+            if (!isPageVisible(page))
+                continue; // don't count hidden pages
+            // found a page
+            boolean active = (activePageId!=null ? activePageId.equals(page.getId()) : (index == activeIndex));
+            if (active)
+                return page;
+            // next
+            index++;
+        }
+        // not found
+        if (activePageId!=null)
+            log.warn("No visible tab-page with pageId {} has been found!", activePageId);
+        else
+            log.warn("No visible tab-page with index {} has been found!", activeIndex);
+        return null;
+    }
+
     public void setActiveTab(ActionEvent event)
     {
         log.debug("setActiveTab");
@@ -202,20 +259,21 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             return;
         }
 
-        // set new Page
+        // set active index
         setActivePageIndex(pageIndex);
+        // set active pageId
+        String pageId = (String)comp.getAttributes().get(TAB_PAGE_ID);
+        setActivePageId(pageId);
 
         // TabChangeListener
         Object tcl = getAttributes().get("tabChangedListener");
         if (tcl != null)
-        {
+        {   // check Method expression
             if (!(tcl instanceof MethodExpression))
-            {
-                log.error("tabChangedListener is not a valid method expression!");
-                return;
-            }
+                throw new InvalidOperationException("tabChangedListener is not a valid method expression!");
+            // invoke
             FacesContext fc = FacesUtils.getContext();
-            MethodExpression methodExpression = (MethodExpression) tcl;
+            MethodExpression methodExpression = (MethodExpression)tcl;
             methodExpression.invoke(fc.getELContext(), new Object[] { pageIndex });
         }
     }
@@ -273,8 +331,11 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             {   // Bar padding item
                 writer.startElement(mode.BAR_PAD_TAG, this);
                 writer.writeAttribute(InputControl.HTML_ATTR_CLASS, TagStyleClass.TAB_BAR_PADDING.get(), null);
+                encodeTabPadding(context, writer);
                 writer.endElement(mode.BAR_PAD_TAG);
             }
+            else
+                encodeTabPadding(context, writer);
             // finish
             if (mode.BAR_ROW_TAG!=null)
                 writer.endElement(mode.BAR_ROW_TAG);
@@ -363,6 +424,7 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
         UIComponent panel = ci.next();
         int index = 0;
         int activeIndex = getActivePageIndex();
+        String activePageId = getActivePageId();
         // Patch for MOJARRA: Remove HtmlCommandLinks
         List<UIComponent> chk = panel.getChildren();
         for (int i = chk.size() - 1; i >= 0; i--)
@@ -378,17 +440,21 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
                 continue;
             }
             // found
-            boolean active = (index == activeIndex);
             TabPageTag page = (TabPageTag) c;
-
             // render tab-page? default is true
             boolean visible = isPageVisible(page);
             if (!visible)
-            {
-                // dont render content
+            {   // don't render content
                 page.setRendered(false);
                 continue;
             }
+            // check active
+            boolean active = (activePageId!=null ? activePageId.equals(page.getId()) : (index == activeIndex));
+            if (active && (index!=activeIndex))
+            {   // set index
+                setActivePageIndex(index);
+            }
+            // write tabs
             if (writer!=null)
             {   // encode Tab
                 boolean disabled = isPageDisabled(page);
@@ -414,7 +480,7 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             index++;
         }
     }
-
+    
     protected void encodeTabLink(FacesContext context, ResponseWriter writer, int index, TabPageTag pageTag, boolean disabled, String showTabBlindJs)
         throws IOException
     {
@@ -461,6 +527,7 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             link.addActionListener(tpal);
         }
         // init linkComponent
+        link.getAttributes().put(TAB_PAGE_ID, pageTag.getId());
         link.setValue(pageTag.getTabLabel());
         link.setTitle(pageTag.getTabTitle());
         link.setDisabled(disabled);
@@ -494,6 +561,15 @@ public class TabViewTag extends UIOutput implements TagEncodingHolder
             link.encodeAll(context);
         }
     }
+    
+    protected void encodeTabPadding(FacesContext context, ResponseWriter writer) throws IOException
+    {
+        UIComponent paddingFacet = getFacet("tabPadding");
+        if (paddingFacet!=null)
+        {   // custom rendering
+            paddingFacet.encodeAll(context);
+        }
+    }
 
     protected void setRenderTabs(FacesContext context)
     {