protected void renderFormItem(
     Renderer renderer,
     StringOutput sb,
     FormItem item,
     URLBuilder ubu,
     Translator translator,
     RenderResult renderResult,
     String[] args) {
   if (item != null) {
     Component cmp = item.getComponent();
     cmp.getHTMLRendererSingleton().render(renderer, sb, cmp, ubu, translator, renderResult, args);
   }
 }
  @Override
  public void validate(UserRequest ureq, ValidationResult vr) {
    super.validate(ureq, vr);

    JSAndCSSAdder jsadder = vr.getJsAndCSSAdder();
    if (jsFileNames != null) {
      int len = jsFileNames.length;
      for (int i = 0; i < len; i++) {
        jsadder.addRequiredStaticJsFile(jsFileNames[i]);
      }
    }
    if (cssFileName != null) {
      jsadder.addRequiredCSSPath("css/" + cssFileName, forceCssRemove, cssFileIndex);
    }
    if (cssPathNames != null) {
      for (String cssPath : cssPathNames) {
        Integer index = cssPathNamesIndexes != null ? cssPathNamesIndexes.get(cssPath) : null;
        if (index == null && baseClass == null) {
          jsadder.addStaticCSSPath(cssPath);
        } else {
          jsadder.addRequiredCSSPath(cssPath, true, index);
        }
      }
    }
    if (rawHeader != null) {
      jsadder.addRequiredRawHeader(baseClass, rawHeader);
    }
    if (fullPageRefresh) {
      jsadder.requireFullPageRefresh();
    }
    if (refreshIntervall != -1 && baseClass != null) {
      jsadder.setRequiredRefreshInterval(baseClass, refreshIntervall);
    }
  }
 /**
  * @param componentName
  * @return true if the component with name componentName is a child of the current container and
  *     if this component is visible
  */
 public boolean visible(String componentName) {
   Component source = renderer.findComponent(componentName);
   return (source != null && source.isVisible());
 }
  @Override
  public void render(
      Renderer renderer,
      StringOutput sb,
      Component source,
      URLBuilder ubu,
      Translator translator,
      RenderResult renderResult,
      String[] args) {

    FlexiTableComponent ftC = (FlexiTableComponent) source;
    FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
    String id = ftC.getFormDispatchId();

    renderHeaderButtons(renderer, sb, ftE, ubu, translator, renderResult, args);

    if (ftE.getTableDataModel().getRowCount() == 0
        && StringHelper.containsNonWhitespace(ftE.getEmtpyTableMessageKey())) {
      String emptyMessageKey = ftE.getEmtpyTableMessageKey();
      sb.append("<div class='o_info'>")
          .append(translator.translate(emptyMessageKey))
          .append("</div>");
    } else {
      sb.append("<div class='o_table_wrapper o_table_flexi")
          .append(" o_table_edit", ftE.isEditMode());
      String css = ftE.getElementCssClass();
      if (css != null) {
        sb.append(" ").append(css);
      }
      switch (ftE.getRendererType()) {
        case custom:
          sb.append(" o_rendertype_custom");
          break;
        case classic:
          sb.append(" o_rendertype_classic");
          break;
      }
      sb.append("'");
      String wrapperSelector = ftE.getWrapperSelector();
      if (wrapperSelector != null) {
        sb.append(" id='").append(wrapperSelector).append("'");
      }
      sb.append("><table id=\"")
          .append(id)
          .append("\" class=\"table table-condensed table-striped table-hover\">");

      // render headers
      renderHeaders(sb, ftC, translator);
      // render body
      sb.append("<tbody>");
      renderBody(renderer, sb, ftC, ubu, translator, renderResult);
      sb.append("</tbody></table>");
      renderFooterButtons(sb, ftC, translator);
      // draggable
      if (ftE.getColumnIndexForDragAndDropLabel() > 0) {
        sb.append("<script type='text/javascript'>")
            .append("/* <![CDATA[ */ \n")
            .append("jQuery(function() {\n")
            .append(" jQuery('.o_table_flexi table tr').draggable({\n")
            .append("  containment: '#o_main',\n")
            .append("	 zIndex: 10000,\n")
            .append("	 cursorAt: {left: 0, top: 0},\n")
            .append("	 accept: function(event,ui){ return true; },\n")
            .append("	 helper: function(event,ui,zt) {\n")
            .append("    var helperText = jQuery(this).children('.o_dnd_label').text();\n")
            .append(
                "    return jQuery(\"<div class='ui-widget-header o_table_drag'>\" + helperText + \"</div>\").appendTo('body').css('zIndex',5).show();\n")
            .append("  }\n")
            .append("});\n")
            .append("});\n")
            .append("/* ]]> */\n")
            .append("</script>\n");
      }

      sb.append("</div>");
    }

    // source
    if (source.isEnabled()) {
      FormJSHelper.appendFlexiFormDirty(sb, ftE.getRootForm(), id);
    }
  }