📄 searchdlg.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( merkur-@users.sourceforge.net / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// SearchDlg.cpp : implementation file
//
#include "stdafx.h"
#include "emule.h"
#include "SearchDlg.h"
#include "packets.h"
#include "server.h"
#include "opcodes.h"
#include "otherfunctions.h"
#include "ED2KLink.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// CSearchDlg dialog
IMPLEMENT_DYNAMIC(CSearchDlg, CDialog)
CSearchDlg::CSearchDlg(CWnd* pParent /*=NULL*/)
: CResizableDialog(CSearchDlg::IDD, pParent){
m_nSearchID = 0;
}
CSearchDlg::~CSearchDlg(){
}
BOOL CSearchDlg::OnInitDialog(){
CResizableDialog::OnInitDialog();
theApp.searchlist->SetOutputWnd(&searchlistctrl);
searchlistctrl.Init(theApp.searchlist);
Localize();
searchprogress.SetStep(1);
global_search_timer = 0;
globsearch = false;
m_guardCBPrompt=false;
m_ctrlSearchFrm.Init(IDI_NORMALSEARCH);
m_ctrlDirectDlFrm.Init(IDI_DIRECTDOWNLOAD);
((CStatic*)GetDlgItem(IDC_SEARCHLST_ICO))->SetIcon((HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SEARCHRESULTS), IMAGE_ICON, 16, 16, 0));
searchselect.ShowWindow(SW_HIDE);
m_ImageList.Create(16,16,ILC_COLOR32|ILC_MASK,0,10);
m_ImageList.SetBkColor(CLR_NONE);
m_ImageList.Add(theApp.LoadIcon(IDI_BN_SEARCH));
searchselect.SetImageList(&m_ImageList);
AddAnchor(IDC_SDOWNLOAD,BOTTOM_LEFT);
AddAnchor(IDC_SEARCHLIST,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(IDC_PROGRESS1,BOTTOM_LEFT,BOTTOM_RIGHT);
AddAnchor(IDC_DDOWN_FRM, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_ELINK, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_STARTS, TOP_RIGHT);
AddAnchor(IDC_CANCELS, TOP_RIGHT);
AddAnchor(IDC_CLEARALL, TOP_RIGHT);
AddAnchor(searchselect.m_hWnd,TOP_LEFT,TOP_RIGHT);
AddAnchor(IDC_STATIC_DLTOof,BOTTOM_LEFT);
AddAnchor(IDC_CATTAB2,BOTTOM_LEFT);
m_lastclpbrd="";
return true;
}
void CSearchDlg::DoDataExchange(CDataExchange* pDX){
CResizableDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SEARCHLIST, searchlistctrl);
DDX_Control(pDX, IDC_PROGRESS1, searchprogress);
DDX_Control(pDX, IDC_COMBO1, methodBox);
DDX_Control(pDX, IDC_TypeSearch, Stypebox);
DDX_Control(pDX, IDC_TAB1, searchselect);
DDX_Control(pDX, IDC_SEARCH_FRM, m_ctrlSearchFrm);
DDX_Control(pDX, IDC_DDOWN_FRM, m_ctrlDirectDlFrm);
DDX_Control(pDX, IDC_CATTAB2, m_cattabs);
}
BEGIN_MESSAGE_MAP(CSearchDlg, CResizableDialog)
ON_BN_CLICKED(IDC_STARTS, OnBnClickedStarts)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CANCELS, OnBnClickedCancels)
ON_BN_CLICKED(IDC_SDOWNLOAD, OnBnClickedSdownload)
ON_NOTIFY(NM_DBLCLK, IDC_SEARCHLIST, OnNMDblclkSearchlist)
ON_BN_CLICKED(IDC_CLEARALL, OnBnClickedClearall)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTcnSelchangeTab1)
ON_EN_CHANGE(IDC_SEARCHNAME, OnEnChangeSearchname)
ON_CBN_SELCHANGE(IDC_TypeSearch, OnEnChangeSearchname)
ON_MESSAGE(WM_CLOSETAB, OnCloseTab)
ON_EN_CHANGE(IDC_SEARCHAVAIL , OnEnChangeSearchname)
ON_EN_CHANGE(IDC_SEARCHEXTENTION, OnEnChangeSearchname)
ON_EN_CHANGE(IDC_SEARCHMINSIZE, OnEnChangeSearchname)
ON_EN_CHANGE(IDC_SEARCHMAXSIZE, OnEnChangeSearchname)
ON_BN_CLICKED(IDC_SEARCH_RESET, OnBnClickedSearchReset)
ON_EN_KILLFOCUS(IDC_ELINK, OnEnKillfocusElink)
END_MESSAGE_MAP()
// CSearchDlg message handlers
void CSearchDlg::OnBnClickedStarts(){
searchprogress.SetPos(0);
// ed2k-links
if (GetDlgItem(IDC_ELINK)->GetWindowTextLength()){
CString strlink;
GetDlgItem(IDC_ELINK)->GetWindowText(strlink);
GetDlgItem(IDC_ELINK)->SetWindowText("");
AddEd2kLinksToDownload(strlink);
return;
}
// start "normal" server-search
if (GetDlgItem(IDC_SEARCHNAME)->GetWindowTextLength())
{
switch (methodBox.GetCurSel())
{
case 0:
case 1:
StartNewSearch();
break;
case 2:
case 3:
ShellOpenFile(CreateWebQuery());
return;
default:
return;
}
}
}
void CSearchDlg::OnTimer(UINT nIDEvent){
CResizableDialog::OnTimer(nIDEvent);
if (theApp.serverconnect->IsConnected()){
CServer* toask = theApp.serverlist->GetNextSearchServer();
if (toask == theApp.serverlist->GetServerByAddress(theApp.serverconnect->GetCurrentServer()->GetAddress(),theApp.serverconnect->GetCurrentServer()->GetPort()))
toask = theApp.serverlist->GetNextSearchServer();
if (toask && theApp.serverlist->GetServerCount()-1 != servercount){
servercount++;
theApp.serverconnect->SendUDPPacket(searchpacket,toask,false);
searchprogress.StepIt();
}
else
OnBnClickedCancels();
}
else
OnBnClickedCancels();
}
void CSearchDlg::OnBnClickedCancels(){
canceld = true;
globsearch = false;
if (global_search_timer){
delete searchpacket;
KillTimer(global_search_timer);
global_search_timer = 0;
searchprogress.SetPos(0);
}
this->GetDlgItem(IDC_CANCELS)->EnableWindow(false);
this->GetDlgItem(IDC_STARTS)->EnableWindow(true);
}
void CSearchDlg::LocalSearchEnd(uint16 count){
if (!canceld && count > MAX_RESULTS)
OnBnClickedCancels();
if (!canceld){
if (!globsearch){
this->GetDlgItem(IDC_STARTS)->EnableWindow(true);
this->GetDlgItem(IDC_CANCELS)->EnableWindow(false);
}
else
global_search_timer = SetTimer(1, 750, 0);
}
}
void CSearchDlg::AddUDPResult(uint16 count){
if (!canceld && count > MAX_RESULTS)
OnBnClickedCancels();
}
void CSearchDlg::OnBnClickedSdownload(){
//start download(s)
DownloadSelected();
}
BOOL CSearchDlg::PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 27)) return FALSE;
if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 13)){
if (pMsg->hwnd == GetDlgItem(IDC_SEARCHLIST)->m_hWnd)
OnBnClickedSdownload();
else if (pMsg->hwnd == GetDlgItem(IDC_SEARCHNAME)->m_hWnd ||
pMsg->hwnd == GetDlgItem(IDC_TypeSearch)->m_hWnd ||
pMsg->hwnd == GetDlgItem(IDC_EDITSEARCHMIN)->m_hWnd ||
pMsg->hwnd == GetDlgItem(IDC_EDITSEARCHMAX)->m_hWnd ||
pMsg->hwnd == GetDlgItem(IDC_EDITSEARCHAVAIBILITY)->m_hWnd ||
pMsg->hwnd == GetDlgItem(IDC_COMBO1)->m_hWnd ||
pMsg->hwnd == GetDlgItem(IDC_EDITSEARCHEXTENSION)->m_hWnd)
OnBnClickedStarts();
}
return CResizableDialog::PreTranslateMessage(pMsg);
}
void CSearchDlg::OnNMDblclkSearchlist(NMHDR *pNMHDR, LRESULT *pResult){
OnBnClickedSdownload();
*pResult = 0;
}
CString CSearchDlg::CreateWebQuery()
{
CString query,tosearch;
unsigned long num;
switch (methodBox.GetCurSel())
{
case 2:
query = "http://www.filedonkey.com/fdsearch/index.php?";
GetDlgItem(IDC_SEARCHNAME)->GetWindowText(tosearch);
query += "pattern="+ToQueryString(tosearch);
GetDlgItem(IDC_TypeSearch)->GetWindowText(tosearch);
if (GetResString(IDS_SEARCH_AUDIO)==tosearch)
tosearch="Audio";
else if (GetResString(IDS_SEARCH_VIDEO)==tosearch)
tosearch="Video";
else if (GetResString(IDS_SEARCH_PRG)==tosearch)
tosearch="Pro";
else
tosearch="All";
query +="&media=" + tosearch; //Cax2 added filedonkey 'type' option
query += "&action=search&name=FD-Search&op=modload&file=index&requestby=emule";
break;
case 3:
query = "http://www.jigle.com/search?";
GetDlgItem(IDC_SEARCHNAME)->GetWindowText(tosearch);
query += "p="+ToQueryString(tosearch) + "&ma=";
GetDlgItem(IDC_EDITSEARCHAVAIBILITY)->GetWindowText(tosearch);
if (atol(tosearch)>1000) tosearch="1000";
else if (atoi(tosearch)>500) tosearch="500";
else if (atoi(tosearch)>200) tosearch="200";
else if (atoi(tosearch)>100) tosearch="100";
else if (atoi(tosearch)>50) tosearch="50";
else if (atoi(tosearch)>20) tosearch="20";
else if (atoi(tosearch)>10) tosearch="10";
else tosearch="1";
query += tosearch +"&v=0&d=1&a=0&l=10"; //Cax2 might want to change to l=25 for more results per page...
GetDlgItem(IDC_TypeSearch)->GetWindowText(tosearch);
if (GetResString(IDS_SEARCH_AUDIO)==tosearch)
tosearch="1";
else if (GetResString(IDS_SEARCH_VIDEO)==tosearch)
tosearch="2";
else if (GetResString(IDS_SEARCH_PICS)==tosearch)
tosearch="3";
else if (GetResString(IDS_SEARCH_PRG)==tosearch)
tosearch="4";
else
tosearch="0";
query +="&t=" +tosearch;
GetDlgItem(IDC_EDITSEARCHEXTENSION)->GetWindowText(tosearch);
query +="&x=" + ToQueryString(tosearch);
GetDlgItem(IDC_EDITSEARCHMIN)->GetWindowText(tosearch);
num=atol(tosearch);
tosearch.Format("%u",((num>0)?num *1048576:1));
query +="&sl=" +tosearch;
GetDlgItem(IDC_EDITSEARCHMAX)->GetWindowText(tosearch);
num=atol(tosearch);
tosearch.Format(((num>0)?"%u":""),num * 1048576);
query +="&su=" + tosearch;
break;
default:
return "";
}
return query;
}
void CSearchDlg::DownloadSelected() {
int index = -1;
POSITION pos = searchlistctrl.GetFirstSelectedItemPosition();
while(pos != NULL)
{
index = searchlistctrl.GetNextSelectedItem(pos);
if(index > -1) {
theApp.downloadqueue->AddSearchToDownload((CSearchFile*)searchlistctrl.GetItemData(index ),m_cattabs.GetCurSel());
searchlistctrl.Update(index);
}
}
}
void CSearchDlg::Localize(){
searchlistctrl.Localize();
GetDlgItem(IDC_SEARCH_FRM)->SetWindowText(GetResString(IDS_SW_SEARCHBOX));
GetDlgItem(IDC_MSTATIC3)->SetWindowText(GetResString(IDS_SW_NAME));
GetDlgItem(IDC_MSTATIC7)->SetWindowText(GetResString(IDS_SW_TYPE));
GetDlgItem(IDC_DDOWN_FRM)->SetWindowText(GetResString(IDS_SW_DIRECTDOWNLOAD));
GetDlgItem(IIDC_FSTATIC2)->SetWindowText(GetResString(IDS_SW_LINK));
GetDlgItem(IDC_STARTS)->SetWindowText(GetResString(IDS_SW_START));
GetDlgItem(IDC_CANCELS)->SetWindowText(GetResString(IDS_CANCEL));
GetDlgItem(IDC_CLEARALL)->SetWindowText(GetResString(IDS_REMOVEALLSEARCH));
GetDlgItem(IDC_RESULTS_LBL)->SetWindowText(GetResString(IDS_SW_RESULT));
GetDlgItem(IDC_SDOWNLOAD)->SetWindowText(GetResString(IDS_SW_DOWNLOAD));
GetDlgItem(IDC_MSTATIC7)->SetWindowText(GetResString(IDS_TYPE));
GetDlgItem(IDC_SEARCH_RESET)->SetWindowText(GetResString(IDS_PW_RESET));
GetDlgItem(IDC_SEARCHMINSIZE)->SetWindowText(GetResString(IDS_SEARCHMINSIZE)+":");
GetDlgItem(IDC_SEARCHMAXSIZE)->SetWindowText(GetResString(IDS_SEARCHMAXSIZE)+":");
GetDlgItem(IDC_SEARCHEXTENTION)->SetWindowText(GetResString(IDS_SEARCHEXTENTION)+":");
GetDlgItem(IDC_SEARCHAVAIL)->SetWindowText(GetResString(IDS_SEARCHAVAIL)+":");
GetDlgItem(IDC_METH)->SetWindowText(GetResString(IDS_METHOD));
while (methodBox.GetCount()>0) methodBox.DeleteString(0);
methodBox.AddString(GetResString(IDS_SERVER));
methodBox.AddString(GetResString(IDS_GLOBALSEARCH));
methodBox.AddString("Filedonkey");
methodBox.AddString("Jigle");
methodBox.SetCurSel(0);
while (Stypebox.GetCount()>0) Stypebox.DeleteString(0);
Stypebox.AddString(GetResString(IDS_SEARCH_ANY));
Stypebox.AddString(GetResString(IDS_SEARCH_ARC));
Stypebox.AddString(GetResString(IDS_SEARCH_AUDIO));
Stypebox.AddString(GetResString(IDS_SEARCH_CDIMG));
Stypebox.AddString(GetResString(IDS_SEARCH_PICS));
Stypebox.AddString(GetResString(IDS_SEARCH_PRG));
Stypebox.AddString(GetResString(IDS_SEARCH_VIDEO));
Stypebox.SetCurSel(Stypebox.FindString(-1,GetResString(IDS_SEARCH_ANY)));
}
void CSearchDlg::OnBnClickedClearall()
{
OnBnClickedCancels();
DeleteAllSearchs();
}
void CSearchDlg::StartNewSearch(){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -