summary refs log tree commit diff stats
path: root/plugins/wmpa/wmpadialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/wmpa/wmpadialog.cpp')
-rw-r--r--plugins/wmpa/wmpadialog.cpp375
1 files changed, 375 insertions, 0 deletions
diff --git a/plugins/wmpa/wmpadialog.cpp b/plugins/wmpa/wmpadialog.cpp
new file mode 100644
index 00000000..b0cdd16e
--- /dev/null
+++ b/plugins/wmpa/wmpadialog.cpp
@@ -0,0 +1,375 @@
+/******************************************************************

+* $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);

+}