File: System\Windows\Documents\MsSpellCheckLib\SpellChecker\SpellingError.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj (PresentationFramework)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
//
// Description: A class encapsulating the functionality of ISpellingError
//              exposed by MsSpellCheckLib.RCW. 
//              
//              In addition to ISpellingError fields, this class also automatically
//              generates a list of suggestions when the corrective action suggested 
//              is CorrectiveAction.GetSuggestions. 
//
 
using System.Runtime.InteropServices;
using ISpellingError = System.Windows.Documents.MsSpellCheckLib.RCW.ISpellingError;
 
namespace System.Windows.Documents.MsSpellCheckLib
{
    internal partial class SpellChecker
    {
        /// <summary>
        /// This Enum corresponds to <see cref="RCW.CORRECTIVE_ACTION"/>, and 
        /// supports the SpellingError type that follows.
        /// </summary>
        internal enum CorrectiveAction
        {
            None = 0,
            GetSuggestions = 1,
            Replace = 2,
            Delete = 3
        }
 
        /// <summary>
        /// This type encapsulates information from an instnace 
        /// of <see cref="RCW.ISpellingError"/>
        /// </summary>
        internal class SpellingError
        {
            #region Fields 
 
            #region ISpellingError Fields
 
            internal uint StartIndex { get; }
            internal uint Length { get; }
            internal CorrectiveAction CorrectiveAction { get; }
            internal string Replacement { get; }
 
            #endregion // ISpellingError Fields
 
            private List<string> _suggestions;
 
            /// <summary>
            /// When <see cref="CorrectiveAction"/> is <see cref="CorrectiveAction.GetSuggestions"/>, 
            /// this field will be populated with those suggestions. Otherwise, this will return an 
            /// empty list.
            /// </summary>
            internal IReadOnlyCollection<string> Suggestions
            {
                get
                {
                    return _suggestions.AsReadOnly();
                }
            }
 
            #endregion // Fields
 
            /// <summary>
            /// Copies simple fields from ISpellingError, and populates suggestions
            /// when CorrectiveAction == GetSuggestions.
            /// </summary>
            internal SpellingError(ISpellingError error, SpellChecker spellChecker, string text, bool shouldSuppressCOMExceptions = true, bool shouldReleaseCOMObject = true)
            {
                ArgumentNullException.ThrowIfNull(error);
 
                StartIndex = error.StartIndex;
                Length = error.Length;
                CorrectiveAction = (CorrectiveAction)error.CorrectiveAction;
                Replacement = error.Replacement;
 
                PopulateSuggestions(error, spellChecker, text, shouldSuppressCOMExceptions, shouldReleaseCOMObject);
            }
 
            /// <summary>
            /// Populates suggestions when CorrectiveAction == GetSuggestions
            /// </summary>
            private void PopulateSuggestions(ISpellingError error, SpellChecker spellChecker, string text, bool shouldSuppressCOMExceptions, bool shouldReleaseCOMObject)
            {
                try
                {
                    _suggestions = new List<string>();
                    if (CorrectiveAction == CorrectiveAction.GetSuggestions)
                    {
                        var suggestions = spellChecker.Suggest(text, shouldSuppressCOMExceptions);
                        _suggestions.AddRange(suggestions);
                    }
                    else if (CorrectiveAction == CorrectiveAction.Replace)
                    {
                        _suggestions.Add(Replacement);
                    }
                }
                finally
                {
                    if (shouldReleaseCOMObject)
                    {
                        Marshal.ReleaseComObject(error);
                    }
                }
            }           
        }
    }
}