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; }
BOOL COleDocument::ApplyPrintDevice(const DVTARGETDEVICE* ptd) { ASSERT_VALID(this); ASSERT(ptd == NULL || AfxIsValidAddress(ptd, (size_t)ptd->tdSize, FALSE)); // allocate copy of target device if (ptd != NULL) { DVTARGETDEVICE* ptdNew = _AfxOleCopyTargetDevice((DVTARGETDEVICE*)ptd); if (ptdNew == NULL) return FALSE; ptd = ptdNew; } // remove old target device from memory CoTaskMemFree(m_ptd); m_ptd = (DVTARGETDEVICE*)ptd; // Note: updating all the client items does not refresh the pres. cache POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { // update all the client items with new target device pItem->SetPrintDevice(ptd); } return TRUE; }
COleClientItem* COleLinkingDoc::OnFindEmbeddedItem(LPCTSTR lpszItemName) { ASSERT_VALID(this); ASSERT(AfxIsValidString(lpszItemName)); // default implementation walks list of client items looking for // a case sensitive match POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { // a client item is running if there is a match in name // and the m_lpObject is also running. TCHAR szItemName[OLE_MAXITEMNAME]; pItem->GetItemName(szItemName, _countof(szItemName)); if (lstrcmp(szItemName, lpszItemName) == 0) return pItem; } TRACE(traceOle, 1, "Warning: default COleLinkingDoc::OnFindEmbeddedItem\n"); TRACE(traceOle, 1, _T("\timplementation failed to find item '%s'.\n"), lpszItemName); return NULL; // no matching item found }
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; }
BOOL COleDocument::SaveModified() { // determine if necessary to discard changes if (::InSendMessage()) { POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { ASSERT(pItem->m_lpObject != NULL); SCODE sc = pItem->m_lpObject->IsUpToDate(); if (sc != OLE_E_NOTRUNNING && FAILED(sc)) { // inside inter-app SendMessage limits the user's choices CString name = m_strPathName; if (name.IsEmpty()) VERIFY(name.LoadString(AFX_IDS_UNTITLED)); CString prompt; AfxFormatString1(prompt, AFX_IDP_ASK_TO_DISCARD, name); return AfxMessageBox(prompt, MB_OKCANCEL|MB_DEFBUTTON2, AFX_IDP_ASK_TO_DISCARD) == IDOK; } } } // sometimes items change without a notification, so we have to // update the document's modified flag before calling // CDocument::SaveModified. UpdateModifiedFlag(); return CDocument::SaveModified(); }
void COleDocument::CommitItems(BOOL bSuccess) { // special 'Commit' phase for COleClientItem items POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { // calling CommitItem with FALSE causes the object to revert // to the original storage. Calling CommitItem TRUE causes // the item to adopt the new storage created in the Serialize // function. pItem->CommitItem(bSuccess); } }
void COleDocument::OnUpdateEditLinksMenu(CCmdUI* pCmdUI) { POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { if (pItem->GetType() == OT_LINK) { // we found a link! pCmdUI->Enable(TRUE); return; } } pCmdUI->Enable(FALSE); // no links today }
void COleDocument::UpdateModifiedFlag() { ASSERT_VALID(this); POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { if (pItem->IsModified()) { SetModifiedFlag(); break; } } }
void COleDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU) { USES_CONVERSION; CDocument::SetPathName(lpszPathName, bAddToMRU); // update all of the objects' host names POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { // update that item's host names pItem->m_lpObject->SetHostNames(T2COLE(AfxGetAppName()), T2COLE(m_strTitle)); } }
void COleDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU) { CDocument::SetPathName(lpszPathName, bAddToMRU); // update all of the objects' host names POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { ENSURE(pItem->m_lpObject); // update that item's host names const CStringW strAppName(AfxGetAppName()); const CStringW strTitle(m_strTitle); pItem->m_lpObject->SetHostNames(strAppName.GetString(),strTitle.GetString()); } }
void COleDocument::DeleteContents() { // deletes all COleClientItem objects in the doc item list // (Note: doesn't touch server items or other docitems) POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { if (pItem->m_lpObject != NULL) { pItem->Release(OLECLOSE_NOSAVE); // release OLE object RemoveItem(pItem); // disconnect from document pItem->InternalRelease(); // may 'delete pItem' } } }
void COleDocument::CommitItems(BOOL bSuccess, LPSTORAGE pNewStorage) { // special 'Commit' phase for COleClientItem items POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { // Set m_lpNewStorage so we can pass it to IPersistStorage::SaveCompleted // in COleClientItem::CommitItem. m_bNeedCommit was set in // HandsOffStorage. if (pItem->m_bNeedCommit && pNewStorage) { if (pItem->m_lpNewStorage) pItem->m_lpNewStorage->Release(); pNewStorage->AddRef(); pItem->m_lpNewStorage = pNewStorage; } // calling CommitItem with FALSE causes the object to revert // to the original storage. Calling CommitItem TRUE causes // the item to adopt the new storage created in the Serialize // function. pItem->CommitItem(bSuccess); } }
BOOL COleLinkingDoc::Register(COleObjectFactory* pFactory, LPCTSTR lpszPathName) { ASSERT_VALID(this); ASSERT(pFactory == NULL || AfxIsValidAddress(pFactory, sizeof(COleObjectFactory))); ASSERT(lpszPathName == NULL || AfxIsValidString(lpszPathName)); ASSERT(m_dwRegister == 0); // attach the document to the server ASSERT(m_pFactory == NULL || m_pFactory == pFactory); m_pFactory = pFactory; BOOL bResult = TRUE; // create file moniker based on path name RELEASE(m_lpMonikerROT); m_strMoniker.Empty(); if (lpszPathName != NULL) { if (CreateFileMoniker(CStringW(lpszPathName), &m_lpMonikerROT) != S_OK) bResult = FALSE; } // register file moniker as running if (m_lpMonikerROT != NULL) { // see if the object is already running in the ROT LPRUNNINGOBJECTTABLE lpROT = NULL; VERIFY(GetRunningObjectTable(0, &lpROT) == S_OK); ASSERT(lpROT != NULL); LPUNKNOWN lpUnk; if (lpROT->GetObject(m_lpMonikerROT, &lpUnk) == S_OK) { // fatal error -- can't register same moniker twice! lpUnk->Release(); RELEASE(m_lpMonikerROT); return FALSE; } // not already running -- so ok to attempt registration SCODE sc = lpROT->Register(NULL, (LPUNKNOWN) GetInterface(&IID_IUnknown), m_lpMonikerROT, &m_dwRegister); lpROT->Release(); m_strMoniker = lpszPathName; if (sc != S_OK) bResult = FALSE; } // update all objects with new moniker POSITION pos = GetStartPosition(); COleClientItem* pItem; while ((pItem = GetNextClientItem(pos)) != NULL) { if (pItem->m_bMoniker) { ASSERT(pItem->m_lpObject != NULL); pItem->m_lpObject->SetMoniker(OLEWHICHMK_CONTAINER, m_lpMonikerROT); } } return bResult; }