Esempio n. 1
0
        public ScrollCommand(GridUpdateType code, Size size)
        {
            Debug.Assert(code == GridUpdateType.SizeChange);

            UpdateType = code;
            Param      = size;
        }
Esempio n. 2
0
        private async Task DrawVisualsAsync(GridUpdateType updateType, bool suppressNotification, CancellationToken token, ISortOrder sortOrder)
        {
            var visualViewport = new Rect(Points.HorizontalOffset, Points.VerticalOffset, Points.ViewportWidth, Points.ViewportHeight);
            var newViewport    = Points.ComputeDataViewport(visualViewport);

            if (newViewport.Rows.Count < 1 || newViewport.Columns.Count < 1)
            {
                return;
            }

            // pull data from provider
            try {
                var data = await DataProvider.GetAsync(newViewport, sortOrder);

                if (data == null)
                {
                    throw new InvalidOperationException("Couldn't fetch grid data");
                }

                if (!data.Grid.Range.Contains(newViewport) ||
                    !data.ColumnHeader.Range.Contains(newViewport.Columns) ||
                    !data.RowHeader.Range.Contains(newViewport.Rows))
                {
                    throw new InvalidOperationException("Couldn't acquire enough data");
                }

                await DrawVisualsAsync(newViewport, data, updateType, visualViewport, suppressNotification, token);
            } catch (OperationCanceledException) { }
        }
Esempio n. 3
0
        private async Task DrawVisualsAsync(GridUpdateType updateType, bool suppressNotification, CancellationToken token, ISortOrder sortOrder)
        {
            Rect visualViewport = new Rect(
                Points.HorizontalOffset,
                Points.VerticalOffset,
                Points.ViewportWidth,
                Points.ViewportHeight);

            GridRange newViewport = Points.ComputeDataViewport(visualViewport);

            if (newViewport.Rows.Count < 1 || newViewport.Columns.Count < 1)
            {
                return;
            }

            // pull data from provider
            try {
                var data = await DataProvider.GetAsync(newViewport, sortOrder);

                if (!data.Grid.Range.Contains(newViewport) ||
                    !data.ColumnHeader.Range.Contains(newViewport.Columns) ||
                    !data.RowHeader.Range.Contains(newViewport.Rows))
                {
                    throw new InvalidOperationException("Couldn't acquire enough data");
                }

                // actual drawing runs in UI thread
                await Task.Factory.StartNew(
                    () => DrawVisuals(newViewport, data, updateType, visualViewport, suppressNotification),
                    token,
                    TaskCreationOptions.None,
                    _ui);
            } catch (OperationCanceledException) { }
        }
Esempio n. 4
0
        public ScrollCommand(GridUpdateType code, double offset, ThumbTrack thumbtrack) {
            Debug.Assert(code == GridUpdateType.SetHorizontalOffset
                || code == GridUpdateType.SetVerticalOffset);

            UpdateType = code;
            Param = new Tuple<double, ThumbTrack>(offset, thumbtrack);
        }
Esempio n. 5
0
        public ScrollCommand(GridUpdateType code, double param) {
            Debug.Assert(code != GridUpdateType.SizeChange
                && code != GridUpdateType.SetHorizontalOffset
                && code != GridUpdateType.SetVerticalOffset);

            UpdateType = code;
            Param = param;
        }
Esempio n. 6
0
        public ScrollCommand(GridUpdateType code, double offset, ThumbTrack thumbtrack)
        {
            Debug.Assert(code == GridUpdateType.SetHorizontalOffset ||
                         code == GridUpdateType.SetVerticalOffset);

            UpdateType = code;
            Param      = new Tuple <double, ThumbTrack>(offset, thumbtrack);
        }
Esempio n. 7
0
        public ScrollCommand(GridUpdateType code, double param)
        {
            Debug.Assert(code != GridUpdateType.SizeChange &&
                         code != GridUpdateType.SetHorizontalOffset &&
                         code != GridUpdateType.SetVerticalOffset);

            UpdateType = code;
            Param      = param;
        }
Esempio n. 8
0
        private async Task DrawVisualsAsync(
            GridRange dataViewport,
            IGridData <string> data,
            GridUpdateType updateType,
            Rect visualViewport,
            bool suppressNotification,
            CancellationToken token)
        {
            await VsAppShell.Current.SwitchToMainThreadAsync(token);

            using (var deferal = Points.DeferChangeNotification(suppressNotification)) {
                // measure points
                ColumnHeader?.MeasurePoints(
                    Points.GetAccessToPoints(ColumnHeader.ScrollDirection),
                    new GridRange(new Range(0, 1), dataViewport.Columns),
                    new RangeToGrid <string>(dataViewport.Columns, data.ColumnHeader, true),
                    updateType);

                RowHeader?.MeasurePoints(
                    Points.GetAccessToPoints(RowHeader.ScrollDirection),
                    new GridRange(dataViewport.Rows, new Range(0, 1)),
                    new RangeToGrid <string>(dataViewport.Rows, data.RowHeader, false),
                    updateType == GridUpdateType.Sort ? GridUpdateType.Refresh : updateType);

                DataGrid?.MeasurePoints(
                    Points.GetAccessToPoints(DataGrid.ScrollDirection),
                    dataViewport,
                    data.Grid,
                    updateType == GridUpdateType.Sort ? GridUpdateType.Refresh : updateType);

                // adjust Offset in case of overflow
                if ((Points.HorizontalOffset + visualViewport.Width).GreaterThanOrClose(Points.HorizontalExtent))
                {
                    Points.HorizontalOffset = Points.HorizontalExtent - visualViewport.Width;
                }
                if ((Points.VerticalOffset + visualViewport.Height).GreaterThanOrClose(Points.VerticalExtent))
                {
                    Points.VerticalOffset = Points.VerticalExtent - visualViewport.Height;
                }

                // arrange and draw gridline
                ColumnHeader?.ArrangeVisuals(Points.GetAccessToPoints(ColumnHeader.ScrollDirection));
                RowHeader?.ArrangeVisuals(Points.GetAccessToPoints(RowHeader.ScrollDirection));
                DataGrid?.ArrangeVisuals(Points.GetAccessToPoints(DataGrid.ScrollDirection));

                Points.ViewportHeight = DataGrid.RenderSize.Height;
                Points.ViewportWidth  = DataGrid.RenderSize.Width;
            }
        }
Esempio n. 9
0
        private void CreateGrid(GridRange newViewport, IGrid <string> data, GridUpdateType updateType)
        {
            var orgGrid = _visualGrid;

            if (Header)
            {
                _visualGrid = new Grid <TextVisual>(
                    newViewport,
                    (r, c) => {
                    if (updateType == GridUpdateType.Sort)
                    {
                        return(orgGrid[r, c]);
                    }
                    if (updateType != GridUpdateType.Refresh && _dataViewport.Contains(r, c))
                    {
                        return(orgGrid[r, c]);
                    }
                    var visual = new HeaderTextVisual(c);
                    InitVisual(r, c, data, visual);
                    return(visual);
                });
            }
            else
            {
                _visualGrid = new Grid <TextVisual>(
                    newViewport,
                    (r, c) => {
                    if (updateType != GridUpdateType.Refresh && _dataViewport.Contains(r, c))
                    {
                        return(orgGrid[r, c]);
                    }
                    var visual = new TextVisual();
                    InitVisual(r, c, data, visual);
                    return(visual);
                });
            }
        }
Esempio n. 10
0
 internal void EnqueueCommand(GridUpdateType code, double param) {
     _scrollCommands.Add(new ScrollCommand(code, param));
 }
Esempio n. 11
0
        private void DrawVisuals(
            GridRange dataViewport,
            IGridData<string> data,
            GridUpdateType updateType,
            Rect visualViewport,
            bool suppressNotification) {

            using (var deferal = Points.DeferChangeNotification(suppressNotification)) {
                // measure points
                ColumnHeader?.MeasurePoints(
                    Points.GetAccessToPoints(ColumnHeader.ScrollDirection),
                    new GridRange(new Range(0, 1), dataViewport.Columns),
                    new RangeToGrid<string>(dataViewport.Columns, data.ColumnHeader, true),
                    updateType);

                RowHeader?.MeasurePoints(
                    Points.GetAccessToPoints(RowHeader.ScrollDirection),
                    new GridRange(dataViewport.Rows, new Range(0, 1)),
                    new RangeToGrid<string>(dataViewport.Rows, data.RowHeader, false),
                    updateType == GridUpdateType.Sort ? GridUpdateType.Refresh : updateType);

                DataGrid?.MeasurePoints(
                    Points.GetAccessToPoints(DataGrid.ScrollDirection),
                    dataViewport,
                    data.Grid,
                    updateType == GridUpdateType.Sort ? GridUpdateType.Refresh : updateType);

                // adjust Offset in case of overflow
                if ((Points.HorizontalOffset + visualViewport.Width).GreaterThanOrClose(Points.HorizontalExtent)) {
                    Points.HorizontalOffset = Points.HorizontalExtent - visualViewport.Width;
                }
                if ((Points.VerticalOffset + visualViewport.Height).GreaterThanOrClose(Points.VerticalExtent)) {
                    Points.VerticalOffset = Points.VerticalExtent - visualViewport.Height;
                }

                // arrange and draw gridline
                ColumnHeader?.ArrangeVisuals(Points.GetAccessToPoints(ColumnHeader.ScrollDirection));
                RowHeader?.ArrangeVisuals(Points.GetAccessToPoints(RowHeader.ScrollDirection));
                DataGrid?.ArrangeVisuals(Points.GetAccessToPoints(DataGrid.ScrollDirection));

                Points.ViewportHeight = DataGrid.RenderSize.Height;
                Points.ViewportWidth = DataGrid.RenderSize.Width;
            }
        }
Esempio n. 12
0
        private async Task DrawVisualsAsync(GridUpdateType updateType, bool suppressNotification, CancellationToken token, ISortOrder sortOrder) {
            Rect visualViewport = new Rect(
                    Points.HorizontalOffset,
                    Points.VerticalOffset,
                    Points.ViewportWidth,
                    Points.ViewportHeight);

            GridRange newViewport = Points.ComputeDataViewport(visualViewport);

            if (newViewport.Rows.Count < 1 || newViewport.Columns.Count < 1) {
                return;
            }

            // pull data from provider
            try {
                var data = await DataProvider.GetAsync(newViewport, sortOrder);
                if (data == null) {
                    throw new InvalidOperationException("Couldn't fetch grid data");
                }

                if (!data.Grid.Range.Contains(newViewport)
                    || !data.ColumnHeader.Range.Contains(newViewport.Columns)
                    || !data.RowHeader.Range.Contains(newViewport.Rows)) {
                    throw new InvalidOperationException("Couldn't acquire enough data");
                }

                // actual drawing runs in UI thread
                await Task.Factory.StartNew(
                    () => DrawVisuals(newViewport, data, updateType, visualViewport, suppressNotification),
                    token,
                    TaskCreationOptions.None,
                    _ui);
            } catch (OperationCanceledException) { }
        }
Esempio n. 13
0
 private bool IsRepeating(List<ScrollCommand> commands, int index, GridUpdateType[] scrollTypes) {
     return commands[index].UpdateType == commands[index + 1].UpdateType && scrollTypes.Contains(commands[index].UpdateType);
 }
Esempio n. 14
0
 internal void EnqueueCommand(GridUpdateType code, object param) => _scrollCommands.Post(new ScrollCommand(code, param));
Esempio n. 15
0
        private async Task DrawVisualsAsync(GridRange dataViewport, IGridData <string> data, GridUpdateType updateType, Rect visualViewport, bool suppressNotification, CancellationToken token)
        {
            await _services.MainThread().SwitchToAsync(token);

            DataGrid.SelectedIndex = new GridIndex(Math.Min(DataGrid.SelectedIndex.Row, DataProvider.RowCount - 1), Math.Min(DataGrid.SelectedIndex.Column, DataProvider.ColumnCount - 1));
            var columnsData = new RangeToGrid <string>(dataViewport.Columns, data.ColumnHeader, true);
            var rowsData    = new RangeToGrid <string>(dataViewport.Rows, data.RowHeader, false);
            var cellsData   = data.Grid;

            using (Points.DeferChangeNotification(suppressNotification)) {
                // measure points
                ColumnHeader.MeasurePoints(
                    Points.GetAccessToPoints(ColumnHeader.ScrollDirection),
                    new GridRange(new Range(0, 1), dataViewport.Columns),
                    columnsData,
                    updateType);

                RowHeader.MeasurePoints(
                    Points.GetAccessToPoints(RowHeader.ScrollDirection),
                    new GridRange(dataViewport.Rows, new Range(0, 1)),
                    rowsData,
                    updateType == Sort ? Refresh : updateType);

                DataGrid.MeasurePoints(
                    Points.GetAccessToPoints(DataGrid.ScrollDirection),
                    dataViewport,
                    cellsData,
                    updateType == Sort ? Refresh : updateType);

                // adjust Offset in case of overflow
                if ((Points.HorizontalOffset + visualViewport.Width).GreaterOrCloseTo(Points.HorizontalExtent))
                {
                    Points.HorizontalOffset = Points.HorizontalExtent - visualViewport.Width;
                }
                if ((Points.VerticalOffset + visualViewport.Height).GreaterOrCloseTo(Points.VerticalExtent))
                {
                    Points.VerticalOffset = Points.VerticalExtent - visualViewport.Height;
                }

                if (updateType == ScrollIntoView)
                {
                    AdjustFocusedCellOffset(visualViewport);
                }

                // arrange and draw gridline
                ColumnHeader.ArrangeVisuals(Points.GetAccessToPoints(ColumnHeader.ScrollDirection));
                RowHeader.ArrangeVisuals(Points.GetAccessToPoints(RowHeader.ScrollDirection));
                DataGrid.ArrangeVisuals(Points.GetAccessToPoints(DataGrid.ScrollDirection));

                Points.ViewportHeight = DataGrid.RenderSize.Height;
                Points.ViewportWidth  = DataGrid.RenderSize.Width;
            }

            DataViewport = dataViewport;
            Data         = data;
            _owner.AutomationPeer?.Update();
        }
Esempio n. 16
0
 internal void EnqueueCommand(GridUpdateType code, double param)
 {
     _scrollCommands.Add(new ScrollCommand(code, param));
 }
Esempio n. 17
0
        internal void MeasurePoints(IPoints points, GridRange newViewport, IGrid<string> data, GridUpdateType updateType) {
            CreateGrid(newViewport, data, updateType);
            _visualChildren.Clear();

            foreach (int c in newViewport.Columns.GetEnumerable()) {
                foreach (int r in newViewport.Rows.GetEnumerable()) {
                    var visual = _visualGrid[r, c];

                    visual.Draw();
                    points.Width[c] = visual.Size.Width + (visual.Margin * 2) + GridLineThickness;
                    points.Height[r] = visual.Size.Height + (visual.Margin * 2) + GridLineThickness;

                    _visualChildren.Add(_visualGrid[r, c]);
                }
            }

            _dataViewport = newViewport;
        }
Esempio n. 18
0
 internal void EnqueueCommand(GridUpdateType code, double offset, ThumbTrack track) {
     _scrollCommands.Add(new ScrollCommand(code, offset, track));
 }
Esempio n. 19
0
 internal void EnqueueCommand(GridUpdateType code, double offset, ThumbTrack track)
 {
     _scrollCommands.Add(new ScrollCommand(code, offset, track));
 }
Esempio n. 20
0
 internal void EnqueueCommand(GridUpdateType code, Size size)
 {
     _scrollCommands.Add(new ScrollCommand(code, size));
 }
Esempio n. 21
0
        public ScrollCommand(GridUpdateType code, Size size) {
            Debug.Assert(code == GridUpdateType.SizeChange);

            UpdateType = code;
            Param = size;
        }
Esempio n. 22
0
 internal void EnqueueCommand(GridUpdateType code, Size size) {
     _scrollCommands.Add(new ScrollCommand(code, size));
 }
Esempio n. 23
0
        internal void MeasurePoints(IPoints points, GridRange newViewport, IGrid <string> data, GridUpdateType updateType)
        {
            CreateGrid(newViewport, data, updateType);
            _visualChildren.Clear();

            foreach (int c in newViewport.Columns.GetEnumerable())
            {
                foreach (int r in newViewport.Rows.GetEnumerable())
                {
                    var visual = _visualGrid[r, c];

                    visual.Draw();
                    points.Width[c]  = visual.Size.Width + (visual.Margin * 2) + GridLineThickness;
                    points.Height[r] = visual.Size.Height + (visual.Margin * 2) + GridLineThickness;

                    _visualChildren.Add(_visualGrid[r, c]);
                }
            }

            _dataViewport = newViewport;
        }
Esempio n. 24
0
 private void CreateGrid(GridRange newViewport, IGrid<string> data, GridUpdateType updateType) {
     var orgGrid = _visualGrid;
     if (Header) {
         _visualGrid = new Grid<TextVisual>(
                 newViewport,
                 (r, c) => {
                     if (updateType == GridUpdateType.Sort) {
                         return orgGrid[r, c];
                     }
                     if (updateType != GridUpdateType.Refresh && _dataViewport.Contains(r, c)) {
                         return orgGrid[r, c];
                     }
                     var visual = new HeaderTextVisual(c);
                     InitVisual(r, c, data, visual);
                     return visual;
                 });
     } else {
         _visualGrid = new Grid<TextVisual>(
             newViewport,
             (r, c) => {
                 if (updateType != GridUpdateType.Refresh && _dataViewport.Contains(r, c)) {
                     return orgGrid[r, c];
                 }
                 var visual = new TextVisual();
                 InitVisual(r, c, data, visual);
                 return visual;
             });
     }
 }
Esempio n. 25
0
 public ScrollCommand(GridUpdateType code, object param)
 {
     UpdateType = code;
     Param      = param;
 }