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;
}