/// <summary>
        /// Processes the pipeline.
        /// </summary>
        protected override void ProcessRecord()
        {
            if (!CheckAndPrepareInput(this))
            {
                return;
            }

            // 20120823
            // 20131109
            //foreach (AutomationElement inputObject in this.InputObject) {
            foreach (IUiElement inputObject in InputObject)
            {
                string strData = String.Empty;
                // 20131109
                //System.Windows.Automation.AutomationElement _control =
                IUiElement currentControl =
                    // 20120823
                    //this.InputObject;
                    inputObject;
                // 20131208
                // TablePattern tblPattern = null;
                ITablePattern tblPattern = null;

                try {
                    tblPattern =
                        // 20120823
                        //this.InputObject.GetCurrentPattern(classic.TablePattern.Pattern)
                        // 20131208
                        // inputObject.GetCurrentPattern(classic.TablePattern.Pattern)
                        // inputObject.GetCurrentPattern<ITablePattern, TablePattern>(classic.TablePattern.Pattern)
                        // as TablePattern;
                        inputObject.GetCurrentPattern <ITablePattern>(classic.TablePattern.Pattern);

                    bool res1 =
                        UiaHelper.GetHeaderItems(ref currentControl, out strData, Delimiter);

                    if (res1)
                    {
                        WriteObject(strData);
                    }
                    else
                    {
                        WriteVerbose(this, strData);
                    }

                    // temporary!!!
                    // Selection
                    // 20131109
                    //System.Windows.Automation.AutomationElement[] selectedItems = null;
                    IUiElement[] selectedItems = null;
                    if (SelectedOnly)
                    {
                        // if there's a selection, get items in the selection
                        try
                        {
                            // 20131208
                            // SelectionPattern selPattern = inputObject.GetCurrentPattern(
                            // SelectionPattern selPattern = inputObject.GetCurrentPattern<ISelectionPattern, SelectionPattern>(
                            // SelectionPattern.Pattern)
                            // as SelectionPattern;
                            // SelectionPattern selPattern = inputObject.GetCurrentPattern<ISelectionPattern>(classic.SelectionPattern.Pattern);
                            ISelectionPattern selPattern = inputObject.GetCurrentPattern <ISelectionPattern>(classic.SelectionPattern.Pattern);

                            /*
                             * System.Windows.Automation.SelectionPattern selPattern;
                             * selPattern =
                             *  // 20120823
                             *  //this.InputObject.GetCurrentPattern(
                             *  inputObject.GetCurrentPattern(
                             *      System.Windows.Automation.SelectionPattern.Pattern)
                             *      as System.Windows.Automation.SelectionPattern;
                             */
                            selectedItems =
                                // 20131109
                                //selPattern.Current.GetSelection();
                                // 20131119
                                //new UiEltCollection(selPattern.Current.GetSelection()).Cast<UiElement>().ToArray();
                                AutomationFactory.GetUiEltCollection(selPattern.Current.GetSelection()).Cast <UiElement>().ToArray();
                        }
                        catch (Exception eSelection) {
                            WriteDebug(this, eSelection.Message);
                            WriteVerbose(this, "there wasn't a selection");
                        }
                    }


                    // temporary!!!
                    // get rows
                    if (tblPattern != null && tblPattern.Current.RowCount <= 0)
                    {
                        continue;
                    }

                    /*
                     * if (tblPattern.Current.RowCount <= 0) continue;
                     */
                    // 20130318
                    //RunOnSuccessScriptBlocks(this);
                    RunOnSuccessScriptBlocks(this, null);

                    for (int rowsCounter = 0;
                         rowsCounter < tblPattern.Current.RowCount;
                         rowsCounter++)
                    {
                        if (SelectedOnly && selectedItems.Length > 0)
                        {
                        }
                        else
                        {
                            // without a selection
                            string outString =
                                // 20131208
                                // UiaHelper.GetOutputStringUsingTableGridPattern<TablePattern>(
                                UiaHelper.GetOutputStringUsingTableGridPattern <ITablePattern>(
                                    tblPattern,
                                    tblPattern.Current.ColumnCount,
                                    rowsCounter,
                                    Delimiter);
                            // getOutputString(ref tblPattern,
                            // rowsCounter);
                            // output a row
                            WriteObject(outString);
                        }
                    }
                    //}

                    /*
                     * if (tblPattern.Current.RowCount > 0) {
                     *  // 20130318
                     *  //RunOnSuccessScriptBlocks(this);
                     *  RunOnSuccessScriptBlocks(this, null);
                     *      for (int rowsCounter = 0;
                     *           rowsCounter<tblPattern.Current.RowCount;
                     *           rowsCounter++) {
                     *          if (this.SelectedOnly && selectedItems.Length > 0) {
                     *          } else {
                     *              // without a selection
                     *              string outString =
                     *                  UiaHelper.GetOutputStringUsingTableGridPattern<System.Windows.Automation.TablePattern>(
                     *                      tblPattern,
                     *                      tblPattern.Current.ColumnCount,
                     *                      rowsCounter,
                     *                      this.Delimiter);
                     * // getOutputString(ref tblPattern,
                     * // rowsCounter);
                     *              // output a row
                     *              this.WriteObject(outString);
                     *          }
                     *      }
                     *  //}
                     * }
                     */
                } catch {
                    if (tblPattern != null)
                    {
                        continue;
                    }
                    WriteVerbose(this, "couldn't get TablePattern");
                    WriteVerbose(this, "trying to enumerate columns and rows");


                    bool res2 =
                        UiaHelper.GetHeaders(ref currentControl, out strData, Delimiter);
                    if (res2)
                    {
                        WriteObject(strData);
                    }
                    else
                    {
                        WriteVerbose(this, strData);
                    }

                    List <string> rows =
                        // 20120823
                        //UiaHelper.GetOutputStringUsingItemsValuePattern(this.InputObject,
                        UiaHelper.GetOutputStringUsingItemsValuePattern(inputObject,
                                                                        Delimiter);
                    if (rows.Count <= 0)
                    {
                        continue;
                    }
                    // 20130318
                    //RunOnSuccessScriptBlocks(this);
                    RunOnSuccessScriptBlocks(this, null);
                    foreach (string row in rows)
                    {
                        WriteObject(row);
                    }

                    // 20131119
                    // disposal
                    rows = null;

                    /*
                     * if (rows.Count > 0) {
                     *  // 20130318
                     *  //RunOnSuccessScriptBlocks(this);
                     *  RunOnSuccessScriptBlocks(this, null);
                     *  foreach (string row in rows) {
                     *      this.WriteObject(row);
                     *  }
                     * }
                     */

                    // WriteObject(this, false);
                    // return;

                    /*
                     * if (tblPattern == null)
                     * {
                     *  this.WriteVerbose(this, "couldn't get TablePattern");
                     *  this.WriteVerbose(this, "trying to enumerate columns and rows");
                     *
                     *
                     *  bool res2 =
                     *      UiaHelper.GetHeaders(ref _control, out strData, this.Delimiter);
                     *  if (res2) {
                     *      this.WriteObject(strData);
                     *  } else {
                     *      this.WriteVerbose(this, strData);
                     *  }
                     *
                     *  System.Collections.Generic.List<string> rows =
                     *      // 20120823
                     *      //UiaHelper.GetOutputStringUsingItemsValuePattern(this.InputObject,
                     *      UiaHelper.GetOutputStringUsingItemsValuePattern(inputObject,
                     *                                                      this.Delimiter);
                     *  if (rows.Count > 0) {
                     *      // 20130318
                     *      //RunOnSuccessScriptBlocks(this);
                     *      RunOnSuccessScriptBlocks(this, null);
                     *      foreach (string row in rows) {
                     *          this.WriteObject(row);
                     *      }
                     *  }
                     *  // WriteObject(this, false);
                     *  // return;
                     * }
                     */
                }
            } // 20120823
        }