STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::GetConvertInfo( DWORD dwObject, CLSID* lpClassID, WORD* lpwFormat, CLSID*, LPCLSID*, UINT*) { COleClientItem* pItem = (COleClientItem*)dwObject; ASSERT_VALID(pItem); if (lpClassID != NULL) { if (pItem->GetType() == OT_LINK || S_OK != ReadClassStg(pItem->m_lpStorage, lpClassID)) { pItem->GetClassID(lpClassID); } } if (lpwFormat != NULL) { *lpwFormat = 0; CLIPFORMAT cf; if (ReadFmtUserTypeStg(pItem->m_lpStorage, &cf, NULL) == S_OK) *lpwFormat = (WORD)cf; } // Note: leave rest at default return S_OK; }
STDMETHODIMP COleUILinkInfo::CancelLink(DWORD dwLink) { COleClientItem* pItem = (COleClientItem*)dwLink; ASSERT_VALID(pItem); ASSERT_KINDOF(COleClientItem, pItem); ASSERT(pItem->GetType() == OT_LINK); SCODE sc = E_FAIL; TRY { if (pItem->FreezeLink()) sc = S_OK; } CATCH_ALL(e) { sc = COleException::Process(e); DELETE_EXCEPTION(e); } END_CATCH_ALL // report error if (sc != S_OK) pItem->ReportError(sc); return S_OK; }
STDMETHODIMP COleUILinkInfo::GetLinkUpdateOptions( DWORD dwLink, DWORD* lpdwUpdateOpt) { COleClientItem* pItem = (COleClientItem*)dwLink; ASSERT_VALID(pItem); ASSERT_KINDOF(COleClientItem, pItem); SCODE sc; TRY { if (pItem->GetType() == OT_LINK) *lpdwUpdateOpt = pItem->GetLinkUpdateOptions(); else *lpdwUpdateOpt = OLEUPDATE_ALWAYS; // make believe it is auto-link sc = S_OK; } CATCH_ALL(e) { sc = COleException::Process(e); DELETE_EXCEPTION(e); } END_CATCH_ALL return sc; }
STDMETHODIMP_(DWORD) COleUILinkInfo::GetNextLink( DWORD dwLink) { ASSERT(m_pDocument != NULL); if (dwLink == 0) { // start enumerating from the beginning m_pos = m_pDocument->GetStartPosition(); } COleClientItem* pItem; while ((pItem = m_pDocument->GetNextClientItem(m_pos)) != NULL) { // check for links OLE_OBJTYPE objType = pItem->GetType(); if (m_bUpdateLinks && objType == OT_LINK) { // link found -- return it return (DWORD)(void*)pItem; } // check for embeddings if (m_bUpdateEmbeddings && objType == OT_EMBEDDED) { // embedding w/mismatched target device return (DWORD)(void*)pItem; } } return 0; // link not found }
void COleDocument::OnUpdateObjectVerbMenu(CCmdUI* pCmdUI) { if (pCmdUI->m_pMenu == NULL || pCmdUI->m_pParentMenu == NULL) { // not a menu or is on sub-menu (don't recurse) pCmdUI->ContinueRouting(); return; } // check for single selection COleClientItem* pItem = GetPrimarySelectedItem(GetRoutingView_()); if (pItem == NULL || pItem->GetType() == OT_STATIC) { // no selection, or is 'static' item pCmdUI->Enable(FALSE); } // only include Convert... if there is a handler for ID_OLE_EDIT_CONVERT UINT nConvertID = ID_OLE_EDIT_CONVERT; AFX_CMDHANDLERINFO info; if (!OnCmdMsg(ID_OLE_EDIT_CONVERT, CN_COMMAND, NULL, &info)) nConvertID = 0; // update the menu AfxOleSetEditMenu(GetPrimarySelectedItem(GetRoutingView_()), pCmdUI->m_pMenu, pCmdUI->m_nIndex, ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, nConvertID); }
void CMainFrame::AdjustObjectSubmenu (CMFCPopupMenu* pMenuPopup) { ASSERT (pMenuPopup != NULL); if (pMenuPopup == NULL) { return; } if (pMenuPopup->GetParentPopupMenu () != NULL) { return; } CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar (); ASSERT (pMenuBar != NULL); if (pMenuBar == NULL) { return; } int iIndex = pMenuBar->CommandToIndex (ID_OLE_VERB_POPUP); if (iIndex < 0) { return; } CWordPadDoc* pDoc = (CWordPadDoc*)GetActiveDocument(); ASSERT_VALID (pDoc); // check for single selection COleClientItem* pItem = pDoc->GetPrimarySelectedItem(GetActiveView()); if (pItem == NULL || pItem->GetType() == OT_STATIC) { // no selection, or is 'static' item return; } // only include Convert... if there is a handler for ID_OLE_EDIT_CONVERT UINT nConvertID = ID_OLE_EDIT_CONVERT; AFX_CMDHANDLERINFO info; if (!pDoc->OnCmdMsg(ID_OLE_EDIT_CONVERT, CN_COMMAND, NULL, &info)) nConvertID = 0; HMENU hMenu = pMenuBar->ExportToMenu (); ASSERT(hMenu != NULL); if (hMenu != NULL) { // update the menu AfxOleSetEditMenu(pItem, CMenu::FromHandle (hMenu), iIndex, ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, nConvertID); pMenuBar->ImportFromMenu (hMenu); ::DestroyMenu (hMenu); } }
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 }
STDMETHODIMP COleUILinkInfo::OpenLinkSource(DWORD dwLink) { COleClientItem* pItem = (COleClientItem*)dwLink; ASSERT_VALID(pItem); ASSERT_KINDOF(COleClientItem, pItem); ASSERT(pItem->GetType() == OT_LINK); SCODE sc; TRY { // Note: no need for valid CView* since links don't activate inplace pItem->DoVerb(OLEIVERB_SHOW, NULL); sc = S_OK; } CATCH_ALL(e) { sc = COleException::Process(e); DELETE_EXCEPTION(e); } END_CATCH_ALL return sc; }
STDMETHODIMP COleUILinkInfo::SetLinkUpdateOptions( DWORD dwLink, DWORD dwUpdateOpt) { COleClientItem* pItem = (COleClientItem*)dwLink; ASSERT_VALID(pItem); ASSERT_KINDOF(COleClientItem, pItem); ASSERT(pItem->GetType() == OT_LINK); SCODE sc; TRY { // item is a link -- get its link options pItem->SetLinkUpdateOptions((OLEUPDATE)dwUpdateOpt); sc = S_OK; } CATCH_ALL(e) { sc = COleException::Process(e); DELETE_EXCEPTION(e); } END_CATCH_ALL return sc; }
STDMETHODIMP COleUILinkInfo::GetLinkSource( DWORD dwLink, LPTSTR* lplpszDisplayName, ULONG* lplenFileName, LPTSTR* lplpszFullLinkType, LPTSTR* lplpszShortLinkType, BOOL* lpfSourceAvailable, BOOL* lpfIsSelected) { COleClientItem* pItem = (COleClientItem*)dwLink; ASSERT_VALID(pItem); ASSERT_KINDOF(COleClientItem, pItem); ASSERT(pItem->GetType() == OT_LINK); // set OUT params to NULL ASSERT(lplpszDisplayName != NULL); *lplpszDisplayName = NULL; if (lplpszFullLinkType != NULL) *lplpszFullLinkType = NULL; if (lplpszShortLinkType != NULL) *lplpszShortLinkType = NULL; if (lplenFileName != NULL) *lplenFileName = 0; if (lpfSourceAvailable != NULL) *lpfSourceAvailable = !pItem->m_bLinkUnavail; // get IOleLink interface LPOLELINK lpOleLink = QUERYINTERFACE(pItem->m_lpObject, IOleLink); ASSERT(lpOleLink != NULL); // get moniker & object information LPMONIKER lpmk; if (lpOleLink->GetSourceMoniker(&lpmk) == S_OK) { if (lplenFileName != NULL) *lplenFileName = _AfxOleGetLenFilePrefixOfMoniker(lpmk); lpmk->Release(); } // attempt to get the type names of the link if (lplpszFullLinkType != NULL) { LPOLESTR lpOleStr = NULL; pItem->m_lpObject->GetUserType(USERCLASSTYPE_FULL, &lpOleStr); *lplpszFullLinkType = TASKSTRINGOLE2T(lpOleStr); if (*lplpszFullLinkType == NULL) { TCHAR szUnknown[256]; VERIFY(AfxLoadString(AFX_IDS_UNKNOWNTYPE, szUnknown) != 0); *lplpszFullLinkType = AfxAllocTaskString(szUnknown); } } if (lplpszShortLinkType != NULL) { LPOLESTR lpOleStr = NULL; pItem->m_lpObject->GetUserType(USERCLASSTYPE_SHORT, &lpOleStr); *lplpszShortLinkType = TASKSTRINGOLE2T(lpOleStr); if (*lplpszShortLinkType == NULL) { TCHAR szUnknown[256]; VERIFY(AfxLoadString(AFX_IDS_UNKNOWNTYPE, szUnknown) != 0); *lplpszShortLinkType = AfxAllocTaskString(szUnknown); } } // get source display name for moniker LPOLESTR lpOleStr = NULL; SCODE sc = lpOleLink->GetSourceDisplayName(&lpOleStr); *lplpszDisplayName = TASKSTRINGOLE2T(lpOleStr); lpOleLink->Release(); if (sc != S_OK) return sc; // see if item is selected if specified if (lpfIsSelected) { *lpfIsSelected = (m_pSelectedItem == pItem); } return S_OK; }
STDMETHODIMP COleUILinkInfo::SetLinkSource( DWORD dwLink, LPTSTR lpszDisplayName, ULONG lenFileName, ULONG* pchEaten, BOOL fValidateSource) { USES_CONVERSION; COleClientItem* pItem = (COleClientItem*)dwLink; ASSERT_VALID(pItem); ASSERT_KINDOF(COleClientItem, pItem); ASSERT(pItem->GetType() == OT_LINK); LPOLEOBJECT lpObject = NULL; CLSID clsid; // parse the portion known to be a file name into a file moniker TCHAR szName[_MAX_PATH]; lstrcpyn(szName, lpszDisplayName, (int)lenFileName + 1); LPMONIKER lpmk = NULL; SCODE sc = CreateFileMoniker(T2COLE(szName), &lpmk); if (lpmk == NULL) return sc; LPBC lpbc = NULL; if (fValidateSource) { sc = CreateBindCtx(0, &lpbc); if (sc != S_OK) { lpmk->Release(); return sc; } } // nUneaten is the number of chars left to parse UINT nUneaten = lstrlen(lpszDisplayName) - lenFileName; // lpszRemainder is the left over display name LPTSTR lpszRemainder = lpszDisplayName + lenFileName; *pchEaten = lenFileName; // parse the rest of the display name while (nUneaten > 0) { // attempt to parse next moniker ULONG nEaten = 0; LPMONIKER lpmkNext = NULL; sc = _AfxParseDisplayName(lpmk, lpbc, lpszRemainder, &nEaten, &lpmkNext); if (sc != S_OK) { lpmk->Release(); lpbc->Release(); return sc; } // advance through the display name nUneaten -= nEaten; *pchEaten += nEaten; lpszRemainder += nEaten; if (lpmkNext != NULL) { // create composite out of current and next LPMONIKER lpmkTemp = NULL; sc = CreateGenericComposite(lpmk, lpmkNext, &lpmkTemp); if (FAILED(sc)) { lpmk->Release(); lpmkNext->Release(); lpbc->Release(); return sc; } // make current = next lpmkNext->Release(); lpmk->Release(); lpmk = lpmkTemp; } } if (fValidateSource) { // attempt to bind the the object sc = lpmk->BindToObject(lpbc, NULL, IID_IOleObject, (LPLP)&lpObject); if (FAILED(sc)) { pItem->m_bLinkUnavail = TRUE; lpbc->Release(); lpmk->Release(); RELEASE(lpObject); return sc; } ASSERT(lpObject != NULL); // call GetUserClassID while bound so default handler updates lpObject->GetUserClassID(&clsid); pItem->m_bLinkUnavail = FALSE; } // get IOleLink interface LPOLELINK lpOleLink = QUERYINTERFACE(pItem->m_lpObject, IOleLink); ASSERT(lpOleLink != NULL); // set source from moniker sc = lpOleLink->SetSourceMoniker(lpmk, clsid); // update the cache if object was successfully bound if (lpObject != NULL) { lpObject->Update(); lpObject->Release(); } // cleanup lpOleLink->Release(); RELEASE(lpmk); RELEASE(lpbc); return sc; }
STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::GetObjectInfo( DWORD dwObject, DWORD* lpdwObjSize, LPTSTR* lplpszLabel, LPTSTR* lplpszType, LPTSTR* lplpszShortType, LPTSTR* lplpszLocation) { COleClientItem* pItem = (COleClientItem*)dwObject; ASSERT_VALID(pItem); BOOL bIsLink = (pItem->GetType() == OT_LINK); if (lpdwObjSize != NULL) { ASSERT(pItem->m_lpStorage != NULL); // try ILockBytes first, then IStorage STATSTG statStg; if ((pItem->m_lpLockBytes == NULL || pItem->m_lpLockBytes->Stat(&statStg, STATFLAG_NONAME) != S_OK) && pItem->m_lpStorage->Stat(&statStg, STATFLAG_NONAME) != S_OK) { *lpdwObjSize = 0xFFFFFFFF; } else { ASSERT(statStg.pwcsName == NULL); if (statStg.cbSize.HighPart > 0) *lpdwObjSize = 0xFFFFFFFE; else if (statStg.cbSize.LowPart == 0) *lpdwObjSize = 0xFFFFFFFF; else *lpdwObjSize = statStg.cbSize.LowPart; } } if (lplpszLabel != NULL) { TCHAR szFormatLink[128]; AfxLoadString(AFX_IDS_PASTELINKEDTYPE, szFormatLink, _countof(szFormatLink)); TCHAR szFormatObj[] = _T("%s"); LPTSTR lpszFormat = bIsLink ? szFormatLink : szFormatObj; CString strType; pItem->GetUserType(USERCLASSTYPE_FULL, strType); CString strResult; strResult.Format(lpszFormat, (LPCTSTR)strType); *lplpszLabel = AfxAllocTaskString(strResult); } if (lplpszType != NULL) { LPOLESTR lpOleStr; pItem->m_lpObject->GetUserType(USERCLASSTYPE_FULL, &lpOleStr); *lplpszType = TASKSTRINGOLE2T(lpOleStr); } if (lplpszShortType != NULL) { LPOLESTR lpOleStr; pItem->m_lpObject->GetUserType(USERCLASSTYPE_SHORT, &lpOleStr); *lplpszShortType = TASKSTRINGOLE2T(lpOleStr); } if (lplpszLocation != NULL) { if (bIsLink) { LPOLELINK lpOleLink = NULL; pItem->m_lpObject->QueryInterface(IID_IOleLink, (LPVOID*)&lpOleLink); ASSERT(lpOleLink != NULL); LPOLESTR lpOleStr; lpOleLink->GetSourceDisplayName(&lpOleStr); *lplpszLocation = TASKSTRINGOLE2T(lpOleStr); lpOleLink->Release(); } else { CDocument* pDoc = (CDocument*)pItem->GetDocument(); CString strLocation = pDoc->GetPathName(); if (strLocation.IsEmpty()) strLocation = pDoc->GetTitle(); *lplpszLocation = AfxAllocTaskString(strLocation); } } return S_OK; }
void CMainFrame::AdjustObjectSubmenu(CMFCPopupMenu* pMenuPopup) { ASSERT(pMenuPopup != NULL); if (pMenuPopup->GetParentPopupMenu() != NULL) { return; } // <snippet7> // CMFCPopupMenu* pMenuPopup CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar(); // </snippet7> ASSERT(pMenuBar != NULL); // <snippet10> // CMFCPopupMenuBar* pMenuBar CMFCCustomizeMenuButton* pBtn = (CMFCCustomizeMenuButton*)pMenuBar->GetButton(0); pBtn->EnableCustomization(true); pBtn->SetSeparator(); // </snippet10> int iIndex = pMenuBar->CommandToIndex(ID_OLE_VERB_FIRST); if (iIndex < 0) { return; } CFrameWnd* pFrame = GetActiveFrame(); if (pFrame == NULL) { return; } CDrawDoc* pDoc = (CDrawDoc*)pFrame->GetActiveDocument(); ASSERT_VALID(pDoc); // check for single selection COleClientItem* pItem = pDoc->GetPrimarySelectedItem(pFrame->GetActiveView()); if (pItem == NULL || pItem->GetType() == OT_STATIC) { // no selection, or is 'static' item return; } // only include Convert... if there is a handler for ID_OLE_EDIT_CONVERT UINT nConvertID = ID_OLE_EDIT_CONVERT; AFX_CMDHANDLERINFO info; if (!pDoc->OnCmdMsg(ID_OLE_EDIT_CONVERT, CN_COMMAND, NULL, &info)) nConvertID = 0; HMENU hMenu = pMenuBar->ExportToMenu(); ASSERT(hMenu != NULL); // update the menu AfxOleSetEditMenu(pItem, CMenu::FromHandle(hMenu), iIndex, ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, nConvertID); pMenuBar->ImportFromMenu(hMenu); ::DestroyMenu(hMenu); }