diff options
Diffstat (limited to 'chrome_frame/ole_document_impl.h')
-rw-r--r-- | chrome_frame/ole_document_impl.h | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/chrome_frame/ole_document_impl.h b/chrome_frame/ole_document_impl.h new file mode 100644 index 0000000..4c346d8 --- /dev/null +++ b/chrome_frame/ole_document_impl.h @@ -0,0 +1,253 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// TODO(slightlyoff): Add any required LICENSE block changes for MSFT code +// inclusion. + +// ole_document_impl.h : IOleDocument implementation +// +// This file is a modified version of the OleDocument.h file, which is +// part of the ActiveDoc MSDN sample. The modifications are largely +// conversions to Google coding guidelines. Below if the original header +// from the file. + +// This is a part of the Active Template Library. +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is only intended as a supplement to the +// Active Template Library Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Active Template Library product. + +#ifndef CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ +#define CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ + +// TODO(sanjeevr): Revisit this impl file and cleanup dependencies +#include <atlbase.h> +#include <docobj.h> + +#include "base/logging.h" + +////////////////////////////////////////////////////////////////////////////// +// IOleDocumentImpl +template <class T> +class ATL_NO_VTABLE IOleDocumentImpl : public IOleDocument { + public: + STDMETHOD(CreateView)(IOleInPlaceSite* in_place_site, + IStream* stream, + DWORD reserved , + IOleDocumentView** new_view) { + DLOG(INFO) << __FUNCTION__; + if (new_view == NULL) + return E_POINTER; + T* t = static_cast<T*>(this); + // If we've already created a view then we can't create another as we + // currently only support the ability to create one view + if (t->m_spInPlaceSite) { + return E_FAIL; + } + IOleDocumentView* view; + t->GetUnknown()->QueryInterface(IID_IOleDocumentView, + reinterpret_cast<void**>(&view)); + // If we support IOleDocument we should support IOleDocumentView + ATLENSURE(view != NULL); + // If they've given us a site then use it + if (in_place_site != NULL) { + view->SetInPlaceSite(in_place_site); + } + // If they have given us an IStream pointer then use it to + // initialize the view + if (stream != NULL) { + view->ApplyViewState(stream); + } + // Return the view + *new_view = view; + return S_OK; + } + + STDMETHOD(GetDocMiscStatus)(DWORD* status) { + DLOG(INFO) << __FUNCTION__; + if (NULL == status) { + return E_POINTER; + } + *status = DOCMISC_NOFILESUPPORT; + return S_OK; + } + + STDMETHOD(EnumViews)(IEnumOleDocumentViews** enum_views, + IOleDocumentView** view) { + DLOG(INFO) << __FUNCTION__; + if (view == NULL) + return E_POINTER; + T* t = static_cast<T*>(this); + // We only support one view + return t->_InternalQueryInterface(IID_IOleDocumentView, + reinterpret_cast<void**>(view)); + } +}; + +////////////////////////////////////////////////////////////////////////////// +// IOleDocumentViewImpl + +template <class T> +class ATL_NO_VTABLE IOleDocumentViewImpl : public IOleDocumentView { + public: + STDMETHOD(SetInPlaceSite)(IOleInPlaceSite* in_place_site) { + DLOG(INFO) << __FUNCTION__; + T* t = static_cast<T*>(this); + if (t->m_spInPlaceSite) { + // If we already have a site get rid of it + UIActivate(FALSE); + HRESULT hr = t->InPlaceDeactivate(); + if (FAILED(hr)) { + return hr; + } + DCHECK(!t->m_bInPlaceActive); + } + if (in_place_site != NULL) { + t->m_spInPlaceSite.Release(); + in_place_site->QueryInterface( + IID_IOleInPlaceSiteWindowless, + reinterpret_cast<void **>(&t->m_spInPlaceSite)); + if (!t->m_spInPlaceSite) { + // TODO(sanjeevr): This is a super-hack because m_spInPlaceSite + // is an IOleInPlaceSiteWindowless pointer and we are setting + // an IOleInPlaceSite pointer into it. The problem is that ATL + // (CComControlBase) uses this in a schizophrenic manner based + // on the m_bWndLess flag. Ouch, ouch, ouch! Find a way to clean + // this up. + // Disclaimer: I did not invent this hack, it exists in the MSDN + // sample from where this code has been derived and it also exists + // in ATL itself (look at atlctl.h line 938). + t->m_spInPlaceSite = + reinterpret_cast<IOleInPlaceSiteWindowless*>(in_place_site); + } + } + return S_OK; + } + + STDMETHOD(GetInPlaceSite)(IOleInPlaceSite** in_place_site) { + DLOG(INFO) << __FUNCTION__; + if (in_place_site == NULL) { + return E_POINTER; + } + T* t = static_cast<T*>(this); + return t->m_spInPlaceSite->QueryInterface( + IID_IOleInPlaceSite, + reinterpret_cast<LPVOID *>(in_place_site)); + } + + STDMETHOD(GetDocument)(IUnknown** document) { + DLOG(INFO) << __FUNCTION__; + if (document == NULL) { + return E_POINTER; + } + T* t = static_cast<T*>(this); + *document = t->GetUnknown(); + (*document)->AddRef(); + return S_OK; + } + + STDMETHOD(SetRect)(LPRECT view_rect) { + static bool is_resizing = false; + if (is_resizing) { + return S_OK; + } + is_resizing = true; + DLOG(INFO) << __FUNCTION__ << " " << view_rect->left << "," << + view_rect->top << "," << view_rect->right << "," << view_rect->bottom; + T* t = static_cast<T*>(this); + t->SetObjectRects(view_rect, view_rect); + is_resizing = false; + return S_OK; + } + + STDMETHOD(GetRect)(LPRECT view_rect) { + DLOG(INFO) << __FUNCTION__; + if (view_rect == NULL) { + return E_POINTER; + } + T* t = static_cast<T*>(this); + *view_rect = t->m_rcPos; + return S_OK; + } + + STDMETHOD(SetRectComplex)(LPRECT view_rect, + LPRECT hscroll_rect, + LPRECT vscroll_rect, + LPRECT size_box_rect) { + DLOG(INFO) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(Show)(BOOL show) { + DLOG(INFO) << __FUNCTION__; + T* t = static_cast<T*>(this); + HRESULT hr = S_OK; + if (show) { + if (!t->m_bUIActive) + hr = t->ActiveXDocActivate(OLEIVERB_INPLACEACTIVATE); + } else { + hr = t->UIActivate(FALSE); + ::ShowWindow(t->m_hWnd, SW_HIDE); + } + return hr; + } + + STDMETHOD(UIActivate)(BOOL ui_activate) { + DLOG(INFO) << __FUNCTION__; + T* t = static_cast<T*>(this); + HRESULT hr = S_OK; + if (ui_activate) { + // We must know the client site first + if (t->m_spInPlaceSite == NULL) { + return E_UNEXPECTED; + } + if (!t->m_bUIActive) { + hr = t->ActiveXDocActivate(OLEIVERB_UIACTIVATE); + } + } else { + t->InPlaceMenuDestroy(); + // t->DestroyToolbar(); + hr = t->UIDeactivate(); + } + return hr; + } + + STDMETHOD(Open)() { + DLOG(INFO) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(CloseView)(DWORD reserved) { + DLOG(INFO) << __FUNCTION__; + T* t = static_cast<T*>(this); + t->Show(FALSE); + t->SetInPlaceSite(NULL); + return S_OK; + } + + STDMETHOD(SaveViewState)(LPSTREAM stream) { + DLOG(INFO) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(ApplyViewState)(LPSTREAM stream) { + DLOG(INFO) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(Clone)(IOleInPlaceSite* new_in_place_site, + IOleDocumentView** new_view) { + DLOG(INFO) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + HRESULT ActiveXDocActivate(LONG verb) { + return E_NOTIMPL; + } +}; + +#endif // CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ |