예제 #1
0
        public void AddRange(int start, int limit)
        {
            if (start >= limit)
            {
                throw new ArgumentException(String.Format("start ({0}) cannot be >= to limit ({1})", start, limit));
            }

            for (int i = 0; i < sortedRanges.Count; i++)
            {
                var range = sortedRanges[i];
                if (start <= range.limit)
                {
                    if (limit < range.start)
                    {
                        sortedRanges.Insert(i, new LimitRange(start, limit));
                        count += (uint)(limit - start);
                        return;
                    }

                    if (start < range.start)
                    {
                        count          += (uint)(range.start - start);
                        sortedRanges[i] = new LimitRange(start, range.limit);
                    }
                    CombineRanges(i, limit);
                    return;
                }
            }

            if (sortedRanges.Count == 0)
            {
                sortedRanges.Add(new LimitRange(start, limit));
                count += (uint)(limit - start);
                return;
            }

            var lastRange = sortedRanges[sortedRanges.Count - 1];

            if (lastRange.limit < start)
            {
                sortedRanges.Add(new LimitRange(start, limit));
                count += (uint)(limit - start);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
예제 #2
0
        /// <returns>True if the value was added</returns>
        public Boolean TryAdd(int value)
        {
            for (int i = 0; i < sortedRanges.Count; i++)
            {
                var range = sortedRanges[i];
                if (value < range.start)
                {
                    if (value + 1 == range.start)
                    {
                        sortedRanges[i] = new LimitRange(value, range.limit);
                    }
                    else
                    {
                        sortedRanges.Insert(i, new LimitRange(value, value + 1));
                    }
                    count++;
                    return(true); // was added
                }

                if (value.Equals(range.start))
                {
                    return(false); // was already added
                }
            }

            if (sortedRanges.Count == 0)
            {
                sortedRanges.Add(new LimitRange(value, value + 1));
                count++;
                return(true);
            }

            var lastRange = sortedRanges[sortedRanges.Count - 1];

            if (lastRange.limit < value)
            {
                sortedRanges.Add(new LimitRange(value, value + 1));
                count++;
                return(true); // was added
            }
            if (lastRange.limit == value)
            {
                sortedRanges[sortedRanges.Count - 1] = new LimitRange(lastRange.start, value + 1);
                count++;
                return(true); // was added
            }
            return(false);    // was already added
        }
예제 #3
0
파일: AxisPanel.cs 프로젝트: Mrding/Ribbon
        protected AxisPanel()
        {
            //AddBehavior
            Interaction.GetBehaviors(this).Add(new InitializeBehavior());

            ScrollInfo = this;
            ScrollOwner = this;
            //定数量16是因为太少的话反而会有效率影响,一般控件会在16个以内
            //VerticalControls = new List<AxisControl>(16);
            HorizontalControls = new List<AxisControl>(16);
            _children = new List<AxisControl>(16);

            _viewportRangeX = new LimitRange<double>();
            _dataRangeX = new LimitRange<DateTime>();
            _viewportRangeY = new LimitRange<double>();
            _dataRangeY = new LimitRange<int>();
        }
예제 #4
0
        void CombineRanges(int startRangeIndex, int limit)
        {
            var startRange = sortedRanges[startRangeIndex];

            if (limit > startRange.limit)
            {
                var previousRange = startRange;
                for (int ii = startRangeIndex + 1; ; ii++)
                {
                    if (ii >= sortedRanges.Count)
                    {
                        if (ii > startRangeIndex)
                        {
                            sortedRanges.RemoveRange(startRangeIndex + 1, ii - 1);
                        }
                        count += (uint)(limit - previousRange.limit);
                        sortedRanges[startRangeIndex] = new LimitRange(startRange.start, limit);
                        return;
                    }
                    var range = sortedRanges[ii];
                    if (limit < range.start)
                    {
                        if (ii > startRangeIndex)
                        {
                            sortedRanges.RemoveRange(startRangeIndex + 1, ii - 1);
                        }
                        count += (uint)(limit - previousRange.limit);
                        sortedRanges[startRangeIndex] = new LimitRange(startRange.start, limit);
                        return;
                    }
                    count += (uint)(range.start - previousRange.limit);
                    if (limit <= range.limit)
                    {
                        if (ii > startRangeIndex)
                        {
                            sortedRanges.RemoveRange(startRangeIndex + 1, ii);
                        }
                        sortedRanges[startRangeIndex] = new LimitRange(startRange.start, range.limit);
                        return;
                    }
                    previousRange = range;
                }
            }
        }