using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Paroxe.PdfRenderer.Internal;
namespace Paroxe.PdfRenderer
{
#if !UNITY_WEBGL
///
/// Represent a search session within a specific page. To search in entire document use PDFTextPage.Search
///
public class PDFSearchHandle : IDisposable
{
public enum MatchOption
{
NONE = 0x00000000,
MATCH_CASE = 0x00000001,
MATCH_WHOLE_WORD = 0x00000002,
MATCH_CASE_AND_WHOLE_WORD = 0x00000003
}
private bool m_Disposed;
private IntPtr m_NativePointer;
private PDFTextPage m_TextPage;
public PDFSearchHandle(PDFTextPage textPage, byte[] findWhatUnicode, int startIndex,
MatchOption flags = MatchOption.NONE)
{
if (textPage == null)
throw new NullReferenceException();
if (startIndex < 0)
throw new ArgumentOutOfRangeException();
PDFLibrary.AddRef("PDFSearchHandle");
m_TextPage = textPage;
IntPtr unmanagedPointer = Marshal.AllocHGlobal(findWhatUnicode.Length);
Marshal.Copy(findWhatUnicode, 0, unmanagedPointer, findWhatUnicode.Length);
m_NativePointer = NativeMethods.FPDFText_FindStart(textPage.NativePointer, unmanagedPointer, (uint)flags, startIndex);
Marshal.FreeHGlobal(unmanagedPointer);
}
~PDFSearchHandle()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!m_Disposed)
{
lock (PDFLibrary.nativeLock)
{
if (m_NativePointer != IntPtr.Zero)
{
NativeMethods.FPDFText_FindClose(m_NativePointer);
m_NativePointer = IntPtr.Zero;
}
}
PDFLibrary.RemoveRef("PDFSearchHandle");
m_Disposed = true;
}
}
public IntPtr NativePointer
{
get { return m_NativePointer; }
}
///
/// Return an array containing all the searchResults. If there is no result, this function return null.
///
///
public IList GetResults()
{
List results = new List();
foreach (PDFSearchResult result in EnumerateSearchResults())
{
results.Add(result);
}
return results;
}
///
/// Enumerate search results.
///
///
public IEnumerable EnumerateSearchResults()
{
if (m_NativePointer != IntPtr.Zero)
{
while (NativeMethods.FPDFText_FindNext(m_NativePointer))
yield return new PDFSearchResult(
m_TextPage.PageIndex, NativeMethods.FPDFText_GetSchResultIndex(m_NativePointer), NativeMethods.FPDFText_GetSchCount(m_NativePointer));
}
}
///
/// Get the next search result. If there is no other result, the function returns an invalid searchResult (validate it with PDFSearchResult.IsValid)
///
///
public PDFSearchResult FindNext()
{
if (NativeMethods.FPDFText_FindNext(m_NativePointer))
return new PDFSearchResult(
m_TextPage.PageIndex, NativeMethods.FPDFText_GetSchResultIndex(m_NativePointer), NativeMethods.FPDFText_GetSchCount(m_NativePointer));
return new PDFSearchResult(-1, -1, -1);
}
///
/// Get the previous search result. If there is no other result, the function returns an invalid searchResult (validate it with PDFSearchResult.IsValid)
///
///
public PDFSearchResult FindPrevious()
{
if (NativeMethods.FPDFText_FindPrev(m_NativePointer))
return new PDFSearchResult(
m_TextPage.PageIndex, NativeMethods.FPDFText_GetSchResultIndex(m_NativePointer), NativeMethods.FPDFText_GetSchCount(m_NativePointer));
return new PDFSearchResult(-1, -1, -1);
}
}
#endif
}