#ifndef _COMMON_FINDTEXTEX_HPP_
#define _COMMON_FINDTEXTEX_HPP_
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#endif
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_CHARRANGE_HPP_
#include <common/range.hpp>
#endif

class FindTextEx : private FINDTEXTEX
{
public:
  FindTextEx(void);
	FindTextEx(const FindTextEx &findTextEx);
	FindTextEx(const CharRange &charRange,const String &strFind);
	virtual ~FindTextEx();
	FindTextEx &operator=(const FindTextEx &findTextEx);
	BOOL operator==(const FindTextEx &findTextEx)const;
	CharRange searchRange(void)const;
	void searchRange(const CharRange &searchRange);
	const String &strFind(void)const;
	void strFind(const String &strFind);
	CharRange foundRange(void)const;
	void foundRange(const CharRange &foundRange);
	FINDTEXTEX &findTextEx(void);
private:
  String mStrInternal;
};

inline
FindTextEx::FindTextEx(void)
{
  FINDTEXTEX::chrg.cpMin=0;
	FINDTEXTEX::chrg.cpMax=0;
	FINDTEXTEX::lpstrText=0;
	FINDTEXTEX::chrgText.cpMin=0;
	FINDTEXTEX::chrgText.cpMax=0;
}

inline
FindTextEx::FindTextEx(const FindTextEx &findTextEx)
{
  *this=findTextEx;
}

inline
FindTextEx::FindTextEx(const CharRange &charRange,const String &strFind)
{
  mStrInternal=strFind;
  FINDTEXTEX::chrg.cpMin=charRange.posMin();
	FINDTEXTEX::chrg.cpMax=charRange.posMax();
	FINDTEXTEX::lpstrText=(char*)mStrInternal;
}

inline
FindTextEx::~FindTextEx()
{
}

inline
FindTextEx &FindTextEx::operator=(const FindTextEx &findTextEx)
{
  searchRange(findTextEx.searchRange());
	strFind(findTextEx.strFind());
	foundRange(findTextEx.foundRange());
	return *this;
}

inline
BOOL FindTextEx::operator==(const FindTextEx &findTextEx)const
{
  return (searchRange()==findTextEx.searchRange()&&
	        foundRange()==findTextEx.foundRange()&&
					strFind()==findTextEx.strFind());
}

inline
CharRange FindTextEx::searchRange(void)const
{
  return CharRange(FINDTEXTEX::chrg.cpMin,FINDTEXTEX::chrg.cpMax);
}

inline
void FindTextEx::searchRange(const CharRange &searchRange)
{
  FINDTEXTEX::chrg.cpMin=searchRange.posMin();
	FINDTEXTEX::chrg.cpMax=searchRange.posMax();
}

inline
const String &FindTextEx::strFind(void)const
{
  return mStrInternal;
}

inline
void FindTextEx::strFind(const String &strFind)
{
  mStrInternal=strFind;
	FINDTEXTEX::lpstrText=(char*)mStrInternal;
}

inline
CharRange FindTextEx::foundRange(void)const
{
  return CharRange(FINDTEXTEX::chrgText.cpMin,FINDTEXTEX::chrgText.cpMax);
}

inline
void FindTextEx::foundRange(const CharRange &foundRange)
{
  FINDTEXTEX::chrgText.cpMin=foundRange.posMin();
	FINDTEXTEX::chrgText.cpMax=foundRange.posMax();
}

inline
FINDTEXTEX &FindTextEx::findTextEx(void)
{
  return *this;
}
#endif

