/*
http://www.cgsoso.com/forum-211-1.html
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
CGSOSO 主打游戏开发,影视设计等CG资源素材。
插件如若商用,请务必官网购买!
daily assets update for try.
U should buy the asset from home store if u use it in your project!
*/
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
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 = FPDFText_FindStart(textPage.NativePointer, unmanagedPointer, (int) 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)
{
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 (FPDFText_FindNext(m_NativePointer))
yield return new PDFSearchResult(
m_TextPage.PageIndex,
FPDFText_GetSchResultIndex(m_NativePointer),
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 (FPDFText_FindNext(m_NativePointer))
return new PDFSearchResult(
m_TextPage.PageIndex,
FPDFText_GetSchResultIndex(m_NativePointer),
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 (FPDFText_FindPrev(m_NativePointer))
return new PDFSearchResult(
m_TextPage.PageIndex,
FPDFText_GetSchResultIndex(m_NativePointer),
FPDFText_GetSchCount(m_NativePointer));
return new PDFSearchResult(-1, -1, -1);
}
#region NATIVE
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern IntPtr FPDFText_FindStart(IntPtr text_page, IntPtr buffer, int flags, int start_index);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern void FPDFText_FindClose(IntPtr handle);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern bool FPDFText_FindNext(IntPtr handle);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern bool FPDFText_FindPrev(IntPtr handle);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_GetSchCount(IntPtr handle);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_GetSchResultIndex(IntPtr handle);
#endregion
}
#endif
}