#include "wx/msw/private.h" // for wxCopyRectToRECT
// autointerfaces that we only use here
-WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceSite, IOleInPlaceSite)
-WX_DECLARE_AUTOOLE(wxAutoIOleDocument, IOleDocument)
-WX_DECLARE_AUTOOLE(wxAutoIPersistStreamInit, IPersistStreamInit)
-WX_DECLARE_AUTOOLE(wxAutoIAdviseSink, IAdviseSink)
-WX_DECLARE_AUTOOLE(wxAutoIProvideClassInfo, IProvideClassInfo)
-WX_DECLARE_AUTOOLE(wxAutoITypeInfo, ITypeInfo)
-WX_DECLARE_AUTOOLE(wxAutoIConnectionPoint, IConnectionPoint)
-WX_DECLARE_AUTOOLE(wxAutoIConnectionPointContainer, IConnectionPointContainer)
+typedef wxAutoOleInterface<IOleInPlaceSite> wxAutoIOleInPlaceSite;
+typedef wxAutoOleInterface<IOleDocument> wxAutoIOleDocument;
+typedef wxAutoOleInterface<IPersistStreamInit> wxAutoIPersistStreamInit;
+typedef wxAutoOleInterface<IAdviseSink> wxAutoIAdviseSink;
+typedef wxAutoOleInterface<IProvideClassInfo> wxAutoIProvideClassInfo;
+typedef wxAutoOleInterface<ITypeInfo> wxAutoITypeInfo;
+typedef wxAutoOleInterface<IConnectionPoint> wxAutoIConnectionPoint;
+typedef wxAutoOleInterface<IConnectionPointContainer> wxAutoIConnectionPointContainer;
wxDEFINE_EVENT( wxEVT_ACTIVEX, wxActiveXEvent );
{\
public:\
LONG l;\
- TAutoInitInt() : l(0) {}\
+ TAutoInitInt() : l(1) {}\
};\
TAutoInitInt refCount, lockCount;\
static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\
HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpmsg, WORD)
{
// TODO: send an event with this id
- if (m_window->m_oleInPlaceActiveObject.Ok())
+ if (m_window->m_oleInPlaceActiveObject.IsOk())
m_window->m_oleInPlaceActiveObject->TranslateAccelerator(lpmsg);
return S_FALSE;
}
HRESULT STDMETHODCALLTYPE DeactivateAndUndo(){return S_OK; }
HRESULT STDMETHODCALLTYPE OnPosRectChange(LPCRECT lprcPosRect)
{
- if (m_window->m_oleInPlaceObject.Ok() && lprcPosRect)
+ if (m_window->m_oleInPlaceObject.IsOk() && lprcPosRect)
{
//
// Result of several hours and days of bug hunting -
{
wxAutoIOleInPlaceSite inPlaceSite(
IID_IOleInPlaceSite, (IDispatch *) this);
- if (!inPlaceSite.Ok())
+ if (!inPlaceSite.IsOk())
return E_FAIL;
if (pViewToActivate)
{
wxAutoIOleDocument oleDoc(
IID_IOleDocument, m_window->m_oleObject);
- if (! oleDoc.Ok())
+ if (! oleDoc.IsOk())
return E_FAIL;
HRESULT hr = oleDoc->CreateView(inPlaceSite, NULL,
return S_OK;
}
+ friend bool QueryClientSiteInterface(FrameSite *self, REFIID iid, void **_interface, const char *&desc)
+ {
+ return self->m_window->QueryClientSiteInterface(iid,_interface,desc);
+ }
protected:
wxActiveXContainer * m_window;
OLE_IINTERFACE(IOleDocumentSite)
OLE_IINTERFACE(IAdviseSink)
OLE_IINTERFACE(IOleControlSite)
+ OLE_INTERFACE_CUSTOM(QueryClientSiteInterface)
END_OLE_TABLE
wxActiveXContainer::~wxActiveXContainer()
{
// disconnect connection points
- if (m_oleInPlaceObject.Ok())
+ if (m_oleInPlaceObject.IsOk())
{
m_oleInPlaceObject->InPlaceDeactivate();
m_oleInPlaceObject->UIDeactivate();
}
- if (m_oleObject.Ok())
+ if (m_oleObject.IsOk())
{
if (m_docAdviseCookie != 0)
m_oleObject->Unadvise(m_docAdviseCookie);
}
// VZ: we might want to really report an error instead of just asserting here
-#define CHECK_HR(hr) \
- wxASSERT_LEVEL_2_MSG( SUCCEEDED(hr), \
- wxString::Format("HRESULT = %X", (unsigned)(hr)) )
+#if wxDEBUG_LEVEL
+ #define CHECK_HR(hr) \
+ wxASSERT_LEVEL_2_MSG( SUCCEEDED(hr), \
+ wxString::Format("HRESULT = %X", (unsigned)(hr)) )
+#else
+ #define CHECK_HR(hr) wxUnusedVar(hr)
+#endif
//---------------------------------------------------------------------------
// wxActiveXContainer::CreateActiveX
CHECK_HR(hret);
// adviseSink
wxAutoIAdviseSink adviseSink(IID_IAdviseSink, (IDispatch *) m_frameSite);
- wxASSERT(adviseSink.Ok());
+ wxASSERT(adviseSink.IsOk());
// Get Dispatch interface
hret = m_Dispatch.QueryInterface(IID_IDispatch, m_ActiveX);
// get type info via class info
wxAutoIProvideClassInfo classInfo(IID_IProvideClassInfo, m_ActiveX);
- wxASSERT(classInfo.Ok());
+ wxASSERT(classInfo.IsOk());
// type info
wxAutoITypeInfo typeInfo;
hret = classInfo->GetClassInfo(typeInfo.GetRef());
CHECK_HR(hret);
- wxASSERT(typeInfo.Ok());
+ wxASSERT(typeInfo.IsOk());
// TYPEATTR
TYPEATTR *ta = NULL;
// get dispatch type info interface
wxAutoITypeInfo ti;
hret = typeInfo->GetRefTypeInfo(rt, ti.GetRef());
- if (! ti.Ok())
+ if (! ti.IsOk())
continue;
CHECK_HR(hret);
DWORD adviseCookie = 0;
wxAutoIConnectionPointContainer cpContainer(IID_IConnectionPointContainer, m_ActiveX);
- wxASSERT( cpContainer.Ok());
+ wxASSERT( cpContainer.IsOk());
HRESULT hret =
cpContainer->FindConnectionPoint(ta->guid, cp.GetRef());
- CHECK_HR(hret);
- IDispatch* disp;
- m_frameSite->QueryInterface(IID_IDispatch, (void**)&disp);
- hret = cp->Advise(new wxActiveXEvents(this, ta->guid),
- &adviseCookie);
- CHECK_HR(hret);
+ // Notice that the return value of CONNECT_E_NOCONNECTION is
+ // expected if the interface doesn't support connection points.
+ if ( hret != CONNECT_E_NOCONNECTION )
+ {
+ CHECK_HR(hret);
+ }
+
+ if ( cp )
+ {
+ wxActiveXEvents * const
+ events = new wxActiveXEvents(this, ta->guid);
+ hret = cp->Advise(events, &adviseCookie);
+
+ // We don't need this object any more and cp will keep a
+ // reference to it if it needs it, i.e. if Advise()
+ // succeeded.
+ events->Release();
+
+ CHECK_HR(hret);
+ }
}
}
wxAutoIPersistStreamInit
pPersistStreamInit(IID_IPersistStreamInit, m_oleObject);
- if (pPersistStreamInit.Ok())
+ if (pPersistStreamInit.IsOk())
{
hret = pPersistStreamInit->InitNew();
CHECK_HR(hret);
m_oleObjectHWND = 0;
- if (m_oleInPlaceObject.Ok())
- {
- hret = m_oleInPlaceObject->GetWindow(&m_oleObjectHWND);
- if (SUCCEEDED(hret))
- ::SetActiveWindow(m_oleObjectHWND);
- }
-
if (! (dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME))
{
RECT posRect;
wxCopyRectToRECT(m_realparent->GetClientSize(), posRect);
+ hret = m_oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL,
+ m_clientSite, 0, (HWND)m_realparent->GetHWND(), &posRect);
+ CHECK_HR(hret);
+
+ if (m_oleInPlaceObject.IsOk())
+ {
+ hret = m_oleInPlaceObject->GetWindow(&m_oleObjectHWND);
+ CHECK_HR(hret);
+ ::SetActiveWindow(m_oleObjectHWND);
+ }
+
if (posRect.right > 0 && posRect.bottom > 0 &&
- m_oleInPlaceObject.Ok())
+ m_oleInPlaceObject.IsOk())
{
m_oleInPlaceObject->SetObjectRects(&posRect, &posRect);
}
- hret = m_oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL,
- m_clientSite, 0, (HWND)m_realparent->GetHWND(), &posRect);
- CHECK_HR(hret);
-
hret = m_oleObject->DoVerb(OLEIVERB_SHOW, 0, m_clientSite, 0,
(HWND)m_realparent->GetHWND(), &posRect);
CHECK_HR(hret);
}
- if (! m_oleObjectHWND && m_oleInPlaceObject.Ok())
+ if (! m_oleObjectHWND && m_oleInPlaceObject.IsOk())
{
hret = m_oleInPlaceObject->GetWindow(&m_oleObjectHWND);
CHECK_HR(hret);
posRect.right = w;
posRect.bottom = h;
- if (w <= 0 && h <= 0)
+ if (w <= 0 || h <= 0)
return;
// extents are in HIMETRIC units
- if (m_oleObject.Ok())
+ if (m_oleObject.IsOk())
{
- m_oleObject->DoVerb(OLEIVERB_HIDE, 0, m_clientSite, 0,
- (HWND)m_realparent->GetHWND(), &posRect);
SIZEL sz = {w, h};
PixelsToHimetric(sz);
if (sz2.cx != sz.cx || sz.cy != sz2.cy)
m_oleObject->SetExtent(DVASPECT_CONTENT, &sz);
- m_oleObject->DoVerb(OLEIVERB_SHOW, 0, m_clientSite, 0,
- (HWND)m_realparent->GetHWND(), &posRect);
}
- if (m_oleInPlaceObject.Ok())
+ if (m_oleInPlaceObject.IsOk())
m_oleInPlaceObject->SetObjectRects(&posRect, &posRect);
event.Skip();
//---------------------------------------------------------------------------
void wxActiveXContainer::OnSetFocus(wxFocusEvent& event)
{
- if (m_oleInPlaceActiveObject.Ok())
+ if (m_oleInPlaceActiveObject.IsOk())
m_oleInPlaceActiveObject->OnFrameWindowActivate(TRUE);
event.Skip();
//---------------------------------------------------------------------------
void wxActiveXContainer::OnKillFocus(wxFocusEvent& event)
{
- if (m_oleInPlaceActiveObject.Ok())
+ if (m_oleInPlaceActiveObject.IsOk())
m_oleInPlaceActiveObject->OnFrameWindowActivate(FALSE);
event.Skip();
}
+//---------------------------------------------------------------------------
+// wxActiveXContainer::MSWTranslateMessage
+//
+// Called for every message that needs to be translated.
+// Some controls might need more keyboard keys to process (CTRL-C, CTRL-A etc),
+// In that case TranslateAccelerator should always be called first.
+//---------------------------------------------------------------------------
+bool wxActiveXContainer::MSWTranslateMessage(WXMSG* pMsg)
+{
+ if(m_oleInPlaceActiveObject.IsOk() && m_oleInPlaceActiveObject->TranslateAccelerator(pMsg) == S_OK)
+ {
+ return true;
+ }
+ return wxWindow::MSWTranslateMessage(pMsg);
+}
+
+//---------------------------------------------------------------------------
+// wxActiveXContainer::QueryClientSiteInterface
+//
+// Called in the host's site's query method for other interfaces.
+//---------------------------------------------------------------------------
+bool wxActiveXContainer::QueryClientSiteInterface(REFIID iid, void **_interface, const char *&desc)
+{
+ wxUnusedVar(iid);
+ wxUnusedVar(_interface);
+ wxUnusedVar(desc);
+ return false;
+}
+
#endif // wxUSE_ACTIVEX