Пример #1
0
        static private void SetSpecialCharacters(ref LsContextInfo contextInfo)
        {
            Dictionary <char, bool> dict = new Dictionary <char, bool>();

            /* The first three char fields do not designate special characters
             * dict[contextInfo.wchUndef] = true;
             * dict[contextInfo.wchNull] = true;
             * dict[contextInfo.wchSpace] = true;
             */
            dict[contextInfo.wchHyphen]             = true;
            dict[contextInfo.wchTab]                = true;
            dict[contextInfo.wchPosTab]             = true;
            dict[contextInfo.wchEndPara1]           = true;
            dict[contextInfo.wchEndPara2]           = true;
            dict[contextInfo.wchAltEndPara]         = true;
            dict[contextInfo.wchEndLineInPara]      = true;
            dict[contextInfo.wchColumnBreak]        = true;
            dict[contextInfo.wchSectionBreak]       = true;
            dict[contextInfo.wchPageBreak]          = true;
            dict[contextInfo.wchNonBreakSpace]      = true;
            dict[contextInfo.wchNonBreakHyphen]     = true;
            dict[contextInfo.wchNonReqHyphen]       = true;
            dict[contextInfo.wchEmDash]             = true;
            dict[contextInfo.wchEnDash]             = true;
            dict[contextInfo.wchEmSpace]            = true;
            dict[contextInfo.wchEnSpace]            = true;
            dict[contextInfo.wchNarrowSpace]        = true;
            dict[contextInfo.wchOptBreak]           = true;
            dict[contextInfo.wchNoBreak]            = true;
            dict[contextInfo.wchFESpace]            = true;
            dict[contextInfo.wchJoiner]             = true;
            dict[contextInfo.wchNonJoiner]          = true;
            dict[contextInfo.wchToReplace]          = true;
            dict[contextInfo.wchReplace]            = true;
            dict[contextInfo.wchVisiNull]           = true;
            dict[contextInfo.wchVisiAltEndPara]     = true;
            dict[contextInfo.wchVisiEndLineInPara]  = true;
            dict[contextInfo.wchVisiEndPara]        = true;
            dict[contextInfo.wchVisiSpace]          = true;
            dict[contextInfo.wchVisiNonBreakSpace]  = true;
            dict[contextInfo.wchVisiNonBreakHyphen] = true;
            dict[contextInfo.wchVisiNonReqHyphen]   = true;
            dict[contextInfo.wchVisiTab]            = true;
            dict[contextInfo.wchVisiPosTab]         = true;
            dict[contextInfo.wchVisiEmSpace]        = true;
            dict[contextInfo.wchVisiEnSpace]        = true;
            dict[contextInfo.wchVisiNarrowSpace]    = true;
            dict[contextInfo.wchVisiOptBreak]       = true;
            dict[contextInfo.wchVisiNoBreak]        = true;
            dict[contextInfo.wchVisiFESpace]        = true;
            dict[contextInfo.wchEscAnmRun]          = true;
            dict[contextInfo.wchPad]                = true;

            // Many of these fields have value 'wchUndef'.  Remove it now.
            // (This is robust, even if Init() changes the char field assignments.)
            dict.Remove(contextInfo.wchUndef);

            // Remember the result.  First thread to get here wins.
            System.Threading.Interlocked.CompareExchange <Dictionary <char, bool> >(ref _specialCharacters, dict, null);
        }
        private void Init()
        {
            if (_ploc.Value == System.IntPtr.Zero)
            {
                // Initializing context
                LsErr lserr = LsErr.None;

                LsContextInfo  contextInfo = new LsContextInfo();
                LscbkRedefined lscbkRedef  = new LscbkRedefined();

                _callbacks = new LineServicesCallbacks();
                _callbacks.PopulateContextInfo(ref contextInfo, ref lscbkRedef);


                contextInfo.version = 4;                // we should set this right, they might check it in the future
                contextInfo.pols    = IntPtr.Zero;      // This will be filled in the un-managed code
                contextInfo.cEstimatedCharsPerLine = TextStore.TypicalCharactersPerLine;
                contextInfo.fDontReleaseRuns       = 1; // dont waste time

                // There are 3 justification priorities right now with one considered good
                // and the other two provided for emergency expansion.
                // Future development to enable international justification will likely change this.
                // e.g. Kashida justification would require more than one good priorities.
                contextInfo.cJustPriorityLim = 3;

                // Fill up text configuration
                contextInfo.wchNull     = '\u0000';
                contextInfo.wchUndef    = '\u0001';
                contextInfo.wchTab      = '\u0009';
                contextInfo.wchPosTab   = contextInfo.wchUndef;
                contextInfo.wchEndPara1 = TextStore.CharParaSeparator;              // Unicode para separator
                contextInfo.wchEndPara2 = contextInfo.wchUndef;
                contextInfo.wchSpace    = '\u0020';

                contextInfo.wchHyphen             = MS.Internal.Text.TextInterface.TextAnalyzer.CharHyphen;   //'\x002d';
                contextInfo.wchNonReqHyphen       = '\u00AD';
                contextInfo.wchNonBreakHyphen     = '\u2011';
                contextInfo.wchEnDash             = '\u2013';
                contextInfo.wchEmDash             = '\u2014';
                contextInfo.wchEnSpace            = '\u2002';
                contextInfo.wchEmSpace            = '\u2003';
                contextInfo.wchNarrowSpace        = '\u2009';
                contextInfo.wchJoiner             = '\u200D';
                contextInfo.wchNonJoiner          = '\u200C';
                contextInfo.wchVisiNull           = '\u2050';
                contextInfo.wchVisiAltEndPara     = '\u2051';
                contextInfo.wchVisiEndLineInPara  = '\u2052';
                contextInfo.wchVisiEndPara        = '\u2053';
                contextInfo.wchVisiSpace          = '\u2054';
                contextInfo.wchVisiNonBreakSpace  = '\u2055';
                contextInfo.wchVisiNonBreakHyphen = '\u2056';
                contextInfo.wchVisiNonReqHyphen   = '\u2057';
                contextInfo.wchVisiTab            = '\u2058';
                contextInfo.wchVisiPosTab         = contextInfo.wchUndef;
                contextInfo.wchVisiEmSpace        = '\u2059';
                contextInfo.wchVisiEnSpace        = '\u205A';
                contextInfo.wchVisiNarrowSpace    = '\u205B';
                contextInfo.wchVisiOptBreak       = '\u205C';
                contextInfo.wchVisiNoBreak        = '\u205D';
                contextInfo.wchVisiFESpace        = '\u205E';
                contextInfo.wchFESpace            = '\u3000';
                contextInfo.wchEscAnmRun          = TextStore.CharParaSeparator;
                contextInfo.wchAltEndPara         = contextInfo.wchUndef;
                contextInfo.wchEndLineInPara      = TextStore.CharLineSeparator;
                contextInfo.wchSectionBreak       = contextInfo.wchUndef;
                contextInfo.wchNonBreakSpace      = '\u00A0';
                contextInfo.wchNoBreak            = contextInfo.wchUndef;
                contextInfo.wchColumnBreak        = contextInfo.wchUndef;
                contextInfo.wchPageBreak          = contextInfo.wchUndef;
                contextInfo.wchOptBreak           = contextInfo.wchUndef;
                contextInfo.wchToReplace          = contextInfo.wchUndef;
                contextInfo.wchReplace            = contextInfo.wchUndef;

                IntPtr ploc           = IntPtr.Zero;
                IntPtr ppenaltyModule = IntPtr.Zero;

                lserr = UnsafeNativeMethods.LoCreateContext(
                    ref contextInfo,
                    ref lscbkRedef,
                    out ploc
                    );

                if (lserr != LsErr.None)
                {
                    ThrowExceptionFromLsError(SR.Get(SRID.CreateContextFailure, lserr), lserr);
                }

                _ploc.Value = ploc;
                GC.KeepAlive(contextInfo);

                //  There is a trick here to pass in this resolution as in twips
                //  (1/1440 an inch).
                //
                //  LSCreateLine assumes the max width passed in is in twips so to
                //  allow its client to express their width in page unit. However
                //  it asks client to set up the real device resolution here so
                //  that it can internally translate the "twips" width into client
                //  actual device unit.
                //
                //  We are not device dependent anyway, so instead of following the
                //  rule which will cause us to validate the context every time. We
                //  choose to cheat LS to think that our unit is twips.
                //
                LsDevRes devRes;
                devRes.dxpInch = devRes.dxrInch = TwipsPerInch;
                devRes.dypInch = devRes.dyrInch = TwipsPerInch;

                SetDoc(
                    true,           // Yes, we will be displaying
                    true,           // Yes, reference and presentation are the same device
                    ref devRes      // Device resolutions
                    );

                SetBreaking(BreakStrategies.BreakCJK);
            }
        }