📄 ctrlmedialist.cpp
字号:
//
// 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 + -