コード例 #1
0
ファイル: VerticalIndicator.cs プロジェクト: agamat/Ribbon-1
        private int GetCurrentIndex(Point point)
        {
            if (AxisPanel == null)
            {
                return(-1);
            }

            var datetime = AxisXConverter.ToData(point.X + AxisPanel.ViewportRangeX.ViewMin);

            datetime       = datetime.AddSeconds(-datetime.Second);
            _pointDateTime = datetime;

            var remains = datetime.Minute % 15;

            if (remains < 3)
            {
                datetime = datetime.AddMinutes(-remains);
            }
            else if (12 < remains)
            {
                datetime = datetime.AddMinutes(15 - remains);
            }
            else if (remains == 0)
            {
            }
            else
            {
                datetime = datetime.AddMinutes(-remains);
            }

            return((int)(datetime.Subtract(_enquiryStartTime).TotalHours * 4)); // 4 = perHourCount 一小時4格, 15分钟数据单位
        }
コード例 #2
0
        protected override void OnParentMouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.LeftButton != MouseButtonState.Pressed)
            {
                return;
            }

            _startPoint = e.GetPosition(this);
            _lastPoint  = _startPoint;

            if (!BlockConverter.CanConvert(PointOutBlock))
            {
                return;
            }

            _canMove = PointOutBlock != null && !BlockConverter.GetLocked(PointOutBlock);

            if (_canMove)
            {
                StartMouseMovementTracking();
                var date    = AxisXConverter.ScreenToData(0);
                var newDate = date.Add(StepMin);
                _stepMinDistance = AxisXConverter.DataToScreen(newDate);
            }
        }
コード例 #3
0
        public Rect MeasureDragingArea(int screenDataRowIndex)
        {
            // 取两点 画出一个范围方块
            var xMin = Math.Min(_currentPoint.X, _startPoint.X);
            var yMin = Math.Min(_currentPoint.Y, _startPoint.Y);

            var xMax = Math.Max(_currentPoint.X, _startPoint.X);
            var yMax = Math.Max(_currentPoint.Y, _startPoint.Y);

            var end = AxisXConverter.ToData(xMax);

            _timeRange = new TimeRange(AxisXConverter.ToData(xMin), end.TimeOfDay.TotalHours > 0 ? end.Date.AddDays(1) : end);

            ClickDate = _timeRange.Start.Date;

            screenDataRowIndex = 0;//_shiftKeyPressed ? 0 : screenDataRowIndex;

            var maxDataRowIndex = Math.Min(GetItemsSourceCount() - 1, (int)(yMax / Interval) + screenDataRowIndex);

            _dataRowRange = new[] { Math.Min((int)(yMin / Interval) + screenDataRowIndex, maxDataRowIndex), maxDataRowIndex };

            //Debug.Print(string.Format("y:{0}, {1}", yMax, _currentPoint.Y));
            //Debug.Print(string.Format("row:{0}", _dataRowRange[1]));

            _measureofArea = new Rect(xMin, yMin, xMax - xMin, yMax - yMin);

            SelectionTimeRange    = TimeRange;
            SelectionDataRowRange = DataRowRange;

            return(_measureofArea);
        }
コード例 #4
0
        protected override int GetCurrentIndex(Point point)
        {
            // var viewPortWidth = AxisPanel.HorizontalOffset;//AxisXConverter.ScreenToViewport(0);
            //var viewMin = AxisXConverter.ViewportToData(0); ;//AxisXConverter.ViewportToData(0);
            var datetime = AxisXConverter.ToData(point.X + AxisPanel.HorizontalOffset);
            var remains  = datetime.Minute % 15;

            if (remains < 3)
            {
                datetime = datetime.AddMinutes(-remains);
            }
            else if (12 < remains)
            {
                datetime = datetime.AddMinutes(15 - remains);
            }
            else if (remains == 0)
            {
            }
            else
            {
                return(-1);
            }

            datetime = datetime.AddSeconds(-datetime.Second);
            // System.Diagnostics.Debug.Print(datetime.ToString());
            return((int)(datetime.Subtract(_enquiryStartTime).TotalHours *PerHourCount));
        }
コード例 #5
0
ファイル: DateTimeNumberLine.cs プロジェクト: agamat/Ribbon-1
        private void RefreshChildElement()
        {
            if (AxisPanel == null)
            {
                return;
            }

            //得到相对于大容器的位置
            var viewPortWidth = AxisPanel.ViewportRangeX.ViewMin;//AxisXConverter.ScreenToViewport(0);
            //用段的模求出偏移量
            var xTranslateTransform = viewPortWidth % HourWidth;
            var firstSectionX       = viewPortWidth - xTranslateTransform;

            for (var i = 0; i < VisualChildrenCount; i++)
            {
                var x = i * HourWidth - xTranslateTransform;

                var date = AxisXConverter.ToData(firstSectionX + (i * HourWidth));

                // Debug.Print(date.ToString());


                _contentPresenterList[i].Content = date;
                _contentPresenterList[i].Arrange(new Rect(new Point(x, 0), _contentPresenterList[i].DesiredSize));
            }
        }
コード例 #6
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            if (StartTime == (DateTime)StartTimeProperty.DefaultMetadata.DefaultValue || EndTime == (DateTime)EndTimeProperty.DefaultMetadata.DefaultValue || AxisPanel == null)
            {
                return;
            }

            var left  = AxisXConverter.DataToScreen(StartTime);
            var right = Math.Min(AxisXConverter.DataToScreen(EndTime), RenderSize.Width);
            var width = right - left;

            var rect = new Rect(Math.Max(0, left), RenderSize.Height - 14, Math.Min(right >= 0 ? right : 0, width > 0 ? width : 0), 14);//14 is Line Height

            drawingContext.DrawRectangle(ColorRender, null, rect);
            if (Text == null)
            {
                return;
            }
            Text.ToFormattedText(Foreground).Self(fTxt =>
            {
                if (AxisXConverter.DataToScreen(EndTime) - Text.GetTtextSize().Width < 0 || RenderSize.Width < left)
                {
                    return;
                }
                var topMargin = 0;
                drawingContext.DrawText(fTxt, new Point(left >= 0?left:0, topMargin));
            });
        }
コード例 #7
0
        protected override double GetCellInterval()
        {
            var dateTime  = AxisXConverter.ScreenToData(0);
            var hourWidth = AxisXConverter.DataToScreen(dateTime.AddHours(1));

            //每个小时的长度除以PerHourCount;
            return(hourWidth / PerHourCount);
        }
コード例 #8
0
ファイル: VerticalIndicator.cs プロジェクト: agamat/Ribbon-1
        public override void Initialize()
        {
            base.Initialize();
            _startTime        = AxisXConverter.ScreenToData(Math.Min(0, -AxisPanel.HorizontalOffset));//AxisXConverter.ViewportToData(0);
            _enquiryStartTime = _startTime.AddDays(Global.HeadDayAmount);

            base.OnLoaded();
        }
コード例 #9
0
        public void MoveLeft(Rect rect)
        {
            var x = rect.Left - rect.Width;

            if (!AxisXConverter.IsInDataRagne(x, true)) //AxisXConverter.ScreenToData(x) < AxisPanel.StartTime
            {
                x = 0;
            }
            _currentPoint = new Point(x + rect.Width, rect.Y);
            _startPoint   = new Point(x, _currentPoint.Y);
        }
コード例 #10
0
        internal bool IsInViewRange(out Point point)
        {
            if (InitalDrawLocation == null)
            {
                point = new Point(0, 0);
                return(true);
            }

            point = new Point(InitalDrawLocation.Value.X - HorizontalOffset,
                              InitalDrawLocation.Value.Y - VerticalOffset); // 转换成相对位置
            return(AxisXConverter.IsInViewRagne(point.X) && AxisYConverter.IsInViewRagne(point.Y));
        }
コード例 #11
0
        public bool TryMoveRight(Rect rect)
        {
            var x = rect.Left + rect.Width;

            if (!AxisXConverter.IsInDataRagne(x, true))//AxisPanel.EndTime <= AxisXConverter.ScreenToData(x)
            {
                return(false);
            }
            _startPoint   = new Point(x, rect.Y);
            _currentPoint = new Point(x + rect.Width, rect.Y);
            return(true);
        }
コード例 #12
0
        protected override int GetStartIndex(double xTransform)
        {
            //得到相对于大容器的位置
            //var startTime = AxisXConverter.ScreenToData(-AxisPanel.HorizontalOffset);//AxisXConverter.ViewportToScreen(0)
            //var screenTime = AxisXConverter.ScreenToData(xTransform);
            // index = screenTime.Subtract(startTime).TotalHours * PerHourCount;
            var screenStartTime = AxisXConverter.ScreenToData(0);

            return((int)(screenStartTime.Subtract(_enquiryStartTime).TotalMinutes / 15));

            //return (int)index;)
            return(0);
        }
コード例 #13
0
        private void ChangeBlockEdgeCursor(Point point)
        {
            var left  = AxisXConverter.DataToScreen(PointOutBlock.Start);
            var right = AxisXConverter.DataToScreen(PointOutBlock.End);

            //如果在边上,鼠标形状就发生变化
            if ((point.X - left) < ApprochDistance)
            {
                LayerContainer.ChangeCursor(Cursors.SizeWE);
                FlagAdd(MouseState.LeftDirection);
            }
            else if ((right - point.X) < ApprochDistance)
            {
                LayerContainer.ChangeCursor(Cursors.SizeWE);
                FlagAdd(MouseState.RightDirection);
            }
        }
コード例 #14
0
        protected override void OnParentDragOver(DragEventArgs e)
        {
            _isDragLeave = false;

            var point = e.GetPosition(this);

            if (_startPoint == null || _startPoint.Value.X < 0)
            {
                var date    = AxisXConverter.ScreenToData(0);
                var newDate = date.Add(StepMin);
                _stepMinDistance = AxisXConverter.DataToScreen(newDate);

                var pointTime = AxisXConverter.ScreenToData(point.X - point.X % _stepMinDistance).ConvertToMultiplesOfFive();
                System.Diagnostics.Debug.Print(pointTime.ToString());
                var arg = default(DragingRoutedEventArgs);

                var data = e.Data.GetData("Castle.Proxies.TermStyleProxy");

                if (data != null)
                {
                    arg = new DragingRoutedEventArgs(pointTime, data, DraggingEvent, this);
                    RaiseEvent(arg);
                }

                if (arg != null && arg.Target != null)
                {
                    _startPoint = point;
                    _lastPoint  = _startPoint;
                }
                else
                {
                    _startPoint = null;
                    _lastPoint  = null;
                }

                PointOutBlock = arg == null ? null : arg.Target;
            }

            _canMove = PointOutBlock != null;

            if (_canMove)
            {
                MouseMoving(point);
                InvalidateVisual();
            }
        }
コード例 #15
0
        protected void MouseMoving(Point point)
        {
            //if(_startPoint == null || _lastPoint == null)
            //{
            //    return;
            //}


            var distance = point.X - (_startPoint == null ? 0 : _startPoint.Value.X);

            _lastPoint = new Point(point.X - distance % _stepMinDistance, point.Y); // do not modify 每格移动,减去不到标准距离的值

            //Henry modified
            MoveSpan        = AxisXConverter.ScreenToData(GetMoveOffSet()).Subtract(AxisXConverter.ScreenToData(0)); // was => NotifyBlocknewPositionInfoList();
            DropedPlacement = new TimeRange(PointOutBlock.Start.Add(MoveSpan).AddSeconds(0.1), PointOutBlock.End.Add(MoveSpan).AddSeconds(0.1));
            _isMoving       = true;
        }
コード例 #16
0
ファイル: DateTimeTip.cs プロジェクト: agamat/Ribbon-1
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (AxisPanel == null)
            {
                return;
            }


            var point = e.GetPosition(this);

            WatchTime = AxisXConverter.ScreenToData(point.X);

            if (_popup == null)
            {
                return;
            }
            _popup.HorizontalOffset = point.X + HorizontalOffset;
            _popup.VerticalOffset   = point.Y - RenderSize.Height + VerticalOffset;
        }
コード例 #17
0
        private void HandleEvent(Func <IBlockGridLayer, bool> handle, Point point, RoutedEventArgs e)
        {
            if ((AxisYConverter.IsInViewRagne(point.Y) && AxisXConverter.IsInViewRagne(point.X)) || HeaderIsHitted() || e.OriginalSource != e.Source)
            {
                foreach (BlockGridLayerBase blockGridLayerBase in Children)
                {
                    if (blockGridLayerBase.Visibility == Visibility.Visible)
                    {
                        if (handle(blockGridLayerBase))
                        {
                            break;
                        }
                    }
                }
            }
            else // out of range
            {
                if (e.RoutedEvent == Mouse.MouseUpEvent)
                {
                    foreach (var blockGridLayerBase in Children)
                    {
                        blockGridLayerBase.OnParentHitOutOfRangePrivate();
                    }
                }
            }

            //var head = Header as FrameworkElement;

            //IEnumerable<BlockGridLayerBase> layers;

            //if (head != null && point.Y <= head.ActualHeight)
            //    layers =
            //        Children.OfType<BlockGridLayerBase>().Where(c => (c.Region & LayerRegion.Head) == LayerRegion.Head);
            //else
            //    layers =
            //        Children.OfType<BlockGridLayerBase>().Where(c => (c.Region & LayerRegion.Body) == LayerRegion.Body);

            //BMK Refine Children When HandleEvent
        }
コード例 #18
0
ファイル: EditControlLayer.cs プロジェクト: agamat/Ribbon-1
        private void ScrollToInitalDrawLocation()
        {
            #region 自动滚动到编辑格
            Point point;
            if (!IsInViewRange(out point))
            {
                //Scroll to 当 InitalDrawLocation 不再可视范围内, 自动定位
                if (!InitalDrawLocation.HasValue)
                {
                    return;
                }

                if (!AxisYConverter.IsInViewRagne(point.Y))
                {
                    AxisPanel.SetVerticalOffset(InitalDrawLocation.Value.Y);
                }
                if (!AxisXConverter.IsInViewRagne(point.X))
                {
                    AxisPanel.SetHorizontalOffset(InitalDrawLocation.Value.X);
                }
            }
            #endregion
        }
コード例 #19
0
ファイル: PointOutLayer.cs プロジェクト: agamat/Ribbon-1
        private void SetToolTip(object sender, EventArgs e)
        {
            _timer.Stop();

            if (PointOutBlock == null)
            {
                return;
            }

            var point = Mouse.GetPosition(this);

            if (!AxisYConverter.IsInViewRagne(point.Y) || !AxisXConverter.IsInViewRagne(point.X))
            {
                return;
            }

            ToolTip.SaftyInvoke <ToolTip>(t =>
            {
                t.IsOpen    = true;
                t.Placement = PlacementMode.Mouse;
                t.Content   = PointOutBlock;
            });
        }
コード例 #20
0
        protected override void OnParentMouseDown(object sender, MouseButtonEventArgs e)
        {
            //xif (LayerContainer.TryPrevent()) return;
            if (e.LeftButton != MouseButtonState.Pressed)
            {
                return;
            }

            _startPoint = e.GetPosition(this);
            _lastPoint  = _startPoint;
            FlagAdd(MouseState.MouseDown);
            var date    = AxisXConverter.ScreenToData(0);
            var newDate = date.Add(StepMin);

            _stepMinDistance = AxisXConverter.DataToScreen(newDate);

            if (FlagExist(MouseState.LeftDirection) || FlagExist(MouseState.RightDirection))
            {
                e.Handled        = true;
                InvalidPlacement = true; // 注意 首次按下鼠标时先设定没任何拖动之前都不是有效的位置改变

                StartMouseMovementTracking();
            }
        }
コード例 #21
0
        protected override void OnParentMouseMove(object sender, MouseEventArgs e)
        {
            //xif (LayerContainer.TryPrevent()) return;

            var point = e.GetPosition(this);

            if (!FlagExist(MouseState.MouseDown))
            {
                MoveStateCheck(point); // 尝试变更鼠标样式
            }
            else
            {
                var moveDirection = MouseState.MouseOver;
                if (FlagExist(MouseState.LeftDirection))
                {
                    moveDirection = MouseState.LeftDirection;
                }
                if (FlagExist(MouseState.RightDirection))
                {
                    moveDirection = MouseState.RightDirection;
                }

                //未发现任何左右拉动现象
                if (moveDirection == MouseState.MouseOver)
                {
                    return;
                }

                //var step = AxisXConverter.ScreenToData(distance) - AxisPanel.ScreenStart;
                //if (!(PointOutBlock.End >= PointOutBlock.Start.AddMinutes(step.TotalMinutes))
                //    || !(PointOutBlock.End.AddMinutes(step.TotalMinutes) >= PointOutBlock.Start))
                //    return;

                var distance = point.X - _startPoint.X;
                _lastPoint = new Point(point.X - distance % _stepMinDistance, point.Y); // 刻度式移动,根据 stepMinDistance(通常为5)步进

                var moveSpan = AxisXConverter.ScreenToData(GetMoveOffSet()).Subtract(AxisXConverter.ScreenToData(0));

                var draggingPlacement = default(TimeRange);


                switch (moveDirection)
                {
                case MouseState.LeftDirection:
                    draggingPlacement = PointOutBlock == null ? default(TimeRange) : new TimeRange(PointOutBlock.Start.Add(moveSpan).AddSeconds(0.1), PointOutBlock.End);
                    break;

                case MouseState.RightDirection:
                    draggingPlacement = PointOutBlock == null ? default(TimeRange) : new TimeRange(PointOutBlock.Start, PointOutBlock.End.Add(moveSpan).AddSeconds(0.1));
                    break;
                }

                InvalidPlacement = draggingPlacement == default(TimeRange) || draggingPlacement.Invalid; // 检查Start, End数据正确性(通常Start不能大于End)

                if (InvalidPlacement)
                {
                    DropedPlacement = null;
                    return;
                }

                DropedPlacement = draggingPlacement;
                e.Handled       = true;
                InvalidateVisual();
            }
        }
コード例 #22
0
        private object PointoutBlock(Point e)
        {
            var y = e.Y; //- GetHeaderHeight();

            //var y1 = AxisYConverter.ScreenToData(y);
            //var y2 = (int)(y / Interval) + AxisYConverter.ScreenToData(0);

            //if (y1 != y2)
            //    Debug.Print(string.Format("-------- ViewportToDataY called : y1 = {0}  y2 = {1}", y1, y2));

            // BMK Ambiguous getRowIndex
            PointOutDataRowIndex = AxisYConverter.ScreenToData(y);

            object fountBlock = null;

            if (ItemsSource != null && 0 <= PointOutDataRowIndex && PointOutDataRowIndex < ItemsSource.Count)
            {
                var dateTime  = AxisXConverter.ScreenToData(e.X); // current mouse moved postion
                var positionY = y % Interval;                     // for Top useage


                if (CellMode)
                {
                    var date = dateTime.Date;
                    ItemsSource[PointOutDataRowIndex].SaftyInvoke <IEnumerable>(
                        o =>
                    {
                        fountBlock = o.OfType <ITerm>().FirstOrDefault(t =>
                        {
                            //using HrDate
                            var blockStart = BlockConverter.GetStart(t);
                            return((date == blockStart) && !TryPrevent(t));
                        });
                    });

                    if (RecursivelyPointout)
                    {
                        ItemsSource[PointOutDataRowIndex].SaftyInvoke <IDateIndexer <DateTerm> >(o => o[date].SaftyInvoke(b => fountBlock = b));
                    }
                }
                else
                {
                    ItemsSource[PointOutDataRowIndex].SaftyInvoke <IEnumerable>(
                        o =>
                    {
                        fountBlock = o.OfType <ITerm>().LastOrDefault(block =>
                        {
                            var blockStart = BlockConverter.GetStart(block);
                            var blockTop   = BlockConverter.GetTop(block);
                            return((blockStart <= dateTime && dateTime < block.End &&
                                    blockTop <= positionY && (BlockConverter.GetHeight(block) + blockTop) >= positionY) && !TryPrevent(block));
                        });
                    });
                }
            }

            if (fountBlock != null)
            {
                PointOutDataRowTop = (e.Y - e.Y % Interval) + BlockConverter.GetTop(fountBlock);
            }

            return(fountBlock);
        }