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

📄 ctrlsearchpanel.cpp

📁 p2p软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -