root/Retrieve.cpp
/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- CRetrieve
- CRetrieve
- 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(®, key.GetBuffer(0), REG_EXTENDED | REG_NEWLINE | REG_ICASE);
// regfree(®);
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; // 多分これはでいいですよね?
}