📄 searchresultswnd.cpp
字号:
return true;
}
ASSERT(0);
delete pParams;
return false;
}
bool CSearchResultsWnd::DoNewEd2kSearch(SSearchParams* pParams)
{
if (!theApp.serverconnect->IsConnected())
return false;
CSafeMemFile data(100);
if (!GetSearchPacket(&data, pParams) || data.GetLength() == 0)
return false;
CancelSearch();
CStringA strResultType = pParams->strFileType;
if (strResultType == ED2KFTSTR_PROGRAM)
strResultType.Empty();
m_nSearchID++;
pParams->dwSearchID = m_nSearchID;
theApp.searchlist->NewSearch(&searchlistctrl, strResultType, m_nSearchID);
canceld = false;
if (m_uTimerLocalServer){
VERIFY( KillTimer(m_uTimerLocalServer) );
m_uTimerLocalServer = 0;
}
// once we've sent a new search request, any previously received 'More' gets invalid.
CWnd* pWndFocus = GetFocus();
m_pwndParams->m_ctlMore.EnableWindow(FALSE);
if (pWndFocus && pWndFocus->m_hWnd == m_pwndParams->m_ctlMore.m_hWnd)
m_pwndParams->m_ctlCancel.SetFocus();
m_iSentMoreReq = 0;
Packet* packet = new Packet(&data);
packet->opcode = OP_SEARCHREQUEST;
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T(">>> Sending OP__SearchRequest\n"));
theStats.AddUpDataOverheadServer(packet->size);
theApp.serverconnect->SendPacket(packet,false);
if (pParams->eType == SearchTypeEd2kGlobal && theApp.serverconnect->IsUDPSocketAvailable())
{
// set timeout timer for local server
m_uTimerLocalServer = SetTimer(TimerServerTimeout, 50000, NULL);
if (thePrefs.Score())
theApp.serverlist->ResetSearchServerPos();
if (globsearch){
delete searchpacket;
searchpacket = NULL;
}
searchpacket = packet;
searchpacket->opcode = OP_GLOBSEARCHREQ; // will be changed later when actually sending the packet!!
servercount = 0;
searchprogress.SetRange32(0,theApp.serverlist->GetServerCount()-1);
globsearch = true;
}
else{
globsearch = false;
delete packet;
}
CreateNewTab(pParams);
return true;
}
bool CSearchResultsWnd::SearchMore()
{
if (!theApp.serverconnect->IsConnected())
return false;
SetActiveSearchResultsIcon(m_nSearchID);
canceld = false;
Packet* packet = new Packet();
packet->opcode = OP_QUERY_MORE_RESULT;
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T(">>> Sending OP__QueryMoreResults\n"));
theStats.AddUpDataOverheadServer(packet->size);
theApp.serverconnect->SendPacket(packet);
m_iSentMoreReq++;
return true;
}
bool CSearchResultsWnd::DoNewKadSearch(SSearchParams* pParams)
{
if (!Kademlia::CKademlia::isConnected())
return false;
int iPos = 0;
pParams->strKeyword = pParams->strExpression.Tokenize(_T(" "), iPos);
pParams->strKeyword.Trim();
if (pParams->strKeyword.IsEmpty() || pParams->strKeyword.FindOneOf(_aszInvKadKeywordChars) != -1){
CString strError;
strError.Format(GetResString(IDS_KAD_SEARCH_KEYWORD_INVALID), _aszInvKadKeywordChars);
throw new CMsgBoxException(strError, MB_ICONWARNING | MB_HELP, eMule_FAQ_Search - HID_BASE_PROMPT);
}
CSafeMemFile data(100);
if (!GetSearchPacket(&data, pParams)/* || (!pParams->strBooleanExpr.IsEmpty() && data.GetLength() == 0)*/)
return false;
LPBYTE pSearchTermsData = NULL;
UINT uSearchTermsSize = data.GetLength();
if (uSearchTermsSize){
pSearchTermsData = new BYTE[uSearchTermsSize];
data.SeekToBegin();
data.Read(pSearchTermsData, uSearchTermsSize);
}
Kademlia::CSearch* pSearch = NULL;
try
{
pSearch = Kademlia::CSearchManager::prepareFindKeywords(Kademlia::CSearch::KEYWORD, true, pParams->bUnicode, pParams->strKeyword, uSearchTermsSize, pSearchTermsData);
delete pSearchTermsData;
if (!pSearch){
ASSERT(0);
return false;
}
}
catch (CString strException)
{
delete pSearchTermsData;
throw new CMsgBoxException(strException, MB_ICONWARNING | MB_HELP, eMule_FAQ_Search - HID_BASE_PROMPT);
}
pParams->dwSearchID = pSearch->getSearchID();
CStringA strResultType = pParams->strFileType;
if (strResultType == ED2KFTSTR_PROGRAM)
strResultType.Empty();
theApp.searchlist->NewSearch(&searchlistctrl,strResultType,pParams->dwSearchID);
CreateNewTab(pParams);
return true;
}
bool CSearchResultsWnd::CreateNewTab(SSearchParams* pParams)
{
int iTabItems = searchselect.GetItemCount();
for (int i = 0; i < iTabItems; i++)
{
TCITEM tci;
tci.mask = TCIF_PARAM;
if (searchselect.GetItem(i, &tci) && tci.lParam != NULL && ((const SSearchParams*)tci.lParam)->dwSearchID == pParams->dwSearchID)
return false;
}
// add new tab
TCITEM newitem;
if (pParams->strExpression.IsEmpty())
pParams->strExpression = _T("-");
newitem.mask = TCIF_PARAM | TCIF_TEXT | TCIF_IMAGE;
newitem.lParam = (LPARAM)pParams;
CString label = pParams->strExpression + _T(" (0)");
newitem.pszText = const_cast<LPTSTR>((LPCTSTR)label);
newitem.cchTextMax = 0;
if (pParams->bClientSharedFiles)
newitem.iImage = sriClient;
else if (pParams->eType == SearchTypeKademlia)
newitem.iImage = sriKadActice;
else if (pParams->eType == SearchTypeEd2kGlobal)
newitem.iImage = sriGlobalActive;
else{
ASSERT( pParams->eType == SearchTypeEd2kServer );
newitem.iImage = sriServerActive;
}
int itemnr = searchselect.InsertItem(INT_MAX, &newitem);
if (!searchselect.IsWindowVisible())
ShowSearchSelector(true);
searchselect.SetCurSel(itemnr);
searchlistctrl.ShowResults(pParams->dwSearchID);
return true;
}
bool CSearchResultsWnd::CanDeleteSearch(uint32 nSearchID) const
{
return (searchselect.GetItemCount() > 0);
}
void CSearchResultsWnd::DeleteSearch(uint32 nSearchID)
{
Kademlia::CSearchManager::stopSearch(nSearchID, false);
TCITEM item;
item.mask = TCIF_PARAM;
item.lParam = -1;
int i;
for (i = 0; i != searchselect.GetItemCount();i++){
if (searchselect.GetItem(i, &item) && item.lParam != -1 && item.lParam != NULL && ((const SSearchParams*)item.lParam)->dwSearchID == nSearchID)
break;
}
if (item.lParam == -1 || item.lParam == NULL || ((const SSearchParams*)item.lParam)->dwSearchID != nSearchID)
return;
// delete search results
if (!canceld && nSearchID == m_nSearchID)
CancelSearch();
if (nSearchID == m_nSearchID)
m_pwndParams->m_ctlMore.EnableWindow(FALSE);
theApp.searchlist->RemoveResults(nSearchID);
// delete search tab
int iCurSel = searchselect.GetCurSel();
searchselect.DeleteItem(i);
delete (SSearchParams*)item.lParam;
int iTabItems = searchselect.GetItemCount();
if (iTabItems > 0){
// select next search tab
if (iCurSel == CB_ERR)
iCurSel = 0;
else if (iCurSel >= iTabItems)
iCurSel = iTabItems - 1;
(void)searchselect.SetCurSel(iCurSel); // returns CB_ERR if error or no prev. selection(!)
iCurSel = searchselect.GetCurSel(); // get the real current selection
if (iCurSel == CB_ERR) // if still error
iCurSel = searchselect.SetCurSel(0);
if (iCurSel != CB_ERR){
item.mask = TCIF_PARAM;
item.lParam = NULL;
if (searchselect.GetItem(iCurSel, &item) && item.lParam != NULL){
searchselect.HighlightItem(iCurSel, FALSE);
ShowResults((const SSearchParams*)item.lParam);
}
}
}
else{
searchlistctrl.DeleteAllItems();
ShowSearchSelector(false);
searchlistctrl.NoTabs();
}
}
bool CSearchResultsWnd::CanDeleteAllSearches() const
{
return (searchselect.GetItemCount() > 0);
}
void CSearchResultsWnd::DeleteAllSearchs()
{
for (int i = 0; i < searchselect.GetItemCount(); i++){
TCITEM item;
item.mask = TCIF_PARAM;
item.lParam = -1;
if (searchselect.GetItem(i, &item) && item.lParam != -1 && item.lParam != NULL){
Kademlia::CSearchManager::stopSearch(((const SSearchParams*)item.lParam)->dwSearchID, false);
delete (SSearchParams*)item.lParam;
}
}
theApp.searchlist->Clear();
searchlistctrl.DeleteAllItems();
ShowSearchSelector(false);
searchselect.DeleteAllItems();
m_pwndParams->m_ctlMore.EnableWindow(FALSE);
}
void CSearchResultsWnd::ShowResults(const SSearchParams* pParams)
{
// restoring the params works and is nice during development/testing but pretty annoying in practice.
// TODO: maybe it should be done explicitly via a context menu function or such.
//m_pwndParams->SetParameters(pParams);
searchlistctrl.ShowResults(pParams->dwSearchID);
}
void CSearchResultsWnd::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
CWaitCursor curWait; // this may take a while
int cur_sel = searchselect.GetCurSel();
if (cur_sel == -1)
return;
TCITEM item;
item.mask = TCIF_PARAM;
if (searchselect.GetItem(cur_sel, &item) && item.lParam != NULL)
{
searchselect.HighlightItem(cur_sel, FALSE);
ShowResults((const SSearchParams*)item.lParam);
}
*pResult = 0;
}
LRESULT CSearchResultsWnd::OnCloseTab(WPARAM wparam, LPARAM lparam)
{
TCITEM item;
item.mask = TCIF_PARAM;
if (searchselect.GetItem((int)wparam, &item) && item.lParam != NULL)
{
int nSearchID = ((const SSearchParams*)item.lParam)->dwSearchID;
if (!canceld && nSearchID == m_nSearchID)
CancelSearch();
DeleteSearch(nSearchID);
}
return TRUE;
}
void CSearchResultsWnd::UpdateCatTabs() {
int oldsel=m_cattabs.GetCurSel();
m_cattabs.DeleteAllItems();
for (int ix=0;ix<thePrefs.GetCatCount();ix++)
m_cattabs.InsertItem(ix,(ix==0)?GetResString(IDS_ALL):thePrefs.GetCategory(ix)->title);
if (oldsel>=m_cattabs.GetItemCount() || oldsel==-1)
oldsel=0;
m_cattabs.SetCurSel(oldsel);
int flag;
flag=(m_cattabs.GetItemCount()>1) ? SW_SHOW:SW_HIDE;
GetDlgItem(IDC_CATTAB2)->ShowWindow(flag);
GetDlgItem(IDC_STATIC_DLTOof)->ShowWindow(flag);
}
CString CSearchResultsWnd::ToQueryString(CString str){
CString sTmp = URLEncode(str);
sTmp.Replace(_T("%20"), _T("+"));
return sTmp;
}
void CSearchResultsWnd::ShowSearchSelector(bool visible)
{
WINDOWPLACEMENT wpSearchWinPos;
WINDOWPLACEMENT wpSelectWinPos;
searchselect.GetWindowPlacement(&wpSelectWinPos);
searchlistctrl.GetWindowPlacement(&wpSearchWinPos);
if (visible)
wpSearchWinPos.rcNormalPosition.top = wpSelectWinPos.rcNormalPosition.bottom;
else
wpSearchWinPos.rcNormalPosition.top = wpSelectWinPos.rcNormalPosition.top;
searchselect.ShowWindow(visible ? SW_SHOW : SW_HIDE);
RemoveAnchor(searchlistctrl);
searchlistctrl.SetWindowPlacement(&wpSearchWinPos);
AddAnchor(searchlistctrl, TOP_LEFT, BOTTOM_RIGHT);
GetDlgItem(IDC_CLEARALL)->ShowWindow(visible ? SW_SHOW : SW_HIDE);
}
void CSearchResultsWnd::SaveSettings()
{
searchlistctrl.SaveSettings(CPreferences::tableSearch);
}
void CSearchResultsWnd::OnDestroy()
{
int iTabItems = searchselect.GetItemCount();
for (int i = 0; i < iTabItems; i++){
TCITEM tci;
tci.mask = TCIF_PARAM;
if (searchselect.GetItem(i, &tci) && tci.lParam != NULL){
delete (SSearchParams*)tci.lParam;
}
}
CResizableFormView::OnDestroy();
}
void CSearchResultsWnd::OnSize(UINT nType, int cx, int cy)
{
CResizableFormView::OnSize(nType, cx, cy);
}
void CSearchResultsWnd::OnClose()
{
// Do not pass the WM_CLOSE to the base class. Since we have a rich edit control *and* an attached auto complete
// control, the WM_CLOSE will get generated by the rich edit control when user presses ESC while the auto complete
// is open.
//__super::OnClose();
}
BOOL CSearchResultsWnd::OnHelpInfo(HELPINFO* pHelpInfo)
{
theApp.ShowHelp(eMule_FAQ_Search);
return TRUE;
}
LRESULT CSearchResultsWnd::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
GetDlgItem(IDC_OPEN_PARAMS_WND)->ShowWindow( theApp.emuledlg->searchwnd->IsSearchParamsWndVisible() ? SW_HIDE : SW_SHOW );
return 0;
}
void CSearchResultsWnd::OnBnClickedOpenParamsWnd()
{
theApp.emuledlg->searchwnd->OpenParametersWnd();
}
void CSearchResultsWnd::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_KEYMENU)
{
if (lParam == EMULE_HOTMENU_ACCEL)
theApp.emuledlg->SendMessage(WM_COMMAND, IDC_HOTMENU);
else
theApp.emuledlg->SendMessage(WM_SYSCOMMAND, nID, lParam);
return;
}
__super::OnSysCommand(nID, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -