home *** CD-ROM | disk | FTP | other *** search
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
-
- #ifdef AFX_OLE2_SEG
- #pragma code_seg(AFX_OLE2_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- #define new DEBUG_NEW
-
- /////////////////////////////////////////////////////////////////////////////
- // User interface for COleClientItem
-
- BOOL COleClientItem::ReportError(SCODE sc) const
- // return TRUE if error or warning reported
- {
- ASSERT_VALID(this);
- UINT nIDPrompt = 0;
-
- switch (sc)
- {
- case OLE_E_STATIC:
- nIDPrompt = AFX_IDP_STATIC_OBJECT;
- break;
-
- case E_NOINTERFACE:
- case E_NOTIMPL:
- case E_FAIL:
- nIDPrompt = AFX_IDP_FAILED_TO_CONNECT;
- break;
-
- case E_OUTOFMEMORY:
- nIDPrompt = AFX_IDP_FAILED_MEMORY_ALLOC;
- break;
-
- default:
- return FALSE; // nothing sensible to report
- }
-
- ASSERT(nIDPrompt != 0);
- AfxMessageBox(nIDPrompt);
- return TRUE;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // Item activation
-
- BOOL COleClientItem::DoVerb(LONG nVerb, CView* pView, LPMSG lpMsg)
- {
- ASSERT_VALID(this);
- if (pView != NULL)
- ASSERT_VALID(pView);
- if (lpMsg != NULL)
- ASSERT(AfxIsValidAddress(lpMsg, sizeof(MSG), FALSE));
-
- TRY
- {
- Activate(nVerb, pView, lpMsg);
- }
- CATCH(COleException, e)
- {
- // catch OLE errors and report them as such
- if (!ReportError(e->m_sc))
- AfxMessageBox(AFX_IDP_FAILED_TO_LAUNCH);
- DELETE_EXCEPTION(e);
- return FALSE;
- }
- AND_CATCH_ALL(e)
- {
- // otherwise, show generic error
- AfxMessageBox(AFX_IDP_FAILED_TO_LAUNCH);
- DELETE_EXCEPTION(e);
- return FALSE;
- }
- END_CATCH_ALL
-
- return TRUE;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // COleClientDoc - user interface implementation
- // (functions reside in COleDocument to enable them on the server as well)
-
- BOOL COleDocument::OnCmdMsg(UINT nID, int nCode, void* pExtra,
- AFX_CMDHANDLERINFO* pHandlerInfo)
- {
- ASSERT_VALID(this);
-
- if (nCode == CN_COMMAND && nID >= ID_OLE_VERB_FIRST && nID <= ID_OLE_VERB_LAST)
- {
- CView* pRoutingView = GetRoutingView_();
- COleClientItem* pSel = GetPrimarySelectedItem(pRoutingView);
- if (pSel != NULL)
- {
- if (pHandlerInfo != NULL) // routing test
- {
- pHandlerInfo->pTarget = this;
- return TRUE; // would be handled here
- }
-
- // activate the current selection with the appropriate verb
- CWaitCursor wait;
- pSel->DoVerb(nID - ID_OLE_VERB_FIRST, pRoutingView);
- return TRUE; // handled
- }
- }
- return CDocument::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
- }
-
- COleClientItem* COleDocument::GetPrimarySelectedItem(CView* pView)
- {
- ASSERT_VALID(this);
- ASSERT(pView != NULL);
- ASSERT_VALID(pView);
-
- COleClientItem* pSelectedItem = NULL;
-
- // walk all items in the document - return one if there
- // is only one client item selected
- // (note: non OLE client items are ignored)
- POSITION pos = GetStartPosition();
- COleClientItem* pItem;
- while ((pItem = GetNextClientItem(pos)) != NULL)
- {
- if (pView->IsSelected(pItem))
- {
- // client item selected in
- if (pSelectedItem != NULL)
- return NULL; // more than one - no primary selection
- pSelectedItem = pItem;
- }
- }
- return pSelectedItem;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // In-place item handling
-
- COleClientItem* COleDocument::GetInPlaceActiveItem(CWnd* pWnd)
- {
- ASSERT_VALID(this);
- ASSERT(pWnd != NULL);
- ASSERT_VALID(pWnd);
-
- // check for any item active on the immediate frame of pWndContainer
- // (two active objects on same frame are not supported)
- if (!pWnd->IsFrameWnd())
- {
- CFrameWnd* pFrameWnd = pWnd->GetParentFrame();
- if (pFrameWnd != NULL)
- pWnd = pFrameWnd;
- }
-
- POSITION pos = GetStartPosition();
- COleClientItem* pItem;
- while ((pItem = GetNextClientItem(pos)) != NULL)
- {
- if (pItem->m_pView != NULL && pItem->IsInPlaceActive() &&
- (pItem->m_pView == pWnd ||
- pItem->m_pView->GetParentFrame() == pWnd))
- {
- // that item is active on pWndContainer
- return pItem;
- }
- }
-
- // no item active on that window
- return NULL;
- }
-
- /////////////////////////////////////////////////////////////////////////////
-