@Override
  protected void doDecode(FacesContext context, UIComponent component) {
    super.doDecode(context, component);

    UITab tab = (UITab) component;
    UITabPanel panel = tab.getPane();

    Map<String, String> requestParameterMap = context.getExternalContext().getRequestParameterMap();

    if (AjaxRendererUtils.isAjaxRequest(context)
        && tab.getSwitchTypeOrDefault().equals(UISwitchablePanel.AJAX_METHOD)
        && requestParameterMap.get(tab.getClientId(context)) != null) {

      // add toggle panel itself to rendered list of components
      AjaxRendererUtils.addRegionByName(context, panel, panel.getId());
      AjaxRendererUtils.addRegionsFromComponent(tab, context);

      AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
      Set<String> toProcess = ajaxContext.getAjaxAreasToProcess();
      if (toProcess == null) {
        toProcess = new HashSet<String>(1);
        ajaxContext.setAjaxAreasToProcess(toProcess);
      }
      toProcess.add(panel.getClientId(context));

      ajaxContext.addAreasToProcessFromComponent(context, tab);
    }
  }
  /* (non-Javadoc)
   * @see javax.faces.render.Renderer#encodeChildren(javax.faces.context.FacesContext, javax.faces.component.UIComponent)
   */
  public void encodeChildren(FacesContext context, UIComponent component) throws IOException {
    //
    UIAjaxOutputPanel panel = (UIAjaxOutputPanel) component;
    if ("none".equals(panel.getLayout())) {
      if (component.getChildCount() > 0) {
        AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
        boolean ajaxRequest = ajaxContext.isAjaxRequest();
        Set<String> ajaxRenderedAreas = ajaxContext.getAjaxRenderedAreas();
        for (UIComponent child : component.getChildren()) {
          String childId = child.getClientId(context);
          if (child.isRendered()) {
            renderChild(context, child);
          } else {
            // Render "dummy" span.
            ResponseWriter out = context.getResponseWriter();
            out.startElement(HTML.SPAN_ELEM, child);
            out.writeAttribute(HTML.id_ATTRIBUTE, childId, HTML.id_ATTRIBUTE);
            out.writeAttribute(HTML.style_ATTRIBUTE, "display: none;", "style");
            out.endElement(HTML.SPAN_ELEM);
          }
          // register child as rendered
          if (ajaxRequest && null != ajaxRenderedAreas) {
            ajaxRenderedAreas.add(childId);
          }
        }
      }

    } else {
      renderChildren(context, component);
    }
  }
 @SuppressWarnings("unchecked")
 private void put2ResponseData(String key, Object value) {
   AjaxContext ajaxContext = getAjaxContext();
   if (ajaxContext != null) {
     Map<String, Object> data = (Map<String, Object>) ajaxContext.getResponseData();
     if (null == data) {
       data = new HashMap<String, Object>();
       ajaxContext.setResponseData(data);
     }
     data.put(key, value);
   }
 }
  protected void doDecode(FacesContext facesContext, UIComponent uiComponent) {

    // super.decode must not be called, because value is handled here
    if (isSubmitted(facesContext, uiComponent)) {
      ActionEvent event;
      event = new ActionEvent(uiComponent);
      uiComponent.queueEvent(event);
      uiComponent.queueEvent(new AjaxEvent(uiComponent));
      // Check areas for processing
      if (uiComponent instanceof AjaxComponent) {
        AjaxComponent ajaxComponent = (AjaxComponent) uiComponent;
        Set<String> toProcess = AjaxRendererUtils.asSet(ajaxComponent.getProcess());
        if (null != toProcess) {
          HashSet<String> componentIdsToProcess = new HashSet<String>();
          for (String componentId : toProcess) {
            UIComponent component = getUtils().findComponentFor(uiComponent, componentId);
            if (null != component) {
              componentIdsToProcess.add(component.getClientId(facesContext));
            } else {
              componentIdsToProcess.add(componentId);
            }
          }
          AjaxContext.getCurrentInstance(facesContext).setAjaxAreasToProcess(componentIdsToProcess);
        }
      }
    }
  }
 protected boolean isSubmitted(FacesContext facesContext, UIComponent uiComponent) {
   // Componet accept only ajax requests.
   if (!AjaxContext.getCurrentInstance(facesContext).isAjaxRequest()) {
     return false;
   }
   if (getUtils().isBooleanAttribute(uiComponent, "disabled")) {
     return false;
   }
   String clientId = uiComponent.getClientId(facesContext);
   Map<String, String> paramMap = facesContext.getExternalContext().getRequestParameterMap();
   Object value = paramMap.get(clientId);
   boolean submitted = null != value;
   if (submitted && _log.isDebugEnabled()) {
     _log.debug("Decode submit of the Ajax component " + clientId);
   }
   return submitted;
 }