2 #include <wx/strconv.h>
3 #include <wx/msw/ole/uuid.h>
13 // Depending on compilation mode, the wx headers may have undef'd
14 // this, but in this case we need it so the virtual method in
15 // FrameSite will match what is in oleidl.h.
18 #define GetObject GetObjectW
20 #define GetObject GetObjectA
24 //////////////////////////////////////////////////////////////////////
25 BEGIN_EVENT_TABLE(wxActiveX
, wxWindow
)
27 EVT_SET_FOCUS(OnSetFocus
)
28 EVT_KILL_FOCUS(OnKillFocus
)
34 public IOleClientSite
,
35 public IOleInPlaceSiteEx
,
36 public IOleInPlaceFrame
,
37 public IOleItemContainer
,
39 public IOleCommandTarget
,
40 public IOleDocumentSite
,
42 public IOleControlSite
45 DECLARE_OLE_UNKNOWN(FrameSite
);
48 FrameSite(wxActiveX
* win
);
52 STDMETHODIMP
GetWindow(HWND
*);
53 STDMETHODIMP
ContextSensitiveHelp(BOOL
);
56 STDMETHODIMP
GetBorder(LPRECT
);
57 STDMETHODIMP
RequestBorderSpace(LPCBORDERWIDTHS
);
58 STDMETHODIMP
SetBorderSpace(LPCBORDERWIDTHS
);
59 STDMETHODIMP
SetActiveObject(IOleInPlaceActiveObject
*, LPCOLESTR
);
62 STDMETHODIMP
InsertMenus(HMENU
, LPOLEMENUGROUPWIDTHS
);
63 STDMETHODIMP
SetMenu(HMENU
, HOLEMENU
, HWND
);
64 STDMETHODIMP
RemoveMenus(HMENU
);
65 STDMETHODIMP
SetStatusText(LPCOLESTR
);
66 STDMETHODIMP
EnableModeless(BOOL
);
67 STDMETHODIMP
TranslateAccelerator(LPMSG
, WORD
);
70 STDMETHODIMP
CanInPlaceActivate();
71 STDMETHODIMP
OnInPlaceActivate();
72 STDMETHODIMP
OnUIActivate();
73 STDMETHODIMP
GetWindowContext(IOleInPlaceFrame
**, IOleInPlaceUIWindow
**,
74 LPRECT
, LPRECT
, LPOLEINPLACEFRAMEINFO
);
75 STDMETHODIMP
Scroll(SIZE
);
76 STDMETHODIMP
OnUIDeactivate(BOOL
);
77 STDMETHODIMP
OnInPlaceDeactivate();
78 STDMETHODIMP
DiscardUndoState();
79 STDMETHODIMP
DeactivateAndUndo();
80 STDMETHODIMP
OnPosRectChange(LPCRECT
);
83 STDMETHODIMP
OnInPlaceActivateEx(BOOL
*, DWORD
);
84 STDMETHODIMP
OnInPlaceDeactivateEx(BOOL
);
85 STDMETHODIMP
RequestUIActivate();
88 STDMETHODIMP
SaveObject();
89 STDMETHODIMP
GetMoniker(DWORD
, DWORD
, IMoniker
**);
90 STDMETHODIMP
GetContainer(LPOLECONTAINER FAR
*);
91 STDMETHODIMP
ShowObject();
92 STDMETHODIMP
OnShowWindow(BOOL
);
93 STDMETHODIMP
RequestNewObjectLayout();
96 STDMETHODIMP
OnControlInfoChanged();
97 STDMETHODIMP
LockInPlaceActive(BOOL
);
98 STDMETHODIMP
GetExtendedControl(IDispatch
**);
99 STDMETHODIMP
TransformCoords(POINTL
*, POINTF
*, DWORD
);
100 STDMETHODIMP
TranslateAccelerator(LPMSG
, DWORD
);
101 STDMETHODIMP
OnFocus(BOOL
);
102 STDMETHODIMP
ShowPropertyFrame();
105 STDMETHODIMP
QueryStatus(const GUID
*, ULONG
, OLECMD
[], OLECMDTEXT
*);
106 STDMETHODIMP
Exec(const GUID
*, DWORD
, DWORD
, VARIANTARG
*, VARIANTARG
*);
109 STDMETHODIMP
ParseDisplayName(IBindCtx
*, LPOLESTR
, ULONG
*, IMoniker
**);
112 STDMETHODIMP
EnumObjects(DWORD
, IEnumUnknown
**);
113 STDMETHODIMP
LockContainer(BOOL
);
116 STDMETHODIMP
GetObject(LPOLESTR
, DWORD
, IBindCtx
*, REFIID
, void**);
117 STDMETHODIMP
GetObjectStorage(LPOLESTR
, IBindCtx
*, REFIID
, void**);
118 STDMETHODIMP
IsRunning(LPOLESTR
);
121 STDMETHODIMP
GetIDsOfNames(REFIID
, OLECHAR
**, unsigned int, LCID
, DISPID
*);
122 STDMETHODIMP
GetTypeInfo(unsigned int, LCID
, ITypeInfo
**);
123 STDMETHODIMP
GetTypeInfoCount(unsigned int*);
124 STDMETHODIMP
Invoke(DISPID
, REFIID
, LCID
, WORD
, DISPPARAMS
*, VARIANT
*, EXCEPINFO
*, UINT
*);
127 void STDMETHODCALLTYPE
OnDataChange(FORMATETC
*, STGMEDIUM
*);
128 void STDMETHODCALLTYPE
OnViewChange(DWORD
, LONG
);
129 void STDMETHODCALLTYPE
OnRename(IMoniker
*);
130 void STDMETHODCALLTYPE
OnSave();
131 void STDMETHODCALLTYPE
OnClose();
134 HRESULT STDMETHODCALLTYPE
ActivateMe(IOleDocumentView __RPC_FAR
*pViewToActivate
);
138 wxActiveX
* m_window
;
143 bool m_bSupportsWindowlessActivation
;
144 bool m_bInPlaceLocked
;
145 bool m_bInPlaceActive
;
151 LCID m_nAmbientLocale
;
152 COLORREF m_clrAmbientForeColor
;
153 COLORREF m_clrAmbientBackColor
;
154 bool m_bAmbientShowHatching
;
155 bool m_bAmbientShowGrabHandles
;
156 bool m_bAmbientAppearance
;
159 DEFINE_OLE_TABLE(FrameSite
)
160 OLE_INTERFACE(IID_IUnknown
, IOleClientSite
)
162 OLE_IINTERFACE(IOleClientSite
)
164 OLE_INTERFACE(IID_IOleWindow
, IOleInPlaceSite
)
165 OLE_IINTERFACE(IOleInPlaceSite
)
166 OLE_IINTERFACE(IOleInPlaceSiteEx
)
168 //OLE_IINTERFACE(IOleWindow)
169 OLE_IINTERFACE(IOleInPlaceUIWindow
)
170 OLE_IINTERFACE(IOleInPlaceFrame
)
172 OLE_IINTERFACE(IParseDisplayName
)
173 OLE_IINTERFACE(IOleContainer
)
174 OLE_IINTERFACE(IOleItemContainer
)
176 OLE_IINTERFACE(IDispatch
)
178 OLE_IINTERFACE(IOleCommandTarget
)
180 OLE_IINTERFACE(IOleDocumentSite
)
182 OLE_IINTERFACE(IAdviseSink
)
184 OLE_IINTERFACE(IOleControlSite
)
188 wxActiveX::wxActiveX(wxWindow
* parent
, REFCLSID clsid
, wxWindowID id
,
192 const wxString
& name
) :
193 wxWindow(parent
, id
, pos
, size
, style
, name
)
195 m_bAmbientUserMode
= true;
196 m_docAdviseCookie
= 0;
197 CreateActiveX(clsid
);
200 wxActiveX::wxActiveX(wxWindow
* parent
, wxString progId
, wxWindowID id
,
204 const wxString
& name
) :
205 wxWindow(parent
, id
, pos
, size
, style
, name
)
207 m_bAmbientUserMode
= true;
208 m_docAdviseCookie
= 0;
209 CreateActiveX((LPOLESTR
) wxConvUTF8
.cMB2WC(progId
).data());
212 wxActiveX::~wxActiveX()
214 // disconnect connection points
215 wxOleConnectionArray::iterator it
= m_connections
.begin();
216 while (it
!= m_connections
.end())
218 wxOleConnectionPoint
& cp
= it
->first
;
219 cp
->Unadvise(it
->second
);
223 m_connections
.clear();
225 if (m_oleInPlaceObject
.Ok())
227 m_oleInPlaceObject
->InPlaceDeactivate();
228 m_oleInPlaceObject
->UIDeactivate();
232 if (m_oleObject
.Ok())
234 if (m_docAdviseCookie
!= 0)
235 m_oleObject
->Unadvise(m_docAdviseCookie
);
237 m_oleObject
->DoVerb(OLEIVERB_HIDE
, NULL
, m_clientSite
, 0, (HWND
) GetHWND(), NULL
);
238 m_oleObject
->Close(OLECLOSE_NOSAVE
);
239 m_oleObject
->SetClientSite(NULL
);
243 void wxActiveX::CreateActiveX(REFCLSID clsid
)
249 ////////////////////////////////////////////////////////
251 FrameSite
*frame
= new FrameSite(this);
253 hret
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch
*) frame
);
254 wxASSERT(SUCCEEDED(hret
));
256 wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch
*) frame
);
257 wxASSERT(adviseSink
.Ok());
262 // // Create Object, get IUnknown interface
263 m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
);
264 wxASSERT(m_ActiveX
.Ok());
266 // Get IOleObject interface
267 hret
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);
268 wxASSERT(SUCCEEDED(hret
));
269 // Get IOleInPlaceObject interface
270 hret
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
);
271 wxASSERT(SUCCEEDED(hret
));
275 m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
);
276 wxASSERT(SUCCEEDED(hret
));
278 // set client site first ?
279 if (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
)
280 m_oleObject
->SetClientSite(m_clientSite
);
284 wxAutoOleInterface
<IPersistStreamInit
>
285 pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
);
287 if (pPersistStreamInit
.Ok())
289 hret
= pPersistStreamInit
->InitNew();
290 WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()");
294 m_docAdviseCookie
= 0;
295 hret
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
);
296 WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")");
297 m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
);
298 OleSetContainedObject(m_oleObject
, TRUE
);
300 if (! (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
))
301 m_oleObject
->SetClientSite(m_clientSite
);
305 GetClientSize(&w
, &h
);
313 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
314 WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)");
316 ::SetActiveWindow(m_oleObjectHWND
);
319 if (! (dwMiscStatus
& OLEMISC_INVISIBLEATRUNTIME
))
321 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
323 hret
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
);
324 hret
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
);
329 void wxActiveX::CreateActiveX(LPOLESTR progId
)
332 if (CLSIDFromProgID(progId
, &clsid
) != S_OK
)
335 CreateActiveX(clsid
);
338 HRESULT
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown
*events
)
340 wxOleConnectionPoint cp
;
341 DWORD adviseCookie
= 0;
343 wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
);
344 if (! cpContainer
.Ok())
347 HRESULT hret
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef());
348 if (! SUCCEEDED(hret
))
351 hret
= cp
->Advise(events
, &adviseCookie
);
354 m_connections
.push_back(wxOleConnection(cp
, adviseCookie
));
359 HRESULT
wxActiveX::AmbientPropertyChanged(DISPID dispid
)
361 wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
);
364 return oleControl
->OnAmbientPropertyChange(dispid
);
369 #define HIMETRIC_PER_INCH 2540
370 #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
372 static void PixelsToHimetric(SIZEL
&sz
)
380 HDC dc
= GetDC(NULL
);
381 logX
= GetDeviceCaps(dc
, LOGPIXELSX
);
382 logY
= GetDeviceCaps(dc
, LOGPIXELSY
);
386 #define HIMETRIC_INCH 2540
387 #define CONVERT(x, logpixels) MulDiv(HIMETRIC_INCH, (x), (logpixels))
389 sz
.cx
= CONVERT(sz
.cx
, logX
);
390 sz
.cy
= CONVERT(sz
.cy
, logY
);
397 void wxActiveX::OnSize(wxSizeEvent
& event
)
400 GetClientSize(&w
, &h
);
408 if (m_oleInPlaceObject
)
409 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
411 // extents are in HIMETRIC units
413 PixelsToHimetric(sz
);
416 m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
);
417 if (sz2
.cx
!= sz
.cx
|| sz
.cy
!= sz2
.cy
)
418 m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
);
421 void wxActiveX::OnSetFocus(wxFocusEvent
& event
)
423 if (m_oleInPlaceActiveObject
.Ok())
424 m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
);
427 void wxActiveX::OnKillFocus(wxFocusEvent
& event
)
429 if (m_oleInPlaceActiveObject
.Ok())
430 m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
);
434 FrameSite::FrameSite(wxActiveX
* win
)
437 m_bSupportsWindowlessActivation
= true;
438 m_bInPlaceLocked
= false;
440 m_bInPlaceActive
= false;
441 m_bWindowless
= false;
443 m_nAmbientLocale
= 0;
444 m_clrAmbientForeColor
= ::GetSysColor(COLOR_WINDOWTEXT
);
445 m_clrAmbientBackColor
= ::GetSysColor(COLOR_WINDOW
);
446 m_bAmbientShowHatching
= true;
447 m_bAmbientShowGrabHandles
= true;
448 m_bAmbientAppearance
= true;
451 m_hWndParent
= (HWND
)m_window
->GetHWND();
454 FrameSite::~FrameSite()
461 HRESULT
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR
** rgszNames
, unsigned int cNames
,
462 LCID lcid
, DISPID
* rgDispId
)
464 WXOLE_TRACE("IDispatch::GetIDsOfNames");
468 HRESULT
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
470 WXOLE_TRACE("IDispatch::GetTypeInfo");
474 HRESULT
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
)
476 WXOLE_TRACE("IDispatch::GetTypeInfoCount");
480 HRESULT
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
481 WORD wFlags
, DISPPARAMS
* pDispParams
,
482 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
,
483 unsigned int * puArgErr
)
485 WXOLE_TRACE("IDispatch::Invoke");
487 if (!(wFlags
& DISPATCH_PROPERTYGET
))
492 if (pVarResult
== NULL
)
495 //The most common case is boolean, use as an initial type
496 V_VT(pVarResult
) = VT_BOOL
;
498 switch (dispIdMember
)
500 case DISPID_AMBIENT_MESSAGEREFLECT
:
501 WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT");
502 V_BOOL(pVarResult
)= FALSE
;
505 case DISPID_AMBIENT_DISPLAYASDEFAULT
:
506 WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT");
507 V_BOOL(pVarResult
)= TRUE
;
510 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
511 WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED");
512 V_BOOL(pVarResult
) = TRUE
;
516 case DISPID_AMBIENT_SILENT
:
517 WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT");
518 V_BOOL(pVarResult
)= TRUE
;
521 case DISPID_AMBIENT_APPEARANCE
:
522 pVarResult
->vt
= VT_BOOL
;
523 pVarResult
->boolVal
= m_bAmbientAppearance
;
526 case DISPID_AMBIENT_FORECOLOR
:
527 pVarResult
->vt
= VT_I4
;
528 pVarResult
->lVal
= (long) m_clrAmbientForeColor
;
531 case DISPID_AMBIENT_BACKCOLOR
:
532 pVarResult
->vt
= VT_I4
;
533 pVarResult
->lVal
= (long) m_clrAmbientBackColor
;
536 case DISPID_AMBIENT_LOCALEID
:
537 pVarResult
->vt
= VT_I4
;
538 pVarResult
->lVal
= (long) m_nAmbientLocale
;
541 case DISPID_AMBIENT_USERMODE
:
542 pVarResult
->vt
= VT_BOOL
;
543 pVarResult
->boolVal
= m_window
->m_bAmbientUserMode
;
546 case DISPID_AMBIENT_SHOWGRABHANDLES
:
547 pVarResult
->vt
= VT_BOOL
;
548 pVarResult
->boolVal
= m_bAmbientShowGrabHandles
;
551 case DISPID_AMBIENT_SHOWHATCHING
:
552 pVarResult
->vt
= VT_BOOL
;
553 pVarResult
->boolVal
= m_bAmbientShowHatching
;
557 return DISP_E_MEMBERNOTFOUND
;
565 HRESULT
FrameSite::GetWindow(HWND
* phwnd
)
567 WXOLE_TRACE("IOleWindow::GetWindow");
570 (*phwnd
) = m_hWndParent
;
574 HRESULT
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
)
576 WXOLE_TRACE("IOleWindow::ContextSensitiveHelp");
580 //IOleInPlaceUIWindow
582 HRESULT
FrameSite::GetBorder(LPRECT lprectBorder
)
584 WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder");
585 if (lprectBorder
== NULL
)
587 return INPLACE_E_NOTOOLSPACE
;
590 HRESULT
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
)
592 WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace");
593 if (pborderwidths
== NULL
)
595 return INPLACE_E_NOTOOLSPACE
;
598 HRESULT
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
)
600 WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace");
604 HRESULT
FrameSite::SetActiveObject(IOleInPlaceActiveObject
*pActiveObject
, LPCOLESTR pszObjName
)
606 WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject");
609 pActiveObject
->AddRef();
611 m_window
->m_oleInPlaceActiveObject
= pActiveObject
;
617 HRESULT
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
619 WXOLE_TRACE("IOleInPlaceFrame::InsertMenus");
623 HRESULT
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
)
625 WXOLE_TRACE("IOleInPlaceFrame::SetMenu");
629 HRESULT
FrameSite::RemoveMenus(HMENU hmenuShared
)
631 WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus");
635 HRESULT
FrameSite::SetStatusText(LPCOLESTR pszStatusText
)
637 WXOLE_TRACE("IOleInPlaceFrame::SetStatusText");
638 //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText);
642 HRESULT
FrameSite::EnableModeless(BOOL fEnable
)
644 WXOLE_TRACE("IOleInPlaceFrame::EnableModeless");
648 HRESULT
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
)
650 WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator");
651 // TODO: send an event with this id
652 if (m_window
->m_oleInPlaceActiveObject
.Ok())
653 m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
);
660 HRESULT
FrameSite::CanInPlaceActivate()
662 WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate");
666 HRESULT
FrameSite::OnInPlaceActivate()
668 WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate");
669 m_bInPlaceActive
= true;
673 HRESULT
FrameSite::OnUIActivate()
675 WXOLE_TRACE("IOleInPlaceSite::OnUIActivate");
680 HRESULT
FrameSite::GetWindowContext(IOleInPlaceFrame
**ppFrame
,
681 IOleInPlaceUIWindow
**ppDoc
,
684 LPOLEINPLACEFRAMEINFO lpFrameInfo
)
686 WXOLE_TRACE("IOleInPlaceSite::GetWindowContext");
687 if (ppFrame
== NULL
|| ppDoc
== NULL
|| lprcPosRect
== NULL
||
688 lprcClipRect
== NULL
|| lpFrameInfo
== NULL
)
697 HRESULT hr
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
);
700 WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !");
704 hr
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
);
707 WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !");
708 (*ppFrame
)->Release();
714 m_window
->GetClientSize(&w
, &h
);
717 lprcPosRect
->left
= lprcPosRect
->top
= 0;
718 lprcPosRect
->right
= w
;
719 lprcPosRect
->bottom
= h
;
723 lprcClipRect
->left
= lprcClipRect
->top
= 0;
724 lprcClipRect
->right
= w
;
725 lprcClipRect
->bottom
= h
;
728 memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
));
729 lpFrameInfo
->cb
= sizeof(OLEINPLACEFRAMEINFO
);
730 lpFrameInfo
->hwndFrame
= m_hWndParent
;
735 HRESULT
FrameSite::Scroll(SIZE scrollExtent
)
737 WXOLE_TRACE("IOleInPlaceSite::Scroll");
741 HRESULT
FrameSite::OnUIDeactivate(BOOL fUndoable
)
743 WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate");
748 HRESULT
FrameSite::OnInPlaceDeactivate()
750 WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate");
751 m_bInPlaceActive
= false;
755 HRESULT
FrameSite::DiscardUndoState()
757 WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState");
761 HRESULT
FrameSite::DeactivateAndUndo()
763 WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo");
767 HRESULT
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
)
769 WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange");
770 if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
)
771 m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
);
778 HRESULT
FrameSite::OnInPlaceActivateEx(BOOL
* pfNoRedraw
, DWORD dwFlags
)
780 WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx");
781 OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
);
783 (*pfNoRedraw
) = FALSE
;
787 HRESULT
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
)
789 WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx");
790 OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
);
794 HRESULT
FrameSite::RequestUIActivate()
796 WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate");
803 HRESULT
FrameSite::SaveObject()
805 WXOLE_TRACE("IOleClientSite::SaveObject");
809 HRESULT
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
,
812 WXOLE_TRACE("IOleClientSite::GetMoniker");
816 HRESULT
FrameSite::GetContainer(LPOLECONTAINER
* ppContainer
)
818 WXOLE_TRACE("IOleClientSite::GetContainer");
819 if (ppContainer
== NULL
)
822 HRESULT hr
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
));
823 wxASSERT(SUCCEEDED(hr
));
828 HRESULT
FrameSite::ShowObject()
830 WXOLE_TRACE("IOleClientSite::ShowObject");
834 HRESULT
FrameSite::OnShowWindow(BOOL fShow
)
836 WXOLE_TRACE("IOleClientSite::OnShowWindow");
840 HRESULT
FrameSite::RequestNewObjectLayout()
842 WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout");
848 HRESULT
FrameSite::ParseDisplayName(IBindCtx
*pbc
, LPOLESTR pszDisplayName
,
849 ULONG
*pchEaten
, IMoniker
**ppmkOut
)
851 WXOLE_TRACE("IParseDisplayName::ParseDisplayName");
857 HRESULT
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown
**ppenum
)
859 WXOLE_TRACE("IOleContainer::EnumObjects");
863 HRESULT
FrameSite::LockContainer(BOOL fLock
)
865 WXOLE_TRACE("IOleContainer::LockContainer");
872 HRESULT
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
,
873 IBindCtx
* pbc
, REFIID riid
, void ** ppvObject
)
875 WXOLE_TRACE("IOleItemContainer::GetObject");
878 if (ppvObject
== NULL
)
882 return MK_E_NOOBJECT
;
885 HRESULT
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx
* pbc
,
886 REFIID riid
, void ** ppvStorage
)
888 WXOLE_TRACE("IOleItemContainer::GetObjectStorage");
891 if (ppvStorage
== NULL
)
895 return MK_E_NOOBJECT
;
898 HRESULT
FrameSite::IsRunning(LPOLESTR pszItem
)
900 WXOLE_TRACE("IOleItemContainer::IsRunning");
904 return MK_E_NOOBJECT
;
911 HRESULT
FrameSite::OnControlInfoChanged()
913 WXOLE_TRACE("IOleControlSite::OnControlInfoChanged");
917 HRESULT
FrameSite::LockInPlaceActive(BOOL fLock
)
919 WXOLE_TRACE("IOleControlSite::LockInPlaceActive");
920 m_bInPlaceLocked
= (fLock
) ? true : false;
924 HRESULT
FrameSite::GetExtendedControl(IDispatch
** ppDisp
)
926 WXOLE_TRACE("IOleControlSite::GetExtendedControl");
930 HRESULT
FrameSite::TransformCoords(POINTL
* pPtlHimetric
, POINTF
* pPtfContainer
, DWORD dwFlags
)
932 WXOLE_TRACE("IOleControlSite::TransformCoords");
935 if (pPtlHimetric
== NULL
)
938 if (pPtfContainer
== NULL
)
945 HRESULT
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
)
947 WXOLE_TRACE("IOleControlSite::TranslateAccelerator");
948 // TODO: send an event with this id
952 HRESULT
FrameSite::OnFocus(BOOL fGotFocus
)
954 WXOLE_TRACE("IOleControlSite::OnFocus");
958 HRESULT
FrameSite::ShowPropertyFrame()
960 WXOLE_TRACE("IOleControlSite::ShowPropertyFrame");
966 HRESULT
FrameSite::QueryStatus(const GUID
* pguidCmdGroup
, ULONG cCmds
,
967 OLECMD
* prgCmds
, OLECMDTEXT
* pCmdTet
)
969 WXOLE_TRACE("IOleCommandTarget::QueryStatus");
970 if (prgCmds
== NULL
) return E_INVALIDARG
;
971 bool bCmdGroupFound
= false;
973 for (ULONG nCmd
= 0; nCmd
< cCmds
; nCmd
++)
975 // unsupported by default
976 prgCmds
[nCmd
].cmdf
= 0;
981 if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; }
985 HRESULT
FrameSite::Exec(const GUID
* pguidCmdGroup
, DWORD nCmdID
,
986 DWORD nCmdExecOpt
, VARIANTARG
* pVaIn
,
989 WXOLE_TRACE("IOleCommandTarget::Exec");
990 bool bCmdGroupFound
= false;
992 if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; }
993 return OLECMDERR_E_NOTSUPPORTED
;
998 void STDMETHODCALLTYPE
FrameSite::OnDataChange(FORMATETC
* pFormatEtc
, STGMEDIUM
* pgStgMed
)
1000 WXOLE_TRACE("IAdviseSink::OnDataChange");
1003 void STDMETHODCALLTYPE
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
)
1005 WXOLE_TRACE("IAdviseSink::OnViewChange");
1006 // redraw the control
1009 void STDMETHODCALLTYPE
FrameSite::OnRename(IMoniker
* pmk
)
1011 WXOLE_TRACE("IAdviseSink::OnRename");
1014 void STDMETHODCALLTYPE
FrameSite::OnSave()
1016 WXOLE_TRACE("IAdviseSink::OnSave");
1019 void STDMETHODCALLTYPE
FrameSite::OnClose()
1021 WXOLE_TRACE("IAdviseSink::OnClose");
1024 /////////////////////////////////////////////
1026 HRESULT STDMETHODCALLTYPE
FrameSite::ActivateMe(
1027 /* [in] */ IOleDocumentView __RPC_FAR
*pViewToActivate
)
1029 wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch
*) this);
1030 if (!inPlaceSite
.Ok())
1033 if (pViewToActivate
)
1035 m_window
->m_docView
= pViewToActivate
;
1036 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
1040 wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
);
1044 HRESULT hr
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef());
1048 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
1051 m_window
->m_docView
->UIActivate(TRUE
);
1058 static IMalloc
*iMalloc
= NULL
;
1060 IMalloc
*wxOleInit::GetIMalloc()
1066 wxOleInit::wxOleInit()
1068 if (OleInitialize(NULL
) == S_OK
&& iMalloc
== NULL
)
1069 CoGetMalloc(1, &iMalloc
);
1074 wxOleInit::~wxOleInit()
1078 if (iMalloc
->Release() == 0)
1085 wxString
OLEHResultToString(HRESULT hr
)
1092 case OLECMDERR_E_UNKNOWNGROUP
:
1093 return "The pguidCmdGroup parameter is not NULL but does not specify a recognized command group.";
1095 case OLECMDERR_E_NOTSUPPORTED
:
1096 return "The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup.";
1098 case OLECMDERR_E_DISABLED
:
1099 return "The command identified by nCmdID is currently disabled and cannot be executed.";
1101 case OLECMDERR_E_NOHELP
:
1102 return "The caller has asked for help on the command identified by nCmdID, but no help is available.";
1104 case OLECMDERR_E_CANCELED
:
1105 return "The user canceled the execution of the command.";
1108 return "E_INVALIDARG";
1111 return "E_OUTOFMEMORY";
1114 return "E_NOINTERFACE";
1117 return "E_UNEXPECTED";
1119 case STG_E_INVALIDFLAG
:
1120 return "STG_E_INVALIDFLAG";
1131 sprintf(buf
, "Unknown - 0x%X", hr
);
1132 return wxString(buf
);
1137 // borrowed from src/msw/ole/oleutils.cpp
1138 wxString
GetIIDName(REFIID riid
)
1140 // an association between symbolic name and numeric value of an IID
1144 const wxChar
*szName
;
1147 // construct the table containing all known interfaces
1148 #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) }
1150 static const KNOWN_IID aKnownIids
[] =
1152 ADD_KNOWN_IID(AdviseSink
),
1153 ADD_KNOWN_IID(AdviseSink2
),
1154 ADD_KNOWN_IID(BindCtx
),
1155 ADD_KNOWN_IID(ClassFactory
),
1156 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__)
1157 ADD_KNOWN_IID(ContinueCallback
),
1158 ADD_KNOWN_IID(EnumOleDocumentViews
),
1159 ADD_KNOWN_IID(OleCommandTarget
),
1160 ADD_KNOWN_IID(OleDocument
),
1161 ADD_KNOWN_IID(OleDocumentSite
),
1162 ADD_KNOWN_IID(OleDocumentView
),
1163 ADD_KNOWN_IID(Print
),
1165 ADD_KNOWN_IID(DataAdviseHolder
),
1166 ADD_KNOWN_IID(DataObject
),
1167 ADD_KNOWN_IID(Debug
),
1168 ADD_KNOWN_IID(DebugStream
),
1169 ADD_KNOWN_IID(DfReserved1
),
1170 ADD_KNOWN_IID(DfReserved2
),
1171 ADD_KNOWN_IID(DfReserved3
),
1172 ADD_KNOWN_IID(Dispatch
),
1173 ADD_KNOWN_IID(DropSource
),
1174 ADD_KNOWN_IID(DropTarget
),
1175 ADD_KNOWN_IID(EnumCallback
),
1176 ADD_KNOWN_IID(EnumFORMATETC
),
1177 ADD_KNOWN_IID(EnumGeneric
),
1178 ADD_KNOWN_IID(EnumHolder
),
1179 ADD_KNOWN_IID(EnumMoniker
),
1180 ADD_KNOWN_IID(EnumOLEVERB
),
1181 ADD_KNOWN_IID(EnumSTATDATA
),
1182 ADD_KNOWN_IID(EnumSTATSTG
),
1183 ADD_KNOWN_IID(EnumString
),
1184 ADD_KNOWN_IID(EnumUnknown
),
1185 ADD_KNOWN_IID(EnumVARIANT
),
1186 ADD_KNOWN_IID(ExternalConnection
),
1187 ADD_KNOWN_IID(InternalMoniker
),
1188 ADD_KNOWN_IID(LockBytes
),
1189 ADD_KNOWN_IID(Malloc
),
1190 ADD_KNOWN_IID(Marshal
),
1191 ADD_KNOWN_IID(MessageFilter
),
1192 ADD_KNOWN_IID(Moniker
),
1193 ADD_KNOWN_IID(OleAdviseHolder
),
1194 ADD_KNOWN_IID(OleCache
),
1195 ADD_KNOWN_IID(OleCache2
),
1196 ADD_KNOWN_IID(OleCacheControl
),
1197 ADD_KNOWN_IID(OleClientSite
),
1198 ADD_KNOWN_IID(OleContainer
),
1199 ADD_KNOWN_IID(OleInPlaceActiveObject
),
1200 ADD_KNOWN_IID(OleInPlaceFrame
),
1201 ADD_KNOWN_IID(OleInPlaceObject
),
1202 ADD_KNOWN_IID(OleInPlaceSite
),
1203 ADD_KNOWN_IID(OleInPlaceUIWindow
),
1204 ADD_KNOWN_IID(OleItemContainer
),
1205 ADD_KNOWN_IID(OleLink
),
1206 ADD_KNOWN_IID(OleManager
),
1207 ADD_KNOWN_IID(OleObject
),
1208 ADD_KNOWN_IID(OlePresObj
),
1209 ADD_KNOWN_IID(OleWindow
),
1210 ADD_KNOWN_IID(PSFactory
),
1211 ADD_KNOWN_IID(ParseDisplayName
),
1212 ADD_KNOWN_IID(Persist
),
1213 ADD_KNOWN_IID(PersistFile
),
1214 ADD_KNOWN_IID(PersistStorage
),
1215 ADD_KNOWN_IID(PersistStream
),
1216 ADD_KNOWN_IID(ProxyManager
),
1217 ADD_KNOWN_IID(RootStorage
),
1218 ADD_KNOWN_IID(RpcChannel
),
1219 ADD_KNOWN_IID(RpcProxy
),
1220 ADD_KNOWN_IID(RpcStub
),
1221 ADD_KNOWN_IID(RunnableObject
),
1222 ADD_KNOWN_IID(RunningObjectTable
),
1223 ADD_KNOWN_IID(StdMarshalInfo
),
1224 ADD_KNOWN_IID(Storage
),
1225 ADD_KNOWN_IID(Stream
),
1226 ADD_KNOWN_IID(StubManager
),
1227 ADD_KNOWN_IID(Unknown
),
1228 ADD_KNOWN_IID(ViewObject
),
1229 ADD_KNOWN_IID(ViewObject2
),
1232 // don't clobber preprocessor name space
1233 #undef ADD_KNOWN_IID
1235 // try to find the interface in the table
1236 for ( size_t ui
= 0; ui
< WXSIZEOF(aKnownIids
); ui
++ )
1238 if ( riid
== *aKnownIids
[ui
].pIid
)
1240 return aKnownIids
[ui
].szName
;
1244 // unknown IID, just transform to string
1245 LPOLESTR str
= NULL
;
1246 StringFromIID(riid
, &str
);
1254 return "StringFromIID() error";