www.pudn.com > LECTEUR-MP3.zip > PlayListView.cpp, change:2008-01-18,size:14357b


// PlayListView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "MusGest.h" 
#include "PlayListView.h" 
#include "MainFrm.h" 
#include "ControlView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPlayListView 
extern CMusGestApp theApp; 
 
#define PLAY_START 1 
 
IMPLEMENT_DYNCREATE(CPlayListView, CListView) 
 
CPlayListView::CPlayListView() 
{ 
	m_iInPlayItem = -1; 
	m_pThread = NULL; 
	m_pInPlayFile = NULL; 
	m_pImageList = NULL; 
} 
 
CPlayListView::~CPlayListView() 
{ 
	if (m_pThread) 
	{ 
		m_pThread->StopThread(); 
		delete m_pThread; 
		m_pThread = NULL; 
	} 
 
	if (m_pImageList) 
		delete m_pImageList; 
} 
 
BEGIN_MESSAGE_MAP(CPlayListView, CListView) 
	//{{AFX_MSG_MAP(CPlayListView) 
		ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick) 
		ON_MESSAGE(WM_NEXT_FILE, OnNext) 
		ON_MESSAGE(WM_STOP_THREAD, OnStopThread) 
		ON_MESSAGE(WM_MAJ_TIME, OnMajTime) 
		ON_MESSAGE(WM_CHANGE_SOUND_POS, OnChangeSoundPos) 
 
		ON_NOTIFY_REFLECT(HDN_ITEMDBLCLICK, OnItemdblclick) 
	ON_WM_KEYDOWN() 
	//}}AFX_MSG_MAP 
 
	ON_COMMAND(ID_PLAYLIST_PLAY, OnPlayFile) 
	ON_COMMAND(ID_PLAYLIST_SUPPRIMER, OnSuppFile) 
	ON_COMMAND(ID_PLAYLIST_STOP, OnStopFile) 
	ON_COMMAND(ID_PLAYLIST_MONTERLITEM, OnUpItem) 
	ON_COMMAND(ID_PLAYLIST_DESCENDRELITEM, OnDownItem) 
 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPlayListView drawing 
 
void CPlayListView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPlayListView diagnostics 
 
#ifdef _DEBUG 
void CPlayListView::AssertValid() const 
{ 
	CListView::AssertValid(); 
} 
 
void CPlayListView::Dump(CDumpContext& dc) const 
{ 
	CListView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CPlayListView message handlers 
//---------------------------------------------------------------- 
void CPlayListView::OnInitialUpdate() 
{ 
	CListView::OnInitialUpdate(); 
 
	CListCtrl &List = GetListCtrl(); 
	List.SetExtendedStyle(LVS_EX_HEADERDRAGDROP | LVS_EX_INFOTIP); 
	List.SetExtendedStyle(LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS ); 
 
	//Met le style report au liste view, ajoute les collones 
	List.ModifyStyle(LVS_LIST, LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL); 
	List.InsertColumn(0,"Titre",LVCFMT_RIGHT,250); 
	List.InsertColumn(1,"Type",LVCFMT_LEFT,50); 
	List.InsertColumn(2,"Artiste",LVCFMT_LEFT,150); 
	List.InsertColumn(3,"Album",LVCFMT_LEFT,150); 
	List.InsertColumn(4,"Durée",LVCFMT_LEFT,100); 
 
	m_pDoc = (CMusGestDoc*)GetDocument(); 
 
	m_pImageList = new CImageList; 
	m_pImageList->Create(14, 14, ILC_COLOR8, 0, 4); 
 
	HICON hIcon = (HICON)LoadImage(theApp.m_hInstance,MAKEINTRESOURCE(IDI_AUDIO_FILE),IMAGE_ICON,14, 14,LR_DEFAULTCOLOR|LR_SHARED); 
	if (hIcon) m_pImageList->Add(hIcon); 
 
	hIcon = (HICON)LoadImage(theApp.m_hInstance,MAKEINTRESOURCE(IDI_AUDIO_FILE_PLAY),IMAGE_ICON,14, 14,LR_DEFAULTCOLOR|LR_SHARED); 
	if (hIcon) m_pImageList->Add(hIcon); 
 
	hIcon = (HICON)LoadImage(theApp.m_hInstance,MAKEINTRESOURCE(IDI_AUDIO_FILE_PLAYED),IMAGE_ICON,14, 14,LR_DEFAULTCOLOR|LR_SHARED); 
	if (hIcon) m_pImageList->Add(hIcon); 
 
	List.SetImageList(m_pImageList, LVSIL_SMALL); 
} 
 
//---------------------------------------------------------------- 
void CPlayListView::InsertItem(CRepFile * pRepFile) 
{ 
	int iImage = -1; 
	CListCtrl &List = GetListCtrl(); 
	CAudioFile * pFile = (CAudioFile*)pRepFile; 
 
	if (pFile) 
	{ 
		if(m_pInPlayFile == pFile) iImage = 1; 
		else iImage = 0; 
 
		int iItem = List.InsertItem(List.GetItemCount(),pFile->GetTitle(),iImage); 
 
		if (iItem != -1) 
		{ 
			List.SetItemText(iItem,1,pFile->GetFileExt()); 
			List.SetItemText(iItem,2,pFile->GetArtist()); 
			List.SetItemText(iItem,3,pFile->GetAlbum()); 
			List.SetItemText(iItem,4,pFile->GetStringLenght()); 
			List.SetItemData(iItem, (LPARAM)pFile); 
		} 
	} 
} 
 
//------------------------------------------------------------------------------------- 
int CPlayListView::GetSelectedItem() 
{ 
	CListCtrl &List = GetListCtrl(); 
	int iItem = -1; 
	POSITION pos = NULL; 
	pos = List.GetFirstSelectedItemPosition(); 
 
	if (pos) 
		iItem = List.GetNextSelectedItem(pos); 
 
	return iItem; 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	CListCtrl &List = GetListCtrl(); 
    CPoint point; 
    CMenu menu,*pPopup; 
 	 
	if (GetSelectedItem() > -1) 
	{ 
		GetCursorPos(&point); 
		menu.LoadMenu(IDR_PLAY_MENU); 
		ASSERT (menu.m_hMenu != NULL); 
		pPopup = menu.GetSubMenu(1); 
		ASSERT (pPopup != NULL); 
 
		// insert a separator item at the top 
	    pPopup->InsertMenu(0, MF_BYPOSITION | MF_SEPARATOR, 0, "Options de la playlist"); 
		// insert title item 
		// note: item is not selectable (disabled) but not grayed 
		pPopup->InsertMenu(0, MF_BYPOSITION | MF_STRING | MF_DISABLED, 0, "Options de la playlist"); 
		SetMenuDefaultItem(pPopup->m_hMenu, 0, TRUE); 
 
		int nResult = pPopup->TrackPopupMenu(TPM_LEFTALIGN |  TPM_RIGHTBUTTON, point.x, point.y, this);   
   		menu.DestroyMenu(); 
	} 
 
	*pResult = 0; 
} 
 
//--------------------------------------------------------------------------------- 
void CPlayListView::OnItemdblclick(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; 
	 
	OnPlayFile(); 
	 
	*pResult = 0; 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::SetStatusBarText(CString strText, int iPane) 
{ 
	CMainFrame * pFrame = (CMainFrame*)GetParentFrame(); 
 
	if (pFrame) 
	{ 
		CStatusBar * pBar = pFrame->GetStatusBar(); 
 
		if (pBar) 
		{ 
			pBar->SetPaneText(iPane,strText); 
		} 
	} 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::OnPlayFile() 
{ 
	CMainFrame * pFrame = (CMainFrame*)GetParentFrame(); 
	CFileView * pView = NULL; 
 
	//Reinitialise les iconnes du fileView 
	if (pFrame) 
	{ 
		pView = (CFileView*)pFrame->GetRightView(0,0); 
		 
		if (pView) 
			pView->ReInit(); 
	} 
 
	//Recupère l'item selectionné 
	//(on commence la lecture a partir de cet item) 
	m_iInPlayItem = GetSelectedItem(); 
 
	//Envoie le premier msg de demarge du fichier 
	SendMessage(WM_NEXT_FILE, PLAY_START); 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::OnSuppFile() 
{ 
	CListCtrl &List = GetListCtrl(); 
	int iItem = GetSelectedItem(); 
 
	if (iItem > -1) 
		List.DeleteItem(iItem); 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::OnStopFile() 
{ 
	//Arrete le thread  
	SendMessage(WM_STOP_THREAD); 
} 
 
//------------------------------------------------------------------------------------- 
bool CPlayListView::IsPlaying() 
{ 
	//Retourne vrai si la playList est en train de jouer 
	if (m_pInPlayFile) 
		return true; 
	else 
		return false; 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::OnUpItem() 
{ 
	MoveItem(1); 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::OnDownItem() 
{ 
	MoveItem(0); 
} 
 
//------------------------------------------------------------------------------------- 
void CPlayListView::MoveItem(bool bUpItem) 
{ 
	CListCtrl &List = GetListCtrl(); 
	int iItem = GetSelectedItem(); 
	 
	if (iItem > -1) 
	{ 
		if (bUpItem && iItem > 0) 
		{ 
			CAudioFile * pFile = (CAudioFile*)List.GetItemData(iItem); 
			CAudioFile * pUpFile = (CAudioFile*)List.GetItemData(iItem-1); 
 
			//met l'item up a la val de celui selevtionné 
 
			List.SetItemText(iItem-1,0,pFile->GetTitle()); 
			List.SetItemText(iItem-1,1,pFile->GetFileExt()); 
			List.SetItemText(iItem-1,2,pFile->GetArtist()); 
			List.SetItemText(iItem-1,3,pFile->GetAlbum()); 
			List.SetItemText(iItem-1,4,pFile->GetStringLenght()); 
			List.SetItemData(iItem-1, (LPARAM)pFile); 
 
			List.SetItemText(iItem,0,pUpFile->GetTitle()); 
			List.SetItemText(iItem,1,pUpFile->GetFileExt()); 
			List.SetItemText(iItem,2,pUpFile->GetArtist()); 
			List.SetItemText(iItem,3,pUpFile->GetAlbum()); 
			List.SetItemText(iItem,4,pUpFile->GetStringLenght()); 
			List.SetItemData(iItem, (LPARAM)pUpFile); 
 
			List.SetItem(iItem, 0, LVIF_IMAGE, 0, 0, 0,0,0); 
			List.SetItem(iItem-1, 0, LVIF_IMAGE, 0, 0, 0,0,0); 
 
			if (pUpFile == m_pInPlayFile) 
			{ 
				m_iInPlayItem = iItem; 
				List.SetItem(iItem, 0, LVIF_IMAGE, 0, 1, 0,0,0); 
			} 
 
			if (pFile== m_pInPlayFile) 
			{ 
				m_iInPlayItem = iItem - 1; 
				List.SetItem(iItem-1, 0, LVIF_IMAGE, 0, 1, 0,0,0); 
			} 
 
			 
			PostMessage(WM_KEYDOWN,VK_UP,0); 
		} 
 
		if (!bUpItem && iItem < List.GetItemCount()-1) 
		{ 
			CAudioFile * pFile = (CAudioFile*)List.GetItemData(iItem); 
			CAudioFile * pDownFile = (CAudioFile*)List.GetItemData(iItem+1); 
 
			//met l'item down a la val de celui selevtionné 
 
			List.SetItemText(iItem+1,0,pFile->GetTitle()); 
			List.SetItemText(iItem+1,1,pFile->GetFileExt()); 
			List.SetItemText(iItem+1,2,pFile->GetArtist()); 
			List.SetItemText(iItem+1,3,pFile->GetAlbum()); 
			List.SetItemText(iItem+1,4,pFile->GetStringLenght()); 
			List.SetItemData(iItem+1, (LPARAM)pFile); 
 
			List.SetItemText(iItem,0,pDownFile->GetTitle()); 
			List.SetItemText(iItem,1,pDownFile->GetFileExt()); 
			List.SetItemText(iItem,2,pDownFile->GetArtist()); 
			List.SetItemText(iItem,3,pDownFile->GetAlbum()); 
			List.SetItemText(iItem,4,pDownFile->GetStringLenght()); 
			List.SetItemData(iItem, (LPARAM)pDownFile); 
 
			List.SetItem(iItem, 0, LVIF_IMAGE, 0, 0, 0,0,0); 
			List.SetItem(iItem+1, 0, LVIF_IMAGE, 0, 0, 0,0,0); 
 
			if (pDownFile == m_pInPlayFile) 
			{ 
				m_iInPlayItem = iItem; 
				List.SetItem(m_iInPlayItem, 0, LVIF_IMAGE, 0, 1, 0,0,0); 
			} 
 
			if (pFile== m_pInPlayFile) 
			{ 
				m_iInPlayItem = iItem + 1; 
				List.SetItem(m_iInPlayItem, 0, LVIF_IMAGE, 0, 1, 0,0,0); 
			} 
 
			PostMessage(WM_KEYDOWN,VK_DOWN,0); 
		} 
	} 
} 
 
//--------------------------------------------------------------------- 
void CPlayListView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	//Si la touche enfoncée est supprimé 
	if (nChar == 46) 
	{ 
		OnSuppFile(); 
	}	 
 
	//+ 
	if (nChar == 107) 
	{ 
		MoveItem(true); 
	} 
 
	//- 
	if (nChar == 109) 
	{ 
		MoveItem(false); 
	} 
	 
	CListView::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
 
 
//------------------------------------------------------------------------------------- 
LRESULT CPlayListView::OnNext(WPARAM w, LPARAM l) 
{ 
	CListCtrl &List = GetListCtrl(); 
	CMainFrame * pFrame = (CMainFrame*)GetParentFrame(); 
	CAudioFile * pFile = NULL; 
 
	if (List.GetItemCount() <= 0 || m_iInPlayItem < 0) 
		return 0; 
 
	if (w != PLAY_START) 
	{ 
		OutputDebugString("\n Demarrage de la lecture"); 
		//Met sur l'ancien item jouer l'icon vert 
		List.SetItem(m_iInPlayItem, 0, LVIF_IMAGE, 0, 2, 0,0,0); 
		m_iInPlayItem++; 
	} 
	 
	if (m_iInPlayItem < List.GetItemCount()) 
	{ 
		OutputDebugString("\n Lecture du titre suivant "); 
		pFile = (CAudioFile*)List.GetItemData(m_iInPlayItem); 
	} 
	else 
	{ 
		//Fin de la liste 
		OutputDebugString("\n Fin de lecture (Playlist terminer)"); 
		pFile = NULL; 
		m_pInPlayFile = NULL; 
		m_iInPlayItem = -1; 
	} 
 
	if (pFile) 
	{ 
		//Joue le morceaux 
		if (m_pDoc->PlayFile(pFile) == SOUND_IN_PLAY) 
		{ 
			m_pInPlayFile = pFile; 
			CTimeSpan Time = pFile->GetFileLenght(); 
			int iWait = (Time.GetSeconds() + (Time.GetMinutes() * 60)) * 1000; 
		 
			//Stoppe le thread si c'est pas deja fait 
			if (m_pThread) 
			{ 
				if (!m_pThread->IsStopped()) 
				{ 
					OutputDebugString("\nArret du thread en cour !"); 
					m_pThread->StopThread(); 
				} 
				 
				delete m_pThread; 
				m_pThread = NULL; 
			} 
 
			//Recupère le ptr sur la playbar 
			CControlView * pView = NULL; 
				 
			if (pFrame) 
			{ 
				pView = (CControlView*)pFrame->GetRightView(2,0); 
				if (pView) 
					pView->SetFileTime(iWait); 
			} 
 
			//Met a jour la duréé 
			List.SetItem(GetSelectedItem(), 4, LVIF_TEXT , pFile->GetStringLenght(), NULL, 0,0,0); 
 
			//Créé le nouveau thread 
			m_pThread = new CWorkerThread(this,pView,&m_strTime); 
			 
			//Envoi la duréé du fichier 
			m_pThread->SetWaitTime(iWait); 
 
			//Demarre le thread 
			m_pThread->InitThread(); 
 
			//Selectionne l'item 
			List.SetHotItem(m_iInPlayItem); 
 
			//Met l'image Play 
			List.SetItem(m_iInPlayItem, 0, LVIF_IMAGE, 0, 1, 0,0,0); 
		 
			CString strText; 
			strText.Format("( PlayList ) Lecture en cour du fichier : %s",pFile->GetFileName()); 
			SetStatusBarText(strText,0); 
		} 
	} 
 
	return 0; 
} 
 
//--------------------------------------------------------------------------------- 
LRESULT CPlayListView::OnStopThread(WPARAM w, LPARAM l) 
{ 
	CListCtrl &List = GetListCtrl(); 
 
	//Stoppe le thread si c'est pas deja fait 
	if (m_pThread) 
	{ 
		m_pThread->StopThread(); 
		delete m_pThread; 
		m_pThread = NULL; 
	} 
	 
	//Remet l'iconne std sur l'ancien elem en play si il y en a un 
	for (int i = 0; i< List.GetItemCount();i++) 
	{ 
		List.SetItem(i, 0, LVIF_IMAGE, 0, 0, 0,0,0); 
	} 
 
	SetStatusBarText("Pas de lecture en cour",0); 
 
	if (m_pInPlayFile) 
	{ 
		//Arrete la lecture 
		m_pDoc->StopFile(m_pInPlayFile); 
		m_pInPlayFile = NULL; 
		m_iInPlayItem = -1; 
	} 
 
	return TRUE; 
} 
 
//--------------------------------------------------------------------------------- 
LRESULT CPlayListView::OnMajTime(WPARAM w, LPARAM l) 
{ 
	CString strTime; 
 
	if (m_pInPlayFile) 
	{ 
		strTime.Format("( PlayList ) Lecture en cour du Titre : %s \t Temp écoulé : %s",m_pInPlayFile->GetTitle(), m_strTime); 
		SetStatusBarText(strTime,0); 
	} 
 
	return TRUE; 
} 
 
//--------------------------------------------------------------------------------- 
LRESULT CPlayListView::OnChangeSoundPos(WPARAM w, LPARAM l) 
{ 
	if (m_pThread) 
	{ 
		if (!m_pThread->IsStopped()) 
			m_pThread->ChangePos((int)w); 
 
	} 
 
	return TRUE; 
}