📄 ctrlhomepanel.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 + -