/**
 * ポップアップ用ウィンドウのコンストラクタ
 *
 * @param wxWindow* parent     親ウィンドウのインスタンス
 * @param wxPoint&  point      ウィンドウの出現位置
 * @param wxSize    size       ウィンドウのサイズ
 * @raram wxString& htmlSource 表示させるHTMLソース
 */
AnchoredResponsePopup::AnchoredResponsePopup( wxWindow *parent, wxPoint& point, wxSize size, wxString& htmlSource )
:wxPopupTransientWindow( parent ) {

     // スキンを使わないならデフォルトフォントを設定する
     SkinInfo* skinInfo = new SkinInfo;
     // HTMLのソース
     wxString html = wxEmptyString;
     bool  useSkin = CheckSkinFiles(skinInfo);

     wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
     // wxHtmlWindowにHTMLソースを設定する
     htmlWin = new wxHtmlWindow(this, wxID_ANY, wxPoint(0, 0), size, wxHW_SCROLLBAR_AUTO);
     
     if (!useSkin) {
	  const int p = 12;
	  static int f_size[] = {p - 2, p - 1, p, p + 1, p + 2, p + 3, p + 4 };

#ifdef __WXMSW__
	  wxString fontName = wxT("MS Pゴシック");
	  htmlWin->SetFonts(fontName, wxEmptyString, f_size);
#elif  __WXGTK__
	  wxFont f;
	  if (f.SetFaceName(wxT("Mona"))) {
	       htmlWin->SetFonts(wxT("Mona"), wxEmptyString, f_size);
	  } else if (f.SetFaceName(wxT("Mona-VLGothic"))) {
	       htmlWin->SetFonts(wxT("Mona-VLGothic"), wxEmptyString, f_size);
	  } else if (f.SetFaceName(wxT("Mona-sazanami"))) {
	       htmlWin->SetFonts(wxT("Mona-sazanami"), wxEmptyString, f_size);
	  }
#elif  __WXMAC__
	  wxString fontName = wxT("Mona");
	  htmlWin->SetFonts(fontName, wxEmptyString, f_size);
#endif
	  html += HTML_HEADER;
	  html += htmlSource;
	  html += HTML_FOOTER;
     } else {
	  // スキンを使用する
	  html += skinInfo->header;
	  html += htmlSource;
	  html += skinInfo->footer;
     }

     // 後片付け
     delete skinInfo;

     htmlWin->SetBorders(0);
     htmlWin->SetPage(html);
     // wxHtmlWindow内部での実質サイズを取得する
     int hx = htmlWin->GetInternalRepresentation()->GetWidth();
     int hy = htmlWin->GetInternalRepresentation()->GetHeight();
     htmlWin->SetSize(hx, hy);
     // このウィンドウ(popup)にサイザーをセットして最小の大きさに設定する
     topsizer->Add(htmlWin, 1, wxALL, 10);
     this->SetSize(hx, hy);
}
/**
 * 通常のコンストラクタ
 */
ThreadContentWindow::ThreadContentWindow(wxWindow* parent, const wxString& threadContentPath):
wxHtmlWindow(parent, ID_ThreadContentWindow, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO) {

#ifdef __WXMSW__
     // ウィンドウ内に入った際のイベント通知
     this->Connect(ID_ThreadContentWindow,
		   wxEVT_ENTER_WINDOW,
		   wxMouseEventHandler(JaneClone::OnEnterWindow),
		   NULL, this);
#endif

     // 指定されたパスからHTMLファイルを読み出す
     wxString htmlSource = GetConvertedDatFile(threadContentPath);
     // 設定ファイルの準備をする
     // ユーザーのホームディレクトリを取得
     wxDir workDir(::wxGetHomeDir());
     wxDir jcDir(::wxGetHomeDir() + wxFILE_SEP_PATH + JANECLONE_DIR);

     // ユーザーのホームディレクトリに隠しフォルダがあるかどうか確認
     if (!workDir.HasSubDirs(JANECLONE_DIR)) {
	  ::wxMkdir(jcDir.GetName());
     }
     if (!jcDir.HasSubDirs(wxT("prop"))) {
	  ::wxMkdir(jcDir.GetName() + wxFILE_SEP_PATH + wxT("prop"));
     }

     // スキンを使わないならデフォルトフォントを設定する
     SkinInfo* skinInfo = new SkinInfo;
     bool       useSkin = CheckSkinFiles(skinInfo);
     delete skinInfo;
     
     if (!useSkin) {

	  // フォントのポイント数
	  const int p = 12;
	  static int f_size[] = {p - 2, p - 1, p, p + 1, p + 2, p + 3, p + 4 };

#ifdef __WXMSW__
	  wxString fontName = wxT("MS Pゴシック");
	  this->SetFonts(fontName, wxEmptyString, f_size);
#elif  __WXGTK__
	  wxFont f;
	  if (f.SetFaceName(wxT("Mona"))) {
	       this->SetFonts(wxT("Mona"), wxEmptyString, f_size);
	  } else if (f.SetFaceName(wxT("Mona-VLGothic"))) {
	       this->SetFonts(wxT("Mona-VLGothic"), wxEmptyString, f_size);
	  } else if (f.SetFaceName(wxT("Mona-sazanami"))) {
	       this->SetFonts(wxT("Mona-sazanami"), wxEmptyString, f_size);
	  }

#elif  __WXMAC__
	  wxString fontName = wxT("Mona");
	  this->SetFonts(fontName, wxEmptyString, f_size);
#endif
     }

     // メモリに読み込んだHTMLを表示する
     this->SetPage(htmlSource);
     // 外部から参照可能なHTML
     this->m_htmlSource = htmlSource;
     // スクロールのフラグ
     fNeedScroll = false;
}
/**
 * 指定されたパスからHTMLファイルを読み出し、2ch形式に加工する
 */
const wxString ThreadContentWindow::GetConvertedDatFile(const wxString& threadContentPath) {

     // wxStringにバッファするサイズを計測する
     size_t fileSize = JaneCloneUtil::GetFileSize(threadContentPath);

     if (fileSize == 0)
	  // 読み込みに失敗した場合
	  return FAIL_TO_READ_PAGE;

     // スキンがあれば使う
     SkinInfo* skinInfo = new SkinInfo;
     bool       useSkin = CheckSkinFiles(skinInfo);

     // 取得サイズ分だけwxStringを確保する
     wxString htmlSource;
     htmlSource.Alloc(fileSize);

     if (useSkin && skinInfo->header != wxEmptyString) {
	  htmlSource += skinInfo->header;
     } else {
	  htmlSource += HTML_HEADER;
     }     

     // テキストファイルの読み込み
     wxTextFile datfile;
     datfile.Open(threadContentPath, wxConvUTF8);
     wxString str;
     int number = 1;

     // ファイルがオープンされているならば
     if (datfile.IsOpened()) {
	  for (str = datfile.GetFirstLine(); 
	       !datfile.Eof();
	       str = datfile.GetNextLine()) {

	       if (str.IsNull())
		    continue;

	       if (number == 1) {
		    // 最初の1行目の処理
		    htmlSource += JaneCloneUtil::ProcessFirstResponse(str);
	       } else {
		    // それ以降の処理
		    htmlSource += JaneCloneUtil::ProcessRestResponse(str, number);
	       }

	       number++;
	       this->m_response_number = number;
	  }
     }

     if (useSkin && skinInfo->footer != wxEmptyString) {
	  htmlSource += skinInfo->footer;
     } else {
	  htmlSource += HTML_FOOTER;
     }

     // スキン用構造体を片付ける
     delete skinInfo;
     datfile.Close();

     // ID:xxxxxxxxxx を置換する
     htmlSource = JaneCloneUtil::AddID(htmlSource);
     // >>xx のようなアンカーを受けているレスを赤くする
     htmlSource = JaneCloneUtil::AddColorAnchoredID(htmlSource);

     return htmlSource;
}