private static  AccessibilityReplacementField[] InterpretReplacementFieldsValue(IList value)
 {
     if (value != null)
     {
         var retVal = value as AccessibilityReplacementField[];
         if (retVal == null)
         {
             retVal = new AccessibilityReplacementField[value.Count];
             value.CopyTo(retVal, 0);
         }
         return(retVal);
     }
     return(null);
 }
 private string FormatReplacementFields(
     int row, int column, ref VirtualTreeItemInfo info, string formatString, AccessibilityReplacementField[] replacementFields,
     string[] imageDescriptions, string[] stateImageDescriptions)
 {
     var replacementCount = replacementFields.Length;
     var displayData = VirtualTreeDisplayData.Empty;
     var haveDisplayData = false;
     var fields = new string[replacementCount];
     var branch = info.Branch;
     var locRow = info.Row;
     var locCol = info.Column;
     StringBuilder builder = null;
     AccessibilityReplacementField curField;
     var culture = CultureInfo.CurrentUICulture;
     for (var i = 0; i < replacementCount; ++i)
     {
         curField = replacementFields[i];
         switch (curField)
         {
             case AccessibilityReplacementField.ColumnHeader:
                 if (myHeaderBounds.HasHeaders)
                 {
                     fields[i] = myHeaderBounds.Headers[column].Text;
                 }
                 break;
             case AccessibilityReplacementField.GlobalRow0:
                 fields[i] = row.ToString(culture);
                 break;
             case AccessibilityReplacementField.GlobalRow1:
                 fields[i] = (row + 1).ToString(culture);
                 break;
             case AccessibilityReplacementField.GlobalRowText0:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowAccDesc), row);
                 break;
             case AccessibilityReplacementField.GlobalRowText1:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowAccDesc), row + 1);
                 break;
             case AccessibilityReplacementField.GlobalColumn0:
                 fields[i] = column.ToString(culture);
                 break;
             case AccessibilityReplacementField.GlobalColumn1:
                 fields[i] = (column + 1).ToString(culture);
                 break;
             case AccessibilityReplacementField.GlobalColumnText0:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.ColumnAccDesc), column);
                 break;
             case AccessibilityReplacementField.GlobalColumnText1:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowAccDesc), column + 1);
                 break;
             case AccessibilityReplacementField.GlobalRowAndColumnText0:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowColumnAccDesc), row, column);
                 break;
             case AccessibilityReplacementField.GlobalRowAndColumnText1:
                 fields[i] = string.Format(
                     culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowColumnAccDesc), row + 1, column + 1);
                 break;
             case AccessibilityReplacementField.LocalRow0:
                 fields[i] = locRow.ToString(culture);
                 break;
             case AccessibilityReplacementField.LocalRow1:
                 fields[i] = (locRow + 1).ToString(culture);
                 break;
             case AccessibilityReplacementField.LocalRowText0:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowAccDesc), locRow);
                 break;
             case AccessibilityReplacementField.LocalRowText1:
                 fields[i] = string.Format(culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowAccDesc), locRow + 1);
                 break;
             case AccessibilityReplacementField.LocalRowOfTotal:
                 fields[i] = string.Format(
                     culture, VirtualTreeStrings.GetString(VirtualTreeStrings.RowOfTotalAccDesc), locRow + 1, branch.VisibleItemCount);
                 break;
             case AccessibilityReplacementField.ChildRowCount:
             case AccessibilityReplacementField.ChildRowCountText:
                 {
                     var descendantCount = Tree.GetDescendantItemCount(row, column, false, false);
                     if (curField == AccessibilityReplacementField.ChildRowCountText)
                     {
                         fields[i] = string.Format(
                             culture, VirtualTreeStrings.GetString(VirtualTreeStrings.ChildRowNumberAccDesc), descendantCount);
                     }
                     else
                     {
                         fields[i] = descendantCount.ToString(culture);
                     }
                     break;
                 }
             case AccessibilityReplacementField.ColumnCount:
             case AccessibilityReplacementField.ColumnCountText:
                 {
                     var columnCount = 1;
                     if (myMctree != null)
                     {
                         var mcBranch = branch as IMultiColumnBranch;
                         if (mcBranch != null)
                         {
                             // UNDONE: Column Permutation
                             columnCount = Math.Min(
                                 myMctree.ColumnCount,
                                 (0 != (branch.Features & BranchFeatures.JaggedColumns))
                                     ? mcBranch.ColumnCount
                                     : mcBranch.GetJaggedColumnCount(locRow));
                         }
                     }
                     if (curField == AccessibilityReplacementField.ColumnCountText)
                     {
                         fields[i] = string.Format(
                             culture, VirtualTreeStrings.GetString(VirtualTreeStrings.ColumnNumberAccDesc), columnCount);
                     }
                     else
                     {
                         fields[i] = columnCount.ToString(culture);
                     }
                     break;
                 }
             case AccessibilityReplacementField.DisplayText:
                 fields[i] = branch.GetText(locRow, locCol);
                 break;
             case AccessibilityReplacementField.ImageTipText:
                 fields[i] = branch.GetTipText(locRow, locCol, ToolTipType.Icon);
                 break;
             case AccessibilityReplacementField.PrimaryImageText:
             case AccessibilityReplacementField.PrimaryImageAndOverlaysText:
             case AccessibilityReplacementField.StateImageText:
                 {
                     if (!haveDisplayData)
                     {
                         displayData = branch.GetDisplayData(
                             locRow, locCol,
                             new VirtualTreeDisplayDataMasks(
                                 VirtualTreeDisplayMasks.Image | VirtualTreeDisplayMasks.ImageOverlays
                                 | VirtualTreeDisplayMasks.StateImage, 0));
                     }
                     string[] descriptions;
                     int imageIndex;
                     int descriptionsLength;
                     switch (curField)
                     {
                         case AccessibilityReplacementField.PrimaryImageAndOverlaysText:
                         case AccessibilityReplacementField.PrimaryImageText:
                             imageIndex = displayData.Image;
                             if (imageIndex >= 0)
                             {
                                 descriptions = (displayData.ImageList == null) ? myImageDescriptions : imageDescriptions;
                                 if (descriptions != null)
                                 {
                                     descriptionsLength = descriptions.Length;
                                     if (imageIndex < descriptionsLength)
                                     {
                                         fields[i] = descriptions[imageIndex];
                                     }
                                     if (curField == AccessibilityReplacementField.PrimaryImageAndOverlaysText)
                                     {
                                         imageIndex = displayData.OverlayIndex;
                                         if (imageIndex != -1)
                                         {
                                             var separator = culture.TextInfo.ListSeparator;
                                             var overlayIndices = displayData.OverlayIndices;
                                             if (overlayIndices == null)
                                             {
                                                 if (imageIndex < descriptionsLength)
                                                 {
                                                     fields[i] = string.Concat(fields[i], separator, descriptions[imageIndex]);
                                                 }
                                             }
                                             else
                                             {
                                                 if (builder == null)
                                                 {
                                                     builder = new StringBuilder();
                                                 }
                                                 else
                                                 {
                                                     builder.Length = 0;
                                                 }
                                                 var startString = fields[i];
                                                 if (startString != null
                                                     && startString.Length != 0)
                                                 {
                                                     builder.Append(fields[i]);
                                                 }
                                                 else
                                                 {
                                                     // Keep track of this value so we can rip the leading
                                                     // separator later if the primary image had no text
                                                     startString = null;
                                                 }
                                                 // Use the index as a list of bits into the indices array.
                                                 // Do this typed if possible. It returns an IList to be CLS
                                                 // compliant. Note that this differs from the drawing routines
                                                 // for the images, which draw backwards, while this contatenates forwards.
                                                 int[] indicesArray;
                                                 IList<int> typedList;
                                                 var overlayIndex = imageIndex;
                                                 int indicesCount;
                                                 int curIndex;
                                                 int curBit;
                                                 indicesCount = overlayIndices.Count;
                                                 curBit = 1;
                                                 if (null != (indicesArray = overlayIndices as int[]))
                                                 {
                                                     for (curIndex = 0; curIndex < indicesCount; ++curIndex)
                                                     {
                                                         if (0 != (curBit & overlayIndex))
                                                         {
                                                             imageIndex = indicesArray[curIndex];
                                                             if (imageIndex < descriptionsLength)
                                                             {
                                                                 builder.Append(separator);
                                                                 builder.Append(descriptions[imageIndex]);
                                                             }
                                                         }
                                                         curBit <<= 1;
                                                     }
                                                 }
                                                 else if (null != (typedList = overlayIndices as IList<int>))
                                                 {
                                                     for (curIndex = 0; curIndex < indicesCount; ++curIndex)
                                                     {
                                                         if (0 != (curBit & overlayIndex))
                                                         {
                                                             imageIndex = typedList[curIndex];
                                                             if (imageIndex < descriptionsLength)
                                                             {
                                                                 builder.Append(separator);
                                                                 builder.Append(descriptions[imageIndex]);
                                                             }
                                                         }
                                                         curBit <<= 1;
                                                     }
                                                 }
                                                 else
                                                 {
                                                     for (curIndex = 0; curIndex < indicesCount; ++curIndex)
                                                     {
                                                         if (0 != (curBit & overlayIndex))
                                                         {
                                                             imageIndex = (int)overlayIndices[curIndex];
                                                             if (imageIndex < descriptionsLength)
                                                             {
                                                                 builder.Append(separator);
                                                                 builder.Append(descriptions[imageIndex]);
                                                             }
                                                         }
                                                         curBit <<= 1;
                                                     }
                                                 }
                                                 if (startString == null)
                                                 {
                                                     // Strip leading separator if we had nothing to start with
                                                     var separatorLength = separator.Length;
                                                     fields[i] = builder.ToString(separatorLength, builder.Length - separatorLength);
                                                 }
                                                 else
                                                 {
                                                     fields[i] = builder.ToString();
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                             break;
                         case AccessibilityReplacementField.StateImageText:
                             if (displayData.StateImageIndex >= 0)
                             {
                                 descriptions = (displayData.StateImageList == null)
                                                    ? myStateImageDescriptions
                                                    : stateImageDescriptions;
                                 if (descriptions != null
                                     && displayData.StateImageIndex < descriptions.Length)
                                 {
                                     fields[i] = descriptions[displayData.StateImageIndex];
                                 }
                             }
                             break;
                     }
                 }
                 break;
         }
     }
     return string.Format(culture, formatString, fields);
 }
 /// <summary>
 ///     Construct accessibility data with help, name, description, image text, and state image text settings
 /// </summary>
 /// <param name="helpFile">The help file for this item</param>
 /// <param name="helpContextId">The help context id for this item</param>
 /// <param name="nameFormat">
 ///     The string to use as the item's accessibility name.
 ///     Specify null for default behavior.
 ///     Used as a format string if nameReplacementFields is not null.
 /// </param>
 /// <param name="nameReplacementFields">Replacement fields for the name string</param>
 /// <param name="descriptionFormat">
 ///     The string to use as the item's accessibility description.
 ///     Specify null for default behavior.
 ///     Used as a format string if descriptionReplacementFields is not null.
 /// </param>
 /// <param name="descriptionReplacementFields">Replacement fields for the description string</param>
 /// <param name="imageDescriptions">
 ///     Description strings corresponding to the different elements in the image list.
 ///     Should be specified if GetDisplayData for this item returns a custom image list and if the name or description
 ///     replacement fields include PrimaryImageText or PrimaryImageAndOverlaysText
 /// </param>
 /// <param name="stateImageDescriptions">
 ///     Description strings corresponding to the different elements in the state image list.
 ///     Should be specified if GetDisplayData for this item returns a custom state image list and if the name or description
 ///     replacement fields include StateImageText.
 /// </param>
 public VirtualTreeAccessibilityData(
     string helpFile, int helpContextId, string nameFormat, AccessibilityReplacementField[] nameReplacementFields,
     string descriptionFormat, AccessibilityReplacementField[] descriptionReplacementFields, string[] imageDescriptions,
     string[] stateImageDescriptions)
 {
     myHelpFile = helpFile;
     myHelpContextId = helpContextId;
     myNameFormatString = nameFormat;
     myNameReplacementFields = nameReplacementFields;
     myDescriptionFormatString = descriptionFormat;
     myDescriptionReplacementFields = descriptionReplacementFields;
     myImageDescriptions = imageDescriptions;
     myStateImageDescriptions = stateImageDescriptions;
     myStateImageAccessibleStates = null;
 }
 private static AccessibilityReplacementField[] InterpretReplacementFieldsValue(IList value)
 {
     if (value != null)
     {
         var retVal = value as AccessibilityReplacementField[];
         if (retVal == null)
         {
             retVal = new AccessibilityReplacementField[value.Count];
             value.CopyTo(retVal, 0);
         }
         return retVal;
     }
     return null;
 }
 /// <summary>
 ///     Construct accessibility data with name settings
 /// </summary>
 /// <param name="nameFormat">
 ///     The string to use as the item's accessibility name.
 ///     Specify null for default behavior.
 ///     Used as a format string if nameReplacementFields is not null.
 /// </param>
 /// <param name="nameReplacementFields">Replacement fields for the name string</param>
 public VirtualTreeAccessibilityData(string nameFormat, AccessibilityReplacementField[] nameReplacementFields)
 {
     myHelpFile = null;
     myHelpContextId = 0;
     myNameFormatString = nameFormat;
     myNameReplacementFields = nameReplacementFields;
     myDescriptionFormatString = null;
     myDescriptionReplacementFields = null;
     myImageDescriptions = null;
     myStateImageDescriptions = null;
     myStateImageAccessibleStates = null;
 }