|
|
1.1 ! root 1: // This is a part of the Microsoft Foundation Classes C++ library. ! 2: // Copyright (C) 1992 Microsoft Corporation ! 3: // All rights reserved. ! 4: // ! 5: // This source code is only intended as a supplement to the ! 6: // Microsoft Foundation Classes Reference and Microsoft ! 7: // QuickHelp documentation provided with the library. ! 8: // See these sources for detailed information regarding the ! 9: // Microsoft Foundation Classes product. ! 10: ! 11: #include "afxole.h" ! 12: #pragma hdrstop ! 13: ! 14: #include "afxoleUI.h" // user interface parts ! 15: #include "oleptr_.h" ! 16: ! 17: #include "shellapi.h" ! 18: #include "afxdlgs.h" // for Change link dialog ! 19: ! 20: #ifdef AFX_OLE_SEG ! 21: #pragma code_seg(AFX_OLE_SEG) ! 22: #endif ! 23: ! 24: #ifdef _DEBUG ! 25: #undef THIS_FILE ! 26: static char BASED_CODE THIS_FILE[] = __FILE__; ! 27: #endif ! 28: ! 29: ///////////////////////////////////////////////////////////////////////////// ! 30: // User interface for COleClientItem (with Links) ! 31: ! 32: // forward references ! 33: static void FormatLinkInfo(COleClientItem* pItem, char* szInfoBuffer, ! 34: char* szClassNameBuffer); ! 35: ! 36: ///////////////////////////////////////////////////////////////////////////// ! 37: // Links dialog ! 38: ! 39: class COleLinksDlg : public CModalDialog ! 40: { ! 41: public: ! 42: COleClientDoc* m_pDoc; ! 43: COleClientItem* m_pSingleSelection; // NULL if 0 or >1 items selected ! 44: int m_iSingleSelection; // listbox index (if above is not null) ! 45: ! 46: UINT m_iVerb1; ! 47: UINT m_iVerb2; ! 48: ! 49: // could be static members if desired ! 50: CString strEditVerb; ! 51: CString strActivateVerb; ! 52: ! 53: COleLinksDlg(COleClientDoc* pDoc) ! 54: : CModalDialog(AFX_IDD_LINKS) ! 55: { ! 56: m_pDoc = pDoc; ! 57: m_pSingleSelection = NULL; ! 58: VERIFY(strEditVerb.LoadString(AFX_IDS_EDIT_VERB)); ! 59: VERIFY(strActivateVerb.LoadString(AFX_IDS_ACTIVATE_VERB)); ! 60: } ! 61: ! 62: protected: ! 63: BOOL OnInitDialog(); ! 64: void SetVerbButtons(COleClientItem* pSel); ! 65: void DoVerb(UINT iVerb); ! 66: ! 67: // message map notifications ! 68: afx_msg void OnSelectionChange(); ! 69: ! 70: afx_msg void OnVerb1(); ! 71: afx_msg void OnVerb2(); ! 72: afx_msg void OnAuto(); ! 73: afx_msg void OnManual(); ! 74: afx_msg void OnUpdate(); ! 75: afx_msg void OnFreeze(); ! 76: afx_msg void OnChange(); ! 77: ! 78: DECLARE_MESSAGE_MAP() ! 79: }; ! 80: ! 81: ! 82: BEGIN_MESSAGE_MAP(COleLinksDlg, CModalDialog) ! 83: // selection change ! 84: ON_LBN_SELCHANGE(AFX_IDC_LISTBOX, OnSelectionChange) ! 85: ! 86: // control notifications ! 87: ON_COMMAND(AFX_IDC_VERB1, OnVerb1) ! 88: ON_COMMAND(AFX_IDC_VERB2, OnVerb2) ! 89: ON_COMMAND(AFX_IDC_AUTO, OnAuto) ! 90: ON_COMMAND(AFX_IDC_MANUAL, OnManual) ! 91: ON_COMMAND(AFX_IDC_UPDATE, OnUpdate) ! 92: ON_COMMAND(AFX_IDC_FREEZE, OnFreeze) ! 93: ON_COMMAND(AFX_IDC_CHANGE, OnChange) ! 94: END_MESSAGE_MAP() ! 95: ! 96: ///////////////////////////////////////////////////////////////////////////// ! 97: // Initialize - fill in the information ! 98: ! 99: BOOL COleLinksDlg::OnInitDialog() ! 100: { ! 101: CListBox* pList = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX); ! 102: int cLinks = 0; ! 103: ! 104: // fill with links attached to this object ! 105: pList->ResetContent(); ! 106: ! 107: int tabStops[3]; ! 108: tabStops[0] = 20; // 20 50 ! 109: tabStops[1] = 80; // 60 110 ! 110: tabStops[2] = 120; // 85 200 ! 111: pList->SetTabStops(3, tabStops); ! 112: ! 113: // enumerate over the client document - enumerate OLEOBJECTs ! 114: BOOL bSelected; ! 115: POSITION pos = m_pDoc->GetStartPosition(); ! 116: COleClientItem* pItem; ! 117: ! 118: while ((pItem = m_pDoc->GetNextItem(pos, &bSelected)) != NULL) ! 119: { ! 120: if (pItem->GetType() == OT_LINK) ! 121: { ! 122: // add it to the listbox ! 123: int iItem; ! 124: char szInfo[OLE_MAXNAMESIZE * 2]; // assume this is enough ! 125: ! 126: FormatLinkInfo(pItem, szInfo, NULL); ! 127: if ((iItem = pList->AddString(szInfo)) == -1) ! 128: { ! 129: TRACE("Warning: error filling listbox\n"); ! 130: EndDialog(IDCANCEL); ! 131: return TRUE; ! 132: } ! 133: ! 134: pList->SetItemData(iItem, GetDWordFromPtr(pItem)); ! 135: if (bSelected) ! 136: pList->SetSel(iItem); ! 137: cLinks++; ! 138: } ! 139: } ! 140: ! 141: if (cLinks == 0) ! 142: { ! 143: TRACE("Warning: no links in this document\n"); ! 144: EndDialog(IDCANCEL); // no links after all ! 145: return TRUE; ! 146: } ! 147: ! 148: OnSelectionChange(); // enables buttons etc ! 149: return TRUE; ! 150: } ! 151: ! 152: struct LinkOptionsInfo ! 153: { ! 154: int nIDString; // IDS_ value to LoadString ! 155: int nIDCheckButton; // IDC_ for button to check ! 156: BOOL bCanChangeLink; // if can change or freeze ! 157: }; ! 158: ! 159: static void GetLinkUpdateInfo(COleClientItem* pItem, LinkOptionsInfo* pInfo) ! 160: { ! 161: // sensible defaults ! 162: pInfo->nIDString = AFX_IDS_FROZEN; ! 163: pInfo->nIDCheckButton = -1; ! 164: pInfo->bCanChangeLink = FALSE; ! 165: ! 166: if (pItem->GetType() != OT_LINK) ! 167: return; // assume static ! 168: ! 169: switch (pItem->GetLinkUpdateOptions()) ! 170: { ! 171: case oleupdate_always: ! 172: pInfo->nIDString = AFX_IDS_AUTO; ! 173: pInfo->nIDCheckButton = AFX_IDC_AUTO; ! 174: pInfo->bCanChangeLink = TRUE; ! 175: break; ! 176: ! 177: case oleupdate_oncall: ! 178: pInfo->nIDString = AFX_IDS_MANUAL; ! 179: pInfo->nIDCheckButton = AFX_IDC_MANUAL; ! 180: pInfo->bCanChangeLink = TRUE; ! 181: break; ! 182: ! 183: default: ! 184: break; // default already setup (static) ! 185: } ! 186: } ! 187: ! 188: ! 189: static void FormatLinkInfo(COleClientItem* pItem, char* szInfoBuffer, ! 190: char* szClassNameBuffer) ! 191: { ! 192: struct LinkOptionsInfo linkInfo; ! 193: CString strLinkType; ! 194: ! 195: GetLinkUpdateInfo(pItem, &linkInfo); ! 196: VERIFY(strLinkType.LoadString(linkInfo.nIDString)); ! 197: ! 198: HANDLE hData = pItem->GetLinkFormatData(); ! 199: ASSERT(hData != NULL); ! 200: LPCSTR lpszData = (LPCSTR)::GlobalLock(hData); // actually 3 strings ! 201: ASSERT(lpszData != NULL); ! 202: ! 203: if (szClassNameBuffer != NULL) ! 204: _fstrcpy(szClassNameBuffer, lpszData); ! 205: ! 206: if (szInfoBuffer != NULL) ! 207: { ! 208: // first server class name (use localized name if registered) ! 209: LONG lSize = OLE_MAXNAMESIZE; ! 210: // get real language class of object in szClass for menu ! 211: if (::RegQueryValue(HKEY_CLASSES_ROOT, lpszData, szInfoBuffer, ! 212: &lSize) != ERROR_SUCCESS) ! 213: { ! 214: // no localized class name, use unlocalized name ! 215: _fstrcpy(szInfoBuffer, lpszData); ! 216: } ! 217: _fstrcat(szInfoBuffer, "\t"); ! 218: ! 219: // document and item names ! 220: lpszData += _fstrlen(lpszData) + 1; ! 221: ! 222: // strip pathname and drive letter ! 223: LPCSTR lpszTemp = lpszData; ! 224: while (*lpszTemp) ! 225: { ! 226: if (*lpszTemp == '\\' || *lpszTemp == ':') ! 227: lpszData = lpszTemp + 1; ! 228: lpszTemp = AnsiNext(lpszTemp); ! 229: } ! 230: ! 231: // Append the file name ! 232: _fstrcat(szInfoBuffer, lpszData); ! 233: _fstrcat(szInfoBuffer, "\t"); ! 234: ! 235: // Append the item name ! 236: lpszData += _fstrlen(lpszData) + 1; ! 237: _fstrcat(szInfoBuffer, lpszData); ! 238: _fstrcat(szInfoBuffer, "\t"); ! 239: ! 240: /* Append the type of link, and write it out */ ! 241: _fstrcat(szInfoBuffer, strLinkType); ! 242: } ! 243: ! 244: ::GlobalUnlock(hData); ! 245: } ! 246: ! 247: // update button states depending on current selection ! 248: void COleLinksDlg::OnSelectionChange() ! 249: { ! 250: CListBox* pList = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX); ! 251: int nSelectedLinks = 0; ! 252: int nIDCheck = -1; ! 253: BOOL bCanChangeLink = FALSE; ! 254: ! 255: m_pSingleSelection = NULL; ! 256: ! 257: ASSERT(AFX_IDC_MANUAL == AFX_IDC_AUTO + 1); ! 258: if (pList->GetSelCount() != 0) ! 259: { ! 260: int nTotal = pList->GetCount(); ! 261: for (int iItem = 0; iItem < nTotal; iItem++) ! 262: { ! 263: if (pList->GetSel(iItem) <= 0) ! 264: continue; // not selected ! 265: ! 266: COleClientItem* pItem; ! 267: pItem = (COleClientItem*)GetPtrFromDWord(pList->GetItemData(iItem)); ! 268: ASSERT(pItem != NULL); ! 269: struct LinkOptionsInfo linkInfo; ! 270: ! 271: GetLinkUpdateInfo(pItem, &linkInfo); ! 272: ! 273: if (nSelectedLinks++ == 0) ! 274: { ! 275: // first link ! 276: nIDCheck = linkInfo.nIDCheckButton; ! 277: bCanChangeLink = linkInfo.bCanChangeLink; ! 278: m_pSingleSelection = pItem; ! 279: m_iSingleSelection = iItem; ! 280: } ! 281: else ! 282: { ! 283: if (nIDCheck != linkInfo.nIDCheckButton) // not the same ! 284: nIDCheck = -1; ! 285: ! 286: // if multiple links selected - don't allow anything complex ! 287: if (!linkInfo.bCanChangeLink) ! 288: bCanChangeLink = FALSE; ! 289: m_pSingleSelection = NULL; ! 290: } ! 291: } ! 292: } ! 293: ! 294: //BLOCK: do pushbutton verb stuff ! 295: SetVerbButtons(m_pSingleSelection); ! 296: ! 297: // disable if all in selection can be changed ! 298: GetDlgItem(AFX_IDC_UPDATE)->EnableWindow(bCanChangeLink); ! 299: GetDlgItem(AFX_IDC_FREEZE)->EnableWindow(bCanChangeLink); ! 300: ! 301: // simple Change button - only one link at a time ! 302: GetDlgItem(AFX_IDC_CHANGE)->EnableWindow( ! 303: (m_pSingleSelection != NULL) && bCanChangeLink); ! 304: ! 305: ! 306: CheckRadioButton(AFX_IDC_AUTO, AFX_IDC_MANUAL, nIDCheck); ! 307: // disable if nothing selected ! 308: GetDlgItem(AFX_IDC_AUTO)->EnableWindow(nSelectedLinks > 0); ! 309: GetDlgItem(AFX_IDC_MANUAL)->EnableWindow(nSelectedLinks > 0); ! 310: } ! 311: ! 312: ///////////////////////////////////////////////////////////////////////////// ! 313: // Standard verb buttons ! 314: ! 315: static void SmartChangeButton(CWnd* pButton, const char* pszText, BOOL bEnable) ! 316: { ! 317: char szOldText[OLE_MAXNAMESIZE]; ! 318: ! 319: // avoid flashing if changing to same text ! 320: pButton->GetWindowText(szOldText, sizeof(szOldText)); ! 321: if (strcmp(szOldText, pszText) != 0) ! 322: pButton->SetWindowText(pszText); ! 323: pButton->EnableWindow(bEnable); ! 324: } ! 325: ! 326: void COleLinksDlg::SetVerbButtons(COleClientItem* pSel) ! 327: { ! 328: // defaults for no selection ! 329: const char* pszVerb1 = strActivateVerb; ! 330: BOOL bEnable1 = FALSE; ! 331: const char* pszVerb2 = strEditVerb; ! 332: BOOL bEnable2 = FALSE; ! 333: ! 334: // registered verb names ! 335: char szRegVerb0[OLE_MAXNAMESIZE]; ! 336: char szRegVerb1[OLE_MAXNAMESIZE]; ! 337: ! 338: ASSERT(OLEVERB_PRIMARY == 0); ! 339: m_iVerb1 = m_iVerb2 = 0; // usually primary verb ! 340: ! 341: if (pSel != NULL) ! 342: { ! 343: // look at verbs for current selection ! 344: char szClass[OLE_MAXNAMESIZE]; ! 345: FormatLinkInfo(pSel, NULL, szClass); ! 346: ! 347: szRegVerb0[0] = szRegVerb1[0] = '\0'; ! 348: int cVerbs = 0; ! 349: while (cVerbs < 2) ! 350: { ! 351: char szBuffer[OLE_MAXNAMESIZE+40]; ! 352: wsprintf(szBuffer, "%s\\protocol\\StdFileEditing\\verb\\%d", ! 353: (LPCSTR)szClass, cVerbs); ! 354: ! 355: /* get verb name */ ! 356: char* pszVerb = (cVerbs == 0) ? szRegVerb0 : szRegVerb1; ! 357: LONG lSize = OLE_MAXNAMESIZE; ! 358: if (::RegQueryValue(HKEY_CLASSES_ROOT, szBuffer, ! 359: pszVerb, &lSize) != 0) ! 360: break; // finished counting verbs ! 361: cVerbs++; ! 362: } ! 363: ! 364: if (cVerbs == 0) ! 365: { ! 366: // no special verbs, enable generic edit ! 367: bEnable2 = TRUE; ! 368: } ! 369: else if (cVerbs == 1) ! 370: { ! 371: // 1 special verb, special case if 'edit' ! 372: if (_stricmp(szRegVerb0, strEditVerb) == 0) ! 373: { ! 374: // edit goes on second button ! 375: bEnable2 = TRUE; ! 376: } ! 377: else ! 378: { ! 379: // other verb goes on top ! 380: pszVerb1 = szRegVerb0; ! 381: bEnable1 = TRUE; ! 382: } ! 383: } ! 384: else // 2 verbs ! 385: { ! 386: bEnable1 = bEnable2 = TRUE; ! 387: if (_stricmp(szRegVerb0, strEditVerb) == 0) ! 388: { ! 389: pszVerb1 = szRegVerb1; ! 390: m_iVerb1 = 1; ! 391: // verb 2 is already edit ! 392: } ! 393: else if (_stricmp(szRegVerb1, strEditVerb) == 0) ! 394: { ! 395: pszVerb1 = szRegVerb0; ! 396: // verb 2 is already edit ! 397: } ! 398: else ! 399: { ! 400: pszVerb1 = szRegVerb0; ! 401: pszVerb2 = szRegVerb1; ! 402: m_iVerb2 = 1; ! 403: } ! 404: } ! 405: } ! 406: ! 407: SmartChangeButton(GetDlgItem(AFX_IDC_VERB1), pszVerb1, bEnable1); ! 408: SmartChangeButton(GetDlgItem(AFX_IDC_VERB2), pszVerb2, bEnable2); ! 409: } ! 410: ! 411: ///////////////////////////////////////////////////////////////////////////// ! 412: ! 413: void COleLinksDlg::DoVerb(UINT iVerb) ! 414: { ! 415: ASSERT(m_pSingleSelection != NULL); ! 416: ! 417: if (afxTraceFlags & 0x10) ! 418: TRACE("Executing verb %d on server\n", iVerb); ! 419: ! 420: TRY ! 421: m_pSingleSelection->Activate(iVerb); ! 422: CATCH (COleException, e) ! 423: m_pSingleSelection->ReportError(e->m_status); ! 424: END_CATCH ! 425: ! 426: // End the dialog after launch ! 427: EndDialog(IDOK); ! 428: } ! 429: ! 430: void COleLinksDlg::OnVerb1() ! 431: { ! 432: DoVerb(m_iVerb1); ! 433: } ! 434: ! 435: void COleLinksDlg::OnVerb2() ! 436: { ! 437: DoVerb(m_iVerb2); ! 438: } ! 439: ! 440: #define FOR_EACH_SELECTED_ITEM(pItem) \ ! 441: CListBox* _pList = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX); \ ! 442: int _nTotal = _pList->GetCount(); \ ! 443: for (int _iItem = 0; _iItem < _nTotal; _iItem++) \ ! 444: { \ ! 445: if (_pList->GetSel(_iItem) <= 0) \ ! 446: continue; /* not selected */ \ ! 447: COleClientItem* pItem; \ ! 448: pItem = (COleClientItem*)GetPtrFromDWord(_pList->GetItemData(_iItem));\ ! 449: ASSERT(pItem != NULL); ! 450: ! 451: #define UPDATE_SELECTED(pItem) \ ! 452: UpdateSelectedItem(_pList, pItem, _iItem) ! 453: ! 454: #define DELETE_SELECTED() \ ! 455: _pList->DeleteString(_iItem); \ ! 456: _iItem--; /* for next in the loop */ \ ! 457: _nTotal--; /* for next in the loop */ ! 458: ! 459: #define END_EACH_SELECTED_ITEM() \ ! 460: } ! 461: ! 462: ! 463: static void UpdateSelectedItem(CListBox* pList, ! 464: COleClientItem* pItem, int iItem) ! 465: { ! 466: char szInfo[OLE_MAXNAMESIZE * 2]; ! 467: FormatLinkInfo(pItem, szInfo, NULL); ! 468: pList->DeleteString(iItem); ! 469: pList->InsertString(iItem, szInfo); ! 470: pList->SetItemData(iItem, GetDWordFromPtr(pItem)); ! 471: pList->SetSel(iItem); ! 472: } ! 473: ! 474: ! 475: void COleLinksDlg::OnAuto() ! 476: { ! 477: FOR_EACH_SELECTED_ITEM(pItem) ! 478: { ! 479: pItem->SetLinkUpdateOptions(oleupdate_always); ! 480: UPDATE_SELECTED(pItem); ! 481: } ! 482: END_EACH_SELECTED_ITEM() ! 483: } ! 484: ! 485: void COleLinksDlg::OnManual() ! 486: { ! 487: FOR_EACH_SELECTED_ITEM(pItem) ! 488: { ! 489: pItem->SetLinkUpdateOptions(oleupdate_oncall); ! 490: UPDATE_SELECTED(pItem); ! 491: } ! 492: END_EACH_SELECTED_ITEM() ! 493: } ! 494: ! 495: void COleLinksDlg::OnUpdate() ! 496: { ! 497: FOR_EACH_SELECTED_ITEM(pItem) ! 498: { ! 499: TRY ! 500: pItem->UpdateLink(); ! 501: CATCH (COleException, e) ! 502: pItem->ReportError(e->m_status); ! 503: END_CATCH ! 504: } ! 505: END_EACH_SELECTED_ITEM() ! 506: } ! 507: ! 508: void COleLinksDlg::OnFreeze() ! 509: { ! 510: FOR_EACH_SELECTED_ITEM(pItem) ! 511: { ! 512: TRY ! 513: { ! 514: if (pItem->FreezeLink(pItem->GetName())) ! 515: { ! 516: DELETE_SELECTED(); ! 517: } ! 518: else ! 519: { ! 520: pItem->ReportError(OLE_ERROR_COMM); // strange error ! 521: } ! 522: } ! 523: CATCH (COleException, e) ! 524: { ! 525: pItem->ReportError(OLE_ERROR_COMM); // strange error ! 526: } ! 527: END_CATCH ! 528: } ! 529: END_EACH_SELECTED_ITEM() ! 530: ! 531: if (_pList->GetCount() == 0) ! 532: EndDialog(IDOK); ! 533: } ! 534: ! 535: void COleLinksDlg::OnChange() ! 536: { ! 537: // We only support changing of one item at a time ! 538: // The full UISG UI includes more complicated functionality ! 539: COleClientItem* pItem = m_pSingleSelection; ! 540: ASSERT(pItem != NULL); ! 541: ASSERT(pItem->GetType() == OT_LINK); ! 542: ! 543: HANDLE hData = pItem->GetLinkFormatData(); ! 544: ASSERT(hData != NULL); ! 545: LPCSTR lpszData = (LPCSTR)::GlobalLock(hData); ! 546: ASSERT(lpszData != NULL); ! 547: ! 548: UINT cbClassName = _fstrlen(lpszData); ! 549: LPCSTR lpszDoc = lpszData + cbClassName + 1; ! 550: LPCSTR lpszItems = lpszDoc + _fstrlen(lpszDoc) + 1; ! 551: ! 552: char szPath[_MAX_PATH]; ! 553: _fstrcpy(szPath, lpszDoc); ! 554: ! 555: ! 556: ! 557: CString title; ! 558: CString filter; ! 559: CFileDialog dlgFile(TRUE, NULL, szPath, ! 560: OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, ! 561: (filter.LoadString(AFX_IDS_ALL_FILES) ? (LPCSTR)filter : NULL), ! 562: this); ! 563: ! 564: if (title.LoadString(AFX_IDS_CHANGE_LINK)) ! 565: dlgFile.m_ofn.lpstrTitle = title; ! 566: ! 567: dlgFile.m_ofn.lpstrFile = (LPSTR)szPath; // just fill in my own buffer ! 568: ! 569: if (dlgFile.DoModal() == IDCANCEL) ! 570: return; ! 571: ! 572: ! 573: // change the path name ! 574: HANDLE hNewData = ::GlobalAlloc(GMEM_DDESHARE | GMEM_ZEROINIT, ! 575: cbClassName + 1 + _fstrlen(szPath) + 1 + _fstrlen(lpszItems) + 1 + 1); ! 576: if (hNewData == NULL) ! 577: { ! 578: pItem->ReportError(OLE_ERROR_MEMORY); ! 579: return; ! 580: } ! 581: LPSTR lpszNew = (LPSTR)::GlobalLock(hNewData); ! 582: ASSERT(lpszNew != NULL); ! 583: ! 584: // copy the old class name, new doc name and old item names ! 585: _fstrcpy(lpszNew, lpszData); ! 586: lpszNew += cbClassName + 1; ! 587: _fstrcpy(lpszNew, szPath); ! 588: lpszNew += _fstrlen(lpszNew) + 1; ! 589: _fstrcpy(lpszNew, lpszItems); ! 590: lpszNew += _fstrlen(lpszNew) + 1; ! 591: *lpszNew = '\0'; // terminate it ! 592: ! 593: pItem->SetData((OLECLIPFORMAT)::RegisterClipboardFormat("ObjectLink"), ! 594: hNewData); ! 595: // update the selection in the listbox ! 596: UpdateSelectedItem((CListBox*)GetDlgItem(AFX_IDC_LISTBOX), ! 597: m_pSingleSelection, m_iSingleSelection); ! 598: } ! 599: ! 600: ! 601: ///////////////////////////////////////////////////////////////////////////// ! 602: // Public interface for running modal dialog ! 603: ! 604: BOOL AfxOleLinksDialog(COleClientDoc* pDoc) ! 605: { ! 606: COleLinksDlg dlg(pDoc); ! 607: ! 608: return (dlg.DoModal() == IDOK); ! 609: } ! 610: ! 611: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.