git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36451 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			681 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			681 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
                wxActiveX Library Licence, Version 3
 | 
						|
                ====================================
 | 
						|
 | 
						|
  Copyright (C) 2003 Lindsay Mathieson [, ...]
 | 
						|
 | 
						|
  Everyone is permitted to copy and distribute verbatim copies
 | 
						|
  of this licence document, but changing it is not allowed.
 | 
						|
 | 
						|
                       wxActiveX LIBRARY LICENCE
 | 
						|
     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
						|
  
 | 
						|
  This library is free software; you can redistribute it and/or modify it
 | 
						|
  under the terms of the GNU Library General Public Licence as published by
 | 
						|
  the Free Software Foundation; either version 2 of the Licence, or (at
 | 
						|
  your option) any later version.
 | 
						|
  
 | 
						|
  This library is distributed in the hope that it will be useful, but
 | 
						|
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library
 | 
						|
  General Public Licence for more details.
 | 
						|
 | 
						|
  You should have received a copy of the GNU Library General Public Licence
 | 
						|
  along with this software, usually in a file named COPYING.LIB.  If not,
 | 
						|
  write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 | 
						|
  Boston, MA 02111-1307 USA.
 | 
						|
 | 
						|
  EXCEPTION NOTICE
 | 
						|
 | 
						|
  1. As a special exception, the copyright holders of this library give
 | 
						|
  permission for additional uses of the text contained in this release of
 | 
						|
  the library as licenced under the wxActiveX Library Licence, applying
 | 
						|
  either version 3 of the Licence, or (at your option) any later version of
 | 
						|
  the Licence as published by the copyright holders of version 3 of the
 | 
						|
  Licence document.
 | 
						|
 | 
						|
  2. The exception is that you may use, copy, link, modify and distribute
 | 
						|
  under the user's own terms, binary object code versions of works based
 | 
						|
  on the Library.
 | 
						|
 | 
						|
  3. If you copy code from files distributed under the terms of the GNU
 | 
						|
  General Public Licence or the GNU Library General Public Licence into a
 | 
						|
  copy of this library, as this licence permits, the exception does not
 | 
						|
  apply to the code that you add in this way.  To avoid misleading anyone as
 | 
						|
  to the status of such modified files, you must delete this exception
 | 
						|
  notice from such code and/or adjust the licensing conditions notice
 | 
						|
  accordingly.
 | 
						|
 | 
						|
  4. If you write modifications of your own for this library, it is your
 | 
						|
  choice whether to permit this exception to apply to your modifications. 
 | 
						|
  If you do not wish that, you must delete the exception notice from such
 | 
						|
  code and/or adjust the licensing conditions notice accordingly.
 | 
						|
*/
 | 
						|
 | 
						|
/*! \file wxactivex.h 
 | 
						|
    \brief implements wxActiveX window class and OLE tools
 | 
						|
*/ 
 | 
						|
 | 
						|
#ifndef WX_ACTIVE_X
 | 
						|
#define WX_ACTIVE_X
 | 
						|
#pragma warning( disable : 4101 4786)
 | 
						|
#pragma warning( disable : 4786)
 | 
						|
 | 
						|
 | 
						|
#include <wx/setup.h>
 | 
						|
#include <wx/wx.h>
 | 
						|
#include <wx/variant.h>
 | 
						|
#include <wx/datetime.h>
 | 
						|
#include <oleidl.h>
 | 
						|
#include <exdisp.h>
 | 
						|
#include <docobj.h>
 | 
						|
#include <iostream>
 | 
						|
#include <vector>
 | 
						|
#include <map>
 | 
						|
using namespace std;
 | 
						|
 | 
						|
/// \brief wxActiveX Namespace for stuff I want to keep out of other tools way.
 | 
						|
namespace NS_wxActiveX
 | 
						|
{
 | 
						|
    /// STL utilty class.
 | 
						|
    /// specific to wxActiveX, for creating
 | 
						|
    /// case insenstive maps etc
 | 
						|
    struct less_wxStringI
 | 
						|
    {
 | 
						|
        bool operator()(const wxString& x, const wxString& y) const
 | 
						|
        {
 | 
						|
            return x.CmpNoCase(y) < 0;
 | 
						|
        };
 | 
						|
    };
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
//////////////////////////////////////////
 | 
						|
/// Template class for smart interface handling.
 | 
						|
/// - Automatically dereferences ole interfaces
 | 
						|
/// - Smart Copy Semantics
 | 
						|
/// - Can Create Interfaces
 | 
						|
/// - Can query for other interfaces
 | 
						|
template <class I> class wxAutoOleInterface
 | 
						|
{
 | 
						|
    protected:
 | 
						|
    I *m_interface;
 | 
						|
 | 
						|
    public:
 | 
						|
    /// takes ownership of an existing interface
 | 
						|
    /// Assumed to already have a AddRef() applied
 | 
						|
    explicit wxAutoOleInterface(I *pInterface = NULL) : m_interface(pInterface) {}
 | 
						|
 | 
						|
    /// queries for an interface 
 | 
						|
    wxAutoOleInterface(REFIID riid, IUnknown *pUnk) : m_interface(NULL)
 | 
						|
    {
 | 
						|
        QueryInterface(riid, pUnk);
 | 
						|
    };
 | 
						|
    /// queries for an interface 
 | 
						|
    wxAutoOleInterface(REFIID riid, IDispatch *pDispatch) : m_interface(NULL)
 | 
						|
    {
 | 
						|
        QueryInterface(riid, pDispatch);
 | 
						|
    };
 | 
						|
 | 
						|
    /// Creates an Interface
 | 
						|
    wxAutoOleInterface(REFCLSID clsid, REFIID riid) : m_interface(NULL)
 | 
						|
    {
 | 
						|
        CreateInstance(clsid, riid);
 | 
						|
    };
 | 
						|
 | 
						|
    /// copy constructor
 | 
						|
    wxAutoOleInterface(const wxAutoOleInterface<I>& ti) : m_interface(NULL)
 | 
						|
    {
 | 
						|
        operator = (ti);
 | 
						|
    }
 | 
						|
 | 
						|
    /// assignment operator
 | 
						|
    wxAutoOleInterface<I>& operator = (const wxAutoOleInterface<I>& ti)
 | 
						|
    {
 | 
						|
        if (ti.m_interface)
 | 
						|
            ti.m_interface->AddRef();
 | 
						|
        Free();
 | 
						|
        m_interface = ti.m_interface;
 | 
						|
        return *this;
 | 
						|
    }
 | 
						|
 | 
						|
    /// takes ownership of an existing interface
 | 
						|
    /// Assumed to already have a AddRef() applied
 | 
						|
    wxAutoOleInterface<I>& operator = (I *&ti)
 | 
						|
    {
 | 
						|
        Free();
 | 
						|
        m_interface = ti;
 | 
						|
        return *this;
 | 
						|
    }
 | 
						|
 | 
						|
    /// invokes Free()
 | 
						|
    ~wxAutoOleInterface()
 | 
						|
    {
 | 
						|
        Free();
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    /// Releases interface (i.e decrements refCount)
 | 
						|
    inline void Free()
 | 
						|
    {
 | 
						|
        if (m_interface)
 | 
						|
            m_interface->Release();
 | 
						|
        m_interface = NULL;
 | 
						|
    };
 | 
						|
 | 
						|
    /// queries for an interface 
 | 
						|
    HRESULT QueryInterface(REFIID riid, IUnknown *pUnk)
 | 
						|
    {
 | 
						|
        Free();
 | 
						|
        wxCHECK(pUnk != NULL, -1);
 | 
						|
        return pUnk->QueryInterface(riid, (void **) &m_interface);
 | 
						|
    };
 | 
						|
 | 
						|
    /// Create a Interface instance
 | 
						|
    HRESULT CreateInstance(REFCLSID clsid, REFIID riid)
 | 
						|
    {
 | 
						|
        Free();
 | 
						|
        return CoCreateInstance(clsid, NULL, CLSCTX_ALL, riid, (void **) &m_interface);
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    /// returns the interface pointer
 | 
						|
    inline operator I *() const {return m_interface;}
 | 
						|
 | 
						|
    /// returns the dereferenced interface pointer
 | 
						|
    inline I* operator ->() {return m_interface;}
 | 
						|
    /// returns a pointer to the interface pointer
 | 
						|
    inline I** GetRef() {return &m_interface;}
 | 
						|
    /// returns true if we have a valid interface pointer
 | 
						|
    inline bool Ok() const  {return m_interface != NULL;}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/// \brief Converts a std HRESULT to its error code.
 | 
						|
/// Hardcoded, by no means a definitive list.
 | 
						|
wxString OLEHResultToString(HRESULT hr);
 | 
						|
/// \brief Returns the string description of a IID.
 | 
						|
/// Hardcoded, by no means a definitive list.
 | 
						|
wxString GetIIDName(REFIID riid);
 | 
						|
 | 
						|
//#define __WXOLEDEBUG
 | 
						|
 | 
						|
 | 
						|
#ifdef __WXOLEDEBUG
 | 
						|
    #define WXOLE_TRACE(str) {OutputDebugString(str);OutputDebugString("\r\n");}
 | 
						|
    #define WXOLE_TRACEOUT(stuff)\
 | 
						|
    {\
 | 
						|
        wxString os;\
 | 
						|
        os << stuff << "\r\n";\
 | 
						|
        WXOLE_TRACE(os.mb_str());\
 | 
						|
    }
 | 
						|
 | 
						|
    #define WXOLE_WARN(__hr,msg)\
 | 
						|
    {\
 | 
						|
        if (__hr != S_OK)\
 | 
						|
        {\
 | 
						|
            wxString s = "*** ";\
 | 
						|
            s += msg;\
 | 
						|
            s += " : "+ OLEHResultToString(__hr);\
 | 
						|
            WXOLE_TRACE(s.c_str());\
 | 
						|
        }\
 | 
						|
    }
 | 
						|
#else
 | 
						|
    #define WXOLE_TRACE(str)
 | 
						|
    #define WXOLE_TRACEOUT(stuff)
 | 
						|
    #define WXOLE_WARN(_proc,msg) {_proc;}
 | 
						|
#endif
 | 
						|
 | 
						|
class wxOleInit
 | 
						|
{
 | 
						|
    public:
 | 
						|
    static IMalloc *GetIMalloc();
 | 
						|
 | 
						|
    wxOleInit();
 | 
						|
    ~wxOleInit();
 | 
						|
};
 | 
						|
 | 
						|
#define DECLARE_OLE_UNKNOWN(cls)\
 | 
						|
    private:\
 | 
						|
    class TAutoInitInt\
 | 
						|
    {\
 | 
						|
        public:\
 | 
						|
        LONG l;\
 | 
						|
        TAutoInitInt() : l(0) {}\
 | 
						|
    };\
 | 
						|
    TAutoInitInt refCount, lockCount;\
 | 
						|
    wxOleInit oleInit;\
 | 
						|
    static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\
 | 
						|
    public:\
 | 
						|
    LONG GetRefCount();\
 | 
						|
    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);\
 | 
						|
    ULONG STDMETHODCALLTYPE AddRef();\
 | 
						|
    ULONG STDMETHODCALLTYPE Release();\
 | 
						|
    ULONG STDMETHODCALLTYPE AddLock();\
 | 
						|
    ULONG STDMETHODCALLTYPE ReleaseLock()
 | 
						|
 | 
						|
#define DEFINE_OLE_TABLE(cls)\
 | 
						|
    LONG cls::GetRefCount() {return refCount.l;}\
 | 
						|
    HRESULT STDMETHODCALLTYPE cls::QueryInterface(REFIID iid, void ** ppvObject)\
 | 
						|
    {\
 | 
						|
        if (! ppvObject)\
 | 
						|
        {\
 | 
						|
            WXOLE_TRACE("*** NULL POINTER ***");\
 | 
						|
            return E_FAIL;\
 | 
						|
        };\
 | 
						|
        const char *desc = NULL;\
 | 
						|
        cls::_GetInterface(this, iid, ppvObject, desc);\
 | 
						|
        if (! *ppvObject)\
 | 
						|
        {\
 | 
						|
            WXOLE_TRACEOUT("<" << GetIIDName(iid).c_str() << "> Not Found");\
 | 
						|
            return E_NOINTERFACE;\
 | 
						|
        };\
 | 
						|
        WXOLE_TRACEOUT("QI : <" << desc <<">");\
 | 
						|
        ((IUnknown * )(*ppvObject))->AddRef();\
 | 
						|
        return S_OK;\
 | 
						|
    };\
 | 
						|
    ULONG STDMETHODCALLTYPE cls::AddRef()\
 | 
						|
    {\
 | 
						|
        WXOLE_TRACEOUT(# cls << "::Add ref(" << refCount.l << ")");\
 | 
						|
        InterlockedIncrement(&refCount.l);\
 | 
						|
        return refCount.l;\
 | 
						|
    };\
 | 
						|
    ULONG STDMETHODCALLTYPE cls::Release()\
 | 
						|
    {\
 | 
						|
        if (refCount.l > 0)\
 | 
						|
        {\
 | 
						|
            InterlockedDecrement(&refCount.l);\
 | 
						|
            WXOLE_TRACEOUT(# cls << "::Del ref(" << refCount.l << ")");\
 | 
						|
            if (refCount.l == 0)\
 | 
						|
            {\
 | 
						|
                delete this;\
 | 
						|
                return 0;\
 | 
						|
            };\
 | 
						|
            return refCount.l;\
 | 
						|
        }\
 | 
						|
        else\
 | 
						|
            return 0;\
 | 
						|
    }\
 | 
						|
    ULONG STDMETHODCALLTYPE cls::AddLock()\
 | 
						|
    {\
 | 
						|
        WXOLE_TRACEOUT(# cls << "::Add Lock(" << lockCount.l << ")");\
 | 
						|
        InterlockedIncrement(&lockCount.l);\
 | 
						|
        return lockCount.l;\
 | 
						|
    };\
 | 
						|
    ULONG STDMETHODCALLTYPE cls::ReleaseLock()\
 | 
						|
    {\
 | 
						|
        if (lockCount.l > 0)\
 | 
						|
        {\
 | 
						|
            InterlockedDecrement(&lockCount.l);\
 | 
						|
            WXOLE_TRACEOUT(# cls << "::Del Lock(" << lockCount.l << ")");\
 | 
						|
            return lockCount.l;\
 | 
						|
        }\
 | 
						|
        else\
 | 
						|
            return 0;\
 | 
						|
    }\
 | 
						|
    DEFINE_OLE_BASE(cls)
 | 
						|
 | 
						|
#define DEFINE_OLE_BASE(cls)\
 | 
						|
    void cls::_GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc)\
 | 
						|
    {\
 | 
						|
        *_interface = NULL;\
 | 
						|
        desc = NULL;
 | 
						|
 | 
						|
#define OLE_INTERFACE(_iid, _type)\
 | 
						|
    if (IsEqualIID(iid, _iid))\
 | 
						|
    {\
 | 
						|
        WXOLE_TRACE("Found Interface <" # _type ">");\
 | 
						|
        *_interface = (IUnknown *) (_type *) self;\
 | 
						|
        desc = # _iid;\
 | 
						|
        return;\
 | 
						|
    }
 | 
						|
 | 
						|
#define OLE_IINTERFACE(_face) OLE_INTERFACE(IID_##_face, _face)
 | 
						|
 | 
						|
#define OLE_INTERFACE_CUSTOM(func)\
 | 
						|
    if (func(self, iid, _interface, desc))\
 | 
						|
    {\
 | 
						|
        return;\
 | 
						|
    }
 | 
						|
 | 
						|
#define END_OLE_TABLE\
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/// Main class for embedding a ActiveX control.
 | 
						|
/// Use by itself or derive from it
 | 
						|
/// \note The utility program (wxie) can generate a list of events, methods & properties
 | 
						|
/// for a control. 
 | 
						|
/// First display the control (File|Display), 
 | 
						|
/// then get the type info (ActiveX|Get Type Info) - these are copied to the clipboard. 
 | 
						|
/// Eventually this will be expanded to autogenerate 
 | 
						|
/// wxWindows source files for a control with all methods etc encapsulated.
 | 
						|
/// \par Usage: 
 | 
						|
///     construct using a ProgId or class id
 | 
						|
///     \code new wxActiveX(parent, CLSID_WebBrowser, id, pos, size, style, name)\endcode
 | 
						|
///     \code new wxActiveX(parent, "ShockwaveFlash.ShockwaveFlash", id, pos, size, style, name)\endcode
 | 
						|
/// \par Properties
 | 
						|
/// Properties can be set using \c SetProp() and set/retrieved using \c Prop()
 | 
						|
///         \code SetProp(name, wxVariant(x)) \endcode or 
 | 
						|
///         \code wxString Prop("<name>") = x\endcode
 | 
						|
///         \code wxString result = Prop("<name>")\endcode
 | 
						|
///         \code flash_ctl.Prop("movie") = "file:///movies/test.swf";\endcode
 | 
						|
///         \code flash_ctl.Prop("Playing") = false;\endcode
 | 
						|
///         \code wxString current_movie = flash_ctl.Prop("movie");\endcode
 | 
						|
/// \par Methods
 | 
						|
/// Methods are invoked with \c CallMethod()
 | 
						|
/// \code wxVariant result = CallMethod("<name>", args, nargs = -1)\endcode
 | 
						|
/// \code wxVariant args[] = {0L, "file:///e:/dev/wxie/bug-zap.swf"};
 | 
						|
/// wxVariant result = X->CallMethod("LoadMovie", args);\endcode
 | 
						|
/// \par events
 | 
						|
/// respond to events with the
 | 
						|
///         \c EVT_ACTIVEX(controlId, eventName, handler) & 
 | 
						|
///         \c EVT_ACTIVEX_DISPID(controlId, eventDispId, handler) macros
 | 
						|
/// \code
 | 
						|
/// BEGIN_EVENT_TABLE(wxIEFrame, wxFrame)
 | 
						|
///     EVT_ACTIVEX_DISPID(ID_MSHTML, DISPID_STATUSTEXTCHANGE,  OnMSHTMLStatusTextChangeX)
 | 
						|
///     EVT_ACTIVEX(ID_MSHTML, "BeforeNavigate2",   OnMSHTMLBeforeNavigate2X)
 | 
						|
///     EVT_ACTIVEX(ID_MSHTML, "TitleChange",       OnMSHTMLTitleChangeX)
 | 
						|
///     EVT_ACTIVEX(ID_MSHTML, "NewWindow2",        OnMSHTMLNewWindow2X)
 | 
						|
///     EVT_ACTIVEX(ID_MSHTML, "ProgressChange",    OnMSHTMLProgressChangeX)
 | 
						|
/// END_EVENT_TABLE()\endcode
 | 
						|
class wxActiveX : public wxWindow {
 | 
						|
public:
 | 
						|
    /// General parameter and return type infoformation for Events, Properties and Methods.
 | 
						|
    /// refer to ELEMDESC, IDLDESC in MSDN
 | 
						|
    class ParamX 
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        USHORT      flags;
 | 
						|
        bool        isPtr;
 | 
						|
        bool        isSafeArray;
 | 
						|
        bool        isOptional;
 | 
						|
        VARTYPE     vt;
 | 
						|
        wxString    name;
 | 
						|
 | 
						|
        ParamX() : isOptional(false), vt(VT_EMPTY) {}
 | 
						|
        inline bool IsIn() const        {return (flags & IDLFLAG_FIN) != 0;}
 | 
						|
        inline bool IsOut() const       {return (flags & IDLFLAG_FOUT) != 0;}
 | 
						|
        inline bool IsRetVal() const    {return (flags & IDLFLAG_FRETVAL) != 0;}
 | 
						|
    };
 | 
						|
    typedef vector<ParamX>  ParamXArray;
 | 
						|
 | 
						|
    
 | 
						|
    /// Type & Parameter info for Events and Methods.
 | 
						|
    /// refer to FUNCDESC in MSDN
 | 
						|
    class FuncX 
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        wxString    name;
 | 
						|
        MEMBERID    memid;
 | 
						|
        bool        hasOut;
 | 
						|
 | 
						|
        ParamX      retType;
 | 
						|
        ParamXArray params;
 | 
						|
    };
 | 
						|
    typedef vector<FuncX>  FuncXArray;
 | 
						|
 | 
						|
    
 | 
						|
    /// Type info for properties.
 | 
						|
    class PropX
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        wxString    name;
 | 
						|
        MEMBERID    memid;
 | 
						|
        ParamX      type;
 | 
						|
        ParamX      arg;
 | 
						|
        bool        putByRef;
 | 
						|
 | 
						|
        PropX() : putByRef (false) {}
 | 
						|
        inline bool CanGet() const {return type.vt != VT_EMPTY;}
 | 
						|
        inline bool CanSet() const {return arg.vt != VT_EMPTY;}
 | 
						|
    };
 | 
						|
    typedef vector<PropX>  PropXArray;
 | 
						|
 | 
						|
    
 | 
						|
    /// Create using clsid.
 | 
						|
    wxActiveX(wxWindow * parent, REFCLSID clsid, wxWindowID id = -1,
 | 
						|
        const wxPoint& pos = wxDefaultPosition,
 | 
						|
        const wxSize& size = wxDefaultSize,
 | 
						|
        long style = 0,
 | 
						|
        const wxString& name = wxPanelNameStr);
 | 
						|
    /// create using progid.
 | 
						|
    wxActiveX(wxWindow * parent, const wxString& progId, wxWindowID id = -1,
 | 
						|
        const wxPoint& pos = wxDefaultPosition,
 | 
						|
        const wxSize& size = wxDefaultSize,
 | 
						|
        long style = 0,
 | 
						|
        const wxString& name = wxPanelNameStr);
 | 
						|
    virtual ~wxActiveX();
 | 
						|
 | 
						|
    /// Number of events defined for this control.
 | 
						|
    inline int GetEventCount() const {return m_events.size();}
 | 
						|
    /// returns event description by index.
 | 
						|
    /// throws exception for invalid index
 | 
						|
    const FuncX& GetEventDesc(int idx) const;
 | 
						|
 | 
						|
    /// Number of properties defined for this control.
 | 
						|
    inline int GetPropCount() const {return m_props.size();}
 | 
						|
    /// returns property description by index.
 | 
						|
    /// throws exception for invalid index
 | 
						|
    const PropX& GetPropDesc(int idx) const;
 | 
						|
    /// returns property description by name.
 | 
						|
    /// throws exception for invalid name
 | 
						|
    const PropX& GetPropDesc(const wxString& name) const;
 | 
						|
 | 
						|
    /// Number of methods defined for this control.
 | 
						|
    inline int GetMethodCount() const {return m_methods.size();}
 | 
						|
    /// returns method description by name.
 | 
						|
    /// throws exception for invalid index
 | 
						|
    const FuncX& GetMethodDesc(int idx) const;
 | 
						|
    /// returns method description by name.
 | 
						|
    /// throws exception for invalid name
 | 
						|
    const FuncX& GetMethodDesc(const wxString& name) const;
 | 
						|
 | 
						|
    /// Set property VARIANTARG value by MEMBERID.
 | 
						|
    void SetProp(MEMBERID name, VARIANTARG& value);
 | 
						|
    /// Set property using wxVariant by name.
 | 
						|
    void SetProp(const wxString &name, const wxVariant &value);
 | 
						|
    
 | 
						|
    class wxPropertySetter
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        wxActiveX *m_ctl;
 | 
						|
        wxString m_propName;
 | 
						|
 | 
						|
        wxPropertySetter(wxActiveX *ctl, const wxString& propName) : 
 | 
						|
            m_ctl(ctl), m_propName(propName) {}
 | 
						|
        
 | 
						|
        inline const wxPropertySetter& operator = (wxVariant v) const
 | 
						|
        {
 | 
						|
            m_ctl->SetProp(m_propName, v);
 | 
						|
            return *this;
 | 
						|
        };
 | 
						|
 | 
						|
        inline operator wxVariant() const   {return m_ctl->GetPropAsWxVariant(m_propName);};
 | 
						|
        inline operator wxString() const    {return m_ctl->GetPropAsString(m_propName);};
 | 
						|
        inline operator char() const        {return m_ctl->GetPropAsChar(m_propName);};
 | 
						|
        inline operator long() const        {return m_ctl->GetPropAsLong(m_propName);};
 | 
						|
        inline operator bool() const        {return m_ctl->GetPropAsBool(m_propName);};
 | 
						|
        inline operator double() const      {return m_ctl->GetPropAsDouble(m_propName);};
 | 
						|
        inline operator wxDateTime() const  {return m_ctl->GetPropAsDateTime(m_propName);};
 | 
						|
        inline operator void *() const      {return m_ctl->GetPropAsPointer(m_propName);};
 | 
						|
    };
 | 
						|
 | 
						|
    /// \fn inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
 | 
						|
    /// \param name Property name to read/set
 | 
						|
    /// \return wxPropertySetter, which has overloads for setting/getting the property
 | 
						|
    /// \brief Generic Get/Set Property by name.
 | 
						|
    /// Automatically handles most types
 | 
						|
    /// \par Usage:
 | 
						|
    ///     - Prop("\<name\>") =  \<value\>
 | 
						|
    ///     - var = Prop("\<name\>")
 | 
						|
    ///     - e.g:
 | 
						|
    ///         - \code flash_ctl.Prop("movie") = "file:///movies/test.swf";\endcode
 | 
						|
    ///         - \code flash_ctl.Prop("Playing") = false;\endcode
 | 
						|
    ///         - \code wxString current_movie = flash_ctl.Prop("movie");\endcode
 | 
						|
    /// \exception raises exception if \<name\> is invalid
 | 
						|
    /// \note Have to add a few more type conversions yet ...
 | 
						|
    inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
 | 
						|
 | 
						|
    VARIANT GetPropAsVariant(MEMBERID name);
 | 
						|
    VARIANT GetPropAsVariant(const wxString& name);
 | 
						|
    wxVariant GetPropAsWxVariant(const wxString& name);
 | 
						|
    wxString GetPropAsString(const wxString& name);
 | 
						|
    char GetPropAsChar(const wxString& name);
 | 
						|
    long GetPropAsLong(const wxString& name);
 | 
						|
    bool GetPropAsBool(const wxString& name);
 | 
						|
    double GetPropAsDouble(const wxString& name);
 | 
						|
    wxDateTime GetPropAsDateTime(const wxString& name);
 | 
						|
    void *GetPropAsPointer(const wxString& name);
 | 
						|
 | 
						|
    // methods
 | 
						|
    // VARIANTARG form is passed straight to Invoke, 
 | 
						|
    // so args in *REVERSE* order
 | 
						|
    VARIANT CallMethod(MEMBERID name, VARIANTARG args[], int argc);
 | 
						|
    VARIANT CallMethod(const wxString& name, VARIANTARG args[] = NULL, int argc = -1);
 | 
						|
    // args are in *NORMAL* order
 | 
						|
    // args can be a single wxVariant or an array
 | 
						|
    /// \fn wxVariant CallMethod(wxString name, wxVariant args[], int nargs = -1);
 | 
						|
    /// \param name name of method to call
 | 
						|
    /// \param args array of wxVariant's, defaults to NULL (no args)
 | 
						|
    /// \param nargs number of arguments passed via args. Defaults to actual number of args for the method
 | 
						|
    /// \return wxVariant
 | 
						|
    /// \brief Call a method of the ActiveX control.
 | 
						|
    /// Automatically handles most types
 | 
						|
    /// \par Usage:
 | 
						|
    ///     - result = CallMethod("\<name\>", args, nargs)
 | 
						|
    ///     - e.g.
 | 
						|
    ///     - \code
 | 
						|
    ///     wxVariant args[] = {0L, "file:///e:/dev/wxie/bug-zap.swf"};
 | 
						|
    ///     wxVariant result = X->CallMethod("LoadMovie", args);\endcode
 | 
						|
    /// \exception raises exception if \<name\> is invalid
 | 
						|
    /// \note Since wxVariant has built in type conversion, most the std types can be passed easily
 | 
						|
    wxVariant CallMethod(const wxString& name, wxVariant args[], int nargs = -1);
 | 
						|
 | 
						|
    HRESULT ConnectAdvise(REFIID riid, IUnknown *eventSink);
 | 
						|
 | 
						|
    void OnSize(wxSizeEvent&);
 | 
						|
    void OnPaint(wxPaintEvent& event);
 | 
						|
    void OnMouse(wxMouseEvent& event);
 | 
						|
    void OnSetFocus(wxFocusEvent&);
 | 
						|
    void OnKillFocus(wxFocusEvent&);
 | 
						|
 | 
						|
    DECLARE_EVENT_TABLE();
 | 
						|
 | 
						|
protected:
 | 
						|
    friend class FrameSite;
 | 
						|
    friend class wxActiveXEvents;
 | 
						|
 | 
						|
    unsigned long m_pdwRegister;
 | 
						|
        
 | 
						|
    typedef map<MEMBERID, int>                                  MemberIdMap;
 | 
						|
    typedef map<wxString, int, NS_wxActiveX::less_wxStringI>    NameMap;
 | 
						|
    
 | 
						|
    typedef wxAutoOleInterface<IConnectionPoint>    wxOleConnectionPoint;
 | 
						|
    typedef pair<wxOleConnectionPoint, DWORD>       wxOleConnection;
 | 
						|
    typedef vector<wxOleConnection>                 wxOleConnectionArray;
 | 
						|
 | 
						|
    wxAutoOleInterface<IDispatch>           m_Dispatch;
 | 
						|
    wxAutoOleInterface<IOleClientSite>      m_clientSite;
 | 
						|
    wxAutoOleInterface<IUnknown>            m_ActiveX;
 | 
						|
    wxAutoOleInterface<IOleObject>          m_oleObject;
 | 
						|
    wxAutoOleInterface<IOleInPlaceObject>   m_oleInPlaceObject;
 | 
						|
    wxAutoOleInterface<IOleInPlaceActiveObject>
 | 
						|
 | 
						|
                                            m_oleInPlaceActiveObject;
 | 
						|
    wxAutoOleInterface<IOleDocumentView>    m_docView;
 | 
						|
    wxAutoOleInterface<IViewObject>         m_viewObject;
 | 
						|
    HWND m_oleObjectHWND;
 | 
						|
    bool m_bAmbientUserMode;
 | 
						|
    DWORD m_docAdviseCookie;
 | 
						|
    wxOleConnectionArray                    m_connections;
 | 
						|
 | 
						|
    void CreateActiveX(REFCLSID clsid);
 | 
						|
    void CreateActiveX(LPOLESTR progId);
 | 
						|
    HRESULT AmbientPropertyChanged(DISPID dispid);
 | 
						|
 | 
						|
    void GetTypeInfo();
 | 
						|
    void GetTypeInfo(ITypeInfo *ti, bool defInterface, bool defEventSink);
 | 
						|
 | 
						|
 | 
						|
    // events
 | 
						|
    FuncXArray      m_events;
 | 
						|
    MemberIdMap     m_eventMemberIds;
 | 
						|
 | 
						|
    // properties
 | 
						|
    PropXArray      m_props;
 | 
						|
    NameMap         m_propNames;
 | 
						|
 | 
						|
    // Methods
 | 
						|
    FuncXArray      m_methods;
 | 
						|
    NameMap         m_methodNames;
 | 
						|
 | 
						|
    virtual bool MSWTranslateMessage(WXMSG* pMsg);
 | 
						|
    long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
 | 
						|
 | 
						|
    DECLARE_CLASS(wxActiveX)
 | 
						|
};
 | 
						|
 | 
						|
// events
 | 
						|
class wxActiveXEvent : public wxCommandEvent
 | 
						|
{
 | 
						|
private:
 | 
						|
    friend class wxActiveXEvents;
 | 
						|
 | 
						|
    wxVariant m_params;
 | 
						|
 | 
						|
public:
 | 
						|
 | 
						|
    virtual wxEvent *Clone() const { return new wxActiveXEvent(*this); }
 | 
						|
 | 
						|
    wxString EventName();
 | 
						|
    int ParamCount() const;
 | 
						|
    wxString ParamType(int idx);
 | 
						|
    wxString ParamName(int idx);
 | 
						|
    wxVariant& operator[] (int idx);
 | 
						|
    wxVariant& operator[] (wxString name);
 | 
						|
 | 
						|
private:
 | 
						|
    DECLARE_CLASS(wxActiveXEvent)
 | 
						|
};
 | 
						|
 | 
						|
const wxEventType& RegisterActiveXEvent(const wxChar *eventName);
 | 
						|
const wxEventType& RegisterActiveXEvent(DISPID event);
 | 
						|
 | 
						|
typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&);
 | 
						|
 | 
						|
/// \def EVT_ACTIVEX(id, eventName, fn)
 | 
						|
/// \brief Event handle for events by name
 | 
						|
#define EVT_ACTIVEX(id, eventName, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(wxT(eventName)), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
 | 
						|
/// \def EVT_ACTIVEX_DISPID(id, eventDispId, fn)
 | 
						|
/// \brief Event handle for events by DISPID (dispath id)
 | 
						|
#define EVT_ACTIVEX_DISPID(id, eventDispId, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(eventDispId), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
 | 
						|
 | 
						|
//util
 | 
						|
bool wxDateTimeToVariant(wxDateTime dt, VARIANTARG& va);
 | 
						|
bool VariantToWxDateTime(VARIANTARG va, wxDateTime& dt);
 | 
						|
/// \relates wxActiveX
 | 
						|
/// \fn bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
 | 
						|
/// \param va VARAIANTARG to convert from
 | 
						|
/// \param vx Destination wxVariant
 | 
						|
/// \return success/failure (true/false)
 | 
						|
/// \brief Convert MSW VARIANTARG to wxVariant.
 | 
						|
/// Handles basic types, need to add:
 | 
						|
/// - VT_ARRAY | VT_*
 | 
						|
/// - better support for VT_UNKNOWN (currently treated as void *)
 | 
						|
/// - better support for VT_DISPATCH (currently treated as void *)
 | 
						|
bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
 | 
						|
/// \relates wxActiveX
 | 
						|
/// \fn bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
 | 
						|
/// \param vx wxVariant to convert from
 | 
						|
/// \param va Destination VARIANTARG
 | 
						|
/// \return success/failure (true/false)
 | 
						|
/// \brief Convert wxVariant to MSW VARIANTARG.
 | 
						|
/// Handles basic types, need to add:
 | 
						|
/// - VT_ARRAY | VT_*
 | 
						|
/// - better support for VT_UNKNOWN (currently treated as void *)
 | 
						|
/// - better support for VT_DISPATCH (currently treated as void *)
 | 
						|
bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
 | 
						|
 | 
						|
#endif /* _IEHTMLWIN_H_ */
 |