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);
		void SelectToMousePosition(HexMouseLocation mouseLoc, bool extendSelection) =>
			editorOperations.MoveCaret(mouseLoc.HexViewLine, mouseLoc.Point.X, extendSelection, hexMoveToFlags);
		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;
		}