| Index: chrome_frame/ole_document_impl.h
|
| ===================================================================
|
| --- chrome_frame/ole_document_impl.h (revision 0)
|
| +++ chrome_frame/ole_document_impl.h (revision 0)
|
| @@ -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_
|
|
|