OLD | NEW |
| (Empty) |
1 // ole_document_impl.h : IOleDocument implementation | |
2 // | |
3 // This file is a modified version of the OleDocument.h file, which is | |
4 // part of the ActiveDoc MSDN sample. The modifications are largely | |
5 // conversions to Google coding guidelines. Below if the original header | |
6 // from the file. | |
7 | |
8 // This is a part of the Active Template Library. | |
9 // Copyright (c) Microsoft Corporation. All rights reserved. | |
10 // | |
11 // This source code is only intended as a supplement to the | |
12 // Active Template Library Reference and related | |
13 // electronic documentation provided with the library. | |
14 // See these sources for detailed information regarding the | |
15 // Active Template Library product. | |
16 | |
17 #ifndef CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ | |
18 #define CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ | |
19 | |
20 // TODO(sanjeevr): Revisit this impl file and cleanup dependencies | |
21 #include <atlbase.h> | |
22 #include <docobj.h> | |
23 | |
24 #include "base/logging.h" | |
25 | |
26 ////////////////////////////////////////////////////////////////////////////// | |
27 // IOleDocumentImpl | |
28 template <class T> | |
29 class ATL_NO_VTABLE IOleDocumentImpl : public IOleDocument { | |
30 public: | |
31 STDMETHOD(CreateView)(IOleInPlaceSite* in_place_site, | |
32 IStream* stream, | |
33 DWORD reserved , | |
34 IOleDocumentView** new_view) { | |
35 DVLOG(1) << __FUNCTION__; | |
36 if (new_view == NULL) | |
37 return E_POINTER; | |
38 T* t = static_cast<T*>(this); | |
39 // If we've already created a view then we can't create another as we | |
40 // currently only support the ability to create one view | |
41 if (t->m_spInPlaceSite) | |
42 return E_FAIL; | |
43 IOleDocumentView* view; | |
44 t->GetUnknown()->QueryInterface(IID_IOleDocumentView, | |
45 reinterpret_cast<void**>(&view)); | |
46 // If we support IOleDocument we should support IOleDocumentView | |
47 ATLENSURE(view != NULL); | |
48 // If they've given us a site then use it | |
49 if (in_place_site != NULL) | |
50 view->SetInPlaceSite(in_place_site); | |
51 // If they have given us an IStream pointer then use it to | |
52 // initialize the view | |
53 if (stream != NULL) | |
54 view->ApplyViewState(stream); | |
55 // Return the view | |
56 *new_view = view; | |
57 return S_OK; | |
58 } | |
59 | |
60 STDMETHOD(GetDocMiscStatus)(DWORD* status) { | |
61 DVLOG(1) << __FUNCTION__; | |
62 if (NULL == status) | |
63 return E_POINTER; | |
64 *status = DOCMISC_NOFILESUPPORT; | |
65 return S_OK; | |
66 } | |
67 | |
68 STDMETHOD(EnumViews)(IEnumOleDocumentViews** enum_views, | |
69 IOleDocumentView** view) { | |
70 DVLOG(1) << __FUNCTION__; | |
71 if (view == NULL) | |
72 return E_POINTER; | |
73 T* t = static_cast<T*>(this); | |
74 // We only support one view | |
75 return t->_InternalQueryInterface(IID_IOleDocumentView, | |
76 reinterpret_cast<void**>(view)); | |
77 } | |
78 }; | |
79 | |
80 ////////////////////////////////////////////////////////////////////////////// | |
81 // IOleDocumentViewImpl | |
82 | |
83 template <class T> | |
84 class ATL_NO_VTABLE IOleDocumentViewImpl : public IOleDocumentView { | |
85 public: | |
86 STDMETHOD(SetInPlaceSite)(IOleInPlaceSite* in_place_site) { | |
87 DVLOG(1) << __FUNCTION__; | |
88 T* t = static_cast<T*>(this); | |
89 if (t->m_spInPlaceSite) { | |
90 // If we already have a site get rid of it | |
91 UIActivate(FALSE); | |
92 HRESULT hr = t->InPlaceDeactivate(); | |
93 if (FAILED(hr)) | |
94 return hr; | |
95 DCHECK(!t->m_bInPlaceActive); | |
96 } | |
97 if (in_place_site != NULL) { | |
98 t->m_spInPlaceSite.Release(); | |
99 in_place_site->QueryInterface( | |
100 IID_IOleInPlaceSiteWindowless, | |
101 reinterpret_cast<void **>(&t->m_spInPlaceSite)); | |
102 if (!t->m_spInPlaceSite) { | |
103 // TODO(sanjeevr): This is a super-hack because m_spInPlaceSite | |
104 // is an IOleInPlaceSiteWindowless pointer and we are setting | |
105 // an IOleInPlaceSite pointer into it. The problem is that ATL | |
106 // (CComControlBase) uses this in a schizophrenic manner based | |
107 // on the m_bWndLess flag. Ouch, ouch, ouch! Find a way to clean | |
108 // this up. | |
109 // Disclaimer: I did not invent this hack, it exists in the MSDN | |
110 // sample from where this code has been derived and it also exists | |
111 // in ATL itself (look at atlctl.h line 938). | |
112 t->m_spInPlaceSite = | |
113 reinterpret_cast<IOleInPlaceSiteWindowless*>(in_place_site); | |
114 } | |
115 } | |
116 return S_OK; | |
117 } | |
118 | |
119 STDMETHOD(GetInPlaceSite)(IOleInPlaceSite** in_place_site) { | |
120 DVLOG(1) << __FUNCTION__; | |
121 if (in_place_site == NULL) | |
122 return E_POINTER; | |
123 T* t = static_cast<T*>(this); | |
124 return t->m_spInPlaceSite->QueryInterface( | |
125 IID_IOleInPlaceSite, | |
126 reinterpret_cast<LPVOID *>(in_place_site)); | |
127 } | |
128 | |
129 STDMETHOD(GetDocument)(IUnknown** document) { | |
130 DVLOG(1) << __FUNCTION__; | |
131 if (document == NULL) | |
132 return E_POINTER; | |
133 T* t = static_cast<T*>(this); | |
134 *document = t->GetUnknown(); | |
135 (*document)->AddRef(); | |
136 return S_OK; | |
137 } | |
138 | |
139 STDMETHOD(SetRect)(LPRECT view_rect) { | |
140 static bool is_resizing = false; | |
141 if (is_resizing) | |
142 return S_OK; | |
143 is_resizing = true; | |
144 DVLOG(1) << __FUNCTION__ << " " << view_rect->left << "," | |
145 << view_rect->top << "," << view_rect->right << "," | |
146 << view_rect->bottom; | |
147 T* t = static_cast<T*>(this); | |
148 t->SetObjectRects(view_rect, view_rect); | |
149 is_resizing = false; | |
150 return S_OK; | |
151 } | |
152 | |
153 STDMETHOD(GetRect)(LPRECT view_rect) { | |
154 DVLOG(1) << __FUNCTION__; | |
155 if (view_rect == NULL) | |
156 return E_POINTER; | |
157 T* t = static_cast<T*>(this); | |
158 *view_rect = t->m_rcPos; | |
159 return S_OK; | |
160 } | |
161 | |
162 STDMETHOD(SetRectComplex)(LPRECT view_rect, | |
163 LPRECT hscroll_rect, | |
164 LPRECT vscroll_rect, | |
165 LPRECT size_box_rect) { | |
166 DVLOG(1) << __FUNCTION__ << " not implemented"; | |
167 return E_NOTIMPL; | |
168 } | |
169 | |
170 STDMETHOD(Show)(BOOL show) { | |
171 DVLOG(1) << __FUNCTION__; | |
172 T* t = static_cast<T*>(this); | |
173 HRESULT hr = S_OK; | |
174 if (show) { | |
175 if (!t->m_bUIActive) | |
176 hr = t->ActiveXDocActivate(OLEIVERB_INPLACEACTIVATE); | |
177 } else { | |
178 hr = t->UIActivate(FALSE); | |
179 ::ShowWindow(t->m_hWnd, SW_HIDE); | |
180 } | |
181 return hr; | |
182 } | |
183 | |
184 STDMETHOD(UIActivate)(BOOL ui_activate) { | |
185 DVLOG(1) << __FUNCTION__; | |
186 T* t = static_cast<T*>(this); | |
187 HRESULT hr = S_OK; | |
188 if (ui_activate) { | |
189 // We must know the client site first | |
190 if (t->m_spInPlaceSite == NULL) | |
191 return E_UNEXPECTED; | |
192 if (!t->m_bUIActive) | |
193 hr = t->ActiveXDocActivate(OLEIVERB_UIACTIVATE); | |
194 } else { | |
195 // Menu integration is still not complete, so do not destroy | |
196 // IE's menus. If we call InPlaceMenuDestroy here, menu items such | |
197 // as Print etc will be disabled and we will not get calls to QueryStatus | |
198 // for those commands. | |
199 // t->InPlaceMenuDestroy(); | |
200 // t->DestroyToolbar(); | |
201 hr = t->UIDeactivate(); | |
202 } | |
203 return hr; | |
204 } | |
205 | |
206 STDMETHOD(Open)() { | |
207 DVLOG(1) << __FUNCTION__ << " not implemented"; | |
208 return E_NOTIMPL; | |
209 } | |
210 | |
211 STDMETHOD(CloseView)(DWORD reserved) { | |
212 DVLOG(1) << __FUNCTION__; | |
213 T* t = static_cast<T*>(this); | |
214 t->Show(FALSE); | |
215 t->SetInPlaceSite(NULL); | |
216 return S_OK; | |
217 } | |
218 | |
219 STDMETHOD(SaveViewState)(LPSTREAM stream) { | |
220 DVLOG(1) << __FUNCTION__ << " not implemented"; | |
221 return E_NOTIMPL; | |
222 } | |
223 | |
224 STDMETHOD(ApplyViewState)(LPSTREAM stream) { | |
225 DVLOG(1) << __FUNCTION__ << " not implemented"; | |
226 return E_NOTIMPL; | |
227 } | |
228 | |
229 STDMETHOD(Clone)(IOleInPlaceSite* new_in_place_site, | |
230 IOleDocumentView** new_view) { | |
231 DVLOG(1) << __FUNCTION__ << " not implemented"; | |
232 return E_NOTIMPL; | |
233 } | |
234 | |
235 HRESULT ActiveXDocActivate(LONG verb) { | |
236 return E_NOTIMPL; | |
237 } | |
238 }; | |
239 | |
240 #endif // CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ | |
OLD | NEW |