375 lines
		
	
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			375 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);
 | 
						|
}
 |