]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/contrib/activex/wxie/wxActiveXFrame.cpp
Lindsay Mathieson's newest wxActiveX class has been wrapped into a new
[wxWidgets.git] / wxPython / contrib / activex / wxie / wxActiveXFrame.cpp
diff --git a/wxPython/contrib/activex/wxie/wxActiveXFrame.cpp b/wxPython/contrib/activex/wxie/wxActiveXFrame.cpp
new file mode 100644 (file)
index 0000000..ff6ddcb
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+                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.
+*/
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+// For compilers that support precompilation, includes "wx/wx.h".
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+        #include "wx/wx.h"
+#endif
+#include "wx/wxprec.h"
+#include "wx/filedlg.h"
+#include "wx/textdlg.h"
+#include "wxActiveXFrame.h"
+#include <sstream>
+using namespace std;
+#include "wx/splitter.h"
+#include "wx/textctrl.h"
+#include "wx/clipbrd.h"
+#include <wx/msgdlg.h>
+
+enum
+{
+    // menu items
+    MENU_GETTYPEINFO = 700,
+       MENU_INVOKEMETHOD,
+       MENU_TEST
+};
+
+BEGIN_EVENT_TABLE(wxActiveXFrame, wxFrame)
+    EVT_MENU(MENU_GETTYPEINFO, wxActiveXFrame::OnGetTypeInfo)
+       EVT_MENU(MENU_INVOKEMETHOD, wxActiveXFrame::OnInvokeMethod)
+       EVT_MENU(MENU_TEST, wxActiveXFrame::OnTest)
+END_EVENT_TABLE()
+
+
+wxActiveXFrame::wxActiveXFrame(wxWindow *parent, wxString title) :
+    wxFrame(parent, -1, title) 
+{
+    // create a menu bar
+    wxMenu *xMenu = new wxMenu("", wxMENU_TEAROFF);
+
+       xMenu->Append(MENU_GETTYPEINFO, "Get Type Info", "");
+       xMenu->Append(MENU_INVOKEMETHOD, "Invoke Method (no params)", "");
+       xMenu->Append(MENU_TEST, "Test", "For debugging purposes");
+
+    // now append the freshly created menu to the menu bar...
+    wxMenuBar *menuBar = new wxMenuBar();
+    menuBar->Append(xMenu, "&ActiveX");
+
+    // ... and attach this menu bar to the frame
+    SetMenuBar(menuBar);
+
+    wxSplitterWindow *sp = new wxSplitterWindow(this);
+    X = new wxActiveX(sp, title, 101);
+
+    textLog = new wxTextCtrl(sp, -1, "", wxPoint(0,0),  wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY);
+
+    sp->SplitHorizontally(X, textLog, 0);
+
+    // conenct all events
+    for (int i = 0; i < X->GetEventCount(); i++)
+    {
+        const wxActiveX::FuncX& func = X->GetEventDesc(i);
+        const wxEventType& ev = RegisterActiveXEvent((DISPID) func.memid);
+        Connect(101, ev, (wxObjectEventFunction) OnActiveXEvent);
+    };
+}
+
+wxString VarTypeAsString(VARTYPE vt)
+{
+#define VT(vtype, desc) case vtype : return desc
+
+    if (vt & VT_BYREF)
+        vt -= VT_BYREF;
+
+    if (vt & VT_ARRAY)
+        vt -= VT_ARRAY;
+
+    switch (vt)
+    {
+    VT(VT_SAFEARRAY, "SafeArray");
+    VT(VT_EMPTY, "empty");
+    VT(VT_NULL, "null");
+    VT(VT_UI1, "byte");
+    VT(VT_I1, "char");
+    VT(VT_I2, "short");
+    VT(VT_I4, "long");
+    VT(VT_UI2, "unsigned short");
+    VT(VT_UI4, "unsigned long");
+    VT(VT_INT, "int");
+    VT(VT_UINT, "unsigned int");
+    VT(VT_R4, "real(4)");
+    VT(VT_R8, "real(8)");
+    VT(VT_CY, "Currency");
+    VT(VT_DATE, "wxDate");
+    VT(VT_BSTR, "wxString");
+    VT(VT_DISPATCH, "IDispatch");
+    VT(VT_ERROR, "SCode Error");
+    VT(VT_BOOL, "bool");
+    VT(VT_VARIANT, "wxVariant");
+    VT(VT_UNKNOWN, "IUknown");
+    VT(VT_VOID, "void");
+    VT(VT_PTR, "void *");
+    VT(VT_USERDEFINED, "*user defined*");
+
+    default:
+        {
+            wxString s;
+            s << "Unknown(" << vt << ")";
+            return s;
+        };
+    };
+
+#undef VT
+};
+
+#define ENDL "\r\n"
+
+
+void OutFunc(wxString& os, const wxActiveX::FuncX& func)
+{
+    os << VarTypeAsString(func.retType.vt) << " " << func.name << "(";
+    for (unsigned int p = 0; p < func.params.size(); p++)
+    {
+        const wxActiveX::ParamX& param = func.params[p];
+        if (param.IsIn() && param.IsOut())
+            os << "[IN OUT] ";
+        else if (param.IsIn())
+            os << "[IN] ";
+        else if (param.IsIn())
+            os << "[OUT] ";
+        os << VarTypeAsString(param.vt) << " " << (param.isPtr ? "*" : "") << param.name;
+        if (p < func.params.size() - 1)
+            os << ", ";
+    };
+    os << ")" << ENDL;
+};
+
+void wxActiveXFrame::OnGetTypeInfo(wxCommandEvent& event)
+{
+    wxString os;
+
+       int i =0;
+    os << 
+        "Props" << ENDL <<
+        "=====" << ENDL;
+    for (i = 0; i < X->GetPropCount(); i++)
+    {
+        wxActiveX::PropX prop = X->GetPropDesc(i);
+        os << VarTypeAsString(prop.type.vt) << " " << prop.name << "(";
+        if (prop.CanSet())
+        {
+            os << VarTypeAsString(prop.arg.vt);
+        };
+        os << ")" << ENDL;
+
+    };
+       os << ENDL;
+
+    os << 
+        "Events" << ENDL <<
+        "======" << ENDL;
+    for (i = 0; i < X->GetEventCount(); i++)
+               OutFunc(os, X->GetEventDesc(i));
+       os << ENDL;
+
+    os << 
+        "Methods" << ENDL <<
+        "=======" << ENDL;
+    for (i = 0; i < X->GetMethodCount(); i++)
+               OutFunc(os, X->GetMethodDesc(i));
+       os << ENDL;
+
+
+       if (wxTheClipboard->Open())
+       {
+               wxDataObjectSimple *wo = new wxTextDataObject(os);
+               wxTheClipboard->SetData(wo);
+        wxTheClipboard->Flush();
+               wxTheClipboard->Close();
+       };
+
+    wxMessageBox(os, "Type Info", wxOK, this);
+};
+
+void wxActiveXFrame::OnInvokeMethod(wxCommandEvent& event)
+{
+       //wxTextEntryDialog dlg(this, "Method");
+       //if (dlg.ShowModal() == wxID_OK)
+       //      X->CallMethod(dlg.GetValue());
+};
+
+void wxActiveXFrame::OnTest(wxCommandEvent& event)
+{
+       // flash testing
+    wxVariant args[] = {0L, "http://www.macromedia.com/support/flash/ts/documents/java_script_comm/flash_to_javascript.swf"};
+    X->CallMethod("LoadMovie", args);   
+       //X->Prop("Movie") = "http://www.macromedia.com/support/flash/ts/documents/java_script_comm/flash_to_javascript.swf";
+
+       // mc cal testing
+    //X->Prop("year") = 1964L;
+    //X->Prop("Value") = wxDateTime::Now();
+
+       // pdf testing
+       //wxVariant file = "C:\\WINNT\\wx2\\docs\\pdf\\dialoged.pdf";
+       //X->CallMethod("LoadFile", &file);
+};
+
+void wxActiveXFrame::OnActiveXEvent(wxActiveXEvent& event)
+{
+#ifdef UNICODE
+    wostringstream os;
+#else
+    ostringstream os;
+#endif
+
+    os << (const wxChar *) event.EventName() << wxT("(");
+
+    for (int p = 0; p < event.ParamCount(); p++)
+    {
+        os << 
+            (const wxChar *) event.ParamType(p) << wxT(" ") << 
+            (const wxChar *) event.ParamName(p) << wxT(" = ") <<
+            (const wxChar *) (wxString) event[p];
+        if (p < event.ParamCount() - 1)
+            os << wxT(", ");
+    };
+    os << wxT(")") << endl;
+    wxString data = os.str().c_str();
+    textLog->AppendText(data);
+};
+