//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 2000
//
//  File:       tasksymbol.h
//
//  History: 17-Jan-2000 Vivekj added
//--------------------------------------------------------------------------

#ifndef __TASKSYMBOL_H_
#define __TASKSYMBOL_H_

#include "resource.h"       // main symbols
#include <atlctl.h>


/*+-------------------------------------------------------------------------*
 * class CProxyTaskSymbolEvents
 *
 *
 * PURPOSE: Event source implementation generated by ATL.
 *
 *+-------------------------------------------------------------------------*/
template <class T>
class CProxyTaskSymbolEvents : public IConnectionPointImpl<T, &DIID_TaskSymbolEvents, CComDynamicUnkArray>
{
    //Warning this class may be recreated by the wizard.
public:
    HRESULT Fire_Click()
    {
        CComVariant varResult;
        T* pT = static_cast<T*>(this);
        int nConnectionIndex;
        int nConnections = m_vec.GetSize();

        for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
        {
            pT->Lock();
            CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
            pT->Unlock();
            IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
            if (pDispatch != NULL)
            {
                VariantClear(&varResult);
                DISPPARAMS disp = { NULL, NULL, 0, 0 };
                pDispatch->Invoke(DISPID_CLICK, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
            }
        }
        return varResult.scode;

    }
};

/*+-------------------------------------------------------------------------*
 * class CTaskSymbol
 *
 *
 * PURPOSE:
 *
 *+-------------------------------------------------------------------------*/
class ATL_NO_VTABLE CTaskSymbol :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComControl<CTaskSymbol>,
    public IPersistStreamInitImpl<CTaskSymbol>,
    public IOleControlImpl<CTaskSymbol>,
    public IOleObjectImpl<CTaskSymbol>,
    public IOleInPlaceActiveObjectImpl<CTaskSymbol>,
    public IViewObjectExImpl<CTaskSymbol>,
    public IOleInPlaceObjectWindowlessImpl<CTaskSymbol>,
    public CComCoClass<CTaskSymbol, &CLSID_TaskSymbol>,
    public CProxyTaskSymbolEvents< CTaskSymbol >,
    public IConnectionPointContainerImpl<CTaskSymbol>,
	public IProvideClassInfo2Impl<&CLSID_TaskSymbol, &DIID_TaskSymbolEvents, &LIBID_NODEMGRLib>,
    public IPersistPropertyBagImpl<CTaskSymbol>,
    public IObjectSafetyImpl<CTaskSymbol, INTERFACESAFE_FOR_UNTRUSTED_CALLER |
                                          INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
    typedef IObjectSafetyImpl<CTaskSymbol, INTERFACESAFE_FOR_UNTRUSTED_CALLER |INTERFACESAFE_FOR_UNTRUSTED_DATA> BCSafety;
public:
    CTaskSymbol();

DECLARE_MMC_CONTROL_REGISTRATION (
	g_szMmcndmgrDll,					// implementing DLL
    CLSID_TaskSymbol,               	// CLSID
    _T("TaskSymbol Class"),             // class name
    _T("Control.TaskSymbol.1"),         // ProgID
    _T("Control.TaskSymbol"),           // version-independent ProgID
    LIBID_NODEMGRLib,               	// LIBID
    _T("101"),                          // toolbox bitmap ID
    _T("1.0"))                          // version

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CTaskSymbol)
    COM_INTERFACE_ENTRY(IObjectSafety)
    COM_INTERFACE_ENTRY(IViewObjectEx)
    COM_INTERFACE_ENTRY(IViewObject2)
    COM_INTERFACE_ENTRY(IViewObject)
    COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceObject)
    COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
    COM_INTERFACE_ENTRY(IOleControl)
    COM_INTERFACE_ENTRY(IOleObject)
    COM_INTERFACE_ENTRY(IPersistPropertyBag)
    COM_INTERFACE_ENTRY(IPersistStreamInit)
    COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
    // Connection point container support
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
	COM_INTERFACE_ENTRY(IProvideClassInfo2)
	COM_INTERFACE_ENTRY(IProvideClassInfo)
END_COM_MAP()

BEGIN_CONNECTION_POINT_MAP(CTaskSymbol)
    CONNECTION_POINT_ENTRY(DIID_TaskSymbolEvents)
END_CONNECTION_POINT_MAP()


BEGIN_PROP_MAP(CTaskSymbol)
    PROP_DATA_ENTRY("Small",           m_bSmall,          VT_UI4)
    PROP_DATA_ENTRY("ConsoleTaskID", m_dwConsoleTaskID, VT_UI4)
    // Example entries
    // PROP_ENTRY("Property Description", dispid, clsid)
    // PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_MSG_MAP(CTaskSymbol)
	MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
	MESSAGE_HANDLER(WM_SETCURSOR,   OnSetCursor)
    CHAIN_MSG_MAP(CComControl<CTaskSymbol>)
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);


// IViewObjectEx
    DECLARE_VIEW_STATUS(0)

public:
    HRESULT OnDraw(ATL_DRAWINFO& di);
	LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

private:
    typedef std::wstring CString;
    UINT           m_dwConsoleTaskID;
    UINT           m_bSmall;

// Need to override the default IObjectSafetyImpl methods per KB article Q168371
public:
    STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask,DWORD dwEnabledOptions) {return S_OK;}
};

#endif //__TASKSYMBOL_H_
