extension module called wx.activex. Lots of demo and lib updates to go along with it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26301 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			285 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			8.4 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.
 | 
						|
*/
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// 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);
 | 
						|
};
 | 
						|
 |