/// <summary> /// Returns the first and last point for the given lines in a region. /// </summary> /// <param name="region">The region.</param> /// <param name="first">The index of the first line.</param> /// <param name="last">The index of the last line.</param> /// <param name="allowEstimatesForOutOfViewLines">if set to <c>true</c> allow estimates for out of view lines.</param> /// <returns></returns> public override DoubleSpan RangeToPoints(ScrollAxisRegion region, int first, int last, bool allowEstimatesForOutOfViewLines) { VisibleLinesCollection lines = GetVisibleLines(); // If line is visible use already calculated values, // otherwise get value from Distances VisibleLineInfo line1 = lines.GetVisibleLineAtLineIndex(first); VisibleLineInfo line2 = lines.GetVisibleLineAtLineIndex(last); double p1, p2; p1 = line1 == null?Distances.GetCumulatedDistanceAt(first) : GetCumulatedOrigin(line1); p2 = line2 == null?Distances.GetCumulatedDistanceAt(last + 1) : GetCumulatedCorner(line2); return(RangeToPointsHelper(region, p1, p2)); }
private DoubleSpan RangeToPointsHelper(ScrollAxisRegion region, double p1, double p2) { VisibleLinesCollection lines = GetVisibleLines(); switch (region) { case ScrollAxisRegion.Header: if (HeaderLineCount > 0) { return(new DoubleSpan(p1, p2)); } else { return(DoubleSpan.Empty); } case ScrollAxisRegion.Footer: if (IsFooterVisible) { VisibleLineInfo l = lines[lines.FirstFooterVisibleIndex]; double p3 = Distances.TotalDistance - this.FooterExtent; p1 += l.Origin - p3; p2 += l.Origin - p3; return(new DoubleSpan(p1, p2)); } else { return(DoubleSpan.Empty); } case ScrollAxisRegion.Body: p1 += HeaderExtent - ScrollBar.Value; p2 += HeaderExtent - ScrollBar.Value; return(new DoubleSpan(p1, p2)); } return(DoubleSpan.Empty); }
protected override DropPosition GetDropPosition(DragEventArgs args, RowColumnIndex rowColumnIndex) { bool canDrop = true; var p = args.GetPosition(this.TreeGrid); var treeNode = this.TreeGrid.GetNodeAtRowIndex(rowColumnIndex.RowIndex); ScrollAxisRegion columnRegion = ScrollAxisRegion.Body; var treeGridPanel = TreeGrid.GetTreePanel(); if (treeGridPanel.FrozenColumns > 0) { columnRegion = ScrollAxisRegion.Header; } var rowRect = treeGridPanel.RangeToRect(ScrollAxisRegion.Body, columnRegion, rowColumnIndex, true, false); var node = treeNode; if (!canDrop) { return(DropPosition.None); } else if (p.Y > rowRect.Y + 15 && p.Y < rowRect.Y + 35) { return(DropPosition.DropAsChild); } else if (p.Y < rowRect.Y + 15) { return(DropPosition.DropAbove); } else if (p.Y > rowRect.Y + 35) { return(DropPosition.DropBelow); } else { return(DropPosition.Default); } }
/// <summary> /// Gets the dropping position of a dragging row. /// </summary> /// <param name="args">An <see cref="T:Windows.UI.Xaml.DragEventArgs">DragEventArgs</see> that contains the event data.</param> /// <param name="rowColumnIndex"> /// Specified index on which the mouse is hovered. /// </param> /// <returns> /// Returns appropriate drop position <see cref="Syncfusion.UI.Xaml.TreeGrid.DropPosition"/> if row can drop at the specified index otherwise none. /// </returns> protected virtual DropPosition GetDropPosition(DragEventArgs args, RowColumnIndex rowColumnIndex) { bool canDrop = true; var p = args.GetPosition(this.TreeGrid); var treeNode = this.TreeGrid.GetNodeAtRowIndex(rowColumnIndex.RowIndex); ScrollAxisRegion columnRegion = ScrollAxisRegion.Body; if (TreeGrid.TreeGridPanel.FrozenColumns > 0) { columnRegion = ScrollAxisRegion.Header; } var rowRect = this.TreeGrid.TreeGridPanel.RangeToRect(ScrollAxisRegion.Body, columnRegion, rowColumnIndex, true, false); var node = treeNode; var nodes = GetNodes(args); if (nodes != null) { foreach (var draggingNode in nodes) { node = treeNode; while (node != null) { if (node == draggingNode) { canDrop = false; break; } node = node.ParentNode; } if (!canDrop) { break; } } } if (!canDrop) { return(DropPosition.None); } else if (p.Y > rowRect.Y + 15 && p.Y < rowRect.Y + 35) { if (!treeNode.IsExpanded) { if (CanAutoExpand) { timer.Interval = autoExpandDelay; timer.Tick -= Timer_Tick; autoExpandNode = treeNode; StartTimer(); } } return(DropPosition.DropAsChild); } else if (p.Y < rowRect.Y + 15) { return(DropPosition.DropAbove); } else if (p.Y > rowRect.Y + 35) { return(DropPosition.DropBelow); } else { return(DropPosition.Default); } }
/// <summary> /// Returns the first and last point for the given lines in a region. /// </summary> /// <param name="region">The region.</param> /// <param name="first">The index of the first line.</param> /// <param name="last">The index of the last line.</param> /// <param name="allowEstimatesForOutOfViewLines">if set to <c>true</c> allow estimates for out of view lines.</param> /// <returns></returns> public override DoubleSpan RangeToPoints(ScrollAxisRegion region, int first, int last, bool allowEstimatesForOutOfViewLines) { VisibleLinesCollection visibleLines = this.GetVisibleLines(); bool firstVisible, lastVisible; VisibleLineInfo firstLine, lastLine; GetLinesAndVisibility(first, last, true, out firstVisible, out lastVisible, out firstLine, out lastLine); if (firstLine == null || lastLine == null) { return(DoubleSpan.Empty); } if (allowEstimatesForOutOfViewLines) { switch (region) { case ScrollAxisRegion.Header: if (!firstLine.IsHeader) { return(DoubleSpan.Empty); } break; case ScrollAxisRegion.Footer: if (!lastLine.IsFooter) { return(DoubleSpan.Empty); } break; case ScrollAxisRegion.Body: if (firstLine.IsFooter || lastLine.IsHeader) { return(DoubleSpan.Empty); } break; } // switch return(new DoubleSpan(firstLine.Origin, lastLine.Corner)); } else { switch (region) { case ScrollAxisRegion.Header: { if (!firstLine.IsHeader) { return(DoubleSpan.Empty); } if (!lastVisible || !lastLine.IsHeader) { double corner = firstLine.Corner; for (int n = firstLine.LineIndex + 1; n <= last; n++) { corner += GetLineSize(n); } return(new DoubleSpan(firstLine.Origin, corner)); } return(new DoubleSpan(firstLine.Origin, lastLine.Corner)); } case ScrollAxisRegion.Footer: { if (!lastLine.IsFooter) { return(DoubleSpan.Empty); } if (!firstVisible || !firstLine.IsFooter) { double origin = lastLine.Origin; for (int n = lastLine.LineIndex - 1; n >= first; n--) { origin -= GetLineSize(n); } return(new DoubleSpan(origin, lastLine.Corner)); } return(new DoubleSpan(firstLine.Origin, lastLine.Corner)); } case ScrollAxisRegion.Body: { if (firstLine.IsFooter || lastLine.IsHeader) { return(DoubleSpan.Empty); } double origin = firstLine.Origin; if (!firstVisible || firstLine.Region != ScrollAxisRegion.Body) { origin = HeaderExtent; for (int n = ScrollLineIndex - 1; n >= first; n--) { origin -= GetLineSize(n); } } double corner = lastLine.Corner; if (!lastVisible || lastLine.Region != ScrollAxisRegion.Body) { corner = LastBodyVisibleLine.Corner; for (int n = LastBodyVisibleLine.LineIndex + 1; n <= last; n++) { corner += GetLineSize(n); } } return(new DoubleSpan(origin, corner)); } } // switch return(new DoubleSpan(firstLine.Origin, lastLine.Corner)); } }