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

📄 ctrlhomepanel.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
字号:
//
// CtrlHomePanel.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 "CtrlHomePanel.h"

#include "Statistics.h"
#include "Network.h"
#include "Neighbours.h"
#include "Neighbour.h"
#include "GraphItem.h"
#include "Library.h"
#include "LibraryBuilder.h"
#include "LibraryHistory.h"
#include "SharedFile.h"
#include "Transfers.h"
#include "Downloads.h"
#include "Download.h"

#include "CoolInterface.h"
#include "ShellIcons.h"
#include "RichDocument.h"
#include "RichElement.h"
#include "FragmentBar.h"
#include "FileExecutor.h"
#include "Skin.h"
#include "XML.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNAMIC(CHomePanel, CTaskPanel)
BEGIN_MESSAGE_MAP(CHomePanel, CTaskPanel)
	//{{AFX_MSG_MAP(CHomePanel)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

IMPLEMENT_DYNAMIC(CHomeDownloadsBox, CRichTaskBox)
BEGIN_MESSAGE_MAP(CHomeDownloadsBox, CRichTaskBox)
	//{{AFX_MSG_MAP(CHomeDownloadsBox)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONUP()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

IMPLEMENT_DYNAMIC(CHomeLibraryBox, CRichTaskBox)
BEGIN_MESSAGE_MAP(CHomeLibraryBox, CRichTaskBox)
	//{{AFX_MSG_MAP(CHomeLibraryBox)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONUP()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

IMPLEMENT_DYNAMIC(CHomeUploadsBox, CRichTaskBox)
BEGIN_MESSAGE_MAP(CHomeUploadsBox, CRichTaskBox)
	//{{AFX_MSG_MAP(CHomeUploadsBox)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

IMPLEMENT_DYNAMIC(CHomeConnectionBox, CRichTaskBox)
BEGIN_MESSAGE_MAP(CHomeConnectionBox, CRichTaskBox)
	//{{AFX_MSG_MAP(CHomeConnectionBox)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CHomePanel construction

CHomePanel::CHomePanel()
{
	// SetMargin( 0, 0 );
}

CHomePanel::~CHomePanel()
{
}

/////////////////////////////////////////////////////////////////////////////
// CHomePanel message handlers

BOOL CHomePanel::Create(CWnd* pParentWnd)
{
	CRect rect( 0, 0, 200, 0 );
	return CTaskPanel::Create( WS_VISIBLE, rect, pParentWnd, IDC_HOME_PANEL );
}

int CHomePanel::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if ( CTaskPanel::OnCreate( lpCreateStruct ) == -1 ) return -1;
	
	m_boxDownloads.Create( this, _T("Downloads"), IDR_DOWNLOADSFRAME );
	m_boxUploads.Create( this, _T("Uploads"), IDR_UPLOADSFRAME );
	m_boxConnection.Create( this, _T("Connection"), IDR_NEIGHBOURSFRAME );
	m_boxLibrary.Create( this, _T("Library"), IDR_LIBRARYFRAME );
	
	AddBox( &m_boxDownloads );
	AddBox( &m_boxLibrary );
	AddBox( &m_boxConnection );
	if ( GetSystemMetrics( SM_CYSCREEN ) > 600 ) AddBox( &m_boxUploads );
	
	// SetStretchBox( &m_boxLibrary );
	
	return 0;
}

void CHomePanel::Setup()
{
	SetWatermark( Skin.GetWatermark( _T("CHomePanel") ) );
	SetFooter( Skin.GetWatermark( _T("CHomePanel.Footer") ), TRUE );
	
	m_boxDownloads.Setup();
	m_boxUploads.Setup();
	m_boxConnection.Setup();
	m_boxLibrary.Setup();
	
	Update();
	Invalidate();
}

void CHomePanel::Update()
{
	m_boxDownloads.Update();
	m_boxUploads.Update();
	m_boxConnection.Update();
	m_boxLibrary.Update();
}


/////////////////////////////////////////////////////////////////////////////
// CHomeDownloadsBox construction

CHomeDownloadsBox::CHomeDownloadsBox()
{
	SetPrimary();
}

CHomeDownloadsBox::~CHomeDownloadsBox()
{
	for ( int nItem = 0 ; nItem < m_pList.GetSize() ; nItem++ )
	{
		delete (Item*)m_pList.GetAt( nItem );
	}
}

/////////////////////////////////////////////////////////////////////////////
// CHomeDownloadsBox message handlers

int CHomeDownloadsBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if ( CRichTaskBox::OnCreate( lpCreateStruct ) == -1 ) return -1;
	
	m_pFont.CreateFont( -10, 0, 0, 0, FW_NORMAL, FALSE, TRUE, FALSE,
		DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
		DEFAULT_PITCH|FF_DONTCARE, _T("Tahoma") );
	
	m_hHand = theApp.LoadCursor( IDC_HAND );
	
	m_wndTip.Create( this, &Settings.Interface.TipDownloads );
	
	return 0;
}

void CHomeDownloadsBox::Setup()
{
	if ( m_pDocument ) delete m_pDocument;
	m_pDocument = NULL;
	m_pdDownloadsNone = m_pdDownloadsOne = m_pdDownloadsMany = NULL;
	
	SetCaptionmark( Skin.GetWatermark( _T("CHomeDownloadsBox.Caption") ) );
	
	CXMLElement* pXML = Skin.GetDocument( _T("CHomeDownloadsBox") );
	if ( pXML == NULL ) return;
	
	SetCaption( pXML->GetAttributeValue( _T("title"), _T("Downloads") ) );
	
	m_pDocument = new CRichDocument();
	
	CMapStringToPtr pMap;
	if ( ! m_pDocument->LoadXML( pXML, &pMap ) ) return;
	
	pMap.Lookup( _T("DownloadsNone"), (void*&)m_pdDownloadsNone );
	pMap.Lookup( _T("DownloadsOne"), (void*&)m_pdDownloadsOne );
	pMap.Lookup( _T("DownloadsMany"), (void*&)m_pdDownloadsMany );
	
	if ( m_pdDownloadsMany ) m_sDownloadsMany = m_pdDownloadsMany->m_sText;
	
	GetView().SetDocument( m_pDocument );
	Update();
}

void CHomeDownloadsBox::Update()
{
	if ( m_pDocument == NULL ) return;
	
	CSingleLock pLock( &Transfers.m_pSection );
	if ( ! pLock.Lock( 50 ) ) return;
	
	BOOL bChanged = FALSE;
	CString str;
	
	for ( int nItem = m_pList.GetSize() - 1 ; nItem >= 0 ; nItem-- )
	{
		Item* pItem = (Item*)m_pList.GetAt( nItem );
		
		if ( ! Downloads.CheckActive( pItem->m_pDownload, 6 ) )
		{
			delete pItem;
			m_pList.RemoveAt( nItem );
			bChanged = TRUE;
			m_pHover = NULL;
			KillTimer( 2 );
		}
	}
	
	int nCount = 0;
	int nInsert = 0;
	
	for ( POSITION pos = Downloads.GetReverseIterator() ; pos && nCount < 6 ; )
	{
		CDownload* pDownload = Downloads.GetPrevious( pos );
		if ( pDownload->IsPaused() ) continue;
		if ( pDownload->IsCompleted() ) continue;
		
		Item* pItem = NULL;
		
		for ( int nItem = 0 ; nItem < m_pList.GetSize() ; nItem++ )
		{
			pItem = (Item*)m_pList.GetAt( nItem );
			if ( pItem->m_pDownload == pDownload ) break;
			pItem = NULL;
		}
		
		if ( pItem == NULL )
		{
			pItem				= new Item();
			pItem->m_pDownload	= pDownload;
			pItem->m_sText		= pDownload->GetDisplayName();
			pItem->m_nIcon16	= ShellIcons.Get( pItem->m_sText, 16 );
			m_pList.InsertAt( nInsert++, pItem );
			bChanged = TRUE;
			m_pHover = NULL;
			KillTimer( 2 );
		}
		
		QWORD nComplete	= pDownload->GetVolumeComplete();
		BOOL bPaused	= pDownload->GetFirstTransfer() == NULL;
		
		if ( pItem->m_nComplete != nComplete ||
			 pItem->m_bPaused != bPaused ||
			 pItem->m_nSize != pDownload->m_nSize )
		{
			pItem->m_nSize		= pDownload->m_nSize;
			pItem->m_nComplete	= nComplete;
			pItem->m_bPaused	= bPaused;
			bChanged = TRUE;
		}
		
		nCount++;
	}
	
	nCount = m_pList.GetSize() * 18;
	if ( nCount ) nCount += 6;
	
	m_pDocument->ShowGroup( 1, m_pList.GetSize() == 0 );
	
	int nActive = (int)CGraphItem::GetValue( GRC_DOWNLOADS_FILES );
	
	if ( nActive > 1 )
	{
		if ( m_pdDownloadsMany )
		{
			str.Format( m_sDownloadsMany, nActive );
			m_pdDownloadsMany->SetText( str );
			m_pdDownloadsMany->Show( TRUE );
		}
		if ( m_pdDownloadsOne ) m_pdDownloadsOne->Show( FALSE );
		if ( m_pdDownloadsNone ) m_pdDownloadsNone->Show( FALSE );
	}
	else if ( nActive == 1 )
	{
		if ( m_pdDownloadsMany ) m_pdDownloadsMany->Show( FALSE );
		if ( m_pdDownloadsOne ) m_pdDownloadsOne->Show( TRUE );
		if ( m_pdDownloadsNone ) m_pdDownloadsNone->Show( FALSE );
	}
	else
	{
		if ( m_pdDownloadsMany ) m_pdDownloadsMany->Show( FALSE );
		if ( m_pdDownloadsOne ) m_pdDownloadsOne->Show( FALSE );
		if ( m_pdDownloadsNone ) m_pdDownloadsNone->Show( TRUE );
	}
	
	m_pDocument->ShowGroup( 1, nActive == 0 );
	
	if ( GetView().IsModified() )
	{
		CRect rc;
		GetClientRect( &rc );
		m_nWidth = rc.Width();
		nCount += m_wndView.FullHeightMove( 0, nCount, m_nWidth );
	}
	else
	{
		CRect rc;
		m_wndView.GetWindowRect( &rc );
		ScreenToClient( &rc );
		
		if ( rc.top != nCount )
		{
			m_nWidth = rc.Width();
			nCount += m_wndView.FullHeightMove( 0, nCount, m_nWidth );
		}
		else
		{
			m_wndView.GetClientRect( &rc );
			nCount += rc.Height();
		}
	}
	
	SetSize( nCount );
	
	if ( bChanged ) Invalidate();
}

void CHomeDownloadsBox::OnSize(UINT nType, int cx, int cy) 
{
	CTaskBox::OnSize( nType, cx, cy );
	
	if ( m_nWidth != cx )
	{
		m_nWidth = cx;
		int nCount = m_pList.GetSize() * 18;
		if ( nCount ) nCount += 6;
		nCount += m_wndView.FullHeightMove( 0, nCount, m_nWidth );
		SetSize( nCount );
	}
}

void CHomeDownloadsBox::OnPaint() 
{
	CRect rcClient, rcIcon, rcText;
	CPaintDC dc( this );
	
	GetClientRect( &rcClient );
	m_wndView.GetClientRect( &rcIcon );
	rcClient.bottom -= rcIcon.Height();
	rcClient.top += 6;
	
	rcIcon.SetRect( 4, rcClient.top, 4 + 20, rcClient.top + 16 );
	rcText.SetRect( rcIcon.right, rcIcon.top, rcClient.right - 4, rcIcon.bottom );
	rcIcon.DeflateRect( 0, 2 );

	dc.SetBkMode( OPAQUE );
	dc.SetBkColor( CoolInterface.m_crWindow );
	dc.SetTextColor( RGB( 0, 0, 255 ) );
	
	CFont* pOldFont = (CFont*)dc.SelectObject( &m_pFont );
	
	COLORREF crAlt[3] = { RGB( 0, 153, 255 ), RGB( 190, 0, 0 ), RGB( 0, 153, 0 ) };
	
	for ( int nItem = 0 ; nItem < m_pList.GetSize() ; nItem++ )
	{
		Item* pItem = (Item*)m_pList.GetAt( nItem );
		
		if ( pItem->m_nComplete == 0 || pItem->m_nSize == SIZE_UNKNOWN )
		{
			ShellIcons.Draw( &dc, pItem->m_nIcon16, 16,
				( rcIcon.left + rcIcon.right ) / 2 - 8, rcIcon.top,
				CoolInterface.m_crWindow );
		}
		else
		{
			COLORREF cr = pItem->m_bPaused ? RGB( 192, 192, 192 ) : crAlt[ nItem % 3 ];
			dc.Draw3dRect( &rcIcon, RGB( 50, 50, 50 ), RGB( 50, 50, 50 ) );
			rcIcon.DeflateRect( 1, 1 );
			CFragmentBar::DrawFragment( &dc, &rcIcon, pItem->m_nSize, 0, pItem->m_nComplete, cr, TRUE );
			dc.FillSolidRect( &rcIcon, CoolInterface.m_crWindow );
			rcIcon.InflateRect( 1, 1 );
			dc.ExcludeClipRect( &rcIcon );
		}
		
		CString str = pItem->m_sText;
		
		if ( dc.GetTextExtent( str ).cx > rcText.Width() - 8 )
		{
			while ( str.GetLength() && dc.GetTextExtent( str + _T('

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -