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);
|
||
|
};
|
||
|
|