⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchdlg.cpp

📁 非常出名开源客户端下载的程序emule
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//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 + -