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

📄 ctrlmedialist.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// CtrlMediaList.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 "Library.h"
#include "SharedFile.h"
#include "ShellIcons.h"
#include "LiveList.h"
#include "Skin.h"
#include "Buffer.h"
#include "CtrlMediaList.h"

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

IMPLEMENT_DYNAMIC(CMediaListCtrl, CListCtrl)

BEGIN_MESSAGE_MAP(CMediaListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CMediaListCtrl)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDoubleClick)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_MEDIA_ADD, OnMediaAdd)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_REMOVE, OnUpdateMediaRemove)
	ON_COMMAND(ID_MEDIA_REMOVE, OnMediaRemove)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_CLEAR, OnUpdateMediaClear)
	ON_COMMAND(ID_MEDIA_CLEAR, OnMediaClear)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SELECT, OnUpdateMediaSelect)
	ON_COMMAND(ID_MEDIA_SELECT, OnMediaSelect)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_SAVE, OnUpdateMediaSave)
	ON_COMMAND(ID_MEDIA_SAVE, OnMediaSave)
	ON_COMMAND(ID_MEDIA_OPEN, OnMediaOpen)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PREVIOUS, OnUpdateMediaPrevious)
	ON_COMMAND(ID_MEDIA_PREVIOUS, OnMediaPrevious)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_NEXT, OnUpdateMediaNext)
	ON_COMMAND(ID_MEDIA_NEXT, OnMediaNext)
	ON_NOTIFY_REFLECT(LVN_KEYDOWN, OnKeyDown)
	ON_WM_SIZE()
	ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_UPDATE_COMMAND_UI(ID_MEDIA_REPEAT, OnUpdateMediaRepeat)
	ON_COMMAND(ID_MEDIA_REPEAT, OnMediaRepeat)
	ON_UPDATE_COMMAND_UI(ID_MEDIA_RANDOM, OnUpdateMediaRandom)
	ON_COMMAND(ID_MEDIA_RANDOM, OnMediaRandom)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_MEDIA_ADD_FOLDER, OnMediaAddFolder)
	//}}AFX_MSG_MAP
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
END_MESSAGE_MAP()

#define STATE_CURRENT	(1<<12)
#define STATE_PLAYED	(1<<13)


/////////////////////////////////////////////////////////////////////////////
// CMediaListCtrl construction

CMediaListCtrl::CMediaListCtrl()
{
	m_pDragImage		= NULL;
	m_bCreateDragImage	= FALSE;
}

CMediaListCtrl::~CMediaListCtrl()
{
}

/////////////////////////////////////////////////////////////////////////////
// CMediaListCtrl operations

BOOL CMediaListCtrl::Create(CWnd* pParentWnd, UINT nID) 
{
	CRect rect;

	return CListCtrl::Create(
		WS_CHILD|WS_VSCROLL|LVS_ICON|LVS_REPORT|LVS_SHAREIMAGELISTS|LVS_NOCOLUMNHEADER,
		rect, pParentWnd, nID );
}

BOOL CMediaListCtrl::Open(LPCTSTR pszFile)
{
	Clear();
	
	Enqueue( pszFile, FALSE );
	
	if ( GetItemCount() == 0 ) return FALSE;
	
	GetNext();
	
	return TRUE;
}

BOOL CMediaListCtrl::Enqueue(LPCTSTR pszFile, BOOL bStart)
{
	if ( _tcsistr( pszFile, _T(".m3u") ) != NULL ||
		 _tcsistr( pszFile, _T(".pls") ) != NULL )
	{
		LoadTextList( pszFile );
	}
	else
	{
		Add( pszFile );
	}
	
	if ( bStart && GetItemCount() == 1 ) GetNext();
	
	return TRUE;
}

int CMediaListCtrl::RecursiveEnqueue(LPCTSTR pszPath)
{
	WIN32_FIND_DATA pFind;
	CString strPath;
	HANDLE hSearch;
	int nCount = 0;
	
	strPath.Format( _T("%s\\*.*"), pszPath );
	
	hSearch = FindFirstFile( strPath, &pFind );
	
	if ( hSearch != INVALID_HANDLE_VALUE )
	{
		do
		{
			if ( pFind.cFileName[0] == '.' ) continue;
			if ( _tcsicmp( pFind.cFileName, _T("Metadata") ) == 0 ) continue;
			
			strPath.Format( _T("%s\\%s"), pszPath, pFind.cFileName );
			
			if ( pFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
			{
				nCount += RecursiveEnqueue( strPath );
			}
			else
			{
				nCount += Enqueue( strPath, FALSE );
			}
		}
		while ( FindNextFile( hSearch, &pFind ) );
		
		FindClose( hSearch );
	}
	
	return nCount;
}

void CMediaListCtrl::Remove(LPCTSTR pszFile)
{
	for ( int nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
	{
		if ( GetItemText( nItem, 1 ).CompareNoCase( pszFile ) == 0 )
		{
			Remove( nItem );
		}
	}
}

BOOL CMediaListCtrl::LoadTextList(LPCTSTR pszFile)
{
	CString strPath, strItem;
	CFile pFile;
	
	strPath = pszFile;
	strPath = strPath.Left( strPath.ReverseFind( '\\' ) + 1 );
	
	if ( ! pFile.Open( pszFile, CFile::modeRead ) ) return FALSE;
	
	CBuffer pBuffer;
	pBuffer.EnsureBuffer( (DWORD)pFile.GetLength() );
	pBuffer.m_nLength = (DWORD)pFile.GetLength();
	pFile.Read( pBuffer.m_pBuffer, pBuffer.m_nLength );
	pFile.Close();
	
	while ( pBuffer.ReadLine( strItem ) )
	{
		strItem.TrimLeft();
		strItem.TrimRight();

		if ( strItem.GetLength() && strItem.GetAt( 0 ) != '#' )
		{
			if ( strItem.Find( '\\' ) != 0 &&
				 strItem.Find( ':' ) != 1 )
				strItem = strPath + strItem;

			if ( GetFileAttributes( strItem ) != 0xFFFFFFFF )
				Enqueue( strItem, FALSE );
		}
	}
	
	return TRUE;
}

int CMediaListCtrl::Add(LPCTSTR pszPath, int nItem)
{
	LPCTSTR pszFile = _tcsrchr( pszPath, '\\' );
	pszFile = pszFile ? pszFile + 1 : pszPath;
	
	DWORD nFile = 0;
	if ( CLibraryFile* pFile = LibraryMaps.LookupFileByPath( pszPath, TRUE ) )
	{
		nFile = pFile->m_nIndex;
		Library.Unlock();
	}
	
	LV_ITEM pItem;
	ZeroMemory( &pItem, sizeof(pItem) );
	pItem.mask		= LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
	pItem.iItem		= nItem >= 0 ? nItem : GetItemCount();
	pItem.iImage	= ShellIcons.Get( pszFile, 16 );
	pItem.lParam	= nFile;
	pItem.pszText	= (LPTSTR)pszFile;
	pItem.iItem		= InsertItem( &pItem );
	pItem.mask		= LVIF_TEXT;
	pItem.iSubItem	= 1;
	pItem.pszText	= (LPTSTR)pszPath;
	SetItem( &pItem );
	
	return pItem.iItem;
}

void CMediaListCtrl::Remove(int nItem)
{
	if ( nItem < 0 || nItem >= GetItemCount() ) return;
	
	BOOL bActive = GetItemState( nItem, STATE_CURRENT );
	DeleteItem( nItem );
	
	if ( bActive ) SetCurrent( nItem );
}

int CMediaListCtrl::GetCount()
{
	return GetItemCount();
}

void CMediaListCtrl::Clear()
{
	DeleteAllItems();
	SetCurrent( -1 );
}

int CMediaListCtrl::GetCurrent()
{
	for ( int nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
	{
		if ( GetItemState( nItem, STATE_CURRENT ) ) return nItem;
	}

	return -1;
}

void CMediaListCtrl::SetCurrent(int nCurrent)
{
	for ( int nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
	{
		if ( GetItemState( nItem, STATE_CURRENT ) )
		{
			if ( nItem != nCurrent ) SetItemState( nItem, 0, STATE_CURRENT );
		}
		else
		{
			if ( nItem == nCurrent ) SetItemState( nItem, STATE_CURRENT, STATE_CURRENT );
		}
	}

	NMHDR pNM = { GetSafeHwnd(), GetDlgCtrlID(), MLN_NEWCURRENT };
	GetOwner()->SendMessage( WM_NOTIFY, pNM.idFrom, (LPARAM)&pNM );
}

int CMediaListCtrl::GetNext(BOOL bSet)
{
	int nItem = GetCurrent();

	if ( nItem >= 0 ) SetItemState( nItem, STATE_PLAYED, STATE_PLAYED );

	if ( Settings.MediaPlayer.Random )
	{
		int nCount = 0;

		for ( nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
		{
			if ( GetItemState( nItem, STATE_PLAYED ) == 0 ) nCount++;
		}

		if ( nCount > 0 )
		{
			nCount = rand() % nCount;

			for ( nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
			{
				if ( GetItemState( nItem, STATE_PLAYED ) == 0 )
				{
					if ( nCount-- == 0 ) break;
				}
			}
		}
	}
	else
	{
		if ( ++nItem >= GetItemCount() ) nItem = -1;
	}

	if ( bSet ) SetCurrent( nItem );

	return nItem;
}

void CMediaListCtrl::Reset(BOOL bNext)
{
	for ( int nItem = GetItemCount() - 1 ; nItem >= 0 ; nItem-- )
		SetItemState( nItem, 0, STATE_PLAYED );
	if ( bNext ) SetCurrent( -1 );
}

CString CMediaListCtrl::GetPath(int nItem)
{
	CString str;
	if ( nItem < 0 || nItem >= GetItemCount() ) return str;
	return GetItemText( nItem, 1 );
}

/////////////////////////////////////////////////////////////////////////////
// CMediaListCtrl message handlers

int CMediaListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if ( CListCtrl::OnCreate( lpCreateStruct ) == -1 ) return -1;
	
	SetBkColor( RGB( 0, 0, 0x30 ) );
	SetImageList( ShellIcons.GetObject( 16 ), LVSIL_SMALL );
	InsertColumn( 0, _T("Name"), LVCFMT_LEFT, 100, -1 );
	InsertColumn( 1, _T("Path"), LVCFMT_LEFT, 0, 0 );

	// SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_LABELTIP, LVS_EX_LABELTIP );
	
	m_wndTip.Create( this, &Settings.Interface.TipMedia );

	return 0;
}

void CMediaListCtrl::OnSize(UINT nType, int cx, int cy) 
{
	CListCtrl::OnSize( nType, cx, cy );
	
	CRect rc;
	GetWindowRect( &rc );
	
	LV_COLUMN pColumn;
	pColumn.mask	= LVCF_WIDTH;
	pColumn.cx		= rc.Width() - GetSystemMetrics( SM_CXVSCROLL ) - 8;
	SetColumn( 0, &pColumn );
}

⌨️ 快捷键说明

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