コード例 #1
0
        public void BinarySearchTest()
        {
            List <int> list = new List <int>(new int[] { 0, 2, 4, 5, 6 });

            Assert.AreEqual(1, ListUtils.BinarySearch(list, 0, list.Count,
                                                      delegate(int x) { return(x < 2); }));
            Assert.AreEqual(2, ListUtils.BinarySearch(list, 0, list.Count,
                                                      delegate(int x) { return(x <= 2); }));
            Assert.AreEqual(3, ListUtils.BinarySearch(list, 3, 3,
                                                      delegate(int x) { return(x <= 2); }));
        }
コード例 #2
0
        public static int ScreenPositionToMessageTextCharIndex(Graphics g,
                                                               IMessage msg, bool showRawMessages, int textLineIndex, Font font, StringFormat format, int screenPosition)
        {
            var textToDisplay = msg.GetDisplayText(showRawMessages);
            var txt           = textToDisplay.Text;
            var line          = textToDisplay.GetNthTextLine(textLineIndex);
            var lineValue     = line.Value;
            int lineCharIdx   = ListUtils.BinarySearch(new ListUtils.VirtualList <int>(lineValue.Length, i => i), 0, lineValue.Length, i =>
            {
                var charBounds = g.MeasureCharacterRange(lineValue, font, format, new System.Drawing.CharacterRange(i, 1));
                return(((charBounds.Left + charBounds.Right) / 2) < screenPosition);
            });

            //return (line.StartIndex + lineCharIdx) - txt.StartIndex;
            return(lineCharIdx);
        }
コード例 #3
0
        public IEnumerable <IndexedMessage> Reverse(long startFrom)
        {
            var  idx     = ListUtils.BinarySearch(messages, 0, messages.Count, m => m.Position <= startFrom);
            bool started = false;

            for (; idx >= 0; --idx)
            {
                if (!started)
                {
                    started = idx < messages.Count && messages[idx].EndPosition <= startFrom;
                }
                if (started)
                {
                    yield return(new IndexedMessage(idx, messages[idx]));
                }
            }
        }
コード例 #4
0
        public static Tuple <int, int> CalcFocusedMessageEqualRange(this IReadOnlyList <StateInspectorEvent> allChanges, FocusedMessageInfo focusedMessageInfo)
        {
            if (focusedMessageInfo == null || focusedMessageInfo.FocusedMessage == null)
            {
                return(null);
            }
            var messageLogSource = focusedMessageInfo.FocusedMessage.GetLogSource();

            if (messageLogSource == null)
            {
                return(null);
            }
            var focusedMessageTime     = focusedMessageInfo.FocusedMessage.Time;
            var focusedMessagePosition = focusedMessageInfo.FocusedMessage.Position;

            int lowerBound = ListUtils.BinarySearch(allChanges, 0, allChanges.Count,
                                                    change => EventsComparer.Compare(change, focusedMessageTime, messageLogSource, focusedMessagePosition) < 0);
            int upperBound = ListUtils.BinarySearch(allChanges, 0, allChanges.Count,
                                                    change => EventsComparer.Compare(change, focusedMessageTime, messageLogSource, focusedMessagePosition) <= 0);

            return(new Tuple <int, int>(lowerBound, upperBound));
        }
コード例 #5
0
        bool ISelectionManager.PickNewSelection()
        {
            var viewLines = screenBuffer.Messages;

            if (selection.First.Message == null)
            {
                if (viewLines.Count > 0)
                {
                    SetSelection(0, SelectionFlag.SelectBeginningOfLine);
                }
                return(true);
            }
            if (BelongsToNonExistentSource(selection.First) || BelongsToNonExistentSource(selection.Last))
            {
                if (viewLines.Count > 0)
                {
                    var maxIdx = Math.Min(screenBuffer.FullyVisibleLinesCount, viewLines.Count);
                    IComparer <IMessage> cmp = new DatesComparer(selection.First.Message.Time.ToLocalDateTime());
                    var idx = ListUtils.BinarySearch(viewLines, 0, maxIdx, dl => cmp.Compare(dl.Message, null) < 0);
                    if (idx != maxIdx)
                    {
                        SetSelection(idx, SelectionFlag.SelectBeginningOfLine);
                    }
                    else
                    {
                        SetSelection(0, SelectionFlag.SelectBeginningOfLine);
                    }
                }
                else
                {
                    SetSelection(new CursorPosition(), new CursorPosition());
                    OnFocusedMessageBookmarkChanged();
                }
                return(true);
            }
            return(false);
        }