Aegisub/traydict/IEHtmlWin.cpp

1611 lines
42 KiB
C++

#include "IEHtmlWin.h"
//#include "App/EdApp.h"
#include <wx/msw/ole/oleutils.h>
#include <oleidl.h>
#include <winerror.h>
#include <exdispid.h>
#include <olectl.h>
#include <strsafe.h>
BEGIN_EVENT_TABLE(IEHtmlWin, wxWindow)
EVT_SIZE(IEHtmlWin::OnSize)
//EVT_MOVE(IEHtmlWin::OnMove)
EVT_SET_FOCUS(IEHtmlWin::OnSetFocus)
EVT_PAINT(IEHtmlWin::OnPaint)
EVT_MOUSE_EVENTS(IEHtmlWin::OnMouse)
EVT_CHAR(IEHtmlWin::OnChar)
END_EVENT_TABLE()
void wxLogTrace(const wchar_t *lol) {}
class IEHtmlWin;
class FS_IOleInPlaceFrame;
class FS_IOleInPlaceSiteWindowless;
class FS_IOleClientSite;
class FS_IOleControlSite;
class FS_IOleCommandTarget;
class FS_IOleItemContainer;
class FS_IDispatch;
class FS_DWebBrowserEvents2;
class FS_IAdviseSink2;
class FS_IAdviseSinkEx;
class FrameSite : public IUnknown
{
friend class IEHtmlWin;
friend class FS_IOleInPlaceFrame;
friend class FS_IOleInPlaceSiteWindowless;
friend class FS_IOleClientSite;
friend class FS_IOleControlSite;
friend class FS_IOleCommandTarget;
friend class FS_IOleItemContainer;
friend class FS_IDispatch;
friend class FS_DWebBrowserEvents2;
friend class FS_IAdviseSink2;
friend class FS_IAdviseSinkEx;
public:
FrameSite(IEHtmlWin * win);
~FrameSite();
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
protected:
int m_cRef;
FS_IOleInPlaceFrame * m_IOleInPlaceFrame;
FS_IOleInPlaceSiteWindowless * m_IOleInPlaceSiteWindowless;
FS_IOleClientSite * m_IOleClientSite;
FS_IOleControlSite * m_IOleControlSite;
FS_IOleCommandTarget * m_IOleCommandTarget;
FS_IOleItemContainer * m_IOleItemContainer;
FS_IDispatch * m_IDispatch;
FS_DWebBrowserEvents2 * m_DWebBrowserEvents2;
FS_IAdviseSink2 * m_IAdviseSink2;
FS_IAdviseSinkEx * m_IAdviseSinkEx;
IEHtmlWin * m_window;
HDC m_hDCBuffer;
HWND m_hWndParent;
bool m_bSupportsWindowlessActivation;
bool m_bInPlaceLocked;
bool m_bInPlaceActive;
bool m_bUIActive;
bool m_bWindowless;
LCID m_nAmbientLocale;
COLORREF m_clrAmbientForeColor;
COLORREF m_clrAmbientBackColor;
bool m_bAmbientShowHatching;
bool m_bAmbientShowGrabHandles;
bool m_bAmbientUserMode;
bool m_bAmbientAppearance;
};
class FS_IOleInPlaceFrame : public IOleInPlaceFrame
{
public:
FS_IOleInPlaceFrame(FrameSite* fs) { m_fs = fs; }
~FS_IOleInPlaceFrame() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IOleWindow
STDMETHODIMP GetWindow(HWND*);
STDMETHODIMP ContextSensitiveHelp(BOOL);
//IOleInPlaceUIWindow
STDMETHODIMP GetBorder(LPRECT);
STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS);
STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS);
STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject*, LPCOLESTR);
//IOleInPlaceFrame
STDMETHODIMP InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS);
STDMETHODIMP SetMenu(HMENU, HOLEMENU, HWND);
STDMETHODIMP RemoveMenus(HMENU);
STDMETHODIMP SetStatusText(LPCOLESTR);
STDMETHODIMP EnableModeless(BOOL);
STDMETHODIMP TranslateAccelerator(LPMSG, WORD);
protected:
FrameSite * m_fs;
};
class FS_IOleInPlaceSiteWindowless : public IOleInPlaceSiteWindowless
{
public:
FS_IOleInPlaceSiteWindowless(FrameSite* fs) { m_fs = fs; }
~FS_IOleInPlaceSiteWindowless() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IOleWindow
STDMETHODIMP GetWindow(HWND* h)
{ return m_fs->m_IOleInPlaceFrame->GetWindow(h); }
STDMETHODIMP ContextSensitiveHelp(BOOL b)
{ return m_fs->m_IOleInPlaceFrame->ContextSensitiveHelp(b); }
//IOleInPlaceSite
STDMETHODIMP CanInPlaceActivate();
STDMETHODIMP OnInPlaceActivate();
STDMETHODIMP OnUIActivate();
STDMETHODIMP GetWindowContext(IOleInPlaceFrame**, IOleInPlaceUIWindow**,
LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO);
STDMETHODIMP Scroll(SIZE);
STDMETHODIMP OnUIDeactivate(BOOL);
STDMETHODIMP OnInPlaceDeactivate();
STDMETHODIMP DiscardUndoState();
STDMETHODIMP DeactivateAndUndo();
STDMETHODIMP OnPosRectChange(LPCRECT);
//IOleInPlaceSiteEx
STDMETHODIMP OnInPlaceActivateEx(BOOL*, DWORD);
STDMETHODIMP OnInPlaceDeactivateEx(BOOL);
STDMETHODIMP RequestUIActivate();
//IOleInPlaceSiteWindowless
STDMETHODIMP CanWindowlessActivate();
STDMETHODIMP GetCapture();
STDMETHODIMP SetCapture(BOOL);
STDMETHODIMP GetFocus();
STDMETHODIMP SetFocus(BOOL);
STDMETHODIMP GetDC(LPCRECT, DWORD, HDC*);
STDMETHODIMP ReleaseDC(HDC);
STDMETHODIMP InvalidateRect(LPCRECT, BOOL);
STDMETHODIMP InvalidateRgn(HRGN, BOOL);
STDMETHODIMP ScrollRect(INT, INT, LPCRECT, LPCRECT);
STDMETHODIMP AdjustRect(LPRECT);
STDMETHODIMP OnDefWindowMessage(UINT, WPARAM, LPARAM, LRESULT*);
protected:
FrameSite * m_fs;
};
class FS_IOleClientSite : public IOleClientSite
{
public:
FS_IOleClientSite(FrameSite* fs) { m_fs = fs; }
~FS_IOleClientSite() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IOleClientSite
STDMETHODIMP SaveObject();
STDMETHODIMP GetMoniker(DWORD, DWORD, IMoniker**);
STDMETHODIMP GetContainer(LPOLECONTAINER FAR*);
STDMETHODIMP ShowObject();
STDMETHODIMP OnShowWindow(BOOL);
STDMETHODIMP RequestNewObjectLayout();
protected:
FrameSite * m_fs;
};
class FS_IOleControlSite : public IOleControlSite
{
public:
FS_IOleControlSite(FrameSite* fs) { m_fs = fs; }
~FS_IOleControlSite() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IOleControlSite
STDMETHODIMP OnControlInfoChanged();
STDMETHODIMP LockInPlaceActive(BOOL);
STDMETHODIMP GetExtendedControl(IDispatch**);
STDMETHODIMP TransformCoords(POINTL*, POINTF*, DWORD);
STDMETHODIMP TranslateAccelerator(LPMSG, DWORD);
STDMETHODIMP OnFocus(BOOL);
STDMETHODIMP ShowPropertyFrame();
protected:
FrameSite * m_fs;
};
class FS_IOleCommandTarget : public IOleCommandTarget
{
public:
FS_IOleCommandTarget(FrameSite* fs) { m_fs = fs; }
~FS_IOleCommandTarget() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IOleCommandTarget
STDMETHODIMP QueryStatus(const GUID*, ULONG, OLECMD[], OLECMDTEXT*);
STDMETHODIMP Exec(const GUID*, DWORD, DWORD, VARIANTARG*, VARIANTARG*);
protected:
FrameSite * m_fs;
};
class FS_IOleItemContainer : public IOleItemContainer
{
public:
FS_IOleItemContainer(FrameSite* fs) { m_fs = fs; }
~FS_IOleItemContainer() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IParseDisplayName
STDMETHODIMP ParseDisplayName(IBindCtx*, LPOLESTR, ULONG*, IMoniker**);
//IOleContainer
STDMETHODIMP EnumObjects(DWORD, IEnumUnknown**);
STDMETHODIMP LockContainer(BOOL);
//IOleItemContainer
STDMETHODIMP GetObjectW(LPOLESTR, DWORD, IBindCtx*, REFIID, void**);
STDMETHODIMP GetObjectStorage(LPOLESTR, IBindCtx*, REFIID, void**);
STDMETHODIMP IsRunning(LPOLESTR);
protected:
FrameSite * m_fs;
};
class FS_IDispatch : public IDispatch
{
public:
FS_IDispatch(FrameSite* fs) { m_fs = fs; }
~FS_IDispatch() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IDispatch
STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR**, unsigned int, LCID, DISPID*);
STDMETHODIMP GetTypeInfo(unsigned int, LCID, ITypeInfo**);
STDMETHODIMP GetTypeInfoCount(unsigned int*);
STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);
protected:
FrameSite * m_fs;
};
class FS_DWebBrowserEvents2 : public DWebBrowserEvents2
{
public:
FS_DWebBrowserEvents2(FrameSite* fs) { m_fs = fs; }
~FS_DWebBrowserEvents2() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IDispatch
STDMETHODIMP GetIDsOfNames(REFIID r, OLECHAR** o, unsigned int i, LCID l, DISPID* d)
{ return m_fs->m_IDispatch->GetIDsOfNames(r, o, i, l, d); }
STDMETHODIMP GetTypeInfo(unsigned int i, LCID l, ITypeInfo** t)
{ return m_fs->m_IDispatch->GetTypeInfo(i, l, t); }
STDMETHODIMP GetTypeInfoCount(unsigned int* i)
{ return m_fs->m_IDispatch->GetTypeInfoCount(i); }
STDMETHODIMP Invoke(DISPID d, REFIID r, LCID l, WORD w, DISPPARAMS* dp,
VARIANT* v, EXCEPINFO* e, UINT* u)
{ return m_fs->m_IDispatch->Invoke(d, r, l, w, dp, v, e, u); }
protected:
FrameSite * m_fs;
};
class FS_IAdviseSink2 : public IAdviseSink2
{
public:
FS_IAdviseSink2(FrameSite* fs) { m_fs = fs; }
~FS_IAdviseSink2() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IAdviseSink
void STDMETHODCALLTYPE OnDataChange(FORMATETC*, STGMEDIUM*);
void STDMETHODCALLTYPE OnViewChange(DWORD, LONG);
void STDMETHODCALLTYPE OnRename(IMoniker*);
void STDMETHODCALLTYPE OnSave();
void STDMETHODCALLTYPE OnClose();
//IAdviseSink2
void STDMETHODCALLTYPE OnLinkSrcChange(IMoniker*);
protected:
FrameSite * m_fs;
};
class FS_IAdviseSinkEx : public IAdviseSinkEx
{
public:
FS_IAdviseSinkEx(FrameSite* fs) { m_fs = fs; }
~FS_IAdviseSinkEx() {}
//IUnknown
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) { return m_fs->QueryInterface(iid, ppvObject); }
ULONG STDMETHODCALLTYPE AddRef() { return m_fs->AddRef(); }
ULONG STDMETHODCALLTYPE Release() { return m_fs->Release(); }
//IAdviseSink
void STDMETHODCALLTYPE OnDataChange(FORMATETC* f, STGMEDIUM* s)
{ m_fs->m_IAdviseSink2->OnDataChange(f, s); }
void STDMETHODCALLTYPE OnViewChange(DWORD d, LONG l)
{ m_fs->m_IAdviseSink2->OnViewChange(d, l); }
void STDMETHODCALLTYPE OnRename(IMoniker* i)
{ m_fs->m_IAdviseSink2->OnRename(i); }
void STDMETHODCALLTYPE OnSave()
{ m_fs->m_IAdviseSink2->OnSave(); }
void STDMETHODCALLTYPE OnClose()
{ m_fs->m_IAdviseSink2->OnClose(); }
//IAdviseSinkEx
void STDMETHODCALLTYPE OnViewStatusChange(DWORD);
protected:
FrameSite * m_fs;
};
class wxIStream : public IStream {
wxIStream(const wxString &src) : source(src) {
_refcount = 1;
pos = 0;
}
~wxIStream() {
}
public:
HRESULT static OpenString(const wxString &str, IStream ** ppStream) {
*ppStream = new wxIStream(str);
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject) {
if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) || iid == __uuidof(ISequentialStream)) {
*ppvObject = static_cast<IStream*>(this);
AddRef();
return S_OK;
}
else return E_NOINTERFACE;
}
virtual ULONG STDMETHODCALLTYPE AddRef(void) {
return (ULONG)InterlockedIncrement(&_refcount);
}
virtual ULONG STDMETHODCALLTYPE Release(void) {
ULONG res = (ULONG) InterlockedDecrement(&_refcount);
if (res == 0) delete this;
return res;
}
// ISequentialStream Interface
public:
virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead) {
memcpy(pv,&source[pos],cb*2);
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE Write(void const* pv, ULONG cb, ULONG* pcbWritten) {
return E_NOTIMPL;
}
// IStream Interface
public:
virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Commit(DWORD) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Revert(void) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Clone(IStream **) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin,ULARGE_INTEGER* lpNewFilePointer) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag) {
return E_NOTIMPL;
}
private:
const wxString &source;
int pos;
LONG _refcount;
};
IEHtmlWin::IEHtmlWin(wxWindow * parent, wxWindowID id)
: wxWindow(parent, id)
{
m_oleObject = NULL;
m_oleInPlaceObject = NULL;
m_webBrowser = NULL;
m_currentUrl = _T("");
m_specificallyOpened = false;
CreateBrowser();
}
static const CLSID CLSID_MozillaBrowser =
{ 0x1339B54C, 0x3453, 0x11D2,
{ 0x93, 0xB9, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 } };
void IEHtmlWin::CreateBrowser()
{
SetTransparent(255);
HRESULT hret;
IUnknown *p;
// Get IUnknown Interface
hret = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_ALL, IID_IUnknown, (void**)(&p));
wxASSERT(SUCCEEDED(hret));
// Get IOleObject interface
hret = p->QueryInterface(IID_IViewObject, (void**)(&m_viewObject));
wxASSERT(SUCCEEDED(hret));
hret = p->QueryInterface(IID_IOleObject, (void**)(&m_oleObject));
wxASSERT(SUCCEEDED(hret));
FrameSite * c = new FrameSite(this);
c->AddRef();
DWORD dwMiscStatus;
m_oleObject->GetMiscStatus(DVASPECT_CONTENT, &dwMiscStatus);
bool m_bSetClientSiteFirst = false;
if (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)
{
m_bSetClientSiteFirst = true;
}
bool m_bVisibleAtRuntime = true;
if (dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME)
{
m_bVisibleAtRuntime = false;
}
if (m_bSetClientSiteFirst) m_oleObject->SetClientSite(c->m_IOleClientSite);
IPersistStreamInit * psInit = NULL;
hret = p->QueryInterface(IID_IPersistStreamInit, (void**)(&psInit));
if (SUCCEEDED(hret) && psInit != NULL) {
hret = psInit->InitNew();
wxASSERT(SUCCEEDED(hret));
}
// Get IOleInPlaceObject interface
hret = p->QueryInterface(IID_IOleInPlaceObject, (void**)(&m_oleInPlaceObject));
assert(SUCCEEDED(hret));
hret = m_oleInPlaceObject->GetWindow(&m_oleObjectHWND);
wxASSERT(SUCCEEDED(hret));
::SetActiveWindow(m_oleObjectHWND);
int w, h;
GetSize(&w, &h);
RECT posRect;
posRect.left = 0;
posRect.top = 0;
posRect.right = w;
posRect.bottom = h;
m_oleInPlaceObject->SetObjectRects(&posRect, &posRect);
if (m_bVisibleAtRuntime) {
hret = m_oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL,
c->m_IOleClientSite, 0, (HWND)GetHWND(), &posRect);
}
if (!m_bSetClientSiteFirst) m_oleObject->SetClientSite(c->m_IOleClientSite);
// Get IWebBrowser2 Interface
hret = p->QueryInterface(IID_IWebBrowser2, (void**)(&m_webBrowser));
assert(SUCCEEDED(hret));
IConnectionPointContainer * cpContainer;
hret = p->QueryInterface(IID_IConnectionPointContainer, (void**)(&cpContainer));
assert(SUCCEEDED(hret));
hret = cpContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_connectionPoint);
assert(SUCCEEDED(hret));
m_connectionPoint->Advise(c->m_DWebBrowserEvents2, &m_adviseCookie);
cpContainer->Release();
p->Release();
m_webBrowser->put_MenuBar(VARIANT_FALSE);
m_webBrowser->put_AddressBar(VARIANT_FALSE);
m_webBrowser->put_StatusBar(VARIANT_FALSE);
m_webBrowser->put_ToolBar(VARIANT_FALSE);
m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
}
IEHtmlWin::~IEHtmlWin()
{
if (m_oleInPlaceObject) {
m_oleInPlaceObject->InPlaceDeactivate();
m_oleInPlaceObject->UIDeactivate();
m_oleInPlaceObject->Release();
}
if (m_connectionPoint) {
m_connectionPoint->Unadvise(m_adviseCookie);
m_connectionPoint->Release();
}
if (m_oleObject) {
m_oleObject->Close(OLECLOSE_NOSAVE);
m_oleObject->SetClientSite(NULL);
m_oleObject->Release();
}
if (m_viewObject) {
m_viewObject->Release();
}
if (m_webBrowser) {
m_webBrowser->Release();
}
}
void IEHtmlWin::OnSize(wxSizeEvent& event)
{
int w, h;
GetSize(&w, &h);
if (m_webBrowser) {
m_webBrowser->put_Height(h);
m_webBrowser->put_Width(w);
}
RECT posRect;
posRect.left = 0;
posRect.top = 0;
posRect.right = w;
posRect.bottom = h;
//::SetWindowPos((HWND)GetHWND(), m_oleObjectHWND, 0, 0, w, h, SWP_NOMOVE | SWP_NOACTIVATE | SWP_HIDEWINDOW);
if (m_oleInPlaceObject) {
m_oleInPlaceObject->SetObjectRects(&posRect, &posRect);
}
}
void IEHtmlWin::OnMove(wxMoveEvent& event)
{
int x, y;
GetPosition(&x, &y);
if (m_webBrowser) {
m_webBrowser->put_Left(0/*x*/);
m_webBrowser->put_Top(0/*y*/);
}
}
bool IEHtmlWin::Show(bool shown)
{
bool ret;
ret = wxWindow::Show(shown);
//ret = ::ShowWindow(m_oleObjectHWND, (shown) ? SW_SHOW : SW_HIDE);
if (m_webBrowser) {
m_webBrowser->put_Visible(shown);
}
return ret;
}
void IEHtmlWin::OnSetFocus(wxFocusEvent& event)
{
if (m_webBrowser) {
m_webBrowser->put_Visible(TRUE);
::PostMessage(m_oleObjectHWND, WM_SETFOCUS, (WPARAM)GetHWND(), NULL);
}
if (m_oleInPlaceObject) {
//::PostMessage(m_oleObjectHWND, WM_SETFOCUS, (WPARAM)GetHWND(), NULL);
}
}
void IEHtmlWin::OnPaint(wxPaintEvent& event)
{
wxLogTrace(_T("repainting html win"));
wxPaintDC dc(this);
int w, h;
GetSize(&w, &h);
RECT posRect;
posRect.left = 0;
posRect.top = 0;
posRect.right = w;
posRect.bottom = h;
// Draw only when control is windowless or deactivated
if (m_viewObject)
{
::RedrawWindow(m_oleObjectHWND, NULL, NULL, RDW_INTERNALPAINT);
{
RECTL *prcBounds = (RECTL *) &posRect;
m_viewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL,
(HDC)dc.GetHDC(), prcBounds, NULL, NULL, 0);
}
}
else
{
dc.SetBrush(*wxRED_BRUSH);
dc.DrawRectangle(0, 0, w, h);
dc.SetBrush(wxNullBrush);
}
}
void IEHtmlWin::OnMouse(wxMouseEvent& event)
{
wxLogTrace(_T("mouse event"));
UINT msg = 0;
WPARAM wParam = 0;
LPARAM lParam = 0;
LRESULT lResult = 0;
if (event.m_metaDown) wParam |= MK_CONTROL;
if (event.m_shiftDown) wParam |= MK_SHIFT;
if (event.m_leftDown) wParam |= MK_LBUTTON;
if (event.m_middleDown) wParam |= MK_MBUTTON;
if (event.m_rightDown) wParam |= MK_RBUTTON;
lParam = event.m_x << 16;
lParam |= event.m_y;
if (event.LeftDown()) {
msg = WM_LBUTTONDOWN;
SetFocus();
}
else if (event.LeftDClick()) msg = WM_LBUTTONDBLCLK;
else if (event.LeftUp()) msg = WM_LBUTTONUP;
else if (event.MiddleDown()) {
msg = WM_MBUTTONDOWN;
SetFocus();
}
else if (event.MiddleDClick()) msg = WM_MBUTTONDBLCLK;
else if (event.MiddleUp()) msg = WM_MBUTTONUP;
else if (event.RightDown()) {
msg = WM_RBUTTONDOWN;
SetFocus();
}
else if (event.RightDClick()) msg = WM_RBUTTONDBLCLK;
else if (event.RightUp()) msg = WM_RBUTTONUP;
else if (event.Moving() || event.Dragging()) msg = WM_MOUSEMOVE;
wxString log;
if (msg == 0) { wxLogTrace(_T("no message")); event.Skip(); return; }
if (m_oleInPlaceObject == NULL) { wxLogTrace(_T("no oleInPlaceObject")); event.Skip(); return; }
if (!::SendMessage(m_oleObjectHWND, msg, wParam, lParam)) { wxLogTrace(_T("msg not delivered")); event.Skip(); return; }
wxLogTrace(_T("msg sent"));
}
void IEHtmlWin::OnChar(wxKeyEvent& event)
{
}
bool IEHtmlWin::OnStartURL(wxString& url)
{
wxLogTrace(_T("loading url:"));
wxLogTrace(url.c_str());
m_currentUrl = url;
if (m_specificallyOpened) {
m_specificallyOpened = false;
return true;
}
// should we open this url?
// you should subclass IEHtmlWin and provide your own
// implementation of when to load the specificed url
return true;
}
void IEHtmlWin::OnProgressURL(long current, long maximum)
{
//wxString log;
//log.Printf(_T("url progress: %li/%li", current, maximum);
//wxLogTrace(log.c_str());
}
void IEHtmlWin::OnFinishURL(wxString& url)
{
wxLogTrace(_T("loaded url:"));
wxLogTrace(url.c_str());
m_currentUrl = url;
}
void IEHtmlWin::OpenURL(const wxString& url)
{
VARIANTARG navFlag, targetFrame, postData, headers;
navFlag.vt = VT_EMPTY;
//navFlag.vt = VT_I2;
//navFlag.iVal = navNoReadFromCache;
targetFrame.vt = VT_EMPTY;
postData.vt = VT_EMPTY;
headers.vt = VT_EMPTY;
m_specificallyOpened = true;
HRESULT hret;
hret = m_webBrowser->Navigate((BSTR)(const wchar_t*)url.wc_str(wxConvLibc),
&navFlag, &targetFrame, &postData, &headers);
}
HRESULT LoadWebBrowserFromStream(IWebBrowser* pWebBrowser, IStream* pStream)
{
HRESULT hr;
IDispatch* pHtmlDoc = NULL;
IPersistStreamInit* pPersistStreamInit = NULL;
// Retrieve the document object.
hr = pWebBrowser->get_Document( &pHtmlDoc );
if ( SUCCEEDED(hr) )
{
// Query for IPersistStreamInit.
hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit, (void**)&pPersistStreamInit );
if ( SUCCEEDED(hr) )
{
// Initialize the document.
hr = pPersistStreamInit->InitNew();
if ( SUCCEEDED(hr) )
{
// Load the contents of the stream.
hr = pPersistStreamInit->Load( pStream );
}
pPersistStreamInit->Release();
}
}
return S_OK;
}
void IEHtmlWin::LoadData(const wxString& data) {
HRESULT hr;
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp = NULL;
IStream* pStream = NULL;
HGLOBAL hHTMLText;
wxCharBuffer buf = data.mb_str(wxConvUTF8);
const char *szHTMLText = buf.data();
// Is this the DocumentComplete event for the top frame window?
// Check COM identity: compare IUnknown interface pointers.
hr = m_webBrowser->QueryInterface( IID_IUnknown, (void**)&pUnkBrowser );
if ( SUCCEEDED(hr) )
{
hr = m_viewObject->QueryInterface( IID_IUnknown, (void**)&pUnkDisp );
if ( SUCCEEDED(hr) )
{
if ( pUnkBrowser == pUnkDisp ){
size_t buffer = strlen(szHTMLText);
hHTMLText = GlobalAlloc(GPTR, buffer+1);
if ( hHTMLText ) {
StringCchCopyA((char*)hHTMLText, buffer+1, szHTMLText);
hr = CreateStreamOnHGlobal(hHTMLText, false, &pStream);
if ( SUCCEEDED(hr) )
{
// Call the helper function to load the browser from the stream.
LoadWebBrowserFromStream(m_webBrowser, pStream);
pStream->Release();
}
GlobalFree(hHTMLText);
}
}
pUnkDisp->Release();
}
pUnkBrowser->Release();
}
}
FrameSite::FrameSite(IEHtmlWin * win)
{
m_cRef = 0;
m_window = win;
m_bSupportsWindowlessActivation = true;
m_bInPlaceLocked = false;
m_bUIActive = false;
m_bInPlaceActive = false;
m_bWindowless = false;
m_nAmbientLocale = 0;
m_clrAmbientForeColor = ::GetSysColor(COLOR_WINDOWTEXT);
m_clrAmbientBackColor = ::GetSysColor(COLOR_WINDOW);
m_bAmbientUserMode = true;
m_bAmbientShowHatching = true;
m_bAmbientShowGrabHandles = true;
m_bAmbientAppearance = true;
m_hDCBuffer = NULL;
m_hWndParent = (HWND)m_window->GetHWND();
m_IOleInPlaceFrame = new FS_IOleInPlaceFrame(this);
m_IOleInPlaceSiteWindowless = new FS_IOleInPlaceSiteWindowless(this);
m_IOleClientSite = new FS_IOleClientSite(this);
m_IOleControlSite = new FS_IOleControlSite(this);
m_IOleCommandTarget = new FS_IOleCommandTarget(this);
m_IOleItemContainer = new FS_IOleItemContainer(this);
//m_IOleItemContainer = NULL;
m_IDispatch = new FS_IDispatch(this);
m_DWebBrowserEvents2 = new FS_DWebBrowserEvents2(this);
m_IAdviseSink2 = new FS_IAdviseSink2(this);
m_IAdviseSinkEx = new FS_IAdviseSinkEx(this);
}
FrameSite::~FrameSite()
{
delete m_IAdviseSinkEx;
delete m_IAdviseSink2;
delete m_DWebBrowserEvents2;
delete m_IDispatch;
delete m_IOleItemContainer;
delete m_IOleCommandTarget;
delete m_IOleControlSite;
delete m_IOleClientSite;
delete m_IOleInPlaceSiteWindowless;
delete m_IOleInPlaceFrame;
}
//IUnknown
STDMETHODIMP FrameSite::QueryInterface(REFIID riid, void **ppv)
{
if (ppv == NULL) return E_INVALIDARG;
*ppv = NULL;
if (riid == IID_IUnknown)
*ppv = this;
else if (riid == IID_IOleWindow ||
riid == IID_IOleInPlaceUIWindow ||
riid == IID_IOleInPlaceFrame)
*ppv = m_IOleInPlaceFrame;
else if (riid == IID_IOleInPlaceSite ||
riid == IID_IOleInPlaceSiteEx ||
riid == IID_IOleInPlaceSiteWindowless)
*ppv = m_IOleInPlaceSiteWindowless;
else if (riid == IID_IOleClientSite)
*ppv = m_IOleClientSite;
else if (riid == IID_IOleControlSite)
*ppv = m_IOleControlSite;
else if (riid == IID_IOleCommandTarget)
*ppv = m_IOleCommandTarget;
else if (riid == IID_IOleItemContainer ||
riid == IID_IOleContainer ||
riid == IID_IParseDisplayName)
*ppv = m_IOleItemContainer;
else if (riid == IID_IDispatch)
*ppv = m_IDispatch;
else if (riid == DIID_DWebBrowserEvents2)
*ppv = m_DWebBrowserEvents2;
else if (riid == IID_IAdviseSink ||
riid == IID_IAdviseSink2)
*ppv = m_IAdviseSink2;
else if (riid == IID_IAdviseSinkEx)
*ppv = m_IAdviseSinkEx;
if (*ppv == NULL) return (HRESULT) E_NOINTERFACE;
AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) FrameSite::AddRef()
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) FrameSite::Release()
{
if ( --m_cRef == 0 ) {
delete this;
return 0;
}
else return m_cRef;
}
//IDispatch
HRESULT FS_IDispatch::GetIDsOfNames(REFIID riid, OLECHAR ** rgszNames, unsigned int cNames,
LCID lcid, DISPID * rgDispId)
{
wxLogTrace(_T("IDispatch::GetIDsOfNames"));
return E_NOTIMPL;
}
HRESULT FS_IDispatch::GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo ** ppTInfo)
{
wxLogTrace(_T("IDispatch::GetTypeInfo"));
return E_NOTIMPL;
}
HRESULT FS_IDispatch::GetTypeInfoCount(unsigned int * pcTInfo)
{
wxLogTrace(_T("IDispatch::GetTypeInfoCount"));
return E_NOTIMPL;
}
HRESULT FS_IDispatch::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS * pDispParams,
VARIANT * pVarResult, EXCEPINFO * pExcepInfo,
unsigned int * puArgErr)
{
wxLogTrace(_T("IDispatch::Invoke"));
if (wFlags & DISPATCH_PROPERTYGET)
{
if (pVarResult == NULL) return E_INVALIDARG;
switch (dispIdMember)
{
case DISPID_AMBIENT_APPEARANCE:
pVarResult->vt = VT_BOOL;
pVarResult->boolVal = m_fs->m_bAmbientAppearance;
break;
case DISPID_AMBIENT_FORECOLOR:
pVarResult->vt = VT_I4;
pVarResult->lVal = (long) m_fs->m_clrAmbientForeColor;
break;
case DISPID_AMBIENT_BACKCOLOR:
pVarResult->vt = VT_I4;
pVarResult->lVal = (long) m_fs->m_clrAmbientBackColor;
break;
case DISPID_AMBIENT_LOCALEID:
pVarResult->vt = VT_I4;
pVarResult->lVal = (long) m_fs->m_nAmbientLocale;
break;
case DISPID_AMBIENT_USERMODE:
pVarResult->vt = VT_BOOL;
pVarResult->boolVal = m_fs->m_bAmbientUserMode;
break;
case DISPID_AMBIENT_SHOWGRABHANDLES:
pVarResult->vt = VT_BOOL;
pVarResult->boolVal = m_fs->m_bAmbientShowGrabHandles;
break;
case DISPID_AMBIENT_SHOWHATCHING:
pVarResult->vt = VT_BOOL;
pVarResult->boolVal = m_fs->m_bAmbientShowHatching;
break;
default:
return DISP_E_MEMBERNOTFOUND;
}
return S_OK;
}
switch (dispIdMember)
{
case DISPID_BEFORENAVIGATE2:
{
VARIANT * vurl = pDispParams->rgvarg[5].pvarVal;
wxString url;
if (vurl->vt & VT_BYREF) url = *vurl->pbstrVal;
else url = vurl->bstrVal;
if (m_fs->m_window->OnStartURL(url)) {
*pDispParams->rgvarg->pboolVal = VARIANT_FALSE;
} else {
*pDispParams->rgvarg->pboolVal = VARIANT_TRUE;
}
break;
}
case DISPID_PROGRESSCHANGE:
{
long current = pDispParams->rgvarg[1].lVal;
long maximum = pDispParams->rgvarg[0].lVal;
m_fs->m_window->OnProgressURL(current, maximum);
break;
}
case DISPID_DOCUMENTCOMPLETE:
{
VARIANT * vurl = pDispParams->rgvarg[0].pvarVal;
wxString url;
if (vurl->vt & VT_BYREF) url = *vurl->pbstrVal;
else url = vurl->bstrVal;
m_fs->m_window->OnFinishURL(url);
break;
}
}
return S_OK;
}
//IOleWindow
HRESULT FS_IOleInPlaceFrame::GetWindow(HWND * phwnd)
{
wxLogTrace(_T("IOleWindow::GetWindow"));
if (phwnd == NULL) return E_INVALIDARG;
(*phwnd) = m_fs->m_hWndParent;
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::ContextSensitiveHelp(BOOL fEnterMode)
{
wxLogTrace(_T("IOleWindow::ContextSensitiveHelp"));
return S_OK;
}
//IOleInPlaceUIWindow
HRESULT FS_IOleInPlaceFrame::GetBorder(LPRECT lprectBorder)
{
wxLogTrace(_T("IOleInPlaceUIWindow::GetBorder"));
if (lprectBorder == NULL) return E_INVALIDARG;
return INPLACE_E_NOTOOLSPACE;
}
HRESULT FS_IOleInPlaceFrame::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
{
wxLogTrace(_T("IOleInPlaceUIWindow::RequestBorderSpace"));
if (pborderwidths == NULL) return E_INVALIDARG;
return INPLACE_E_NOTOOLSPACE;
}
HRESULT FS_IOleInPlaceFrame::SetBorderSpace(LPCBORDERWIDTHS pborderwidths)
{
wxLogTrace(_T("IOleInPlaceUIWindow::SetBorderSpace"));
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
{
wxLogTrace(_T("IOleInPlaceUIWindow::SetActiveObject"));
return S_OK;
}
//IOleInPlaceFrame
HRESULT FS_IOleInPlaceFrame::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
{
wxLogTrace(_T("IOleInPlaceFrame::InsertMenus"));
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
{
wxLogTrace(_T("IOleInPlaceFrame::SetMenu"));
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::RemoveMenus(HMENU hmenuShared)
{
wxLogTrace(_T("IOleInPlaceFrame::RemoveMenus"));
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::SetStatusText(LPCOLESTR pszStatusText)
{
wxLogTrace(_T("IOleInPlaceFrame::SetStatusText"));
//((wxFrame*)wxGetApp()->GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText);
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::EnableModeless(BOOL fEnable)
{
wxLogTrace(_T("IOleInPlaceFrame::EnableModeless"));
return S_OK;
}
HRESULT FS_IOleInPlaceFrame::TranslateAccelerator(LPMSG lpmsg, WORD wID)
{
wxLogTrace(_T("IOleInPlaceFrame::TranslateAccelerator"));
// TODO: send an event with this id
return E_NOTIMPL;
}
//IOleInPlaceSite
HRESULT FS_IOleInPlaceSiteWindowless::CanInPlaceActivate()
{
wxLogTrace(_T("IOleInPlaceSite::CanInPlaceActivate"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnInPlaceActivate()
{
wxLogTrace(_T("IOleInPlaceSite::OnInPlaceActivate"));
m_fs->m_bInPlaceActive = true;
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnUIActivate()
{
wxLogTrace(_T("IOleInPlaceSite::OnUIActivate"));
m_fs->m_bUIActive = true;
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::GetWindowContext(IOleInPlaceFrame **ppFrame,
IOleInPlaceUIWindow **ppDoc,
LPRECT lprcPosRect,
LPRECT lprcClipRect,
LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
wxLogTrace(_T("IOleInPlaceSite::GetWindowContext"));
if (ppFrame == NULL || ppDoc == NULL || lprcPosRect == NULL ||
lprcClipRect == NULL || lpFrameInfo == NULL)
{
if (ppFrame != NULL) (*ppFrame) = NULL;
if (ppDoc != NULL) (*ppDoc) = NULL;
return E_INVALIDARG;
}
(*ppDoc) = (*ppFrame) = m_fs->m_IOleInPlaceFrame;
(*ppDoc)->AddRef();
(*ppFrame)->AddRef();
int w, h;
m_fs->m_window->GetSize(&w, &h);
lprcPosRect->left = lprcPosRect->top = 0;
lprcPosRect->right = w;
lprcPosRect->bottom = h;
lprcClipRect->left = lprcClipRect->top = 0;
lprcClipRect->right = w;
lprcClipRect->bottom = h;
lpFrameInfo->fMDIApp = FALSE;
lpFrameInfo->hwndFrame = m_fs->m_hWndParent;
lpFrameInfo->haccel = NULL;
lpFrameInfo->cAccelEntries = 0;
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::Scroll(SIZE scrollExtent)
{
wxLogTrace(_T("IOleInPlaceSite::Scroll"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnUIDeactivate(BOOL fUndoable)
{
wxLogTrace(_T("IOleInPlaceSite::OnUIDeactivate"));
m_fs->m_bUIActive = false;
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnInPlaceDeactivate()
{
wxLogTrace(_T("IOleInPlaceSite::OnInPlaceDeactivate"));
m_fs->m_bInPlaceActive = false;
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::DiscardUndoState()
{
wxLogTrace(_T("IOleInPlaceSite::DiscardUndoState"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::DeactivateAndUndo()
{
wxLogTrace(_T("IOleInPlaceSite::DeactivateAndUndo"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnPosRectChange(LPCRECT lprcPosRect)
{
wxLogTrace(_T("IOleInPlaceSite::OnPosRectChange"));
return S_OK;
}
//IOleInPlaceSiteEx
HRESULT FS_IOleInPlaceSiteWindowless::OnInPlaceActivateEx(BOOL * pfNoRedraw, DWORD dwFlags)
{
wxLogTrace(_T("IOleInPlaceSiteEx::OnInPlaceActivateEx"));
if (pfNoRedraw) (*pfNoRedraw) = FALSE;
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnInPlaceDeactivateEx(BOOL fNoRedraw)
{
wxLogTrace(_T("IOleInPlaceSiteEx::OnInPlaceDeactivateEx"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::RequestUIActivate()
{
wxLogTrace(_T("IOleInPlaceSiteEx::RequestUIActivate"));
return S_FALSE;
}
//IOleInPlaceSiteWindowless
HRESULT FS_IOleInPlaceSiteWindowless::CanWindowlessActivate()
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::CanWindowlessActivate"));
return (m_fs->m_bSupportsWindowlessActivation) ? S_OK : S_FALSE;
}
HRESULT FS_IOleInPlaceSiteWindowless::GetCapture()
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::GetCapture"));
return S_FALSE;
}
HRESULT FS_IOleInPlaceSiteWindowless::SetCapture(BOOL fCapture)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::SetCapture"));
return S_FALSE;
}
HRESULT FS_IOleInPlaceSiteWindowless::GetFocus()
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::GetFocus"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::SetFocus(BOOL fFocus)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::SetFocus"));
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::GetDC(LPCRECT pRect, DWORD grfFlags, HDC* phDC)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::GetDC"));
if (phDC == NULL) return E_INVALIDARG;
if (grfFlags & OLEDC_NODRAW)
{
(*phDC) = m_fs->m_hDCBuffer;
return S_OK;
}
if (m_fs->m_hDCBuffer != NULL) return E_UNEXPECTED;
return E_NOTIMPL;
}
HRESULT FS_IOleInPlaceSiteWindowless::ReleaseDC(HDC hDC)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::ReleaseDC"));
return E_NOTIMPL;
}
HRESULT FS_IOleInPlaceSiteWindowless::InvalidateRect(LPCRECT pRect, BOOL fErase)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::InvalidateRect"));
// Clip the rectangle against the object's size and invalidate it
RECT rcI = { 0, 0, 0, 0 };
RECT posRect;
int w, h;
m_fs->m_window->GetSize(&w, &h);
posRect.left = 0;
posRect.top = 0;
posRect.right = w;
posRect.bottom = h;
if (pRect == NULL)
{
rcI = posRect;
}
else
{
IntersectRect(&rcI, &posRect, pRect);
}
::InvalidateRect(m_fs->m_hWndParent, &rcI, fErase);
return S_OK;
}
HRESULT FS_IOleInPlaceSiteWindowless::InvalidateRgn(HRGN, BOOL)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::InvalidateRgn"));
return E_NOTIMPL;
}
HRESULT FS_IOleInPlaceSiteWindowless::ScrollRect(INT, INT, LPCRECT, LPCRECT)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::ScrollRect"));
return E_NOTIMPL;
}
HRESULT FS_IOleInPlaceSiteWindowless::AdjustRect(LPRECT)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::AdjustRect"));
return E_NOTIMPL;
}
HRESULT FS_IOleInPlaceSiteWindowless::OnDefWindowMessage(UINT, WPARAM, LPARAM, LRESULT*)
{
wxLogTrace(_T("IOleInPlaceSiteWindowless::OnDefWindowMessage"));
return E_NOTIMPL;
}
//IOleClientSite
HRESULT FS_IOleClientSite::SaveObject()
{
wxLogTrace(_T("IOleClientSite::SaveObject"));
return S_OK;
}
HRESULT FS_IOleClientSite::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,
IMoniker ** ppmk)
{
wxLogTrace(_T("IOleClientSite::GetMoniker"));
return E_NOTIMPL;
}
HRESULT FS_IOleClientSite::GetContainer(LPOLECONTAINER * ppContainer)
{
wxLogTrace(_T("IOleClientSite::GetContainer"));
if (ppContainer == NULL) return E_INVALIDARG;
this->QueryInterface(IID_IOleContainer, (void**)(ppContainer));
return S_OK;
}
HRESULT FS_IOleClientSite::ShowObject()
{
wxLogTrace(_T("IOleClientSite::ShowObject"));
return S_OK;
}
HRESULT FS_IOleClientSite::OnShowWindow(BOOL fShow)
{
wxLogTrace(_T("IOleClientSite::OnShowWindow"));
return S_OK;
}
HRESULT FS_IOleClientSite::RequestNewObjectLayout()
{
wxLogTrace(_T("IOleClientSite::RequestNewObjectLayout"));
return E_NOTIMPL;
}
//IParseDisplayName
HRESULT FS_IOleItemContainer::ParseDisplayName(IBindCtx *pbc, LPOLESTR pszDisplayName,
ULONG *pchEaten, IMoniker **ppmkOut)
{
wxLogTrace(_T("IParseDisplayName::ParseDisplayName"));
return E_NOTIMPL;
}
//IOleContainer
HRESULT FS_IOleItemContainer::EnumObjects(DWORD grfFlags, IEnumUnknown **ppenum)
{
wxLogTrace(_T("IOleContainer::EnumObjects"));
return E_NOTIMPL;
}
HRESULT FS_IOleItemContainer::LockContainer(BOOL fLock)
{
wxLogTrace(_T("IOleContainer::LockContainer"));
// TODO
return S_OK;
}
//IOleItemContainer
HRESULT FS_IOleItemContainer::GetObjectW(LPOLESTR pszItem, DWORD dwSpeedNeeded,
IBindCtx * pbc, REFIID riid, void ** ppvObject)
{
wxLogTrace(_T("IOleItemContainer::GetObject"));
if (pszItem == NULL) return E_INVALIDARG;
if (ppvObject == NULL) return E_INVALIDARG;
*ppvObject = NULL;
return MK_E_NOOBJECT;
}
HRESULT FS_IOleItemContainer::GetObjectStorage(LPOLESTR pszItem, IBindCtx * pbc,
REFIID riid, void ** ppvStorage)
{
wxLogTrace(_T("IOleItemContainer::GetObjectStorage"));
if (pszItem == NULL) return E_INVALIDARG;
if (ppvStorage == NULL) return E_INVALIDARG;
*ppvStorage = NULL;
return MK_E_NOOBJECT;
}
HRESULT FS_IOleItemContainer::IsRunning(LPOLESTR pszItem)
{
wxLogTrace(_T("IOleItemContainer::IsRunning"));
if (pszItem == NULL) return E_INVALIDARG;
return MK_E_NOOBJECT;
}
//IOleControlSite
HRESULT FS_IOleControlSite::OnControlInfoChanged()
{
wxLogTrace(_T("IOleControlSite::OnControlInfoChanged"));
return S_OK;
}
HRESULT FS_IOleControlSite::LockInPlaceActive(BOOL fLock)
{
wxLogTrace(_T("IOleControlSite::LockInPlaceActive"));
m_fs->m_bInPlaceLocked = (fLock) ? true : false;
return S_OK;
}
HRESULT FS_IOleControlSite::GetExtendedControl(IDispatch ** ppDisp)
{
wxLogTrace(_T("IOleControlSite::GetExtendedControl"));
return E_NOTIMPL;
}
HRESULT FS_IOleControlSite::TransformCoords(POINTL * pPtlHimetric, POINTF * pPtfContainer, DWORD dwFlags)
{
wxLogTrace(_T("IOleControlSite::TransformCoords"));
HRESULT hr = S_OK;
if (pPtlHimetric == NULL)
{
return E_INVALIDARG;
}
if (pPtfContainer == NULL)
{
return E_INVALIDARG;
}
HDC hdc = ::GetDC(m_fs->m_hWndParent);
::SetMapMode(hdc, MM_HIMETRIC);
POINT rgptConvert[2];
rgptConvert[0].x = 0;
rgptConvert[0].y = 0;
if (dwFlags & XFORMCOORDS_HIMETRICTOCONTAINER)
{
rgptConvert[1].x = pPtlHimetric->x;
rgptConvert[1].y = pPtlHimetric->y;
::LPtoDP(hdc, rgptConvert, 2);
if (dwFlags & XFORMCOORDS_SIZE)
{
pPtfContainer->x = (float)(rgptConvert[1].x - rgptConvert[0].x);
pPtfContainer->y = (float)(rgptConvert[0].y - rgptConvert[1].y);
}
else if (dwFlags & XFORMCOORDS_POSITION)
{
pPtfContainer->x = (float)rgptConvert[1].x;
pPtfContainer->y = (float)rgptConvert[1].y;
}
else
{
hr = E_INVALIDARG;
}
}
else if (dwFlags & XFORMCOORDS_CONTAINERTOHIMETRIC)
{
rgptConvert[1].x = (int)(pPtfContainer->x);
rgptConvert[1].y = (int)(pPtfContainer->y);
::DPtoLP(hdc, rgptConvert, 2);
if (dwFlags & XFORMCOORDS_SIZE)
{
pPtlHimetric->x = rgptConvert[1].x - rgptConvert[0].x;
pPtlHimetric->y = rgptConvert[0].y - rgptConvert[1].y;
}
else if (dwFlags & XFORMCOORDS_POSITION)
{
pPtlHimetric->x = rgptConvert[1].x;
pPtlHimetric->y = rgptConvert[1].y;
}
else
{
hr = E_INVALIDARG;
}
}
else
{
hr = E_INVALIDARG;
}
::ReleaseDC(m_fs->m_hWndParent, hdc);
return hr;
}
HRESULT FS_IOleControlSite::TranslateAccelerator(LPMSG pMsg, DWORD grfModifiers)
{
wxLogTrace(_T("IOleControlSite::TranslateAccelerator"));
// TODO: send an event with this id
return E_NOTIMPL;
}
HRESULT FS_IOleControlSite::OnFocus(BOOL fGotFocus)
{
wxLogTrace(_T("IOleControlSite::OnFocus"));
return S_OK;
}
HRESULT FS_IOleControlSite::ShowPropertyFrame()
{
wxLogTrace(_T("IOleControlSite::ShowPropertyFrame"));
return E_NOTIMPL;
}
//IOleCommandTarget
HRESULT FS_IOleCommandTarget::QueryStatus(const GUID * pguidCmdGroup, ULONG cCmds,
OLECMD * prgCmds, OLECMDTEXT * pCmdTet)
{
wxLogTrace(_T("IOleCommandTarget::QueryStatus"));
if (prgCmds == NULL) return E_INVALIDARG;
bool bCmdGroupFound = false;
for (ULONG nCmd = 0; nCmd < cCmds; nCmd++)
{
// unsupported by default
prgCmds[nCmd].cmdf = 0;
// TODO
}
if (!bCmdGroupFound) { OLECMDERR_E_UNKNOWNGROUP; }
return S_OK;
}
HRESULT FS_IOleCommandTarget::Exec(const GUID * pguidCmdGroup, DWORD nCmdID,
DWORD nCmdExecOpt, VARIANTARG * pVaIn,
VARIANTARG * pVaOut)
{
wxLogTrace(_T("IOleCommandTarget::Exec"));
bool bCmdGroupFound = false;
if (!bCmdGroupFound) { OLECMDERR_E_UNKNOWNGROUP; }
return OLECMDERR_E_NOTSUPPORTED;
}
//IAdviseSink
void STDMETHODCALLTYPE FS_IAdviseSink2::OnDataChange(FORMATETC * pFormatEtc, STGMEDIUM * pgStgMed)
{
wxLogTrace(_T("IAdviseSink::OnDataChange"));
}
void STDMETHODCALLTYPE FS_IAdviseSink2::OnViewChange(DWORD dwAspect, LONG lIndex)
{
wxLogTrace(_T("IAdviseSink::OnViewChange"));
// redraw the control
m_fs->m_IOleInPlaceSiteWindowless->InvalidateRect(NULL, FALSE);
}
void STDMETHODCALLTYPE FS_IAdviseSink2::OnRename(IMoniker * pmk)
{
wxLogTrace(_T("IAdviseSink::OnRename"));
}
void STDMETHODCALLTYPE FS_IAdviseSink2::OnSave()
{
wxLogTrace(_T("IAdviseSink::OnSave"));
}
void STDMETHODCALLTYPE FS_IAdviseSink2::OnClose()
{
wxLogTrace(_T("IAdviseSink::OnClose"));
}
//IAdviseSink2
void STDMETHODCALLTYPE FS_IAdviseSink2::OnLinkSrcChange(IMoniker * pmk)
{
wxLogTrace(_T("IAdviseSink2::OnLinkSrcChange"));
}
//IAdviseSinkEx
void STDMETHODCALLTYPE FS_IAdviseSinkEx::OnViewStatusChange(DWORD dwViewStatus)
{
wxLogTrace(_T("IAdviseSinkEx::OnViewStatusChange"));
}