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 2023/04/12 13:22:04 UTC

[empire-db] branch master updated: EMPIREDB-405 allow TavView to be renderd with divs

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 3d22bf9b EMPIREDB-405 allow TavView to be renderd with divs
3d22bf9b is described below

commit 3d22bf9be4bb80d621f35ab0e12c50cd0f048b3a
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Wed Apr 12 15:22:00 2023 +0200

    EMPIREDB-405
    allow TavView to be renderd with divs
---
 .../src/main/webapp/css/content.css                | 16 +++-
 .../src/main/webapp/pages/employeeDetailPage.xhtml | 11 +--
 .../main/webapp/resources/empire/formGrid.xhtml    |  5 --
 .../src/main/webapp/resources/empire/tabView.xhtml |  2 +
 .../apache/empire/jsf2/components/FormGridTag.java | 33 ++++----
 .../apache/empire/jsf2/components/TabPageTag.java  | 52 +++++++++---
 .../apache/empire/jsf2/components/TabViewTag.java  | 98 ++++++++++++++++++----
 .../empire/jsf2/utils/TagEncodingHelper.java       |  6 ++
 .../apache/empire/jsf2/utils/TagStyleClass.java    | 16 ++--
 9 files changed, 175 insertions(+), 64 deletions(-)

diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
index e097f62b..ef0806ba 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
@@ -77,6 +77,9 @@ span.searchResult {
 /* tab view */
 div.eTabView {
 }
+div.eTabBar {
+	display: flex;
+}
 table.eTabBar {
 	width: 100%;
 	border-spacing: 0;
@@ -84,11 +87,13 @@ table.eTabBar {
 	table-layout: auto;
 	padding: 0;
 }
+div.eTabBar .eTabLabel,
 table.eTabBar tr td.eTabLabel {
 	border: 1px #8F99EF solid;
 	padding: 8px;	
 	white-space: nowrap;
 }
+div.eTabBar .eTabLabel.eTabActive,
 table.eTabBar tr td.eTabLabel.eTabActive {
 	border-bottom: 1px #F8F8F8 solid;
 	background-color: #F8F8F8;	
@@ -97,7 +102,7 @@ table.eTabBar tr td.eTabLabel.eTabDisabled {
 	color: gray;
 	font-style: italic;
 }
-table.eTabBar tr td.eTabBarEmpty {
+.eTabBar .eTabBarEmpty {
 	width: 99%;
 	border-bottom: 1px #8F99EF solid;	
 }
@@ -105,15 +110,20 @@ table.eTabPanel {
 	width: 100%;
 	border-spacing: 0;
 	border-collapse: collapse;
+}
+div.eTabPanel {
+	display: grid;
+}
+.eTabPanel {
 	border: 1px #8F99EF solid;
 	border-top: 0px;	
 }
-table.eTabPanel tr td.eTabPage {
+.eTabPanel .eTabPage {
 	padding: 8px;
 	background-color: #F8F8F8;
 	vertical-align: top;
 }
-table.eTabPanel tr td.eTabPage div.formPanel {
+.eTabPanel .eTabPage .formPanel {
 	border: 0;
 }
 div.info-msg {
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
index 5b019a8d..186eb80f 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
@@ -38,8 +38,8 @@
 		<h:form id="employeeDetail">
 
 		<e:tabView minHeight="400px" activeIndex="#{page.activeTab}" tabChangedListener="#{page.onTabChanged}">
-			<e:tabPage title="#{msg.employeeDetail_tab_basic}" id="tabBasic">
-
+			<!-- first page -->
+			<e:tabPage id="tabBasic" title="#{msg.employeeDetail_tab_basic}">
 				<e:record value="#{page.employeeRecord}">
 				<!-- formPanel -->
 				<div class="formPanel">
@@ -57,12 +57,12 @@
 						<e:control column="#{db.EMPLOYEES.UPDATE_TIMESTAMP}"/> 
 					</e:formGrid>
 				</div>
-				<!-- formPanel -->
+				<!-- end formPanel -->
 				</e:record>
-				
 			</e:tabPage>
 			
-			<e:tabPage title="#{msg.employeeDetail_tab_extended}" id="tabExtended" disabled="#{not page.employeeRecord.exists}">
+			<!-- second page -->
+			<e:tabPage id="tabExtended" title="#{msg.employeeDetail_tab_extended}" disabled="#{not page.employeeRecord.exists}">
 				<h3><h:outputText value="#{msg.employeeDetail_payments}"/></h3>
 				<!-- Payment data -->
 				<h:dataTable id="paymentData" value="#{page.payments}" var="item" rowClasses="odd,even">
@@ -85,6 +85,7 @@
 						<e:value record="#{item}" column="#{db.PAYMENTS.AMOUNT}"/>
 					</h:column>
 				</h:dataTable>
+				<!-- info message -->
 				<h:panelGroup layout="block" styleClass="info-msg">
 					<h:outputText value="#{msg.employeeDetail_msg_extended}"/>
 				</h:panelGroup>
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
index 0c5e262b..dee8bc63 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
@@ -24,11 +24,6 @@
 	<!-- Interface -->
 	<cc:interface componentType="components.FormGridTag">
 		<cc:attribute name="mode" />
-		<!-- overrides -->
-		<cc:attribute name="tag" />
-		<cc:attribute name="controlTag" />	
-		<cc:attribute name="labelTag" />	
-		<cc:attribute name="inputTag" />
 		<cc:attribute name="renderAutoId" />	
 	</cc:interface>
 	
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
index 9d7dd50d..a83b0efe 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
@@ -23,6 +23,8 @@
 
 	<!-- Interface -->
 	<cc:interface componentType="components.TabViewTag">
+		<cc:attribute name="mode" />
+		<cc:attribute name="minHeight" />
 		<cc:attribute name="activeIndex" type="java.lang.Integer" />
 		<cc:attribute name="tabChangedListener" method-signature="void method(java.lang.Integer)"/>
 	</cc:interface>
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
index 107d94c9..d7a98aa8 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/FormGridTag.java
@@ -51,16 +51,16 @@ public class FormGridTag extends UIOutput implements NamingContainer
         FLAT  (InputControl.HTML_TAG_DIV, InputControl.HTML_TAG_DIV, null, null);
         
         public final String GRID_TAG;
-        public final String DEFAULT_CONTROL_TAG;
-        public final String DEFAULT_LABEL_TAG;
-        public final String DEFAULT_INPUT_TAG;
+        public final String CONTROL_TAG;
+        public final String LABEL_TAG;
+        public final String INPUT_TAG;
         
         private FormGridMode(String gridTag, String controlTag, String labelTag, String inputTag)
         {
             this.GRID_TAG = gridTag;
-            this.DEFAULT_CONTROL_TAG = controlTag;
-            this.DEFAULT_LABEL_TAG = labelTag;
-            this.DEFAULT_INPUT_TAG = inputTag;
+            this.CONTROL_TAG = controlTag;
+            this.LABEL_TAG = labelTag;
+            this.INPUT_TAG = inputTag;
         }
         
         public static FormGridMode detect(String mode)
@@ -90,7 +90,7 @@ public class FormGridTag extends UIOutput implements NamingContainer
     
     protected ControlRenderInfo controlRenderInfo = null;
     
-    private String tagName;
+    private FormGridMode mode;
 
     @Override
     public String getFamily()
@@ -106,12 +106,11 @@ public class FormGridTag extends UIOutput implements NamingContainer
         super.encodeBegin(context);
         
         // tagName
-        FormGridMode mode = FormGridMode.detect(helper.getTagAttributeString("mode")); 
-        this.tagName = helper.getTagAttributeString("tag", mode.GRID_TAG);
+        this.mode = FormGridMode.detect(helper.getTagAttributeString("mode", FormGridMode.GRID.name())); 
         
         // render components
         ResponseWriter writer = context.getResponseWriter();
-        writer.startElement(tagName, this);
+        writer.startElement(mode.GRID_TAG, this);
         // id
         helper.writeComponentId(writer, getControlRenderInfo().RENDER_AUTO_ID);
         // style class
@@ -140,7 +139,7 @@ public class FormGridTag extends UIOutput implements NamingContainer
         super.encodeEnd(context);
         // close
         ResponseWriter writer = context.getResponseWriter();
-        writer.endElement(this.tagName);
+        writer.endElement(mode.GRID_TAG);
     }
     
     public ControlRenderInfo getControlRenderInfo()
@@ -149,14 +148,12 @@ public class FormGridTag extends UIOutput implements NamingContainer
         if (controlRenderInfo!=null)
             return controlRenderInfo;
         // check mode
-        FormGridMode mode = FormGridMode.detect(helper.getTagAttributeString("mode", FormGridMode.GRID.name())); 
-        // override?
-        String controlTag = helper.getTagAttributeString("controlTag", mode.DEFAULT_CONTROL_TAG);
-        String labelTag   = helper.getTagAttributeString("labelTag",   mode.DEFAULT_LABEL_TAG);
-        String inputTag   = helper.getTagAttributeString("inputTag",   mode.DEFAULT_INPUT_TAG);
+        if (this.mode==null)
+            this.mode = FormGridMode.detect(helper.getTagAttributeString("mode", FormGridMode.GRID.name())); 
+        // additional
         boolean renderAutoId = ObjectUtils.getBoolean(helper.getTagAttributeString("renderAutoId"));
-        // done
-        this.controlRenderInfo = new ControlRenderInfo(controlTag, labelTag, inputTag, renderAutoId);
+        // create control info
+        this.controlRenderInfo = new ControlRenderInfo(mode.CONTROL_TAG, mode.LABEL_TAG, mode.INPUT_TAG, renderAutoId);
         return controlRenderInfo;
     }
 }
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabPageTag.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabPageTag.java
index f76f2655..4b2fdb4f 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabPageTag.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/TabPageTag.java
@@ -21,23 +21,29 @@ package org.apache.empire.jsf2.components;
 import java.io.IOException;
 
 import javax.faces.component.NamingContainer;
+import javax.faces.component.UIComponent;
 import javax.faces.component.UINamingContainer;
 import javax.faces.component.UIOutput;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 
+import org.apache.empire.jsf2.components.TabViewTag.TabViewMode;
 import org.apache.empire.jsf2.controls.InputControl;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
 import org.apache.empire.jsf2.utils.TagEncodingHelperFactory;
 import org.apache.empire.jsf2.utils.TagStyleClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TabPageTag extends UIOutput implements NamingContainer
 {
     // Logger
-    // private static final Logger log = LoggerFactory.getLogger(MenuTag.class);
+    private static final Logger log = LoggerFactory.getLogger(TabPageTag.class);
     
     protected final TagEncodingHelper helper = TagEncodingHelperFactory.create(this, TagStyleClass.TAB_PAGE.get());
 
+    private TabViewMode mode;
+    
     @Override
     public String getFamily()
     {
@@ -51,15 +57,23 @@ public class TabPageTag extends UIOutput implements NamingContainer
         // call base
         super.encodeBegin(context);
         
+        // TabViewMode 
+        this.mode = detectTabViewMode();
+        
         // render components
         ResponseWriter writer = context.getResponseWriter();
-        writer.startElement(InputControl.HTML_TAG_TR, this);
-        writer.writeAttribute(InputControl.HTML_ATTR_ID, getClientId(), null);
-        helper.writeAttribute(writer, InputControl.HTML_ATTR_CLASS, helper.getTagAttributeString("styleClass"));
-        helper.writeAttribute(writer, InputControl.HTML_ATTR_STYLE, helper.getTagAttributeString("style"));
+        if (mode.PAGE_WRAP_TAG!=null)
+        {   // render page wrap tag
+            writer.startElement(mode.PAGE_WRAP_TAG, this);
+            writer.writeAttribute(InputControl.HTML_ATTR_ID, getClientId(), null);
+        }
         // TabPage
-        writer.startElement(InputControl.HTML_TAG_TD, this);
-        writer.writeAttribute(InputControl.HTML_ATTR_CLASS, "eTabPage", null);
+        writer.startElement(mode.PAGE_TAG, this);
+        if (mode.PAGE_WRAP_TAG==null)
+        {   // no wrapper tag
+            writer.writeAttribute(InputControl.HTML_ATTR_ID, getClientId(), null);
+        }
+        writer.writeAttribute(InputControl.HTML_ATTR_CLASS, this.helper.getSimpleStyleClass(), null);
     }
 
     @Override
@@ -81,14 +95,32 @@ public class TabPageTag extends UIOutput implements NamingContainer
     {
         // call base
         super.encodeEnd(context);
-        // close
+        // close tags
         ResponseWriter writer = context.getResponseWriter();
-        writer.endElement(InputControl.HTML_TAG_TD);
-        writer.endElement(InputControl.HTML_TAG_TR);
+        writer.endElement(mode.PAGE_TAG);
+        // wrapper tag?
+        if (mode.PAGE_WRAP_TAG!=null)
+            writer.endElement(mode.PAGE_WRAP_TAG);
     }
 
     public String getTabLabel()
     {
         return helper.getTagAttributeString("title");
     }
+    
+    protected TabViewMode detectTabViewMode()
+    {
+        // walk upwards the parent component tree and return the first record component found (if any)
+        UIComponent parent = this;
+        while ((parent = parent.getParent()) != null)
+        {
+            if (parent instanceof TabViewTag)
+            {   // found
+                return ((TabViewTag) parent).getViewMode();
+            }
+        }
+        log.warn("TabViewTag not found! Unable to detect TabViewMode.");
+        return TabViewMode.GRID;
+    }
+    
 }
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 a69e0334..b159b52b 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
@@ -126,6 +126,60 @@ public class TabViewTag extends UIOutput implements NamingContainer
         }
     }
 
+    /*
+     * TabViewMode
+     */
+    public enum TabViewMode 
+    {
+        TABLE (InputControl.HTML_TAG_TABLE, InputControl.HTML_TAG_TR,  InputControl.HTML_TAG_TD,  InputControl.HTML_TAG_TD
+             , InputControl.HTML_TAG_TABLE, InputControl.HTML_TAG_TR,  InputControl.HTML_TAG_TD),
+        GRID  (InputControl.HTML_TAG_DIV,   null,                      InputControl.HTML_TAG_DIV, InputControl.HTML_TAG_DIV
+             , InputControl.HTML_TAG_DIV,   null,                      InputControl.HTML_TAG_DIV);
+        
+        public final String BAR_TAG;        // InputControl.HTML_TAG_TABLE
+        public final String BAR_ROW_TAG;    // InputControl.HTML_TAG_TR
+        public final String BAR_ITEM_TAG;   // InputControl.HTML_TAG_TD
+        public final String BAR_PAD_TAG;    // InputControl.HTML_TAG_TD
+        public final String PANEL_TAG;      // InputControl.HTML_TAG_TABLE
+        public final String PAGE_WRAP_TAG;  // InputControl.HTML_TAG_TR
+        public final String PAGE_TAG;       // InputControl.HTML_TAG_TD
+        
+        private TabViewMode(String barTag, String barRowTag, String barItemTag, String barPadTag, String panelTag, String pageWrapTag, String pageTag)
+        {
+            this.BAR_TAG = barTag;          // InputControl.HTML_TAG_TABLE
+            this.BAR_ROW_TAG = barRowTag;   // InputControl.HTML_TAG_TR
+            this.BAR_ITEM_TAG = barItemTag; // InputControl.HTML_TAG_TD
+            this.BAR_PAD_TAG = barPadTag;   // InputControl.HTML_TAG_TD
+            this.PANEL_TAG = panelTag;      // InputControl.HTML_TAG_TABLE
+            this.PAGE_WRAP_TAG = pageWrapTag;   // InputControl.HTML_TAG_TR
+            this.PAGE_TAG = pageTag;            // InputControl.HTML_TAG_TD
+        }
+        
+        public static TabViewMode detect(String mode)
+        {
+            if (mode==null || mode.length()==0)
+                return TABLE;
+            // find
+            TabViewMode[] values = values();
+            for (int i=0; i<values.length; i++)
+            {
+                if (values[i].name().equalsIgnoreCase(mode))
+                    return values[i]; 
+            }
+            // not found
+            log.warn("TabViewMode \"{}\" not found. Using default!", mode);
+            return TABLE;
+        }
+        
+        @Override
+        public String toString()
+        {
+            return name();
+        }
+    }
+    
+    private TabViewMode mode;
+    
     public TabViewTag()
     {
         log.trace("TabViewTag created");
@@ -137,6 +191,11 @@ public class TabViewTag extends UIOutput implements NamingContainer
         return UINamingContainer.COMPONENT_FAMILY;
     }
 
+    public TabViewMode getViewMode()
+    {
+        return mode;
+    }
+
     @Override
     public void encodeBegin(FacesContext context)
         throws IOException
@@ -147,11 +206,14 @@ public class TabViewTag extends UIOutput implements NamingContainer
         // registerTabViewBean
         // context.getExternalContext().getRequestMap().put("tabView", this);
 
+        // check mode
+        this.mode = TabViewMode.detect(helper.getTagAttributeString("mode", TabViewMode.TABLE.name())); 
+
         // render components
         ResponseWriter writer = context.getResponseWriter();
         writer.startElement(InputControl.HTML_TAG_DIV, this);
         writer.writeAttribute(InputControl.HTML_ATTR_ID, getClientId(), null);
-        writer.writeAttribute(InputControl.HTML_ATTR_CLASS, this.helper.getTagStyleClass(), null);
+        writer.writeAttribute(InputControl.HTML_ATTR_CLASS, this.helper.getSimpleStyleClass(), null);
         this.helper.writeAttribute(writer, InputControl.HTML_ATTR_STYLE, this.helper.getTagAttributeString("style"));
 
         // The Tabs
@@ -161,20 +223,28 @@ public class TabViewTag extends UIOutput implements NamingContainer
         }
         else
         {   // show bar
-            writer.startElement(InputControl.HTML_TAG_TABLE, this);
-            writer.writeAttribute(InputControl.HTML_ATTR_CLASS, "eTabBar", null);
-            writer.startElement(InputControl.HTML_TAG_TR, this);
+            writer.startElement(mode.BAR_TAG, this);
+            writer.writeAttribute(InputControl.HTML_ATTR_CLASS, TagStyleClass.TAB_BAR.get(), null);
+            if (mode.BAR_ROW_TAG!=null)
+                writer.startElement(mode.BAR_ROW_TAG, this);
+            // encode Tabs
             encodeTabs(context, writer);
-            writer.startElement(InputControl.HTML_TAG_TD, this);
-            writer.writeAttribute(InputControl.HTML_ATTR_CLASS, "eTabBarEmpty", null);
-            writer.endElement(InputControl.HTML_TAG_TD);
-            writer.endElement(InputControl.HTML_TAG_TR);
-            writer.endElement(InputControl.HTML_TAG_TABLE);
+            // Bar padding item
+            if (mode.BAR_PAD_TAG!=null)
+            {   // Bar padding item
+                writer.startElement(mode.BAR_PAD_TAG, this);
+                writer.writeAttribute(InputControl.HTML_ATTR_CLASS, TagStyleClass.TAB_BAR_PADDING.get(), null);
+                writer.endElement(mode.BAR_PAD_TAG);
+            }
+            // finish
+            if (mode.BAR_ROW_TAG!=null)
+                writer.endElement(mode.BAR_ROW_TAG);
+            writer.endElement(mode.BAR_TAG);
         }
         
         // The Pages
-        writer.startElement(InputControl.HTML_TAG_TABLE, this);
-        writer.writeAttribute(InputControl.HTML_ATTR_CLASS, "eTabPanel", null);
+        writer.startElement(mode.PANEL_TAG, this);
+        writer.writeAttribute(InputControl.HTML_ATTR_CLASS, TagStyleClass.TAB_PANEL.get(), null);
         String minHeight = this.helper.getTagAttributeString("minHeight");
         if (StringUtils.isNotEmpty(minHeight))
         {
@@ -203,7 +273,7 @@ public class TabViewTag extends UIOutput implements NamingContainer
         super.encodeEnd(context);
         // close
         ResponseWriter writer = context.getResponseWriter();
-        writer.endElement(InputControl.HTML_TAG_TABLE);
+        writer.endElement(mode.PANEL_TAG);
         writer.endElement(InputControl.HTML_TAG_DIV);
     }
 
@@ -266,7 +336,7 @@ public class TabViewTag extends UIOutput implements NamingContainer
             if (writer!=null)
             {   // encode Tab
                 boolean disabled = ObjectUtils.getBoolean(TagEncodingHelper.getTagAttributeValue(page, "disabled"));
-                writer.startElement(InputControl.HTML_TAG_TD, this);
+                writer.startElement(mode.BAR_ITEM_TAG, this);
                 // tab label
                 String styleClasses = TagStyleClass.TAB_LABEL.get();
                 if (active)
@@ -280,7 +350,7 @@ public class TabViewTag extends UIOutput implements NamingContainer
                 writer.writeAttribute(InputControl.HTML_ATTR_CLASS, styleClasses, null);
                 // encode Link
                 encodeTabLink(context, writer, index, page, (active || disabled));
-                writer.endElement(InputControl.HTML_TAG_TD);
+                writer.endElement(mode.BAR_ITEM_TAG);
             }
             // set rendered
             page.setRendered(active);
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
index 76b09136..0edd27ef 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
@@ -1752,6 +1752,12 @@ public class TagEncodingHelper implements NamingContainer
         }
     }
 
+    public String getSimpleStyleClass()
+    {
+        String userStyle = getTagAttributeStringEx("styleClass");
+        return assembleStyleClassString(cssStyleClass, null, null, userStyle);
+    }
+
     public String getTagStyleClass(DataType dataType, String addlStyle, String userStyle)
     {
         String typeClass = (dataType!=null) ? getDataTypeClass(dataType) : null;
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagStyleClass.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagStyleClass.java
index 15652872..e64257a2 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagStyleClass.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagStyleClass.java
@@ -18,6 +18,8 @@
  */
 package org.apache.empire.jsf2.utils;
 
+import org.apache.empire.commons.StringUtils;
+
 /**
  * Collection of TagStyleClasses
  */
@@ -43,6 +45,9 @@ public enum TagStyleClass
     MENU("eMenuList"),
     UNIT("eUnit"),
     TAB_VIEW("eTabView"),
+    TAB_BAR("eTabBar"),
+    TAB_BAR_PADDING("eTabBarEmpty"),
+    TAB_PANEL("eTabPanel"),
     TAB_PAGE("eTabPage"),
     TAB_LINK("eTabLink"),
     TAB_LABEL("eTabLabel"),
@@ -105,11 +110,7 @@ public enum TagStyleClass
         if (existsIn(styleClasses, styleClassName))
             return styleClasses;
         // add with space
-        StringBuilder b = new StringBuilder(styleClasses.length()+styleClassName.length()+1);
-        b.append(styleClasses);
-        b.append(" ");
-        b.append(styleClassName);
-        return b.toString();
+        return StringUtils.concat(styleClasses, " ", styleClassName);
     }
 
     public final String addTo(String styleClasses)
@@ -150,10 +151,7 @@ public enum TagStyleClass
         // in between
         int after  = idx + styleClassName.length();
         int before = idx - 1; // SPACE assumed!
-        StringBuilder b = new StringBuilder(styleClasses.length()-(after-before));
-        b.append(styleClasses.substring(0, before));
-        b.append(styleClasses.substring(after));
-        return b.toString();
+        return StringUtils.concat(styleClasses.substring(0, before), styleClasses.substring(after));
     }
 
     public final String removeFrom(String styleClasses)