Exemplo n.º 1
0
        public VisualPointInfo GetTextPointInfoFromCaretPoint(int caretX)
        {
            int         accTextRunWidth = 0; int accTextRunCharCount = 0;
            EditableRun lastestTextRun = null;

            foreach (EditableRun t in this._runs)
            {
                lastestTextRun = t;
                int thisTextRunWidth = t.Width;
                if (accTextRunWidth + thisTextRunWidth > caretX)
                {
                    EditableRunCharLocation localPointInfo = t.GetCharacterFromPixelOffset(caretX - thisTextRunWidth);
                    EditableVisualPointInfo pointInfo      =
                        new EditableVisualPointInfo(this, accTextRunCharCount + localPointInfo.RunCharIndex);
                    pointInfo.SetAdditionVisualInfo(t, accTextRunCharCount, caretX, accTextRunWidth);
                    return(pointInfo);
                }
                else
                {
                    accTextRunWidth     += thisTextRunWidth;
                    accTextRunCharCount += t.CharacterCount;
                }
            }
            if (lastestTextRun != null)
            {
                return(null);
            }
            else
            {
                EditableVisualPointInfo pInfo = new EditableVisualPointInfo(this, -1);
                pInfo.SetAdditionVisualInfo(null, accTextRunCharCount, caretX, accTextRunWidth);
                return(pInfo);
            }
        }
        /// <summary>
        /// try set caret x pos to nearest request value
        /// </summary>
        /// <param name="value"></param>
        public void TrySetCaretXPos(int value)
        {
            if (currentTextRun == null)
            {
                caret_char_index = 0;
                caretXPos        = 0;
                rCharOffset      = 0;
                rPixelOffset     = 0;
                return;
            }
            int pixDiff = value - caretXPos;

            if (pixDiff > 0)
            {
                do
                {
                    int thisTextRunPixelLength = currentTextRun.Width;
                    if (rPixelOffset + thisTextRunPixelLength > value)
                    {
                        EditableRunCharLocation foundLocation = EditableRun.InnerGetCharacterFromPixelOffset(currentTextRun, value - rPixelOffset);
                        caretXPos        = rPixelOffset + foundLocation.pixelOffset;
                        caret_char_index = rCharOffset + foundLocation.RunCharIndex;

                        //if (foundLocation.charIndex == -1)
                        //{
                        //    if (!(MoveToPreviousTextRun()))
                        //    {
                        //        caretXPos = 0;
                        //        caret_char_index = 0;
                        //    }
                        //}
                        //else
                        //{
                        //    caretXPos = rPixelOffset + foundLocation.pixelOffset;
                        //    caret_char_index = rCharOffset + foundLocation.charIndex;
                        //}
                        return;
                    }
                } while (MoveToNextTextRun());
                //to the last
                caretXPos        = rPixelOffset + currentTextRun.Width;
                caret_char_index = rCharOffset + currentTextRun.CharacterCount;
                return;
            }
            else if (pixDiff < 0)
            {
                do
                {
                    if (value >= rPixelOffset)
                    {
                        EditableRunCharLocation foundLocation = EditableRun.InnerGetCharacterFromPixelOffset(currentTextRun, value - rPixelOffset);
                        caretXPos        = rPixelOffset + foundLocation.pixelOffset;
                        caret_char_index = rCharOffset + foundLocation.RunCharIndex;

                        //if (foundLocation.charIndex == -1)
                        //{
                        //    if (!MoveToPreviousTextRun())
                        //    {
                        //        caret_char_index = 0;
                        //        caretXPos = 0;
                        //    }
                        //}
                        //else
                        //{
                        //    caretXPos = rPixelOffset + foundLocation.pixelOffset;
                        //    caret_char_index = rCharOffset + foundLocation.RunCharIndex;
                        //}
                        return;
                    }
                } while (MoveToPreviousTextRun());//
                caretXPos        = 0;
                caret_char_index = 0;
                return;
            }
        }