// FrameworkNotifySink.cpp: implementation of the CFrameworkNotifySink class.
//
//////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <tchar.h>
#include "sink.h"
#include "mbutton.h"
#include "resource.h"
#include "mmenu.h"
#include "shellico.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

HWND CFrameworkNotifySink::m_hwndTitle = NULL;
extern BOOL fPlaying;
extern BOOL fIntro;
extern BOOL fShellMode;
extern HPALETTE hpalMain; //main palette of app
extern LPCDOPT g_pOptions;
extern LPCDDATA g_pData;
extern HWND hwndMain;

CFrameworkNotifySink::CFrameworkNotifySink(PCOMPNODE pNode)
{
    m_dwRef = 0;
    m_pNode = pNode;

   LoadString(NULL,IDS_APPNAME,m_szAppName,sizeof(m_szAppName)/sizeof(TCHAR));
}

CFrameworkNotifySink::~CFrameworkNotifySink()
{
}

HRESULT CFrameworkNotifySink::QueryInterface(REFIID riid, LPVOID *ppvObj)
{
    return S_OK;
}

ULONG CFrameworkNotifySink::AddRef()
{
    return (m_dwRef++);
}

ULONG CFrameworkNotifySink::Release()
{
    m_dwRef--;
    if (m_dwRef == 0)
    {
        delete this;
    }
    return (m_dwRef);
}

HRESULT CFrameworkNotifySink::OnEvent(MMEVENTS mmEventID, LPVOID pEvent)
{
    HRESULT hr = S_OK;

    switch (mmEventID)
    {
        case (MMEVENT_SETTITLE) :
        {
            MMSETTITLE* pSetTitle = (MMSETTITLE*)pEvent;
            if (pSetTitle->mmInfoText == MMINFOTEXT_TITLE)
            {
                if (m_hwndTitle)
                {
                    _tcscpy(m_pNode->szTitle,pSetTitle->szTitle);
                    TCHAR szText[MAX_PATH];
                    wsprintf(szText,TEXT("%s - %s"),pSetTitle->szTitle,m_szAppName);

                    //only do this if the titles don't match
                    TCHAR szOrgTitle[MAX_PATH];
                    GetWindowText(m_hwndTitle,szOrgTitle,sizeof(szOrgTitle)/sizeof(TCHAR));
                    if (_tcscmp(szOrgTitle,szText)!=0)
                    {
                        SetWindowText(m_hwndTitle,szText);
                        RedrawWindow(m_hwndTitle,NULL,NULL,RDW_FRAME|RDW_INVALIDATE);

                        if (fShellMode)
                        {
                            ShellIconSetTooltip();
                        } //end if shell mode
                    }
                } //end if window ok
            } //end if title

            if (pSetTitle->mmInfoText == MMINFOTEXT_DESCRIPTION)
            {
                if (IsIconic(m_hwndTitle))
                {
                    TCHAR szText[MAX_PATH];
                    wsprintf(szText,TEXT("%s - %s"),pSetTitle->szTitle,m_szAppName);
                    SetWindowText(m_hwndTitle,szText);
                }

                if (fShellMode)
                {
                    ShellIconSetTooltip();
                }
            } //end if description
        }
        break;
           
        case (MMEVENT_ONPLAY) :
        {
			CMButton* pButton = GetMButtonFromID(m_hwndTitle,IDB_PLAY);
            if (pButton)
            {
			    if (fIntro)
                {
                    pButton->SetIcon(IDI_MODE_INTRO);
                    pButton->SetToolTipID(IDB_TT_INTRO);
                    SetWindowText(pButton->GetHWND(),TEXT("2"));
                }
                else
                {
                    pButton->SetIcon(IDI_ICON_PAUSE);
                    pButton->SetToolTipID(IDB_TT_PAUSE);
                    SetWindowText(pButton->GetHWND(),TEXT("1"));
                }
            }

            if (fShellMode)
            {
                ShellIconSetState(PAUSE_ICON);
            } //end if shell mode

			fPlaying = TRUE;
        }
        break;

        case (MMEVENT_ONSTOP) :
        {
            CMButton* pButton = GetMButtonFromID(m_hwndTitle,IDB_PLAY);
            if (pButton)
            {
                pButton->SetIcon(IDI_ICON_PLAY);
                pButton->SetToolTipID(IDB_TT_PLAY);
                SetWindowText(pButton->GetHWND(),TEXT(""));
            }

            fPlaying = FALSE;
            if (fShellMode)
            {
                ShellIconSetState(PLAY_ICON);
            } //end if shell mode
        }
        break;

        case (MMEVENT_ONPAUSE) :
        {
            CMButton* pButton = GetMButtonFromID(m_hwndTitle,IDB_PLAY);
            if (pButton)
            {
                pButton->SetIcon(IDI_ICON_PLAY);
                pButton->SetToolTipID(IDB_TT_PLAY);
                SetWindowText(pButton->GetHWND(),TEXT(""));
            }

            fPlaying = FALSE;
            if (fShellMode)
            {
                ShellIconSetState(PLAY_ICON);
            } //end if shell mode
        }
        break;

        case (MMEVENT_ONMEDIAUNLOADED) :
        {
            CMButton* pButton = GetMButtonFromID(m_hwndTitle,IDB_PLAY);
            if (pButton)
            {
                pButton->SetIcon(IDI_ICON_PLAY);
                pButton->SetToolTipID(IDB_TT_PLAY);
                SetWindowText(pButton->GetHWND(),TEXT(""));
            }

            fPlaying = FALSE;
            if (fShellMode)
            {
                ShellIconSetState(NODISC_ICON);
            } //end if shell mode
        }
        break;

        case (MMEVENT_ONUSERNOTIFY) :
        {
        }
        break;

        case (MMEVENT_ONDISCCHANGED) :
        {
            MMONDISCCHANGED* pDisc = (MMONDISCCHANGED*)pEvent;
            SendMessage(m_hwndTitle,WM_DISCCHANGED,pDisc->nNewDisc,pDisc->fDisplayVolChange);
        }
        break;
    }

    return hr;
}

void* CFrameworkNotifySink::GetCustomMenu()
{
    CustomMenu* pMenu = NULL;
    AllocCustomMenu(&pMenu);

    return (pMenu);
}

HPALETTE CFrameworkNotifySink::GetPalette()
{
    return hpalMain;
}

void* CFrameworkNotifySink::GetOptions()
{
    return ((void*)GetCDOpt());
}

void* CFrameworkNotifySink::GetData()
{
    return ((void*)GetCDData());
}

////////////////////////////////////////////////////////////////////////////////////////////
// * GetCDOpt
// Creates or returns the global CDOpt
////////////////////////////////////////////////////////////////////////////////////////////
LPCDOPT GetCDOpt()
{
    if (g_pOptions == NULL)
    {
        CDOPT_CreateInstance(NULL, IID_ICDOpt, (void**)&g_pOptions);
    }

    return g_pOptions;
}

////////////////////////////////////////////////////////////////////////////////////////////
// * GetCDData
// Creates or returns the global CDOpt
////////////////////////////////////////////////////////////////////////////////////////////
LPCDDATA GetCDData()
{
    if (g_pData == NULL)
    {
        HRESULT hr = CDOPT_CreateInstance(NULL, IID_ICDData, (void**)&g_pData);
    }

    return g_pData;
}