root/Retrieve.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. CRetrieve
  2. CRetrieve
  3. GoRetrieve

/*
 * Copyright (C) 2002-2003 chik, s.hiranaka
 * For license terms, see the file COPYING in this directory.
 */

// Retrieve.cpp: CRetrieve クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Pochy.h"
#include "Retrieve.h"
#include "CodeConvert.h"
#include "SummaryView.h"
#include "MainFrm.h"
#include "Pochy.h"
#include "RetrieveDlg.h"
//#include "_regex.h"                   // 正規表現ライブラリ用
#include "lib.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

CRetrieve::CRetrieve()
{

}

CRetrieve::~CRetrieve()
{

}

void CRetrieve::GoRetrieve(CString path, int Flag)
{
  WIN32_FIND_DATA wfd;
  HANDLE hFile;
  CFileFind ff;
  SLISTSTACK List;
  CString tmp;
  CString mail;
  CString key;
  CString name;
  int listItem;
  int stacknum;
  int selected;
  int cnt;
  int cnt_start;
  char mes[256];

  CPochyApp *app = (CPochyApp *)AfxGetApp();
  CMainFrame *mf = (CMainFrame *)app->m_pMainWnd;

  CTreeCtrl &tc = mf->m_pTreeV->GetTreeCtrl();
  CSummaryView *sv = (CSummaryView *)mf->m_pListV;
  CListCtrl &lc = sv->GetListCtrl();
  CRichEditCtrl &ec = mf->m_pTextV->GetRichEditCtrl();

  if(Flag == CONTINUE && app->m_keyword.IsEmpty()) return;

  if(Flag == FIRST){
    CRetrieveDlg rd;
    if(rd.DoModal() != IDOK || app->m_keyword.IsEmpty()) return;
  }

  stacknum = sv->m_stack_num;
  selected = lc.GetNextItem(-1, LVNI_SELECTED);
  lc.SetItemState(selected, 0, LVIS_FOCUSED | LVIS_SELECTED); 


  if(selected == -1) selected = 0;

  if(Flag == CONTINUE) cnt = stacknum - selected -2;
  else cnt = stacknum - selected -1;
  cnt_start = cnt;

  key = app->m_keyword;
  app->m_retrieving = TRUE;

  // 正規表現関数を使う為の前準備
//  regex_t reg;
//  regmatch_t pmatch[1];
//  regcomp(&reg, key.GetBuffer(0), REG_EXTENDED | REG_NEWLINE | REG_ICASE);
//      regfree(&reg);

  while(cnt >= 0){
    mail.Empty();
    tmp.Empty();
    name.Empty();

    name = sv->m_array_list[cnt].m_str5;
    tmp = path + "\\" + name;

    // 検索対象ファイルが存在しているかどうか
    // 存在していない場合は、次のループへ
    hFile = FindFirstFile(tmp.GetBuffer(0), &wfd);
    if(hFile == INVALID_HANDLE_VALUE){
      cnt--;
      continue;
    }
    FindClose(hFile);

        CWaitCursor wait_cursor;

    // 検索対象ファイルへのハンドルを作成
    CStdioFile ReadFile;
    ReadFile.Open(tmp.GetBuffer(0), CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);

    // メールの内容をCStringに読み込む
    LPSTR pMail = mail.GetBuffer(ReadFile.GetLength());
    UINT tmpi = ReadFile.Read(pMail, ReadFile.GetLength());
    mail.ReleaseBuffer(tmpi);
    ReadFile.Close();

    // キーワードが改行で分断されている場合があるので、予め改行コードを除去する
    mail.Remove('\x0D');
    mail.Remove('\x0A');

    // メールの文字コードを解析して、sjisに変換する
    CCodeConvert cc(mail);
    mail = cc.ToSjis();

    if(mail.Find(key)!=-1){
      listItem = sv->m_stack_num - cnt -1;
      lc.SetItemState(listItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
      lc.EnsureVisible(listItem, TRUE);
      sv->SetFocus();
      mf->SetStatusBarText(0, "");

      // 運がよければテキストビューの該当部分を表示
      FINDTEXTEX ft;
      ft.chrg.cpMin = 0;
      ft.chrg.cpMax = -1;
      ft.lpstrText = (LPSTR)key.GetBuffer(0);
      long n = ec.FindText(0,&ft);
      if(n != -1){
        ec.SetSel(n, n+key.GetLength());
                ec.LineScroll(ec.LineFromChar(n));
        mf->m_pTextV->SetFocus();
      }

      break;
    }
    cnt--;

    MSG msg;
    if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
      if(msg.message != WM_LBUTTONDOWN){
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
      }
    }
    if(!app->m_retrieving){
      mf->SetStatusBarText(0,"");
      break;
    }

    wsprintf(mes, "検索中(のこり%d/%d), TAB->継続, ESC->中止", cnt+1, cnt_start);
    mf->SetStatusBarText(0, mes);
  }
  if(cnt<0)
    mf->SetStatusBarText(0, "検索完了");
  app->m_retrieving = FALSE; // 多分これはでいいですよね?
}

/* [<][>][^][v][top][bottom][index][help] */