diff options
author | amit@chromium.org <amit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-03 22:33:46 +0000 |
---|---|---|
committer | amit@chromium.org <amit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-03 22:33:46 +0000 |
commit | f6985243ea050cb848843faf4b63049f5285dce7 (patch) | |
tree | 0f6b63aaeffefa25ac104d9121847ee0a254bfd4 /third_party/active_doc/ole_document_impl.h | |
parent | 52dde0af9ceba4d770c07a37d5ef93d230c4290b (diff) | |
download | chromium_src-f6985243ea050cb848843faf4b63049f5285dce7.zip chromium_src-f6985243ea050cb848843faf4b63049f5285dce7.tar.gz chromium_src-f6985243ea050cb848843faf4b63049f5285dce7.tar.bz2 |
Move modified ATL sample code to third_party
No code modifications other than removing chromium licence block.
BUG=80617
TEST=none
Review URL: http://codereview.chromium.org/6901059
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@83979 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/active_doc/ole_document_impl.h')
-rw-r--r-- | third_party/active_doc/ole_document_impl.h | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/third_party/active_doc/ole_document_impl.h b/third_party/active_doc/ole_document_impl.h new file mode 100644 index 0000000..466c227 --- /dev/null +++ b/third_party/active_doc/ole_document_impl.h @@ -0,0 +1,240 @@ +// 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) { + DVLOG(1) << __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) { + DVLOG(1) << __FUNCTION__; + if (NULL == status) + return E_POINTER; + *status = DOCMISC_NOFILESUPPORT; + return S_OK; + } + + STDMETHOD(EnumViews)(IEnumOleDocumentViews** enum_views, + IOleDocumentView** view) { + DVLOG(1) << __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) { + DVLOG(1) << __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) { + DVLOG(1) << __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) { + DVLOG(1) << __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; + DVLOG(1) << __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) { + DVLOG(1) << __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) { + DVLOG(1) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(Show)(BOOL show) { + DVLOG(1) << __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) { + DVLOG(1) << __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 { + // Menu integration is still not complete, so do not destroy + // IE's menus. If we call InPlaceMenuDestroy here, menu items such + // as Print etc will be disabled and we will not get calls to QueryStatus + // for those commands. + // t->InPlaceMenuDestroy(); + // t->DestroyToolbar(); + hr = t->UIDeactivate(); + } + return hr; + } + + STDMETHOD(Open)() { + DVLOG(1) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(CloseView)(DWORD reserved) { + DVLOG(1) << __FUNCTION__; + T* t = static_cast<T*>(this); + t->Show(FALSE); + t->SetInPlaceSite(NULL); + return S_OK; + } + + STDMETHOD(SaveViewState)(LPSTREAM stream) { + DVLOG(1) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(ApplyViewState)(LPSTREAM stream) { + DVLOG(1) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + STDMETHOD(Clone)(IOleInPlaceSite* new_in_place_site, + IOleDocumentView** new_view) { + DVLOG(1) << __FUNCTION__ << " not implemented"; + return E_NOTIMPL; + } + + HRESULT ActiveXDocActivate(LONG verb) { + return E_NOTIMPL; + } +}; + +#endif // CHROME_FRAME_OLE_DOCUMENT_IMPL_H_ |