376 lines
9.8 KiB
C++
376 lines
9.8 KiB
C++
/******************************************************************
|
|
* $Id$
|
|
*
|
|
* $Log$
|
|
*
|
|
* Copyright © 2005 David Cullen, All rights reserved
|
|
*
|
|
******************************************************************/
|
|
#include "stdafx.h"
|
|
#include "wmpa.h"
|
|
#include "WMPADialog.h"
|
|
#include "shellapi.h"
|
|
#include "hexchat-plugin.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define ID_TRAY_ICON 1000
|
|
#define WM_TRAY_ICON (WM_APP + 1)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWMPADialog dialog
|
|
|
|
CWMPADialog::CWMPADialog(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CWMPADialog::IDD, pParent)
|
|
{
|
|
EnableAutomation();
|
|
|
|
//{{AFX_DATA_INIT(CWMPADialog)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CWMPADialog::OnFinalRelease()
|
|
{
|
|
// When the last reference for an automation object is released
|
|
// OnFinalRelease is called. The base class will automatically
|
|
// deletes the object. Add additional cleanup required for your
|
|
// object before calling the base class.
|
|
|
|
CDialog::OnFinalRelease();
|
|
}
|
|
|
|
void CWMPADialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CWMPADialog)
|
|
DDX_Control(pDX, IDC_SONGLIST, m_SongListBox);
|
|
DDX_Control(pDX, IDC_PLAYLIST, m_PlaylistBox);
|
|
DDX_Control(pDX, IDC_WMP, m_WMP);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CWMPADialog, CDialog)
|
|
//{{AFX_MSG_MAP(CWMPADialog)
|
|
ON_LBN_DBLCLK(IDC_PLAYLIST, OnDblclkPlaylist)
|
|
ON_WM_SHOWWINDOW()
|
|
ON_WM_CLOSE()
|
|
ON_LBN_DBLCLK(IDC_SONGLIST, OnDblclkSonglist)
|
|
ON_WM_DESTROY()
|
|
ON_WM_SIZE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BEGIN_DISPATCH_MAP(CWMPADialog, CDialog)
|
|
//{{AFX_DISPATCH_MAP(CWMPADialog)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_DISPATCH_MAP
|
|
END_DISPATCH_MAP()
|
|
|
|
// Note: we add support for IID_IWMPADialog to support typesafe binding
|
|
// from VBA. This IID must match the GUID that is attached to the
|
|
// dispinterface in the .ODL file.
|
|
|
|
// {01C1B3AA-C7FC-4023-89A5-C814E1B62B9B}
|
|
static const IID IID_IWMPADialog =
|
|
{ 0x1c1b3aa, 0xc7fc, 0x4023, { 0x89, 0xa5, 0xc8, 0x14, 0xe1, 0xb6, 0x2b, 0x9b } };
|
|
|
|
BEGIN_INTERFACE_MAP(CWMPADialog, CDialog)
|
|
INTERFACE_PART(CWMPADialog, IID_IWMPADialog, Dispatch)
|
|
END_INTERFACE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWMPADialog message handlers
|
|
|
|
void CWMPADialog::OnDblclkPlaylist()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
long index;
|
|
|
|
// Get the playlist name
|
|
index = m_PlaylistBox.GetCurSel();
|
|
CString playlistName;
|
|
m_PlaylistBox.GetText(index, playlistName);
|
|
|
|
// Get the playlist
|
|
CWMPPlaylistCollection pc = m_WMP.GetPlaylistCollection();
|
|
CWMPPlaylistArray pa = pc.getByName((LPCTSTR) playlistName);
|
|
CWMPPlaylist playlist = pa.Item(0);
|
|
m_WMP.SetCurrentPlaylist(playlist);
|
|
|
|
// Set the song list
|
|
UpdateSongList();
|
|
|
|
m_WMP.GetControls().play();
|
|
if (autoAnnounce) {
|
|
hexchat_commandf(ph, "me is playing %s", (LPCTSTR) wmpaGetSongTitle());
|
|
}
|
|
else {
|
|
hexchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
|
|
}
|
|
}
|
|
|
|
void CWMPADialog::OnShowWindow(BOOL bShow, UINT nStatus)
|
|
{
|
|
CDialog::OnShowWindow(bShow, nStatus);
|
|
|
|
// TODO: Add your message handler code here
|
|
if (bShow) {
|
|
if (!trayInit) {
|
|
ZeroMemory(&nid, sizeof(nid));
|
|
nid.cbSize = sizeof(nid);
|
|
nid.hWnd = m_hWnd;
|
|
nid.uID = ID_TRAY_ICON;
|
|
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
|
nid.uCallbackMessage = WM_TRAY_ICON;
|
|
nid.hIcon = m_hIcon;
|
|
strcpy(nid.szTip, "WMPA");
|
|
strcat(nid.szTip, VER_STRING);
|
|
strcat(nid.szTip, "\nWindows Media\nPlayer Announcer");
|
|
nid.dwState = 0;
|
|
nid.dwStateMask = 0;
|
|
strcpy(nid.szInfo, "WMPA ");
|
|
strcat(nid.szInfo, VER_STRING);
|
|
nid.uTimeout = 10000; // 10 second time out
|
|
strcat(nid.szInfoTitle, "WMPA");
|
|
nid.dwInfoFlags = 0;
|
|
trayInit = TRUE;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void CWMPADialog::PostNcDestroy()
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
delete this;
|
|
|
|
CDialog::PostNcDestroy();
|
|
}
|
|
|
|
|
|
BOOL CWMPADialog::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
CString title = "WMPA";
|
|
title += " ";
|
|
title += VER_STRING;
|
|
SetWindowText((LPCTSTR) title);
|
|
|
|
UpdatePlayLists();
|
|
|
|
autoAnnounce = FALSE;
|
|
trayInit = FALSE;
|
|
trayClicked = FALSE;
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CWMPADialog::OnClose()
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
Shell_NotifyIcon(NIM_ADD, &nid);
|
|
ShowWindow(SW_HIDE);
|
|
|
|
// Don't let the user close the dialog
|
|
// CDialog::OnClose();
|
|
}
|
|
|
|
void CWMPADialog::OnCancel()
|
|
{
|
|
// this->DestroyWindow();
|
|
}
|
|
|
|
void CWMPADialog::OnDblclkSonglist()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
int index = m_SongListBox.GetCurSel();
|
|
m_WMP.GetControls().playItem(m_WMP.GetCurrentPlaylist().GetItem(index));
|
|
if (autoAnnounce) {
|
|
hexchat_commandf(ph, "me is playing %s", (LPCTSTR) wmpaGetSongTitle());
|
|
}
|
|
else {
|
|
hexchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
|
|
}
|
|
}
|
|
|
|
BEGIN_EVENTSINK_MAP(CWMPADialog, CDialog)
|
|
//{{AFX_EVENTSINK_MAP(CWMPADialog)
|
|
ON_EVENT(CWMPADialog, IDC_WMP, 5806 /* CurrentItemChange */, OnCurrentItemChangeWmp, VTS_DISPATCH)
|
|
ON_EVENT(CWMPADialog, IDC_WMP, 5101 /* PlayStateChange */, OnPlayStateChangeWmp, VTS_I4)
|
|
//}}AFX_EVENTSINK_MAP
|
|
END_EVENTSINK_MAP()
|
|
|
|
void CWMPADialog::OnCurrentItemChangeWmp(LPDISPATCH pdispMedia)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
int state = m_WMP.GetPlayState();
|
|
if (state == 3) { // Playing
|
|
if (autoAnnounce) {
|
|
hexchat_commandf(ph, "me is playing %s", (LPCTSTR) wmpaGetSongTitle());
|
|
}
|
|
else {
|
|
hexchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
|
|
}
|
|
}
|
|
|
|
SelectCurrentSong();
|
|
}
|
|
|
|
void CWMPADialog::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
|
|
// TODO: Add your message handler code here
|
|
}
|
|
|
|
void CWMPADialog::UpdateSongList()
|
|
{
|
|
char buffer[32];
|
|
CString name;
|
|
CString artist;
|
|
CString title;
|
|
CString album;
|
|
CString bitrate;
|
|
CString duration;
|
|
CString song;
|
|
long index;
|
|
long count;
|
|
|
|
m_SongListBox.ResetContent();
|
|
CWMPPlaylist playlist = m_WMP.GetCurrentPlaylist();
|
|
count = playlist.GetCount();
|
|
m_SongListBox.ResetContent();
|
|
for (index = 0; index < count; index++) {
|
|
name = playlist.GetItem(index).GetName();
|
|
artist = playlist.GetItem(index).getItemInfo("Artist");
|
|
title = playlist.GetItem(index).getItemInfo("Title");
|
|
album = playlist.GetItem(index).getItemInfo("Album");
|
|
bitrate = playlist.GetItem(index).getItemInfo("Bitrate");
|
|
duration = playlist.GetItem(index).GetDurationString();
|
|
|
|
long krate = strtoul((LPCTSTR) bitrate, NULL, 10) / 1000;
|
|
_ultoa(krate, buffer, 10);
|
|
bitrate = CString(buffer);
|
|
|
|
if (album.IsEmpty()) {
|
|
playlist.removeItem(playlist.GetItem(index));
|
|
count = playlist.GetCount();
|
|
}
|
|
else {
|
|
song = "";
|
|
song += artist;
|
|
if (song.IsEmpty()) song = "Various";
|
|
song += " - ";
|
|
song += title;
|
|
song += " (";
|
|
song += album;
|
|
song += ") [";
|
|
song += duration;
|
|
song += "/";
|
|
song += bitrate;
|
|
song += "Kbps]";
|
|
m_SongListBox.AddString((LPCTSTR) song);
|
|
}
|
|
|
|
}
|
|
m_SongListBox.SetCurSel(0);
|
|
}
|
|
|
|
void CWMPADialog::SelectCurrentSong()
|
|
{
|
|
CWMPMedia media;
|
|
long index;
|
|
long count;
|
|
|
|
count = m_WMP.GetCurrentPlaylist().GetCount();
|
|
for (index = 0; index < count; index++) {
|
|
media = m_WMP.GetCurrentPlaylist().GetItem(index);
|
|
if (m_WMP.GetCurrentMedia().GetIsIdentical(media)) {
|
|
m_SongListBox.SetCurSel(index);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CWMPADialog::UpdatePlayLists()
|
|
{
|
|
// TODO: Add extra initialization here
|
|
CWMPPlaylistCollection pc = m_WMP.GetPlaylistCollection();
|
|
CWMPPlaylistArray pa = pc.getAll();
|
|
CWMPPlaylist playlist;
|
|
|
|
int index;
|
|
int count = pa.GetCount();
|
|
m_PlaylistBox.ResetContent();
|
|
for (index = 0; index < count; index++) {
|
|
playlist = pa.Item(index);
|
|
m_PlaylistBox.AddString((LPCTSTR) playlist.GetName());
|
|
}
|
|
}
|
|
|
|
|
|
void CWMPADialog::OnPlayStateChangeWmp(long NewState)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
}
|
|
|
|
void CWMPADialog::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CDialog::OnSize(nType, cx, cy);
|
|
// TODO: Add your message handler code here
|
|
switch (nType) {
|
|
case SIZE_MINIMIZED:
|
|
break;
|
|
|
|
case SIZE_RESTORED:
|
|
Shell_NotifyIcon(NIM_DELETE, &nid);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
LRESULT CWMPADialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
switch (message) {
|
|
case WM_TRAY_ICON:
|
|
switch (lParam) {
|
|
case WM_LBUTTONDBLCLK:
|
|
trayClicked = TRUE;
|
|
break;
|
|
|
|
case WM_LBUTTONUP:
|
|
if (trayClicked == TRUE) {
|
|
ShowWindow(SW_RESTORE);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
trayClicked = FALSE;
|
|
break;
|
|
}
|
|
return(TRUE);
|
|
break;
|
|
|
|
default:
|
|
return CDialog::WindowProc(message, wParam, lParam);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CWMPADialog::DeleteTrayIcon()
|
|
{
|
|
Shell_NotifyIcon(NIM_DELETE, &nid);
|
|
}
|