fixed paste error
[wxWidgets.git] / wxPython / contrib / iewin / wxactivex.h
index 2d36e37541f24d1ca3fa8d51321fe6d763bcc99c..4c88a1d3f32862cb91927460f58f81ca85c6c4b2 100644 (file)
@@ -6,10 +6,13 @@
 
 #include <wx/setup.h>
 #include <wx/wx.h>
+#include <wx/variant.h>
 #include <oleidl.h>
+#include <exdisp.h>
 #include <docobj.h>
 #include <iostream>
 #include <vector>
+#include <map>
 using namespace std;
 
 //////////////////////////////////////////
@@ -29,12 +32,12 @@ template <class I> class wxAutoOleInterface
        // Assumed to already have a AddRef() applied
     explicit wxAutoOleInterface(I *pInterface = NULL) : m_interface(pInterface) {}
 
-       // queries for an interface
+       // queries for an interface 
     wxAutoOleInterface(REFIID riid, IUnknown *pUnk) : m_interface(NULL)
        {
                QueryInterface(riid, pUnk);
        };
-       // queries for an interface
+       // queries for an interface 
     wxAutoOleInterface(REFIID riid, IDispatch *pDispatch) : m_interface(NULL)
        {
                QueryInterface(riid, pDispatch);
@@ -47,7 +50,7 @@ template <class I> class wxAutoOleInterface
        };
 
        // copy constructor
-    explicit wxAutoOleInterface(const wxAutoOleInterface<I>& ti) : m_interface(NULL)
+    wxAutoOleInterface(const wxAutoOleInterface<I>& ti) : m_interface(NULL)
     {
                operator = (ti);
     }
@@ -84,7 +87,7 @@ template <class I> class wxAutoOleInterface
         m_interface = NULL;
     };
 
-       // queries for an interface
+       // queries for an interface 
     HRESULT QueryInterface(REFIID riid, IUnknown *pUnk)
        {
                Free();
@@ -258,16 +261,60 @@ class wxOleInit
 
 class wxActiveX : public wxWindow {
 public:
-       wxActiveX(wxWindow * parent, REFCLSID clsid, wxWindowID id = -1);
-    wxActiveX(wxWindow * parent, wxString progId, wxWindowID id = -1);
+    ////////////////////////////////////////
+    // type stuff
+       class ParamX // refer to ELEMDESC, IDLDESC in MSDN
+       {
+       public:
+               USHORT      flags;
+        bool isPtr, isSafeArray;
+               VARTYPE     vt;
+        wxString    name;
+
+               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;
+
+    class FuncX // refer to FUNCDESC in MSDN
+    {
+    public:
+        wxString    name;
+        MEMBERID    memid;
+               bool            hasOut;
+
+               ParamXArray     params;
+    };
+
+    typedef vector<FuncX> FuncXArray;
+    typedef map<MEMBERID, int>  MemberIdList;
+
+    wxActiveX(wxWindow * parent, REFCLSID clsid, wxWindowID id = -1,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = 0,
+        const wxString& name = wxPanelNameStr);
+    wxActiveX(wxWindow * parent, wxString progId, wxWindowID id = -1,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = 0,
+        const wxString& name = wxPanelNameStr);
        virtual ~wxActiveX();
 
        void CreateActiveX(REFCLSID clsid);
     void CreateActiveX(LPOLESTR progId);
 
+    // expose type info
+    inline int GetEventCount() const {return m_events.size();}
+    const FuncX& GetEvent(int idx) const;
+
        HRESULT ConnectAdvise(REFIID riid, IUnknown *eventSink);
 
        void OnSize(wxSizeEvent&);
+    void OnPaint(wxPaintEvent& event);
+    void OnMouse(wxMouseEvent& event);
        void OnSetFocus(wxFocusEvent&);
     void OnKillFocus(wxFocusEvent&);
 
@@ -275,6 +322,7 @@ public:
 
 protected:
     friend class FrameSite;
+    friend class wxActiveXEvents;
 
        typedef wxAutoOleInterface<IConnectionPoint>    wxOleConnectionPoint;
        typedef pair<wxOleConnectionPoint, DWORD>               wxOleConnection;
@@ -288,6 +336,7 @@ protected:
 
                                             m_oleInPlaceActiveObject;
     wxAutoOleInterface<IOleDocumentView>       m_docView;
+    wxAutoOleInterface<IViewObject>            m_viewObject;
        HWND m_oleObjectHWND;
     bool m_bAmbientUserMode;
     DWORD m_docAdviseCookie;
@@ -295,6 +344,49 @@ protected:
 
     HRESULT AmbientPropertyChanged(DISPID dispid);
 
+       void GetTypeInfo();
+       void GetTypeInfo(ITypeInfo *ti, bool defEventSink);
+
+
+    // events
+    FuncXArray      m_events;
+    MemberIdList    m_eventsIdx;
+
+    WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
 };
 
+// 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) const;
+    wxVariant& operator[] (int idx);
+    wxVariant  operator[] (wxString name) const;
+    wxVariant& operator[] (wxString name);
+};
+
+const wxEventType& RegisterActiveXEvent(const wxChar *eventName);
+const wxEventType& RegisterActiveXEvent(DISPID event);
+
+typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&);
+
+#define EVT_ACTIVEX(id, eventName, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(wxT(eventName)), id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxActiveXEventFunction, & fn ), (wxObject *) NULL ),
+#define EVT_ACTIVEX_DISPID(id, eventDispId, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(eventDispId), id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxActiveXEventFunction, & fn ), (wxObject *) NULL ),
+
+//util
+bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
+bool VariantToMSWVariant(wxVariant& vx, VARIANTARG& va);
+
 #endif /* _IEHTMLWIN_H_ */