docs: @Override
      public boolean visitTree(VisitContext context, VisitCallback callback)
      {
          // push the Component to EL
          pushComponentToEL(context.getFacesContext(), this);
          try
          {
              if (!isVisitable(context))
              {
                  return false;
              }
  
              boolean isCachedFacesContext = isCachedFacesContext();
              if (!isCachedFacesContext)
              {
                  setCachedFacesContext(context.getFacesContext());
              }
              // save the current row index
              int oldRowIndex = getRowIndex();
              // set row index to -1 to process the facets and to get the rowless clientId
              setRowIndex(-1);
              try
              {
                  VisitResult visitResult = context.invokeVisitCallback(this,
                          callback);
                  switch (visitResult)
                  {
                  //we are done nothing has to be processed anymore
                  case COMPLETE:
                      return true;
  
                  case REJECT:
                      return false;
  
                      //accept
                  default:
                      // determine if we need to visit our children
                      Collection<String> subtreeIdsToVisit = context
                              .getSubtreeIdsToVisit(this);
                      boolean doVisitChildren = subtreeIdsToVisit != null
                              && !subtreeIdsToVisit.isEmpty();
                      if (doVisitChildren)
                      {
                          // visit the facets of the component
                          if (getFacetCount() > 0)
                          {
                              for (UIComponent facet : getFacets().values())
                              {
                                  if (facet.visitTree(context, callback))
                                  {
                                      return true;
                                  }
                              }
                          }
  
                          boolean skipIterationHint = context.getHints().contains(VisitHint.SKIP_ITERATION);
                          if (skipIterationHint)
                          {
                              // If SKIP_ITERATION is enabled, do not take into account rows.
                              for (int i = 0, childCount = getChildCount(); i < childCount; i++ )
                              {
                                  UIComponent child = getChildren().get(i);
                                  if (child.visitTree(context, callback))
                                  {
                                      return true;
                                  }
                              }
                          }
                          else
                          {
                              // visit every column directly without visiting its children
                              // (the children of every UIColumn will be visited later for
                              // every row) and also visit the column's facets
                              for (int i = 0, childCount = getChildCount(); i < childCount; i++)
                              {
                                  UIComponent child = getChildren().get(i);
                                  if (child instanceof UIColumn)
                                  {
                                      VisitResult columnResult = context.invokeVisitCallback(child, callback);
                                      if (columnResult == VisitResult.COMPLETE)
                                      {
                                          return true;
                                      }
                                      if (child.getFacetCount() > 0)
                                      {
                                          for (UIComponent facet : child.getFacets().values())
                                          {
                                              if (facet.visitTree(context, callback))
                                              {
                                                  return true;
                                              }
                                          }
                                      }
                                  }
                              }
                              // iterate over the rows
                              int rowsToProcess = getRows();
                              // if getRows() returns 0, all rows have to be processed
                              if (rowsToProcess == 0)
                              {
                                  rowsToProcess = getRowCount();
                              }
                              int rowIndex = getFirst();
                              for (int rowsProcessed = 0; rowsProcessed < rowsToProcess; rowsProcessed++, rowIndex++)
                              {
                                  setRowIndex(rowIndex);
                                  if (!isRowAvailable())
                                  {
                                      return false;
                                  }
                                  // visit the children of every child of the UIData that is an instance of UIColumn
                                  for (int i = 0, childCount = getChildCount(); i < childCount; i++)
                                  {
                                      UIComponent child = getChildren().get(i);
                                      if (child instanceof UIColumn)
                                      {
                                          for (int j = 0, grandChildCount = child.getChildCount();
                                               j < grandChildCount; j++)
                                          {
                                              UIComponent grandchild = child.getChildren().get(j);
                                              if (grandchild.visitTree(context, callback))
                                              {
                                                  return true;
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                      }
                  }
              }
              finally
              {
                  // restore the old row index
                  setRowIndex(oldRowIndex);
                  if (!isCachedFacesContext)
                  {
                      setCachedFacesContext(null);
                  }
              }
          }
          finally
          {
              // pop the component from EL
              popComponentFromEL(context.getFacesContext());
          }
          // Return false to allow the visiting to continue
          return false;
      }