/****************************************************************** * $Id$ * * $Log$ * * Copyright © 2005 David Cullen, All rights reserved * ******************************************************************/ #include "stdafx.h" #include "wmpa.h" #include "WMPADialog.h" #include "shellapi.h" #include "xchat-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) { xchat_commandf(ph, "me is playing %s", (LPCTSTR) wmpaGetSongTitle()); } else { xchat_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) { xchat_commandf(ph, "me is playing %s", (LPCTSTR) wmpaGetSongTitle()); } else { xchat_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) { xchat_commandf(ph, "me is playing %s", (LPCTSTR) wmpaGetSongTitle()); } else { xchat_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); }