📄 ctrlsearchpanel.cpp
字号:
//
// CtrlSearchPanel.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza 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.
//
// Shareaza 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 Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "Schema.h"
#include "SchemaCache.h"
#include "ManagedSearch.h"
#include "QuerySearch.h"
#include "CtrlSearchPanel.h"
#include "CoolInterface.h"
#include "ShellIcons.h"
#include "XML.h"
#include "Skin.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CSearchPanel, CTaskPanel)
BEGIN_MESSAGE_MAP(CSearchPanel, CTaskPanel)
//{{AFX_MSG_MAP(CSearchPanel)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(CSearchInputBox, CTaskBox)
BEGIN_MESSAGE_MAP(CSearchInputBox, CTaskBox)
//{{AFX_MSG_MAP(CSearchInputBox)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_PAINT()
ON_CBN_SELCHANGE(IDC_SCHEMAS, OnSelChangeSchemas)
ON_CBN_CLOSEUP(IDC_SCHEMAS, OnCloseUpSchemas)
ON_COMMAND(IDC_SEARCH_START, OnSearchStart)
ON_COMMAND(IDC_SEARCH_STOP, OnSearchStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(CSearchSchemaBox, CTaskBox)
BEGIN_MESSAGE_MAP(CSearchSchemaBox, CTaskBox)
//{{AFX_MSG_MAP(CSearchSchemaBox)
ON_WM_CREATE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(CSearchResultsBox, CTaskBox)
BEGIN_MESSAGE_MAP(CSearchResultsBox, CTaskBox)
//{{AFX_MSG_MAP(CSearchResultsBox)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#define BOX_MARGIN 10
/////////////////////////////////////////////////////////////////////////////
// CSearchPanel construction
CSearchPanel::CSearchPanel()
{
m_bSendSearch = FALSE;
}
CSearchPanel::~CSearchPanel()
{
}
/////////////////////////////////////////////////////////////////////////////
// CSearchPanel message handlers
BOOL CSearchPanel::Create(CWnd* pParentWnd)
{
CRect rect;
return CTaskPanel::Create( WS_VISIBLE, rect, pParentWnd, IDC_SEARCH_PANEL );
}
int CSearchPanel::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( CTaskPanel::OnCreate( lpCreateStruct ) == -1 )return -1;
BOOL bAdvanced = Settings.General.GUIMode != GUI_BASIC && GetSystemMetrics( SM_CYSCREEN ) > 600;
m_boxSearch.Create( this, bAdvanced ? 188 : 140, _T("Search"), IDR_SEARCHFRAME );
m_boxSchema.Create( this, 0, _T("Schema"), IDR_SEARCHFRAME );
m_boxResults.Create( this, 80, _T("Results"), IDR_HOSTCACHEFRAME );
AddBox( &m_boxSearch );
AddBox( &m_boxSchema );
if ( bAdvanced ) AddBox( &m_boxResults );
SetStretchBox( &m_boxSchema );
OnSkinChange();
return 0;
}
void CSearchPanel::OnSkinChange()
{
CString strCaption;
LoadString( strCaption, IDS_SEARCH_PANEL_INPUT_CAPTION );
m_boxSearch.SetCaption( strCaption );
LoadString( strCaption, IDS_SEARCH_PANEL_RESULTS_CAPTION );
m_boxResults.SetCaption( strCaption );
SetWatermark( Skin.GetWatermark( _T("CSearchPanel") ) );
SetFooter( Skin.GetWatermark( _T("CSearchPanel.Footer") ), TRUE );
m_boxSearch.SetWatermark( Skin.GetWatermark( _T("CSearchInputBox") ) );
m_boxSearch.SetCaptionmark( Skin.GetWatermark( _T("CSearchInputBox.Caption") ) );
m_boxSearch.OnSkinChange();
m_boxSchema.SetWatermark( Skin.GetWatermark( _T("CSearchSchemaBox") ) );
m_boxSchema.SetCaptionmark( Skin.GetWatermark( _T("CSearchSchemaBox.Caption") ) );
m_boxResults.SetWatermark( Skin.GetWatermark( _T("CSearchResultsBox") ) );
m_boxResults.SetCaptionmark( Skin.GetWatermark( _T("CSearchResultsBox.Caption") ) );
Invalidate();
}
void CSearchPanel::SetSearchFocus()
{
m_boxSearch.m_wndSearch.SetFocus();
}
void CSearchPanel::ShowSearch(CManagedSearch* pSearch)
{
if ( pSearch == NULL )
{
OnSchemaChange();
return;
}
m_boxSearch.m_wndSearch.SetWindowText( pSearch->m_pSearch->m_sSearch );
m_boxSearch.m_wndSchemas.Select( pSearch->m_pSearch->m_pSchema );
if ( m_boxSearch.m_wndNetworks.m_hWnd != NULL )
{
if ( pSearch->m_bAllowG2 && ! pSearch->m_bAllowG1 && ! pSearch->m_bAllowED2K )
m_boxSearch.m_wndNetworks.SetNetwork( PROTOCOL_G2 );
else if ( ! pSearch->m_bAllowG2 && pSearch->m_bAllowG1 && ! pSearch->m_bAllowED2K )
m_boxSearch.m_wndNetworks.SetNetwork( PROTOCOL_G1 );
else if ( ! pSearch->m_bAllowG2 && ! pSearch->m_bAllowG1 && pSearch->m_bAllowED2K )
m_boxSearch.m_wndNetworks.SetNetwork( PROTOCOL_ED2K );
else
m_boxSearch.m_wndNetworks.SetNetwork( PROTOCOL_NULL );
}
OnSchemaChange();
if ( pSearch->m_pSearch->m_pXML != NULL )
{
m_boxSchema.m_wndSchema.UpdateData( pSearch->m_pSearch->m_pXML->GetFirstElement(), FALSE );
}
}
void CSearchPanel::ShowStatus(BOOL bSearching, DWORD nFiles, DWORD nHits, DWORD nHubs, DWORD nLeaves)
{
CString strCaption;
LoadString( strCaption, bSearching ? IDS_SEARCH_PANEL_AGAIN : IDS_SEARCH_PANEL_START );
m_boxSearch.m_wndStart.SetText( strCaption );
LoadString( strCaption, bSearching ? IDS_SEARCH_PANEL_STOP : IDS_SEARCH_PANEL_CLEAR );
m_boxSearch.m_wndStop.SetText( strCaption );
m_boxResults.Update( bSearching, nFiles, nHits, nHubs, nLeaves );
}
void CSearchPanel::OnSchemaChange()
{
CSchema* pSchema = m_boxSearch.m_wndSchemas.GetSelected();
m_boxSchema.m_wndSchema.SetSchema( pSchema, TRUE );
m_boxSchema.SetSize( pSchema != NULL ? 1 : 0 );
if ( pSchema != NULL )
{
m_boxSchema.SetIcon( ShellIcons.ExtractIcon( pSchema->m_nIcon16, 16 ), TRUE );
CString strTitle = pSchema->m_sTitle;
int nPos = strTitle.Find( ':' );
if ( nPos > 0 ) strTitle = strTitle.Mid( nPos + 1 );
m_boxSchema.SetCaption( strTitle );
}
}
CManagedSearch* CSearchPanel::GetSearch()
{
CManagedSearch* pSearch = new CManagedSearch();
m_boxSearch.m_wndSearch.GetWindowText( pSearch->m_pSearch->m_sSearch );
pSearch->m_pSearch->m_sSearch.TrimLeft();
pSearch->m_pSearch->m_sSearch.TrimRight();
if ( m_boxSearch.m_wndNetworks.m_hWnd != NULL )
{
switch ( m_boxSearch.m_wndNetworks.GetNetwork() )
{
case PROTOCOL_NULL:
pSearch->m_bAllowG2 = TRUE;
pSearch->m_bAllowG1 = TRUE;
pSearch->m_bAllowED2K = TRUE;
break;
case PROTOCOL_G2:
pSearch->m_bAllowG2 = TRUE;
pSearch->m_bAllowG1 = FALSE;
pSearch->m_bAllowED2K = FALSE;
break;
case PROTOCOL_G1:
pSearch->m_bAllowG2 = FALSE;
pSearch->m_bAllowG1 = TRUE;
pSearch->m_bAllowED2K = FALSE;
break;
case PROTOCOL_ED2K:
pSearch->m_bAllowG2 = FALSE;
pSearch->m_bAllowG1 = FALSE;
pSearch->m_bAllowED2K = TRUE;
break;
}
}
if ( CSchema* pSchema = m_boxSearch.m_wndSchemas.GetSelected() )
{
pSearch->m_pSearch->m_pSchema = pSchema;
pSearch->m_pSearch->m_pXML = pSchema->Instantiate();
m_boxSchema.m_wndSchema.UpdateData(
pSearch->m_pSearch->m_pXML->AddElement( pSchema->m_sSingular ), TRUE );
pSearch->m_pSearch->GetHashFromXML();
Settings.Search.LastSchemaURI = pSchema->m_sURI;
}
else
{
Settings.Search.LastSchemaURI.Empty();
}
pSearch->m_pSearch->BuildWordList();
if ( pSearch->m_pSearch->m_nWords == 0 )
{
delete pSearch;
return NULL;
}
return pSearch;
}
void CSearchPanel::ExecuteSearch()
{
m_bSendSearch = TRUE;
GetParent()->SendMessage( WM_COMMAND, ID_SEARCH_SEARCH );
m_bSendSearch = FALSE;
}
BOOL CSearchPanel::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_KEYDOWN )
{
if ( pMsg->wParam == VK_RETURN )
{
ExecuteSearch();
return TRUE;
}
else if ( pMsg->wParam == VK_TAB )
{
BOOL bShift = GetAsyncKeyState( VK_SHIFT ) & 0x8000;
CWnd* pWnd = GetFocus();
if ( pWnd == &m_boxSearch.m_wndSearch )
{
if ( bShift )
m_boxSchema.m_wndSchema.SetFocus();
else
m_boxSearch.m_wndSchemas.SetFocus();
return TRUE;
}
else if ( pWnd == &m_boxSearch.m_wndSchemas )
{
if ( bShift )
m_boxSearch.m_wndSearch.SetFocus();
else
m_boxSchema.m_wndSchema.SetFocus();
return TRUE;
}
else
{
m_boxSearch.m_wndSearch.SetFocus();
}
}
}
return CTaskPanel::PreTranslateMessage( pMsg );
}
/////////////////////////////////////////////////////////////////////////////
// CSearchInputBox construction
CSearchInputBox::CSearchInputBox()
{
}
CSearchInputBox::~CSearchInputBox()
{
}
/////////////////////////////////////////////////////////////////////////////
// CSearchInputBox message handlers
int CSearchInputBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( CTaskBox::OnCreate( lpCreateStruct ) == -1 ) return -1;
CRect rc( 0, 0, 0, 0 );
CString strCaption;
if ( ! m_wndSearch.Create( ES_AUTOHSCROLL|WS_TABSTOP|WS_GROUP, rc,
this, IDC_SEARCH ) ) return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -