ScrollDirection?GetScrollDirection(HexMouseLocation mouseLoc, out TimeSpan interval) { // Give prio to scrolling up/down (more common than scrolling left/right) if (mouseLoc.Point.Y < wpfHexView.ViewportTop) { interval = GetVerticalInterval(mouseLoc.Point.Y - wpfHexView.ViewportTop); return(ScrollDirection.Up); } if (mouseLoc.Point.Y >= wpfHexView.ViewportBottom) { interval = GetVerticalInterval(mouseLoc.Point.Y - wpfHexView.ViewportBottom); return(ScrollDirection.Down); } if (mouseLoc.Point.X < wpfHexView.ViewportLeft) { interval = GetHorizontalInterval(mouseLoc.Point.X - wpfHexView.ViewportLeft); return(ScrollDirection.Left); } if (mouseLoc.Point.X >= wpfHexView.ViewportRight) { interval = GetHorizontalInterval(mouseLoc.Point.X - wpfHexView.ViewportRight); return(ScrollDirection.Right); } interval = TimeSpan.Zero; return(null); }
void VisualElement_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (VisualElement.CaptureMouse()) { var line = HexMouseLocation.Create(wpfHexViewHost.HexView, e, insertionPosition: false).HexViewLine; editorOperations.SelectLine(line, (Keyboard.Modifiers & ModifierKeys.Shift) != 0); mouseCaptured = true; e.Handled = true; return; } }
bool IsInSelection(HexMouseLocation mouseLoc) { if (wpfHexView.Selection.IsEmpty) return false; var position = mouseLoc.HexViewLine.BufferLine.GetClosestCellPosition(mouseLoc.Position, onlyVisibleCells: true); if (position == null) return false; var point = position.Value.BufferPosition; foreach (var span in wpfHexView.Selection.SelectedSpans) { if (span.Contains(point)) return true; } return false; }
void WpfHexView_MouseMove(object sender, MouseEventArgs e) { if (owner.IsClosed || owner.IsMouseOverOverlayLayerElement(e)) { ClearMouseHoverPositionAndStopTimer(); return; } if (e.LeftButton != MouseButtonState.Released || e.RightButton != MouseButtonState.Released || e.MiddleButton != MouseButtonState.Released) { return; } var loc = HexMouseLocation.TryCreateTextOnly(owner, e); LinePosition?newPosition; if (loc == null) { newPosition = null; } else if (loc.Position > loc.HexViewLine.TextSpan.End) { newPosition = null; } else if (!(loc.HexViewLine.TextTop <= loc.Point.Y && loc.Point.Y < loc.HexViewLine.TextBottom)) { newPosition = null; } else if (!(loc.HexViewLine.TextLeft <= loc.Point.X && loc.Point.X < loc.HexViewLine.TextRight)) { newPosition = null; } else { newPosition = new LinePosition(loc.HexViewLine.BufferLine, loc.Position); } if (newPosition != position) { position = newPosition; StopTimer(); foreach (var h in handlers) { h.Raised = false; } UpdateTimer(); } }
bool IsInSelection(HexMouseLocation mouseLoc) { if (wpfHexView.Selection.IsEmpty) { return(false); } var position = mouseLoc.HexViewLine.BufferLine.GetClosestCellPosition(mouseLoc.Position, onlyVisibleCells: true); if (position == null) { return(false); } var point = position.Value.BufferPosition; foreach (var span in wpfHexView.Selection.SelectedSpans) { if (span.Contains(point)) { return(true); } } return(false); }
void VisualElement_MouseMove(object sender, MouseEventArgs e) { if (mouseCaptured) { var mouseLoc = HexMouseLocation.Create(wpfHexViewHost.HexView, e, insertionPosition: false); var line = mouseLoc.HexViewLine; editorOperations.SelectLine(line, true); // Needed or the scrolling will stop if (mouseLoc.Point.Y <= wpfHexViewHost.HexView.ViewportTop) { editorOperations.ScrollUpAndMoveCaretIfNecessary(); } else if (mouseLoc.Point.Y >= wpfHexViewHost.HexView.ViewportBottom) { var lastVisLine = wpfHexViewHost.HexView.HexViewLines.LastVisibleLine; if (!lastVisLine.IsLastDocumentLine() || lastVisLine.VisibilityState != VSTF.VisibilityState.FullyVisible) { editorOperations.ScrollDownAndMoveCaretIfNecessary(); } } e.Handled = true; return; } }
void SelectToMousePosition(HexMouseLocation mouseLoc, bool extendSelection) => editorOperations.MoveCaret(mouseLoc.HexViewLine, mouseLoc.Point.X, extendSelection, hexMoveToFlags);
HexMouseLocation GetLocation(MouseEventArgs e) => HexMouseLocation.Create(wpfHexView, e, insertionPosition: insertionPosition);
ScrollDirection? GetScrollDirection(HexMouseLocation mouseLoc, out TimeSpan interval) { // Give prio to scrolling up/down (more common than scrolling left/right) if (mouseLoc.Point.Y < wpfHexView.ViewportTop) { interval = GetVerticalInterval(mouseLoc.Point.Y - wpfHexView.ViewportTop); return ScrollDirection.Up; } if (mouseLoc.Point.Y >= wpfHexView.ViewportBottom) { interval = GetVerticalInterval(mouseLoc.Point.Y - wpfHexView.ViewportBottom); return ScrollDirection.Down; } if (mouseLoc.Point.X < wpfHexView.ViewportLeft) { interval = GetHorizontalInterval(mouseLoc.Point.X - wpfHexView.ViewportLeft); return ScrollDirection.Left; } if (mouseLoc.Point.X >= wpfHexView.ViewportRight) { interval = GetHorizontalInterval(mouseLoc.Point.X - wpfHexView.ViewportRight); return ScrollDirection.Right; } interval = TimeSpan.Zero; return null; }