@Override
  public void handleControlStart(
      String uri,
      String localname,
      String qName,
      Attributes attributes,
      String staticId,
      final String effectiveId,
      XFormsSingleNodeControl xformsControl)
      throws SAXException {

    final String groupElementName = getContainingElementName();
    final String xhtmlPrefix = handlerContext.findXHTMLPrefix();
    final String groupElementQName = XMLUtils.buildQName(xhtmlPrefix, groupElementName);

    final ElementHandlerController controller = handlerContext.getController();

    // Get classes
    // TODO: should use getContainerAttributes() instead?
    final StringBuilder classes = getInitialClasses(uri, localname, attributes, null);
    handleMIPClasses(classes, getPrefixedId(), xformsControl);

    final ContentHandler contentHandler = controller.getOutput();

    // Start xhtml:fieldset element if needed
    if (!handlerContext.isNewXHTMLLayout())
      contentHandler.startElement(
          XMLConstants.XHTML_NAMESPACE_URI,
          groupElementName,
          groupElementQName,
          getAttributes(attributes, classes.toString(), effectiveId));

    // Output an xhtml:legend element if and only if there is an xforms:label element. This help
    // with
    // styling in particular.
    final boolean hasLabel = XFormsControl.hasLabel(containingDocument, getPrefixedId());
    if (hasLabel) {

      // Handle label classes
      reusableAttributes.clear();
      reusableAttributes.addAttribute(
          "", "class", "class", ContentHandlerHelper.CDATA, getLabelClasses(xformsControl));
      // The id should never be need on <legend>
      //            reusableAttributes.addAttribute("", "id", "id", ContentHandlerHelper.CDATA,
      // getLHHACId(effectiveId, LHHAC_CODES.get(LHHAC.LABEL)));

      // Output xhtml:legend with label content
      final String legendQName = XMLUtils.buildQName(xhtmlPrefix, "legend");
      contentHandler.startElement(
          XMLConstants.XHTML_NAMESPACE_URI, "legend", legendQName, reusableAttributes);
      {
        final String labelValue = getLabelValue(xformsControl);
        if (StringUtils.isNotEmpty(labelValue))
          contentHandler.characters(labelValue.toCharArray(), 0, labelValue.length());
      }
      contentHandler.endElement(XMLConstants.XHTML_NAMESPACE_URI, "legend", legendQName);
    }
  }
  public void execute(
      XFormsActionInterpreter actionInterpreter,
      Element actionElement,
      Scope actionScope,
      boolean hasOverriddenContext,
      Item overriddenContext) {

    final XFormsContainingDocument containingDocument = actionInterpreter.containingDocument();

    // Resolve all attributes as AVTs
    final String dialogStaticOrEffectiveId = actionInterpreter.resolveAVT(actionElement, "dialog");
    final String neighborEffectiveId;
    {
      final String neighborStaticOrEffectiveId =
          actionInterpreter.resolveAVT(actionElement, "neighbor");
      final XFormsControl neighbor =
          (XFormsControl)
              ((neighborStaticOrEffectiveId != null)
                  ? actionInterpreter.resolveOrFindByEffectiveId(
                      actionElement, neighborStaticOrEffectiveId)
                  : null);
      neighborEffectiveId = (neighbor != null) ? neighbor.getEffectiveId() : null;
    }
    final boolean constrainToViewport;
    {
      final String constrain = actionInterpreter.resolveAVT(actionElement, "constrain");
      constrainToViewport = !"false".equals(constrain);
    }

    if (dialogStaticOrEffectiveId != null) {
      // Dispatch xxforms-dialog-open event to dialog
      final Object controlObject =
          actionInterpreter.resolveOrFindByEffectiveId(actionElement, dialogStaticOrEffectiveId);
      if (controlObject instanceof XXFormsDialogControl) {
        final XXFormsDialogControl targetDialog = (XXFormsDialogControl) controlObject;

        // Remove focus if any
        containingDocument.setClientFocusEffectiveControlId(null);

        final XFormsEvent newEvent =
            new XXFormsDialogOpenEvent(
                containingDocument, targetDialog, neighborEffectiveId, constrainToViewport);
        addContextAttributes(actionInterpreter, actionElement, newEvent);
        targetDialog.getXBLContainer(containingDocument).dispatchEvent(newEvent);

        // Check if form author has set focus while dialog was opening, and if not focus on dialog
        final String currentFocusEffectiveId =
            containingDocument.getClientFocusControlEffectiveId();
        if (currentFocusEffectiveId == null && targetDialog.isVisible())
          targetDialog
              .getXBLContainer()
              .dispatchEvent(new XFormsFocusEvent(containingDocument, targetDialog));

      } else {
        final IndentedLogger indentedLogger = actionInterpreter.indentedLogger();
        if (indentedLogger.isDebugEnabled())
          indentedLogger.logDebug(
              "xxforms:show",
              "dialog does not refer to an existing xxforms:dialog element, ignoring action",
              "dialog id",
              dialogStaticOrEffectiveId);
      }
    }
  }