public FormatChanges GetFormatChanges()
        {
            FormatChanges fc = new FormatChanges();

            fc.color = SelectionColor;
            fc.font  = SelectionFont;
            STRUCT_CHARFORMAT2 cf2 = new STRUCT_CHARFORMAT2();

            GetCharFormat(ref cf2);
            if ((cf2.dwMask & CFM_BOLD) != 0)
            {
                fc.bold = ((cf2.dwEffects & CFE_BOLD) != 0) ? Ternary.Yes : Ternary.No;
            }
            if ((cf2.dwMask & CFM_ITALIC) != 0)
            {
                fc.italic = ((cf2.dwEffects & CFE_ITALIC) != 0) ? Ternary.Yes : Ternary.No;
            }
            if ((cf2.dwMask & CFM_UNDERLINE) != 0)
            {
                fc.underline = ((cf2.dwEffects & CFE_UNDERLINE) != 0) ? Ternary.Yes : Ternary.No;
            }
            if ((cf2.dwMask & CFM_SUPERSCRIPT) != 0)
            {
                fc.superscript = ((cf2.dwEffects & CFE_SUPERSCRIPT) != 0) ? Ternary.Yes : Ternary.No;
            }
            if ((cf2.dwMask & CFM_SUBSCRIPT) != 0)
            {
                fc.subscript = ((cf2.dwEffects & CFE_SUBSCRIPT) != 0) ? Ternary.Yes : Ternary.No;
            }
            if ((cf2.dwMask & CFM_STRIKEOUT) != 0)
            {
                fc.strikeout = ((cf2.dwEffects & CFE_STRIKEOUT) != 0) ? Ternary.Yes : Ternary.No;
            }
            if ((cf2.dwMask & CFM_FACE) != 0)
            {
                fc.fontfamily = cf2.szFaceName;
            }
            if ((cf2.dwMask & CFM_SIZE) != 0)
            {
                fc.fontsize = cf2.yHeight / 20f; /*again, this may not be right. why 20?*/
            }
            return(fc);
        }
        public void SetFormatChanges(FormatChanges fc)
        {
            if (fc.color != Color.Empty)
            {
                SelectionColor = fc.color;
            }
            if (fc.font != null)
            {
                SelectionFont = fc.font;
            }

            STRUCT_CHARFORMAT2 cf2 = new STRUCT_CHARFORMAT2();

            if (fc.fontfamily != String.Empty)
            {
                cf2.dwMask    |= CFM_FACE;
                cf2.szFaceName = fc.fontfamily;
            }
            if (fc.fontsize != 0f)
            {
                cf2.dwMask |= CFM_SIZE;
                cf2.yHeight = (int)(fc.fontsize * 20f); /*no idea if this is correct conversion*/
            }
            if (fc.bold != Ternary.Indeterminate)
            {
                cf2.dwMask |= CFM_BOLD;
                if (fc.bold == Ternary.Yes)
                {
                    cf2.dwEffects |= CFE_BOLD;
                }
            }
            if (fc.italic != Ternary.Indeterminate)
            {
                cf2.dwMask |= CFM_ITALIC;
                if (fc.italic == Ternary.Yes)
                {
                    cf2.dwEffects |= CFE_ITALIC;
                }
            }
            if (fc.underline != Ternary.Indeterminate)
            {
                cf2.dwMask |= CFM_UNDERLINE;
                if (fc.underline == Ternary.Yes)
                {
                    cf2.dwEffects |= CFE_UNDERLINE;
                }
            }
            if (fc.strikeout != Ternary.Indeterminate)
            {
                cf2.dwMask |= CFM_STRIKEOUT;
                if (fc.strikeout == Ternary.Yes)
                {
                    cf2.dwEffects |= CFE_STRIKEOUT;
                }
            }
            if (fc.superscript != Ternary.Indeterminate)
            {
                cf2.dwMask |= CFM_SUPERSCRIPT;
                if (fc.superscript == Ternary.Yes)
                {
                    cf2.dwEffects |= CFE_SUPERSCRIPT;
                }
            }
            if (fc.subscript != Ternary.Indeterminate)
            {
                cf2.dwMask |= CFM_SUBSCRIPT;
                if (fc.subscript == Ternary.Yes)
                {
                    cf2.dwEffects |= CFE_SUBSCRIPT;
                }
            }
            if (cf2.dwMask != 0)
            {
                SetCharFormat(ref cf2);
            }
        }