public override void EnsureSpanVisible(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options) { if (lineSpan.IsDefault) throw new ArgumentException(); if (lineSpan.BufferSpan.Buffer != hexView.Buffer) throw new ArgumentException(); EnsureSpanVisibleCore(lineSpan, options); }
void EnsureSpanVisibleX(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options) { var span = lineSpan.BufferSpan; if (hexView.ViewportWidth == 0) return; var lines = hexView.HexViewLines.GetHexViewLinesIntersectingSpan(span); if (lines.Count == 0) return; var ispan = span.Intersection(hexView.HexViewLines.FormattedSpan); if (ispan == null) return; span = ispan.Value; double left = double.PositiveInfinity, right = double.NegativeInfinity; for (int i = 0; i < lines.Count; i++) { var line = lines[i]; var intersection = line.BufferSpan.Intersection(span); if (intersection == null) continue; var bounds = lineSpan.IsTextSpan ? line.GetNormalizedTextBounds(lineSpan.TextSpan.Value) : line.GetNormalizedTextBounds(intersection.Value, lineSpan.SelectionFlags.Value); foreach (var b in bounds) { if (left > b.Left) left = b.Left; if (right < b.Right) right = b.Right; } } if (double.IsInfinity(left) || double.IsInfinity(right)) return; Debug.Assert(left <= right); if (left > right) right = left; double width = right - left; double availWidth = Math.Max(0, hexView.ViewportWidth - width); double extraScroll; const double EXTRA_WIDTH = 4; if (availWidth >= EXTRA_WIDTH) extraScroll = EXTRA_WIDTH; else extraScroll = availWidth / 2; if (hexView.ViewportLeft <= right && right <= hexView.ViewportRight) { } else if (right > hexView.ViewportRight) hexView.ViewportLeft = right + extraScroll - hexView.ViewportWidth; else { var newLeft = left - extraScroll; if (newLeft + hexView.ViewportWidth < right) newLeft = right - hexView.ViewportWidth; hexView.ViewportLeft = newLeft; } }
internal void Update(HexLineSpan lineSpan, VSTA.PopupStyles style) { if (lineSpan.IsDefault) throw new ArgumentException(); if ((style & (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) == (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) throw new ArgumentOutOfRangeException(nameof(style)); this.lineSpan = lineSpan; this.style = style; wpfHexView.QueueSpaceReservationStackRefresh(); }
void EnsureSpanVisibleCore(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options) { if (lineSpan.BufferSpan.Buffer != hexView.Buffer) throw new ArgumentException(); if ((hexView.HexViewLines?.Count ?? 0) == 0) return; EnsureSpanVisibleY(lineSpan.BufferSpan, options); EnsureSpanVisibleX(lineSpan, options); }
public HexPopupSpaceReservationAgent(HexSpaceReservationManager spaceReservationManager, WpfHexView wpfHexView, HexLineSpan lineSpan, VSTA.PopupStyles style, UIElement content) { if (spaceReservationManager == null) throw new ArgumentNullException(nameof(spaceReservationManager)); if (lineSpan.IsDefault) throw new ArgumentException(); if (content == null) throw new ArgumentNullException(nameof(content)); if ((style & (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) == (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) throw new ArgumentOutOfRangeException(nameof(style)); this.spaceReservationManager = spaceReservationManager; this.wpfHexView = wpfHexView; this.lineSpan = lineSpan; this.style = style; this.content = content; popup = new Popup { PlacementTarget = wpfHexView.VisualElement, Placement = PlacementMode.Relative, Visibility = Visibility.Collapsed, IsOpen = false, AllowsTransparency = true, UseLayoutRounding = true, SnapsToDevicePixels = true, }; }
public override HexSpaceReservationAgent CreatePopupAgent(HexLineSpan lineSpan, VSTA.PopupStyles style, UIElement content) { if (wpfHexView.IsClosed) throw new InvalidOperationException(); if (lineSpan.IsDefault) throw new ArgumentException(); if (content == null) throw new ArgumentNullException(nameof(content)); if ((style & (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) == (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) throw new ArgumentOutOfRangeException(nameof(style)); return new HexPopupSpaceReservationAgent(this, wpfHexView, lineSpan, style, content); }
public override void UpdatePopupAgent(HexSpaceReservationAgent agent, HexLineSpan lineSpan, VSTA.PopupStyles styles) { if (wpfHexView.IsClosed) throw new InvalidOperationException(); if (agent == null) throw new ArgumentNullException(nameof(agent)); if (lineSpan.IsDefault) throw new ArgumentException(); if ((styles & (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) == (VSTA.PopupStyles.DismissOnMouseLeaveText | VSTA.PopupStyles.DismissOnMouseLeaveTextOrContent)) throw new ArgumentOutOfRangeException(nameof(styles)); if (!spaceReservationAgents.Contains(agent)) throw new ArgumentOutOfRangeException(nameof(agent)); var popupAgent = agent as HexPopupSpaceReservationAgent; if (popupAgent == null) throw new ArgumentException(); popupAgent.Update(lineSpan, styles); UpdateAggregateFocus(); wpfHexView.QueueSpaceReservationStackRefresh(); }