You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2020/10/28 11:07:43 UTC

[myfaces-tobago] 01/03: TOBAGO-1633: Use TypeScript instead of JavaScript. Simplify Renderers: remove "inside": selectBooleanCheckboxInsideCommand, SelectOneRadioInsideCommand, selectManyCheckboxInsideCommand

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

lofwyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git

commit ebf8898fc9f1e28852eb3fa352daf4d557db6d39
Author: Udo Schnurpfeil <ud...@irian.eu>
AuthorDate: Wed Oct 28 11:36:35 2020 +0100

    TOBAGO-1633: Use TypeScript instead of JavaScript.
    Simplify Renderers: remove "inside": selectBooleanCheckboxInsideCommand, SelectOneRadioInsideCommand, selectManyCheckboxInsideCommand
---
 .../myfaces/tobago/component/RendererTypes.java    |   8 --
 .../renderkit/renderer/CommandRendererBase.java    |  34 +++----
 .../renderer/LinkInsideCommandRenderer.java        |  34 -------
 .../renderer/MessageLayoutRendererBase.java        |  18 ++++
 ...SelectBooleanCheckboxInsideCommandRenderer.java |  60 ------------
 .../renderer/SelectBooleanCheckboxRenderer.java    |  24 +++--
 .../SelectManyCheckboxInsideCommandRenderer.java   |  52 -----------
 .../renderer/SelectManyCheckboxRenderer.java       |  21 +++--
 .../SelectOneRadioInsideCommandRenderer.java       |  51 -----------
 .../renderkit/renderer/SelectOneRadioRenderer.java |  21 +++--
 .../taglib/component/BadgeTagDeclaration.java      |   2 +-
 .../taglib/component/ButtonTagDeclaration.java     |   2 +-
 .../taglib/component/LinkTagDeclaration.java       |   2 +-
 .../taglib/component/LinksTagDeclaration.java      |   2 +-
 .../taglib/component/OutTagDeclaration.java        |   2 +-
 .../SelectBooleanCheckboxTagDeclaration.java       |   2 +-
 .../SelectBooleanToggleTagDeclaration.java         |   2 +-
 .../SelectManyCheckboxTagDeclaration.java          |   2 +-
 .../component/SelectOneChoiceTagDeclaration.java   |   2 +-
 .../component/SelectOneRadioTagDeclaration.java    |   2 +-
 .../taglib/component/SeparatorTagDeclaration.java  |   2 +-
 .../tobago/renderkit/html/HtmlElements.java        |   2 +
 .../internal/config/AbstractTobagoTestBase.java    |  17 +++-
 .../renderkit/renderer/LinkRendererUnitTest.java   | 102 +++++++++++++++++++++
 .../resources/renderer/link/booleanInsideLink.html |  28 ++++++
 .../resources/renderer/link/manyInsideLink.html    |  34 +++++++
 .../resources/renderer/link/radioInsideLink.html   |  34 +++++++
 .../renderer/link/separatorInsideLink.html         |  32 +++++++
 28 files changed, 329 insertions(+), 265 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
index 720581c..97a4a2a 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
@@ -46,7 +46,6 @@ public enum RendererTypes {
   In,
   Image,
   Link,
-  LinkInsideCommand,
   Links,
   Label,
   Messages,
@@ -65,15 +64,12 @@ public enum RendererTypes {
   Section,
   SegmentLayout,
   SelectBooleanCheckbox,
-  SelectBooleanCheckboxInsideCommand,
   SelectBooleanToggle,
   SelectManyCheckbox,
-  SelectManyCheckboxInsideCommand,
   SelectManyListbox,
   SelectManyShuttle,
   SelectOneChoice,
   SelectOneRadio,
-  SelectOneRadioInsideCommand,
   SelectOneListbox,
   SelectReference,
   Separator,
@@ -121,7 +117,6 @@ public enum RendererTypes {
   public static final String IN = "In";
   public static final String IMAGE = "Image";
   public static final String LINK = "Link";
-  public static final String LINK_INSIDE_COMMAND = "LinkInsideCommand";
   public static final String LINKS = "Links";
   public static final String LABEL = "Label";
   public static final String MESSAGES = "Messages";
@@ -140,15 +135,12 @@ public enum RendererTypes {
   public static final String SECTION = "Section";
   public static final String SEGMENT_LAYOUT = "SegmentLayout";
   public static final String SELECT_BOOLEAN_CHECKBOX = "SelectBooleanCheckbox";
-  public static final String SELECT_BOOLEAN_CHECKBOX_INSIDE_COMMAND = "SelectBooleanCheckboxInsideCommand";
   public static final String SELECT_BOOLEAN_TOGGLE = "SelectBooleanToggle";
   public static final String SELECT_MANY_CHECKBOX = "SelectManyCheckbox";
-  public static final String SELECT_MANY_CHECKBOX_INSIDE_COMMAND = "SelectManyCheckboxInsideCommand";
   public static final String SELECT_MANY_LISTBOX = "SelectManyListbox";
   public static final String SELECT_MANY_SHUTTLE = "SelectManyShuttle";
   public static final String SELECT_ONE_CHOICE = "SelectOneChoice";
   public static final String SELECT_ONE_RADIO = "SelectOneRadio";
-  public static final String SELECT_ONE_RADIO_INSIDE_COMMAND = "SelectOneRadioInsideCommand";
   public static final String SELECT_ONE_LISTBOX = "SelectOneListbox";
   public static final String SELECT_REFERENCE = "SelectReference";
   public static final String SEPARATOR = "Separator";
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
index fca31b3..a3171bb 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
@@ -20,7 +20,6 @@
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
 import org.apache.myfaces.tobago.component.Attributes;
-import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.component.AbstractUIBadge;
 import org.apache.myfaces.tobago.internal.component.AbstractUICommand;
 import org.apache.myfaces.tobago.internal.component.AbstractUIFormBase;
@@ -68,7 +67,7 @@ public abstract class CommandRendererBase<T extends AbstractUICommand> extends D
     final boolean anchor = (component.getLink() != null || component.getOutcome() != null) && !disabled;
     final String target = component.getTarget();
     final boolean parentOfCommands = component.isParentOfCommands();
-    final boolean dropdownSubmenu = this instanceof LinkInsideCommandRenderer;
+    final boolean dropdownSubmenu = isInside(facesContext, HtmlElements.COMMAND);
 
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
@@ -110,15 +109,13 @@ public abstract class CommandRendererBase<T extends AbstractUICommand> extends D
       writer.writeAttribute(DataAttributes.TOGGLE, "dropdown", false);
     }
     final String title = HtmlRendererUtils.getTitleFromTipAndMessages(facesContext, component);
-    if (title != null) {
-      writer.writeAttribute(HtmlAttributes.TITLE, title, true);
-    }
+    writer.writeAttribute(HtmlAttributes.TITLE, title, true);
 
     writer.writeClassAttribute(
         getRendererCssClass(),
         getRendererCssClass().createMarkup(component.getMarkup()),
-        parentOfCommands ? null : getOuterCssItems(facesContext, component),
         getCssItems(facesContext, component),
+        !parentOfCommands && dropdownSubmenu ? BootstrapClass.DROPDOWN_ITEM : null,
         parentOfCommands && !dropdownSubmenu ? BootstrapClass.DROPDOWN_TOGGLE : null,
         component.getCustomClass(),
         isInside(facesContext, HtmlElements.TOBAGO_LINKS) ? BootstrapClass.NAV_LINK : null);
@@ -184,17 +181,21 @@ public abstract class CommandRendererBase<T extends AbstractUICommand> extends D
             }
             renderLater.add(child);
           } else if (child instanceof AbstractUILink) {
-            child.setRendererType(RendererTypes.LinkInsideCommand.name());
+            insideBegin(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
             child.encodeAll(facesContext);
+            insideEnd(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
           } else if (child instanceof AbstractUISelectBooleanCheckbox) {
-            child.setRendererType(RendererTypes.SelectBooleanCheckboxInsideCommand.name());
+            insideBegin(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
             child.encodeAll(facesContext);
+            insideEnd(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
           } else if (child instanceof AbstractUISelectManyCheckbox) {
-            child.setRendererType(RendererTypes.SelectManyCheckboxInsideCommand.name());
+            insideBegin(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
             child.encodeAll(facesContext);
+            insideEnd(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
           } else if (child instanceof AbstractUISelectOneRadio) {
-            child.setRendererType(RendererTypes.SelectOneRadioInsideCommand.name());
+            insideBegin(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
             child.encodeAll(facesContext);
+            insideEnd(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
           } else if (child instanceof AbstractUISeparator) {
             insideBegin(facesContext, HtmlElements.COMMAND); // XXX may refactor / cleanup
             child.encodeAll(facesContext);
@@ -232,23 +233,16 @@ public abstract class CommandRendererBase<T extends AbstractUICommand> extends D
 
     final String clientId = command.getClientId(facesContext);
     final boolean parentOfCommands = command.isParentOfCommands();
-    final boolean dropdownSubmenu = this instanceof LinkInsideCommandRenderer;
-
+    final boolean dropdownSubmenu = isInside(facesContext, HtmlElements.COMMAND);
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
     if (parentOfCommands) {
       writer.startElement(HtmlElements.TOBAGO_DROPDOWN);
       writer.writeIdAttribute(clientId);
 
-      final CssItem first;
-      if (dropdownSubmenu) {
-        first = TobagoClass.DROPDOWN__SUBMENU;
-      } else {
-        first = BootstrapClass.DROPDOWN;
-      }
       writer.writeClassAttribute(
-          first,
-          getOuterCssItems(facesContext, command));
+          dropdownSubmenu ? TobagoClass.DROPDOWN__SUBMENU : BootstrapClass.DROPDOWN,
+          dropdownSubmenu ? BootstrapClass.DROPDOWN_ITEM : null);
     }
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkInsideCommandRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkInsideCommandRenderer.java
deleted file mode 100644
index fee9493..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkInsideCommandRenderer.java
+++ /dev/null
@@ -1,34 +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.myfaces.tobago.internal.renderkit.renderer;
-
-import org.apache.myfaces.tobago.internal.component.AbstractUILink;
-import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
-
-import javax.faces.context.FacesContext;
-
-public class LinkInsideCommandRenderer<T extends AbstractUILink> extends LinkRenderer<T> {
-
-  @Override
-  protected CssItem[] getOuterCssItems(final FacesContext facesContext, final T command) {
-    return new CssItem[]{BootstrapClass.DROPDOWN_ITEM};
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java
index 29b6ee5..70c96ab 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java
@@ -43,6 +43,24 @@ public abstract class MessageLayoutRendererBase<T extends UIComponent & Supports
     extends LabelLayoutRendererBase<T> {
 
   @Override
+  public void encodeBeginInternal(FacesContext facesContext, T component) throws IOException {
+    if (isInside(facesContext, HtmlElements.COMMAND)) {
+      encodeBeginField(facesContext, component);
+    } else {
+      super.encodeBeginInternal(facesContext, component);
+    }
+  }
+
+  @Override
+  public void encodeEndInternal(FacesContext facesContext, T component) throws IOException {
+    if (isInside(facesContext, HtmlElements.COMMAND)) {
+      encodeEndField(facesContext, component);
+    } else {
+      super.encodeEndInternal(facesContext, component);
+    }
+  }
+
+  @Override
   public void encodeBeginMessageField(final FacesContext facesContext, final T component) throws IOException {
     encodeBeginMessagesContainer(facesContext, component);
     encodeBeginField(facesContext, component);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java
deleted file mode 100644
index 657a39c..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.myfaces.tobago.internal.renderkit.renderer;
-
-import org.apache.myfaces.tobago.internal.component.AbstractUISelectBoolean;
-import org.apache.myfaces.tobago.internal.component.AbstractUISelectBooleanCheckbox;
-import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
-import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
-
-import javax.faces.context.FacesContext;
-import java.io.IOException;
-
-public class SelectBooleanCheckboxInsideCommandRenderer<T extends AbstractUISelectBooleanCheckbox>
-    extends SelectBooleanCheckboxRenderer<T> {
-
-  @Override
-  public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeBeginField(facesContext, component);
-  }
-
-  @Override
-  public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeEndField(facesContext, component);
-  }
-
-  @Override
-  protected HtmlElements getOuterHtmlTag() {
-    return HtmlElements.TOBAGO_SELECT_BOOLEAN_CHECKBOX;
-  }
-
-  @Override
-  protected CssItem[] getOuterCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
-    return new CssItem[]{
-        BootstrapClass.FORM_CHECK
-    };
-  }
-
-  @Override
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
-    return new CssItem[]{BootstrapClass.DROPDOWN_ITEM};
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java
index d8efa09..0bdb3c3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java
@@ -88,7 +88,7 @@ public class SelectBooleanCheckboxRenderer<T extends AbstractUISelectBooleanChec
     final String itemImage = component.getItemImage();
     final Markup markup = component.getMarkup();
 
-    writer.startElement(getOuterHtmlTag());
+    writer.startElement(getOuterHtmlTag(facesContext));
     writer.writeIdAttribute(clientId);
     writer.writeClassAttribute(
         getTobagoClass(),
@@ -148,24 +148,34 @@ public class SelectBooleanCheckboxRenderer<T extends AbstractUISelectBooleanChec
   protected void encodeEndField(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
-    writer.endElement(getOuterHtmlTag());
+    writer.endElement(getOuterHtmlTag(facesContext));
 
     encodeBehavior(writer, facesContext, component);
   }
 
-  protected HtmlElements getOuterHtmlTag() {
-    return HtmlElements.DIV;
+  /** XXX can this be removed? use always HtmlElements.TOBAGO_SELECT_BOOLEAN_CHECKBOX ??? */
+  protected HtmlElements getOuterHtmlTag(final FacesContext facesContext) {
+    if (isInside(facesContext, HtmlElements.COMMAND)) {
+      return HtmlElements.TOBAGO_SELECT_BOOLEAN_CHECKBOX;
+    } else {
+      return HtmlElements.DIV;
+    }
   }
 
   protected CssItem[] getOuterCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
+    final boolean colFromLabel = !select.isLabelLayoutSkip() && !isInside(facesContext, HtmlElements.COMMAND);
     return new CssItem[]{
-        !select.isLabelLayoutSkip() ? BootstrapClass.COL_FORM_LABEL : null,
-        BootstrapClass.FORM_CHECK
+        BootstrapClass.FORM_CHECK,
+        colFromLabel ? BootstrapClass.COL_FORM_LABEL : null
     };
   }
 
   protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
-    return null;
+    if (isInside(facesContext, HtmlElements.COMMAND)) {
+      return new CssItem[]{BootstrapClass.DROPDOWN_ITEM};
+    } else {
+      return null;
+    }
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxInsideCommandRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxInsideCommandRenderer.java
deleted file mode 100644
index 09150af..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxInsideCommandRenderer.java
+++ /dev/null
@@ -1,52 +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.myfaces.tobago.internal.renderkit.renderer;
-
-import org.apache.myfaces.tobago.internal.component.AbstractUISelectManyCheckbox;
-import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
-import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
-
-import javax.faces.context.FacesContext;
-import java.io.IOException;
-
-public class SelectManyCheckboxInsideCommandRenderer<T extends AbstractUISelectManyCheckbox>
-    extends SelectManyCheckboxRenderer<T> {
-
-  @Override
-  public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeBeginField(facesContext, component);
-  }
-
-  @Override
-  public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeEndField(facesContext, component);
-  }
-
-  @Override
-  protected HtmlElements getOuterHtmlTag() {
-    return HtmlElements.TOBAGO_SELECT_MANY_CHECKBOX;
-  }
-
-  @Override
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectManyCheckbox select) {
-    return new CssItem[]{BootstrapClass.DROPDOWN_ITEM};
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
index f82fa5e..763bd94 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
@@ -27,7 +27,6 @@ import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.SelectItemUtils;
 import org.apache.myfaces.tobago.internal.util.StringUtils;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
@@ -59,8 +58,9 @@ public class SelectManyCheckboxRenderer<T extends AbstractUISelectManyCheckbox>
     final boolean required = component.isRequired();
     final boolean inline = component.isInline();
     final Markup markup = component.getMarkup();
+    final boolean isInsideCommand = isInside(facesContext, HtmlElements.COMMAND);
 
-    writer.startElement(getOuterHtmlTag());
+    writer.startElement(getOuterHtmlTag(facesContext));
     writer.writeClassAttribute(
         TobagoClass.SELECT_MANY_CHECKBOX,
         TobagoClass.SELECT_MANY_CHECKBOX.createMarkup(markup),
@@ -110,7 +110,7 @@ public class SelectManyCheckboxRenderer<T extends AbstractUISelectManyCheckbox>
         writer.startElement(HtmlElements.LABEL);
         writer.writeClassAttribute(
             BootstrapClass.FORM_CHECK_LABEL,
-            getCssItems(facesContext, component));
+            isInsideCommand ? BootstrapClass.DROPDOWN_ITEM : null);
         writer.writeAttribute(HtmlAttributes.FOR, itemId, false);
 
         if (item instanceof org.apache.myfaces.tobago.model.SelectItem) {
@@ -147,17 +147,18 @@ public class SelectManyCheckboxRenderer<T extends AbstractUISelectManyCheckbox>
   protected void encodeEndField(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
-    writer.endElement(getOuterHtmlTag());
+    writer.endElement(getOuterHtmlTag(facesContext));
 
     encodeBehavior(writer, facesContext, component);
   }
 
-  protected HtmlElements getOuterHtmlTag() {
-    return HtmlElements.DIV;
-  }
-
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectManyCheckbox select) {
-    return null;
+  /** XXX can this be removed? use always HtmlElements.TOBAGO_SELECT_MANY_CHECKBOX ??? */
+  protected HtmlElements getOuterHtmlTag(final FacesContext facesContext) {
+    if (isInside(facesContext, HtmlElements.COMMAND)) {
+      return HtmlElements.TOBAGO_SELECT_MANY_CHECKBOX;
+    } else {
+      return HtmlElements.DIV;
+    }
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioInsideCommandRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioInsideCommandRenderer.java
deleted file mode 100644
index cae0b6d..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioInsideCommandRenderer.java
+++ /dev/null
@@ -1,51 +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.myfaces.tobago.internal.renderkit.renderer;
-
-import org.apache.myfaces.tobago.internal.component.AbstractUISelectOneRadio;
-import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
-import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
-
-import javax.faces.context.FacesContext;
-import java.io.IOException;
-
-public class SelectOneRadioInsideCommandRenderer<T extends AbstractUISelectOneRadio> extends SelectOneRadioRenderer<T> {
-
-  @Override
-  public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeBeginField(facesContext, component);
-  }
-
-  @Override
-  public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeEndField(facesContext, component);
-  }
-
-  @Override
-  protected HtmlElements getOuterHtmlTag() {
-    return HtmlElements.TOBAGO_SELECT_ONE_RADIO;
-  }
-
-  @Override
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectOneRadio select) {
-    return new CssItem[]{BootstrapClass.DROPDOWN_ITEM};
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
index 60ccb89..cba6407 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
@@ -28,7 +28,6 @@ import org.apache.myfaces.tobago.internal.util.ObjectUtils;
 import org.apache.myfaces.tobago.internal.util.SelectItemUtils;
 import org.apache.myfaces.tobago.internal.util.StringUtils;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
@@ -61,8 +60,9 @@ public class SelectOneRadioRenderer<T extends AbstractUISelectOneRadio> extends
     final boolean required = component.isRequired();
     final boolean inline = component.isInline();
     final Markup markup = component.getMarkup();
+    final boolean isInsideCommand = isInside(facesContext, HtmlElements.COMMAND);
 
-    writer.startElement(getOuterHtmlTag());
+    writer.startElement(getOuterHtmlTag(facesContext));
     writer.writeClassAttribute(
         TobagoClass.SELECT_ONE_RADIO,
         TobagoClass.SELECT_ONE_RADIO.createMarkup(markup),
@@ -110,7 +110,7 @@ public class SelectOneRadioRenderer<T extends AbstractUISelectOneRadio> extends
         writer.startElement(HtmlElements.LABEL);
         writer.writeClassAttribute(
             BootstrapClass.FORM_CHECK_LABEL,
-            getCssItems(facesContext, component));
+            isInsideCommand ? BootstrapClass.DROPDOWN_ITEM : null);
         writer.writeAttribute(HtmlAttributes.FOR, itemId, false);
         if (item instanceof org.apache.myfaces.tobago.model.SelectItem) {
           final org.apache.myfaces.tobago.model.SelectItem tobagoItem =
@@ -146,17 +146,18 @@ public class SelectOneRadioRenderer<T extends AbstractUISelectOneRadio> extends
   protected void encodeEndField(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
-    writer.endElement(getOuterHtmlTag());
+    writer.endElement(getOuterHtmlTag(facesContext));
 
     encodeBehavior(writer, facesContext, component);
   }
 
-  protected HtmlElements getOuterHtmlTag() {
-    return HtmlElements.DIV;
-  }
-
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectOneRadio select) {
-    return null;
+  /** XXX can this be removed? use always HtmlElements.TOBAGO_SELECT_MANY_CHECKBOX ??? */
+  protected HtmlElements getOuterHtmlTag(final FacesContext facesContext) {
+    if (isInside(facesContext, HtmlElements.COMMAND)) {
+      return HtmlElements.TOBAGO_SELECT_ONE_RADIO;
+    } else {
+      return HtmlElements.DIV;
+    }
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BadgeTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BadgeTagDeclaration.java
index aba9947..9b91c16 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BadgeTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BadgeTagDeclaration.java
@@ -42,7 +42,7 @@ import javax.faces.component.UIOutput;
         "javax.faces.component.behavior.ClientBehaviorHolder"
     },
     componentFamily = UIOutput.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.BADGE},
+    rendererType = RendererTypes.BADGE,
     allowedChildComponenents = "NONE",
     markups = {
         @Markup(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java
index 3b3fc36..f7056b3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java
@@ -62,7 +62,7 @@ import javax.faces.component.UICommand;
         "org.apache.myfaces.tobago.component.SupportsAccessKey"
     },
     componentFamily = UICommand.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.BUTTON},
+    rendererType = RendererTypes.BUTTON,
     allowedChildComponenents = "NONE",
     facets = {
         @Facet(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java
index e96be42..4ce209c 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java
@@ -59,7 +59,7 @@ import javax.faces.component.UICommand;
     uiComponentFacesClass = "javax.faces.component.UICommand",
     interfaces = "org.apache.myfaces.tobago.component.SupportsAccessKey",
     componentFamily = UICommand.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.LINK, RendererTypes.LINK_INSIDE_COMMAND},
+    rendererType = RendererTypes.LINK,
     allowedChildComponenents = "NONE",
     facets = {
         @Facet(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java
index 6370221..5398e6d 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java
@@ -43,7 +43,7 @@ import javax.faces.component.UIPanel;
         // As long as no behavior event names are defined, ClientBehaviorHolder must be implemented for Mojarra.
         "javax.faces.component.behavior.ClientBehaviorHolder"
     },
-    rendererType = {RendererTypes.LINKS})
+    rendererType = RendererTypes.LINKS)
 public interface LinksTagDeclaration extends HasIdBindingAndRendered, IsVisual, HasTip, HasOrientation {
 
   /**
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
index 970a056..acfc002 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
@@ -46,7 +46,7 @@ import javax.faces.component.UIOutput;
     uiComponent = "org.apache.myfaces.tobago.component.UIOut",
     uiComponentFacesClass = "javax.faces.component.UIOutput",
     componentFamily = UIOutput.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.OUT},
+    rendererType = RendererTypes.OUT,
     interfaces = {
         // As long as no behavior event names are defined, ClientBehaviorHolder must be implemented for Mojarra.
         "javax.faces.component.behavior.ClientBehaviorHolder"
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java
index 9dfcdfb..1a215ab 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java
@@ -58,7 +58,7 @@ import javax.faces.component.UISelectBoolean;
     uiComponent = "org.apache.myfaces.tobago.component.UISelectBooleanCheckbox",
     uiComponentFacesClass = "javax.faces.component.UISelectBoolean",
     componentFamily = UISelectBoolean.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.SELECT_BOOLEAN_CHECKBOX, RendererTypes.SELECT_BOOLEAN_CHECKBOX_INSIDE_COMMAND},
+    rendererType = RendererTypes.SELECT_BOOLEAN_CHECKBOX,
     allowedChildComponenents = "NONE",
     behaviors = {
         @Behavior(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java
index ad775ea..bd562ac 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java
@@ -58,7 +58,7 @@ import javax.faces.component.UISelectBoolean;
     uiComponent = "org.apache.myfaces.tobago.component.UISelectBooleanToggle",
     uiComponentFacesClass = "javax.faces.component.UISelectBoolean",
     componentFamily = UISelectBoolean.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.SELECT_BOOLEAN_TOGGLE},
+    rendererType = RendererTypes.SELECT_BOOLEAN_TOGGLE,
     allowedChildComponenents = "NONE",
     behaviors = {
         @Behavior(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java
index 060bdb8..0a093f9 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java
@@ -60,7 +60,7 @@ import javax.faces.component.UISelectMany;
     uiComponent = "org.apache.myfaces.tobago.component.UISelectManyCheckbox",
     uiComponentFacesClass = "javax.faces.component.UISelectMany",
     componentFamily = UISelectMany.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.SELECT_MANY_CHECKBOX, RendererTypes.SELECT_MANY_CHECKBOX_INSIDE_COMMAND},
+    rendererType = RendererTypes.SELECT_MANY_CHECKBOX,
     allowedChildComponenents = {
         "javax.faces.SelectItem",
         "javax.faces.SelectItems"},
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
index 6ff1cc1..5388174 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
@@ -58,7 +58,7 @@ import javax.faces.component.UISelectOne;
     uiComponent = "org.apache.myfaces.tobago.component.UISelectOneChoice",
     uiComponentFacesClass = "javax.faces.component.UISelectOne",
     componentFamily = UISelectOne.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.SELECT_ONE_CHOICE},
+    rendererType = RendererTypes.SELECT_ONE_CHOICE,
     allowedChildComponenents = {
         "javax.faces.SelectItem",
         "javax.faces.SelectItems"
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java
index 0078dfc..78b71b5 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java
@@ -60,7 +60,7 @@ import javax.faces.component.UISelectOne;
     uiComponent = "org.apache.myfaces.tobago.component.UISelectOneRadio",
     uiComponentFacesClass = "javax.faces.component.UISelectOne",
     componentFamily = UISelectOne.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.SELECT_ONE_RADIO, RendererTypes.SELECT_ONE_RADIO_INSIDE_COMMAND},
+    rendererType = RendererTypes.SELECT_ONE_RADIO,
     allowedChildComponenents = {
         "javax.faces.SelectItem",
         "javax.faces.SelectItems"
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SeparatorTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SeparatorTagDeclaration.java
index 9eb415b..bc8f4eb 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SeparatorTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SeparatorTagDeclaration.java
@@ -35,7 +35,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 @UIComponentTag(
     uiComponent = "org.apache.myfaces.tobago.component.UISeparator",
     componentFamily = "org.apache.myfaces.tobago.Separator",
-    rendererType = {RendererTypes.SEPARATOR},
+    rendererType = RendererTypes.SEPARATOR,
     allowedChildComponenents = "NONE",
     interfaces = {
         // As long as no behavior event names are defined, ClientBehaviorHolder must be implemented for Mojarra.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java
index 8f6b271..5d758cc 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java
@@ -46,6 +46,8 @@ public enum HtmlElements {
   CODE("code", Qualifier.INLINE),
   COL("col", Qualifier.VOID),
   COLGROUP("colgroup"),
+  /** @deprecated */
+  @Deprecated
   COMMAND("command", Qualifier.VOID),
   DATALIST("datalist"),
   DD("dd"),
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
index bf62ae6..1c9863d 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
@@ -38,7 +38,10 @@ import org.apache.myfaces.tobago.component.UIPanel;
 import org.apache.myfaces.tobago.component.UIPopup;
 import org.apache.myfaces.tobago.component.UISection;
 import org.apache.myfaces.tobago.component.UISegmentLayout;
+import org.apache.myfaces.tobago.component.UISelectBooleanCheckbox;
 import org.apache.myfaces.tobago.component.UISelectItem;
+import org.apache.myfaces.tobago.component.UISelectManyCheckbox;
+import org.apache.myfaces.tobago.component.UISelectManyListbox;
 import org.apache.myfaces.tobago.component.UISelectOneChoice;
 import org.apache.myfaces.tobago.component.UISelectOneRadio;
 import org.apache.myfaces.tobago.component.UISeparator;
@@ -50,7 +53,6 @@ import org.apache.myfaces.tobago.internal.renderkit.renderer.ButtonRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.ButtonsRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.GridLayoutRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.InRenderer;
-import org.apache.myfaces.tobago.internal.renderkit.renderer.LinkInsideCommandRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.LinkRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.LinksRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.OutRenderer;
@@ -58,6 +60,9 @@ import org.apache.myfaces.tobago.internal.renderkit.renderer.PanelRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.PopupRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SectionRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SegmentLayoutRenderer;
+import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectBooleanCheckboxRenderer;
+import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectManyCheckboxRenderer;
+import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectManyListboxRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectOneChoiceRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectOneRadioRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SeparatorRenderer;
@@ -127,6 +132,9 @@ public abstract class AbstractTobagoTestBase extends AbstractJsfTestCase {
     application.addComponent(Tags.style.componentType(), UIStyle.class.getName());
     application.addComponent(Tags.section.componentType(), UISection.class.getName());
     application.addComponent(Tags.selectItem.componentType(), UISelectItem.class.getName());
+    application.addComponent(Tags.selectBooleanCheckbox.componentType(), UISelectBooleanCheckbox.class.getName());
+    application.addComponent(Tags.selectManyCheckbox.componentType(), UISelectManyCheckbox.class.getName());
+    application.addComponent(Tags.selectManyListbox.componentType(), UISelectManyListbox.class.getName());
     application.addComponent(Tags.selectOneRadio.componentType(), UISelectOneRadio.class.getName());
     application.addComponent(Tags.selectOneChoice.componentType(), UISelectOneChoice.class.getName());
     application.addComponent(Tags.gridLayout.componentType(), UIGridLayout.class.getName());
@@ -138,7 +146,6 @@ public abstract class AbstractTobagoTestBase extends AbstractJsfTestCase {
     renderKit.addRenderer(UIOut.COMPONENT_FAMILY, RendererTypes.OUT, new OutRenderer());
     renderKit.addRenderer(UIPanel.COMPONENT_FAMILY, RendererTypes.PANEL, new PanelRenderer());
     renderKit.addRenderer(UILink.COMPONENT_FAMILY, RendererTypes.LINK, new LinkRenderer());
-    renderKit.addRenderer(UILink.COMPONENT_FAMILY, RendererTypes.LINK_INSIDE_COMMAND, new LinkInsideCommandRenderer());
     renderKit.addRenderer(UILinks.COMPONENT_FAMILY, RendererTypes.LINKS, new LinksRenderer());
     renderKit.addRenderer(UIBox.COMPONENT_FAMILY, RendererTypes.BOX, new BoxRenderer());
     renderKit.addRenderer(UIButton.COMPONENT_FAMILY, RendererTypes.BUTTON, new ButtonRenderer());
@@ -148,6 +155,12 @@ public abstract class AbstractTobagoTestBase extends AbstractJsfTestCase {
     renderKit.addRenderer(UIStyle.COMPONENT_FAMILY, RendererTypes.STYLE, new StyleRenderer());
     renderKit.addRenderer(UISection.COMPONENT_FAMILY, RendererTypes.SECTION, new SectionRenderer());
     renderKit.addRenderer(
+        UISelectBooleanCheckbox.COMPONENT_FAMILY, RendererTypes.SELECT_BOOLEAN_CHECKBOX, new SelectBooleanCheckboxRenderer());
+    renderKit.addRenderer(
+        UISelectManyCheckbox.COMPONENT_FAMILY, RendererTypes.SELECT_MANY_CHECKBOX, new SelectManyCheckboxRenderer());
+    renderKit.addRenderer(
+        UISelectManyListbox.COMPONENT_FAMILY, RendererTypes.SELECT_MANY_LISTBOX, new SelectManyListboxRenderer());
+    renderKit.addRenderer(
         UISelectOneRadio.COMPONENT_FAMILY, RendererTypes.SELECT_ONE_RADIO, new SelectOneRadioRenderer());
     renderKit.addRenderer(
         UISelectOneChoice.COMPONENT_FAMILY, RendererTypes.SELECT_ONE_CHOICE, new SelectOneChoiceRenderer());
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRendererUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRendererUnitTest.java
index 7178b01..2933aa7 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRendererUnitTest.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRendererUnitTest.java
@@ -22,6 +22,11 @@ package org.apache.myfaces.tobago.internal.renderkit.renderer;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.component.Tags;
 import org.apache.myfaces.tobago.component.UILink;
+import org.apache.myfaces.tobago.component.UISelectBooleanCheckbox;
+import org.apache.myfaces.tobago.component.UISelectItem;
+import org.apache.myfaces.tobago.component.UISelectManyCheckbox;
+import org.apache.myfaces.tobago.component.UISelectOneRadio;
+import org.apache.myfaces.tobago.component.UISeparator;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.junit.Assert;
 import org.junit.jupiter.api.Test;
@@ -31,6 +36,23 @@ import java.io.IOException;
 public class LinkRendererUnitTest extends RendererTestBase {
 
   @Test
+  public void booleanInsideLink() throws IOException {
+    final UILink c = (UILink) ComponentUtils.createComponent(
+        facesContext, Tags.link.componentType(), RendererTypes.Link, "id");
+    c.setLabel("dropdown");
+
+    final UISelectBooleanCheckbox s = (UISelectBooleanCheckbox) ComponentUtils.createComponent(
+        facesContext, Tags.selectBooleanCheckbox.componentType(), RendererTypes.SelectBooleanCheckbox, "id");
+    s.setLabel("boolean");
+
+    c.getChildren().add(s);
+
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/link/booleanInsideLink.html"), formattedResult());
+  }
+
+  @Test
   public void link() throws IOException {
     final UILink c = (UILink) ComponentUtils.createComponent(
         facesContext, Tags.link.componentType(), RendererTypes.Link, "id");
@@ -41,4 +63,84 @@ public class LinkRendererUnitTest extends RendererTestBase {
     Assert.assertEquals(loadHtml("renderer/link/link.html"), formattedResult());
   }
 
+  @Test
+  public void manyInsideLink() throws IOException {
+    final UILink c = (UILink) ComponentUtils.createComponent(
+        facesContext, Tags.link.componentType(), RendererTypes.Link, "id");
+    c.setLabel("dropdown");
+
+    final UISelectManyCheckbox s = (UISelectManyCheckbox) ComponentUtils.createComponent(
+        facesContext, Tags.selectManyCheckbox.componentType(), RendererTypes.SelectManyCheckbox, "many");
+    s.setLabel("many");
+
+    c.getChildren().add(s);
+
+    final UISelectItem i1 = (UISelectItem) ComponentUtils.createComponent(
+        facesContext, Tags.selectItem.componentType(), null, "i1");
+    i1.setItemLabel("Stratocaster");
+    s.getChildren().add(i1);
+    final UISelectItem i2 = (UISelectItem) ComponentUtils.createComponent(
+        facesContext, Tags.selectItem.componentType(), null, "i2");
+    i2.setItemLabel("Telecaster");
+    s.getChildren().add(i2);
+
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/link/manyInsideLink.html"), formattedResult());
+  }
+
+  @Test
+  public void radioInsideLink() throws IOException {
+    final UILink c = (UILink) ComponentUtils.createComponent(
+        facesContext, Tags.link.componentType(), RendererTypes.Link, "id");
+    c.setLabel("dropdown");
+
+    final UISelectOneRadio s = (UISelectOneRadio) ComponentUtils.createComponent(
+        facesContext, Tags.selectOneRadio.componentType(), RendererTypes.SelectOneRadio, "radio");
+    s.setLabel("radio");
+
+    c.getChildren().add(s);
+
+    final UISelectItem i1 = (UISelectItem) ComponentUtils.createComponent(
+        facesContext, Tags.selectItem.componentType(), null, "i1");
+    i1.setItemLabel("Stratocaster");
+    s.getChildren().add(i1);
+    final UISelectItem i2 = (UISelectItem) ComponentUtils.createComponent(
+        facesContext, Tags.selectItem.componentType(), null, "i2");
+    i2.setItemLabel("Telecaster");
+    s.getChildren().add(i2);
+
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/link/radioInsideLink.html"), formattedResult());
+  }
+
+  @Test
+  public void separatorInsideLink() throws IOException {
+    final UILink c = (UILink) ComponentUtils.createComponent(
+        facesContext, Tags.link.componentType(), RendererTypes.Link, "id");
+    c.setLabel("dropdown");
+
+    final UILink l1 = (UILink) ComponentUtils.createComponent(
+        facesContext, Tags.link.componentType(), RendererTypes.Link, "link1");
+    l1.setLabel("Link 1");
+    l1.setLink("https://www.apache.org/");
+
+    final UISeparator s = (UISeparator) ComponentUtils.createComponent(
+        facesContext, Tags.separator.componentType(), RendererTypes.Separator, "separator");
+
+    final UILink l2 = (UILink) ComponentUtils.createComponent(
+        facesContext, Tags.link.componentType(), RendererTypes.Link, "link2");
+    l2.setLabel("Link 2");
+    l2.setLink("https://www.apache.org/");
+
+    c.getChildren().add(l1);
+    c.getChildren().add(s);
+    c.getChildren().add(l2);
+
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/link/separatorInsideLink.html"), formattedResult());
+  }
+
 }
diff --git a/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html b/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
new file mode 100644
index 0000000..64b0466
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
@@ -0,0 +1,28 @@
+<!--
+ * 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.
+-->
+
+<tobago-dropdown id='id' class='dropdown'>
+  <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'>
+    <tobago-behavior event='click' decoupled='decoupled'>
+    </tobago-behavior><span>dropdown</span></button>
+  <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
+    <tobago-select-boolean-checkbox id='id' class='tobago-selectBooleanCheckbox form-check'>
+      <input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
+      <label class='form-check-label dropdown-item' for='id::field'></label>
+    </tobago-select-boolean-checkbox>
+  </div>
+</tobago-dropdown>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/link/manyInsideLink.html b/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
new file mode 100644
index 0000000..b15a572
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
@@ -0,0 +1,34 @@
+<!--
+ * 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.
+-->
+
+<tobago-dropdown id='id' class='dropdown'>
+  <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'>
+    <tobago-behavior event='click' decoupled='decoupled'>
+    </tobago-behavior><span>dropdown</span></button>
+  <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
+    <tobago-select-many-checkbox class='tobago-selectManyCheckbox'>
+      <div class='form-check'>
+        <input class='form-check-input' type='checkbox' name='many' id='many::0' value=''>
+        <label class='form-check-label dropdown-item' for='many::0'>Stratocaster</label>
+      </div>
+      <div class='form-check'>
+        <input class='form-check-input' type='checkbox' name='many' id='many::1' value=''>
+        <label class='form-check-label dropdown-item' for='many::1'>Telecaster</label>
+      </div>
+    </tobago-select-many-checkbox>
+  </div>
+</tobago-dropdown>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/link/radioInsideLink.html b/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
new file mode 100644
index 0000000..bbb9ed7
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
@@ -0,0 +1,34 @@
+<!--
+ * 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.
+-->
+
+<tobago-dropdown id='id' class='dropdown'>
+  <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'>
+    <tobago-behavior event='click' decoupled='decoupled'>
+    </tobago-behavior><span>dropdown</span></button>
+  <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
+    <tobago-select-one-radio class='tobago-selectOneRadio'>
+      <div class='form-check'>
+        <input class='form-check-input' type='radio' checked='checked' name='radio' id='radio::0' value=''>
+        <label class='form-check-label dropdown-item' for='radio::0'>Stratocaster</label>
+      </div>
+      <div class='form-check'>
+        <input class='form-check-input' type='radio' checked='checked' name='radio' id='radio::1' value=''>
+        <label class='form-check-label dropdown-item' for='radio::1'>Telecaster</label>
+      </div>
+    </tobago-select-one-radio>
+  </div>
+</tobago-dropdown>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html b/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
new file mode 100644
index 0000000..fcc0152
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
@@ -0,0 +1,32 @@
+<!--
+ * 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.
+-->
+
+<tobago-dropdown id='id' class='dropdown'>
+  <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'>
+    <tobago-behavior event='click' decoupled='decoupled'>
+    </tobago-behavior><span>dropdown</span></button>
+  <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
+    <a id='link1' name='link1' href='https://www.apache.org/' class='tobago-link dropdown-item'>
+      <tobago-behavior event='click' omit='omit' decoupled='decoupled'>
+      </tobago-behavior><span>Link 1</span></a>
+    <tobago-separator id='separator' class='dropdown-divider'>
+    </tobago-separator>
+    <a id='link2' name='link2' href='https://www.apache.org/' class='tobago-link dropdown-item'>
+      <tobago-behavior event='click' omit='omit' decoupled='decoupled'>
+      </tobago-behavior><span>Link 2</span></a>
+  </div>
+</tobago-dropdown>
\ No newline at end of file