📄 searchparamswnd.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.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.
#include "stdafx.h"
#include "emule.h"
#include "emuledlg.h"
#include "SearchDlg.h"
#include "SearchParamsWnd.h"
#include "SearchResultsWnd.h"
#include "SearchParams.h"
#include "OtherFunctions.h"
#include "CustomAutoComplete.h"
#include "HelpIDs.h"
#include "Opcodes.h"
#include "StringConversion.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#ifndef LVS_EX_LABELTIP
#define LVS_EX_LABELTIP 0x00004000 // listview unfolds partly hidden labels if it does not have infotip text
#endif
#define SEARCH_STRINGS_PROFILE _T("AC_SearchStrings.dat")
IMPLEMENT_DYNAMIC(CSearchParamsWnd, CDialogBar);
BEGIN_MESSAGE_MAP(CSearchParamsWnd, CDialogBar)
ON_WM_SIZE()
ON_WM_DESTROY()
ON_WM_SYSCOLORCHANGE()
ON_MESSAGE(WM_INITDIALOG, OnInitDialog)
ON_BN_CLICKED(IDC_STARTS, OnBnClickedStart)
ON_BN_CLICKED(IDC_CANCELS, OnBnClickedCancel)
ON_BN_CLICKED(IDC_MORE, OnBnClickedMore)
ON_EN_CHANGE(IDC_SEARCHNAME, OnEnChangeName)
ON_CBN_SELCHANGE(IDC_TypeSearch, OnEnChangeName)
ON_BN_CLICKED(IDC_SEARCH_RESET, OnBnClickedSearchReset)
ON_BN_CLICKED(IDC_DD, OnDDClicked)
ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelChangeMethod)
ON_CBN_SELENDOK(IDC_COMBO1, OnCbnSelEndOkMethod)
ON_WM_SYSCOMMAND()
ON_WM_SETCURSOR()
ON_WM_HELPINFO()
END_MESSAGE_MAP()
CSearchParamsWnd::CSearchParamsWnd()
{
m_szFloat.SetSize(0,0);
m_szMRU.SetSize(0,0);
// load default windows system cursor (a shared resource)
m_hcurMove = ::LoadCursor(NULL, IDC_SIZEALL);
m_searchdlg = NULL;
m_pacSearchString = NULL;
m_rcNameLbl.SetRectEmpty();
m_rcName.SetRectEmpty();
m_rcDropDownArrow.SetRectEmpty();
m_rcFileTypeLbl.SetRectEmpty();
m_rcFileType.SetRectEmpty();
m_rcReset.SetRectEmpty();
m_rcMethodLbl.SetRectEmpty();
m_rcMethod.SetRectEmpty();
m_rcOpts.SetRectEmpty();
m_rcStart.SetRectEmpty();
m_rcMore.SetRectEmpty();
m_rcCancel.SetRectEmpty();
m_rcUnicode.SetRectEmpty();
}
CSearchParamsWnd::~CSearchParamsWnd()
{
if (m_pacSearchString)
{
m_pacSearchString->Unbind();
m_pacSearchString->Release();
}
// 'DestroyCursor' is not to be used for a shared cursor (as returned with LoadCursor) (?!)
// if (m_hcurMove)
// VERIFY( DestroyCursor(m_hcurMove) );
}
void CSearchParamsWnd::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_ctlMethod);
DDX_Control(pDX, IDC_TypeSearch, m_ctlFileType);
DDX_Control(pDX, IDC_SEARCHNAME, m_ctlName);
DDX_Control(pDX, IDC_SEARCH_OPTS, m_ctlOpts);
DDX_Control(pDX, IDC_STARTS, m_ctlStart);
DDX_Control(pDX, IDC_CANCELS, m_ctlCancel);
DDX_Control(pDX, IDC_MORE, m_ctlMore);
DDX_Control(pDX, IDC_SEARCH_UNICODE, m_ctlUnicode);
}
LRESULT CSearchParamsWnd::OnInitDialog(WPARAM wParam, LPARAM lParam)
{
Default();
InitWindowStyles(this);
//(void)m_sizeDefault; // not yet set
CRect sizeDefault;
GetWindowRect(&sizeDefault);
CRect rcBorders(4, 4, 4, 4);
SetBorders(&rcBorders);
m_szFloat.cx = sizeDefault.Width() + rcBorders.left + rcBorders.right + GetSystemMetrics(SM_CXEDGE) * 2;
m_szFloat.cy = sizeDefault.Height() + rcBorders.top + rcBorders.bottom + GetSystemMetrics(SM_CYEDGE) * 2;
m_szMRU = m_szFloat;
UpdateData(FALSE);
SetAllIcons();
GetDlgItem(IDC_MSTATIC3)->GetWindowRect(&m_rcNameLbl);
ScreenToClient(&m_rcNameLbl);
m_ctlName.GetWindowRect(&m_rcName);
ScreenToClient(&m_rcName);
m_ctlUnicode.GetWindowRect(&m_rcUnicode);
ScreenToClient(&m_rcUnicode);
GetDlgItem(IDC_DD)->GetWindowRect(&m_rcDropDownArrow);
ScreenToClient(&m_rcDropDownArrow);
GetDlgItem(IDC_MSTATIC7)->GetWindowRect(&m_rcFileTypeLbl);
ScreenToClient(&m_rcFileTypeLbl);
m_ctlFileType.GetWindowRect(&m_rcFileType);
ScreenToClient(&m_rcFileType);
GetDlgItem(IDC_SEARCH_RESET)->GetWindowRect(&m_rcReset);
ScreenToClient(&m_rcReset);
GetDlgItem(IDC_METH)->GetWindowRect(&m_rcMethodLbl);
ScreenToClient(&m_rcMethodLbl);
m_ctlMethod.GetWindowRect(&m_rcMethod);
ScreenToClient(&m_rcMethod);
m_ctlOpts.GetWindowRect(&m_rcOpts);
ScreenToClient(&m_rcOpts);
m_ctlStart.GetWindowRect(&m_rcStart);
ScreenToClient(&m_rcStart);
m_ctlMore.GetWindowRect(&m_rcMore);
ScreenToClient(&m_rcMore);
m_ctlCancel.GetWindowRect(&m_rcCancel);
ScreenToClient(&m_rcCancel);
if (thePrefs.GetUseAutocompletion())
{
m_pacSearchString = new CCustomAutoComplete();
m_pacSearchString->AddRef();
if (m_pacSearchString->Bind(m_ctlName, ACO_UPDOWNKEYDROPSLIST | ACO_AUTOSUGGEST))
m_pacSearchString->LoadList(thePrefs.GetConfigDir() + _T("\\") SEARCH_STRINGS_PROFILE);
if (theApp.emuledlg->m_fontMarlett.m_hObject)
{
GetDlgItem(IDC_DD)->SetFont(&theApp.emuledlg->m_fontMarlett);
GetDlgItem(IDC_DD)->SetWindowText(_T("6")); // show a down-arrow
}
}
else
GetDlgItem(IDC_DD)->ShowWindow(SW_HIDE);
m_ctlName.LimitText(MAX_SEARCH_EXPRESSION_LEN); // max. length of search expression
InitMethodsCtrl();
if (m_ctlMethod.SetCurSel(thePrefs.GetSearchMethod()) == CB_ERR)
m_ctlMethod.SetCurSel(SearchTypeEd2kServer);
CImageList ilDummyImageList; //dummy list for getting the proper height of listview entries
ilDummyImageList.Create(1, theApp.GetSmallSytemIconSize().cy, theApp.m_iDfltImageListColorFlags|ILC_MASK, 1, 1);
m_ctlOpts.SetImageList(&ilDummyImageList, LVSIL_SMALL);
ASSERT( (m_ctlOpts.GetStyle() & LVS_SHAREIMAGELISTS) == 0 );
ilDummyImageList.Detach();
m_ctlOpts.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP);
m_ctlOpts.InsertColumn(0, _T("Parameter"));
m_ctlOpts.InsertColumn(1, _T("Value"));
m_ctlOpts.InsertItem(orMinSize, GetResString(IDS_SEARCHMINSIZE));
m_ctlOpts.InsertItem(orMaxSize, GetResString(IDS_SEARCHMAXSIZE));
m_ctlOpts.InsertItem(orAvailability, GetResString(IDS_SEARCHAVAIL));
m_ctlOpts.InsertItem(orExtension, GetResString(IDS_SEARCHEXTENTION));
m_ctlOpts.InsertItem(orCompleteSources, GetResString(IDS_COMPLSOURCES));
m_ctlOpts.InsertItem(orCodec, GetResString(IDS_CODEC));
m_ctlOpts.InsertItem(orBitrate, GetResString(IDS_MINBITRATE));
m_ctlOpts.InsertItem(orLength, GetResString(IDS_MINLENGTH));
m_ctlOpts.InsertItem(orTitle, GetResString(IDS_TITLE));
m_ctlOpts.InsertItem(orAlbum, GetResString(IDS_ALBUM));
m_ctlOpts.InsertItem(orArtist, GetResString(IDS_ARTIST));
m_ctlOpts.SetColumnWidth(0, 100/*LVSCW_AUTOSIZE*/);
m_ctlOpts.SetColumnWidth(1, 120);
UpdateControls();
OnEnChangeName();
return TRUE;
}
#define MIN_HORZ_WIDTH 500
#define MIN_VERT_WIDTH 200
CSize CSearchParamsWnd::CalcDynamicLayout(int nLength, DWORD dwMode)
{
CFrameWnd* pFrm = GetDockingFrame();
// This function is typically called with
// CSize sizeHorz = m_pBar->CalcDynamicLayout(0, LM_HORZ | LM_HORZDOCK);
// CSize sizeVert = m_pBar->CalcDynamicLayout(0, LM_VERTDOCK);
// CSize sizeFloat = m_pBar->CalcDynamicLayout(0, LM_HORZ | LM_MRUWIDTH);
CRect rcFrmClnt;
pFrm->GetClientRect(&rcFrmClnt);
CRect rcInside = rcFrmClnt;
CalcInsideRect(rcInside, dwMode & LM_HORZDOCK);
CRect rcBorders;
rcBorders.left = rcInside.left - rcFrmClnt.left;
rcBorders.top = rcInside.top - rcFrmClnt.top;
rcBorders.bottom = rcFrmClnt.bottom - rcInside.bottom;
rcBorders.right = rcFrmClnt.right - rcInside.right;
if (dwMode & (LM_HORZDOCK | LM_VERTDOCK))
{
if (dwMode & LM_VERTDOCK)
{
CSize szFloat;
szFloat.cx = MIN_VERT_WIDTH;
szFloat.cy = rcFrmClnt.Height() + GetSystemMetrics(SM_CYEDGE) * 2;
m_szFloat = szFloat;
return szFloat;
}
else if (dwMode & LM_HORZDOCK)
{
CSize szFloat;
szFloat.cx = rcFrmClnt.Width() + GetSystemMetrics(SM_CXEDGE) * 2;
szFloat.cy = m_sizeDefault.cy + rcBorders.top + rcBorders.bottom;
m_szFloat = szFloat;
return szFloat;
}
return CDialogBar::CalcDynamicLayout(nLength, dwMode);
}
if (dwMode & LM_MRUWIDTH){
return m_szMRU;
}
if (dwMode & LM_COMMIT){
m_szMRU = m_szFloat;
return m_szFloat;
}
CSize szFloat;
if ((dwMode & LM_LENGTHY) == 0)
{
szFloat.cx = nLength;
if (nLength < m_sizeDefault.cx + rcBorders.left + rcBorders.right)
{
szFloat.cx = MIN_VERT_WIDTH;
szFloat.cy = MIN_HORZ_WIDTH;
}
else
{
szFloat.cy = m_sizeDefault.cy + rcBorders.top + rcBorders.bottom;
}
}
else
{
szFloat.cy = nLength;
if (nLength < MIN_HORZ_WIDTH)
{
szFloat.cx = m_sizeDefault.cx + rcBorders.left + rcBorders.right;
szFloat.cy = m_sizeDefault.cy + rcBorders.top + rcBorders.bottom;
}
else
{
szFloat.cx = MIN_VERT_WIDTH;
}
}
m_szFloat = szFloat;
return szFloat;
}
BOOL CSearchParamsWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_hcurMove && ((m_dwStyle & (CBRS_GRIPPER|CBRS_FLOATING)) == CBRS_GRIPPER) && pWnd->GetSafeHwnd() == m_hWnd)
{
CPoint ptCursor;
if (GetCursorPos(&ptCursor))
{
ScreenToClient(&ptCursor);
CRect rcClnt;
GetClientRect(&rcClnt);
bool bMouseOverGripper;
if (m_dwStyle & CBRS_ORIENT_HORZ)
bMouseOverGripper = (rcClnt.PtInRect(ptCursor) && ptCursor.x <= 10);
else
bMouseOverGripper = (rcClnt.PtInRect(ptCursor) && ptCursor.y <= 10);
if (bMouseOverGripper)
{
::SetCursor(m_hcurMove);
return TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -