logo
Welcome Guest! To enable all features please Login or Register.

Notification

Icon
Error

Post a reply
From:
Message:

Maximum number of characters in each post is: 32767
Bold Italic Underline   Highlight Quote Choose Language for Syntax Highlighting Insert Image Insert an existing Attachment or upload a new File... Create Link   Unordered List Ordered List   Left Justify Center Justify Right Justify   Outdent Indent   More BBCode Tags
Font Color Font Size
Security Image:
Enter The Letters From The Security Image:
  Preview Post Cancel

Last 10 Posts (In reverse order)
Paul Rayman Posted: Wednesday, August 25, 2021 8:35:19 PM(UTC)
 
Here is an example of such functionality.

Code:

public class MyPdfViewer : PdfViewer
{
	PointF _startPt = new PointF(0, 0);
	PointF _curPt = new PointF(0, 0);
	int _shapshotPage = -1;
	bool _isSelectionStarted = false;

	protected override void OnMouseDown(MouseEventArgs e)
	{
		base.OnMouseDown(e);

		_shapshotPage = PointInPage(e.Location);
		if (_shapshotPage >= 0)
		{
			HighlightedTextInfo.Clear();
			_startPt = ClientToPage(_shapshotPage, e.Location);
			_curPt = _startPt;
			_isSelectionStarted = true;
		}

	}

	protected override void OnMouseUp(MouseEventArgs e)
	{
		base.OnMouseUp(e);
		_isSelectionStarted = false;

		if (_shapshotPage >= 0)
		{
			FS_POINTF leftTop, rightBottom;
			NormalizeSnapshotPoints(out leftTop, out rightBottom);

			var page = Document.Pages[_shapshotPage];
			var len = page.Text.CountChars;
			int lineLen = 0;
			for(int i=0; i< len; i++)
            {
				var chBox = page.Text.GetCharBox(i);
				if(IntersectsWith(chBox, new FS_RECTF(leftTop.X, leftTop.Y, rightBottom.X, rightBottom.Y)))
					lineLen++;
				else if(lineLen>0)
				{
					if (!HighlightedTextInfo.ContainsKey(_shapshotPage))
						HighlightedTextInfo.Add(_shapshotPage, new List<HighlightInfo>());
					var hInf = HighlightedTextInfo[_shapshotPage];
					hInf.Add(new HighlightInfo() { CharIndex = i - lineLen, CharsCount = lineLen, Color = Color.Red });
					lineLen = 0;
					Invalidate();
                }
            }
			_shapshotPage = -1;
		}
	}

	protected override void OnMouseMove(MouseEventArgs e)
	{
		base.OnMouseMove(e);
		if (_isSelectionStarted)
		{
			DeselectText();
			int pageIdx = PointInPage(e.Location);
			if (pageIdx != _shapshotPage)
				return;

			_curPt = ClientToPage(_shapshotPage, e.Location);
			Invalidate();
		}
	}

	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint(e);
		if (_shapshotPage >= 0)
		{
			var pt1 = PageToClient(_shapshotPage, _startPt);
			var pt2 = PageToClient(_shapshotPage, _curPt);
			int left = Math.Min(pt1.X, pt2.X);
			int top = Math.Min(pt1.Y, pt2.Y);
			int right = Math.Max(pt1.X, pt2.X);
			int bottom = Math.Max(pt1.Y, pt2.Y);
			e.Graphics.DrawRectangle(Pens.Red, left, top, right - left, bottom - top);
		}
	}

	private void NormalizeSnapshotPoints(out FS_POINTF leftTop, out FS_POINTF rightBotton)
	{
		leftTop = new FS_POINTF(
			Math.Min(_startPt.X, _curPt.X),
			Math.Max(_startPt.Y, _curPt.Y));
		rightBotton = new FS_POINTF(
			Math.Max(_startPt.X, _curPt.X),
			Math.Min(_startPt.Y, _curPt.Y));
	}

	public bool IntersectsWith(FS_RECTF rect1, FS_RECTF rect2)
	{
		return rect1.left < rect2.right && rect1.right > rect2.left && rect1.top > rect2.bottom && rect1.bottom < rect2.top;
	}
}
gffranca Posted: Wednesday, August 25, 2021 6:17:27 PM(UTC)
 
Is it possible to use the selection tool in area (column) mode?

This image illustrates how the tool works in Acrobat. While using Alt key, the selection is based on it's starting point.
This feature, sometimes, is included in code editors too.
I believe it works similar to Text.GetBoundedText(), but in this case it is for selection in the viewer.

Any ideas?

marquee.PNG