|
|
1.1 ! root 1: /* ! 2: * CONVERT.C ! 3: * ! 4: * Implements the OleUIConvert function which invokes the complete ! 5: * Convert dialog. ! 6: * ! 7: * Copyright (c)1992 Microsoft Corporation, All Right Reserved ! 8: */ ! 9: ! 10: #define STRICT 1 ! 11: #include "ole2ui.h" ! 12: #include <stdlib.h> ! 13: #include "common.h" ! 14: #include "utility.h" ! 15: #include "geticon.h" ! 16: #include "regdb.h" ! 17: #include "convert.h" ! 18: ! 19: #define CF_CLIPBOARDMIN 0xc000 ! 20: #define CF_CLIPBOARDMAX 0xffff ! 21: ! 22: #define AUXUSERTYPE_SHORTNAME USERCLASSTYPE_SHORT // short name ! 23: ! 24: static char szOLE2DLL[] = "ole2.dll"; // name of OLE 2.0 library ! 25: static char szVanillaDocIcon[] = "DefIcon"; ! 26: ! 27: /* ! 28: * OleUIConvert ! 29: * ! 30: * Purpose: ! 31: * Invokes the standard OLE Change Type dialog box allowing the user ! 32: * to change the type of the single specified object, or change the ! 33: * type of all OLE objects of a specified type. ! 34: * ! 35: * Parameters: ! 36: * lpCV LPOLEUICONVERT pointing to the in-out structure ! 37: * for this dialog. ! 38: * ! 39: * Return Value: ! 40: * UINT One of the following codes, indicating success or error: ! 41: * OLEUI_SUCCESS Success ! 42: * OLEUI_ERR_STRUCTSIZE The dwStructSize value is wrong ! 43: */ ! 44: ! 45: STDAPI_(UINT) OleUIConvert(LPOLEUICONVERT lpCV) ! 46: { ! 47: UINT uRet; ! 48: HGLOBAL hMemDlg=NULL; ! 49: ! 50: uRet=UStandardValidation((LPOLEUISTANDARD)lpCV, sizeof(OLEUICONVERT) ! 51: , &hMemDlg); ! 52: ! 53: if (OLEUI_SUCCESS!=uRet) ! 54: return uRet; ! 55: ! 56: // Validate structure members passed in. ! 57: ! 58: if (!IsValidClassID(lpCV->clsid)) ! 59: uRet = OLEUI_CTERR_CLASSIDINVALID; ! 60: ! 61: if ( (lpCV->dwFlags & CF_SETCONVERTDEFAULT) ! 62: && (!IsValidClassID(lpCV->clsidConvertDefault)) ) ! 63: uRet = OLEUI_CTERR_CLASSIDINVALID; ! 64: ! 65: if ( (lpCV->dwFlags & CF_SETACTIVATEDEFAULT) ! 66: && (!IsValidClassID(lpCV->clsidActivateDefault)) ) ! 67: uRet = OLEUI_CTERR_CLASSIDINVALID; ! 68: ! 69: if ( (lpCV->dvAspect != DVASPECT_ICON) ! 70: && (lpCV->dvAspect != DVASPECT_CONTENT) ) ! 71: uRet = OLEUI_CTERR_DVASPECTINVALID; ! 72: ! 73: if ( (lpCV->wFormat >= CF_CLIPBOARDMIN) ! 74: && (lpCV->wFormat <= CF_CLIPBOARDMAX) ) ! 75: { ! 76: char szTemp[8]; ! 77: ! 78: if (0 == GetClipboardFormatName(lpCV->wFormat, (LPSTR)szTemp, 8)) ! 79: uRet = OLEUI_CTERR_CBFORMATINVALID; ! 80: } ! 81: ! 82: ! 83: if ( (NULL != lpCV->lpszUserType) ! 84: && (IsBadReadPtr(lpCV->lpszUserType, 1)) ) ! 85: uRet = OLEUI_CTERR_STRINGINVALID; ! 86: ! 87: ! 88: if (OLEUI_ERR_STANDARDMIN <= uRet) ! 89: { ! 90: if (NULL!=hMemDlg) ! 91: FreeResource(hMemDlg); ! 92: ! 93: return uRet; ! 94: } ! 95: ! 96: //Now that we've validated everything, we can invoke the dialog. ! 97: uRet=UStandardInvocation(ConvertDialogProc, (LPOLEUISTANDARD)lpCV, ! 98: hMemDlg, MAKEINTRESOURCE(IDD_CONVERT)); ! 99: ! 100: return uRet; ! 101: } ! 102: ! 103: ! 104: ! 105: ! 106: ! 107: /* ! 108: * ConvertDialogProc ! 109: * ! 110: * Purpose: ! 111: * Implements the OLE Convert dialog as invoked through the ! 112: * OleUIConvert function. ! 113: * ! 114: * Parameters: ! 115: * Standard ! 116: * ! 117: * Return Value: ! 118: * Standard ! 119: * ! 120: */ ! 121: ! 122: BOOL CALLBACK EXPORT ConvertDialogProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) ! 123: { ! 124: LPCONVERT lpCV; ! 125: UINT uRet = 0; ! 126: OLEUICHANGEICON ci; ! 127: ! 128: //Declare Win16/Win32 compatible WM_COMMAND parameters. ! 129: COMMANDPARAMS(wID, wCode, hWndMsg); ! 130: ! 131: //This will fail under WM_INITDIALOG, where we allocate it. ! 132: lpCV=(LPCONVERT)LpvStandardEntry(hDlg, iMsg, wParam, lParam, (UINT FAR *)&uRet); ! 133: ! 134: //If the hook processed the message, we're done. ! 135: if (0!=uRet) ! 136: return (BOOL)uRet; ! 137: ! 138: //Process the temination message ! 139: if (iMsg==uMsgEndDialog) ! 140: { ! 141: ConvertCleanup(hDlg, lpCV); ! 142: StandardCleanup(lpCV, hDlg); ! 143: EndDialog(hDlg, wParam); ! 144: return TRUE; ! 145: } ! 146: ! 147: // Process help message from Change Icon ! 148: if (iMsg == uMsgHelp) ! 149: { ! 150: ! 151: PostMessage(lpCV->lpOCV->hWndOwner, uMsgHelp, wParam, lParam); ! 152: return FALSE; ! 153: ! 154: } ! 155: ! 156: switch (iMsg) ! 157: { ! 158: case WM_INITDIALOG: ! 159: FConvertInit(hDlg, wParam, lParam); ! 160: return TRUE; ! 161: ! 162: case WM_COMMAND: ! 163: switch (wID) ! 164: { ! 165: case IDCV_ACTIVATELIST: ! 166: case IDCV_CONVERTLIST: ! 167: switch (wCode) ! 168: { ! 169: case LBN_SELCHANGE: ! 170: ! 171: // Change "Results" window to reflect current selection ! 172: SetConvertResults(hDlg, lpCV); ! 173: ! 174: // Update the icon we display, if we are indeed ! 175: // displaying an icon. ! 176: if ( (lpCV->dwFlags & CF_SELECTCONVERTTO) ! 177: && (lpCV->dvAspect == DVASPECT_ICON) ! 178: && (!lpCV->fCustomIcon) ) ! 179: UpdateCVClassIcon(hDlg, lpCV, hWndMsg); ! 180: ! 181: break; ! 182: ! 183: case LBN_DBLCLK: ! 184: //Same as pressing OK. ! 185: SendCommand(hDlg, IDOK, BN_CLICKED, hWndMsg); ! 186: break; ! 187: } ! 188: break; ! 189: ! 190: case IDCV_CONVERTTO: ! 191: case IDCV_ACTIVATEAS: ! 192: { ! 193: HWND hList, hListInvisible; ! 194: LRESULT lRetVal; ! 195: BOOL fState; ! 196: ! 197: hList = lpCV->hListVisible; ! 198: hListInvisible = lpCV->hListInvisible; ! 199: ! 200: ! 201: if (IDCV_CONVERTTO == wParam) ! 202: { ! 203: ! 204: // User just click on the button again - it was ! 205: // already selected. ! 206: if (lpCV->dwFlags & CF_SELECTCONVERTTO) ! 207: break; ! 208: ! 209: ! 210: // Turn painting updates off. ! 211: SendMessage(hDlg, WM_SETREDRAW, FALSE, 0L); ! 212: ! 213: ! 214: // If we're working with a linked object, don't ! 215: // add the activate list - just the object's ! 216: // class should appear in the listbox. ! 217: ! 218: SwapWindows(hDlg, ! 219: hList, ! 220: hListInvisible); ! 221: ! 222: lpCV->hListVisible = hListInvisible; ! 223: lpCV->hListInvisible = hList; ! 224: ! 225: EnableWindow(lpCV->hListInvisible, FALSE); ! 226: EnableWindow(lpCV->hListVisible, TRUE); ! 227: ! 228: // Update our flags. ! 229: lpCV->dwFlags &= ~CF_SELECTACTIVATEAS; ! 230: lpCV->dwFlags |= CF_SELECTCONVERTTO; ! 231: ! 232: } ! 233: else ! 234: { ! 235: if (lpCV->dwFlags & CF_SELECTACTIVATEAS) ! 236: break; ! 237: ! 238: // Turn painting updates off. ! 239: SendMessage(hDlg, WM_SETREDRAW, FALSE, 0L); ! 240: ! 241: SwapWindows(hDlg, ! 242: hList, ! 243: hListInvisible); ! 244: ! 245: lpCV->hListVisible = hListInvisible; ! 246: lpCV->hListInvisible = hList; ! 247: ! 248: EnableWindow(lpCV->hListInvisible, FALSE); ! 249: EnableWindow(lpCV->hListVisible, TRUE); ! 250: ! 251: ! 252: // Update our flags. ! 253: lpCV->dwFlags |= CF_SELECTACTIVATEAS; ! 254: lpCV->dwFlags &= ~CF_SELECTCONVERTTO; ! 255: } ! 256: ! 257: ! 258: if (lpCV->dwFlags & CF_SELECTCONVERTTO) ! 259: lRetVal = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)lpCV->lpszConvertDefault); ! 260: ! 261: else ! 262: lRetVal = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)lpCV->lpszActivateDefault); ! 263: ! 264: if (LB_ERR == lRetVal) ! 265: { ! 266: char szCurrentObject[40]; ! 267: ! 268: GetDlgItemText(hDlg, IDCV_OBJECTTYPE, (LPSTR)szCurrentObject, 40); ! 269: SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPSTR)szCurrentObject); ! 270: } ! 271: ! 272: // Turn updates back on. ! 273: SendMessage(hDlg, WM_SETREDRAW, TRUE, 0L); ! 274: ! 275: InvalidateRect(lpCV->hListVisible, NULL, TRUE); ! 276: UpdateWindow(lpCV->hListVisible); ! 277: ! 278: if ((lpCV->dvAspect & DVASPECT_ICON) && (lpCV->dwFlags & CF_SELECTCONVERTTO)) ! 279: UpdateCVClassIcon(hDlg, lpCV, lpCV->hListVisible); ! 280: ! 281: // Hide the icon stuff when Activate is selected...show ! 282: // it again when Convert is selected. ! 283: ! 284: fState = (lpCV->dwFlags & CF_SELECTACTIVATEAS) ? SW_HIDE : SW_SHOW; ! 285: ! 286: StandardShowDlgItem(hDlg, IDCV_DISPLAYASICON, fState); ! 287: StandardShowDlgItem(hDlg, IDCV_CHANGEICON, fState); ! 288: ! 289: // Only display the icon if convert is selected AND display ! 290: // as icon is checked. ! 291: if ((SW_SHOW == fState) && (DVASPECT_ICON != lpCV->dvAspect)) ! 292: fState = SW_HIDE; ! 293: ! 294: StandardShowDlgItem(hDlg, IDCV_ICON, fState); ! 295: StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, fState); ! 296: StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, fState); ! 297: ! 298: SetConvertResults(hDlg, lpCV); ! 299: ! 300: } ! 301: break; ! 302: ! 303: ! 304: case IDOK: ! 305: { ! 306: ! 307: WORD iCurSel; ! 308: LPSTR lpszCLSID; ! 309: char szBuffer[256]; ! 310: ! 311: // Set OUT parameters ! 312: ! 313: // ! 314: // Set output flags to current ones ! 315: // ! 316: lpCV->lpOCV->dwFlags = lpCV->dwFlags; ! 317: ! 318: ! 319: // Update the dvAspect and fObjectsIconChanged members ! 320: // as appropriate. ! 321: // ! 322: if (lpCV->dwFlags & CF_SELECTACTIVATEAS) ! 323: { ! 324: // DON'T update aspect if activate as was selected. ! 325: lpCV->lpOCV->fObjectsIconChanged = FALSE; ! 326: } ! 327: else ! 328: lpCV->lpOCV->dvAspect = lpCV->dvAspect; ! 329: ! 330: ! 331: // ! 332: // Get the new clsid ! 333: // ! 334: iCurSel = (WORD)SendMessage(lpCV->hListVisible, LB_GETCURSEL, 0, 0); ! 335: SendMessage(lpCV->hListVisible, LB_GETTEXT, iCurSel, (LPARAM)(LPSTR)szBuffer); ! 336: ! 337: lpszCLSID = PointerToNthField((LPSTR)szBuffer, 2, '\t'); ! 338: ! 339: CLSIDFromString(lpszCLSID, (LPCLSID)(&(lpCV->lpOCV->clsidNew))); ! 340: ! 341: ! 342: ! 343: // Free the hMetaPict we got in. ! 344: OleUIMetafilePictIconFree(lpCV->lpOCV->hMetaPict); ! 345: ! 346: // ! 347: // Get the hMetaPict (if display as icon is checked) ! 348: // ! 349: if (DVASPECT_ICON == lpCV->dvAspect) ! 350: { ! 351: HICON hIcon; ! 352: char szLabel[OLEUI_CCHLABELMAX]; ! 353: int Index; ! 354: ! 355: ! 356: // Create the hMetaPict here from icon, label, ! 357: // index, and path ! 358: ! 359: hIcon = (HICON)SendDlgItemMessage(hDlg, IDCV_ICON, STM_GETICON, 0, 0L); ! 360: ! 361: // the combined length of the 2 label lines won't ever be more than ! 362: // OLEUI_CCHLABELMAX. ! 363: Index = (int)SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_GETTEXT, OLEUI_CCHLABELMAX, (LPARAM)(LPSTR)szLabel); ! 364: ! 365: if (Index < OLEUI_CCHLABELMAX) ! 366: { ! 367: LPSTR lpszSecondLine = szLabel + Index; ! 368: ! 369: ! 370: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_GETTEXT, ! 371: OLEUI_CCHLABELMAX-Index, ! 372: (LPARAM)(LPSTR)lpszSecondLine); ! 373: } ! 374: lpCV->lpOCV->hMetaPict = ! 375: OleUIMetafilePictFromIconAndLabel(hIcon, ! 376: (LPSTR)szLabel, ! 377: lpCV->lpszIconSource, ! 378: lpCV->IconIndex); ! 379: ! 380: } ! 381: else ! 382: lpCV->lpOCV->hMetaPict = (HGLOBAL)NULL; ! 383: ! 384: ! 385: // ! 386: // End the dialog ! 387: // ! 388: SendMessage(hDlg, uMsgEndDialog, OLEUI_OK, 0L); ! 389: } ! 390: break; ! 391: ! 392: case IDCANCEL: ! 393: SendMessage(hDlg, uMsgEndDialog, OLEUI_CANCEL, 0L); ! 394: break; ! 395: ! 396: ! 397: case IDCV_HELP: ! 398: PostMessage(lpCV->lpOCV->hWndOwner, ! 399: uMsgHelp, (WPARAM)hDlg, MAKELPARAM(IDD_CONVERT, 0)); ! 400: break; ! 401: ! 402: case IDCV_DISPLAYASICON: ! 403: { ! 404: ! 405: int i; ! 406: BOOL fCheck; ! 407: ! 408: fCheck=IsDlgButtonChecked(hDlg, wID); ! 409: ! 410: if (fCheck) ! 411: lpCV->dvAspect = DVASPECT_ICON; ! 412: else ! 413: lpCV->dvAspect = DVASPECT_CONTENT; ! 414: ! 415: if (fCheck && (!lpCV->fCustomIcon)) ! 416: UpdateCVClassIcon(hDlg, lpCV, lpCV->hListVisible); ! 417: ! 418: //Show or hide the icon depending on the check state. ! 419: ! 420: i=(fCheck) ? SW_SHOWNORMAL : SW_HIDE; ! 421: ! 422: StandardShowDlgItem(hDlg, IDCV_CHANGEICON, i); ! 423: StandardShowDlgItem(hDlg, IDCV_ICON, i); ! 424: StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, i); ! 425: StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, i); ! 426: ! 427: SetConvertResults(hDlg, lpCV); ! 428: ! 429: } ! 430: break; ! 431: ! 432: case IDCV_CHANGEICON: ! 433: { ! 434: LPMALLOC pIMalloc; ! 435: LPSTR pszString, pszCLSID; ! 436: int iSel; ! 437: HICON hIcon; ! 438: char szLabel[OLEUI_CCHLABELMAX]; ! 439: int Index; ! 440: ! 441: ! 442: //Initialize the structure for the hook. ! 443: _fmemset((LPOLEUICHANGEICON)&ci, 0, sizeof(ci)); ! 444: ! 445: ! 446: // Create the hMetaPict here from icon, label, ! 447: // index, and path ! 448: ! 449: hIcon = (HICON)SendDlgItemMessage(hDlg, IDCV_ICON, STM_GETICON, 0, 0L); ! 450: ! 451: // the combined length of the 2 label lines won't ever be more than ! 452: // OLEUI_CCHLABELMAX. ! 453: ! 454: Index = (int)SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_GETTEXT, OLEUI_CCHLABELMAX, (LPARAM)(LPSTR)szLabel); ! 455: ! 456: if (Index < OLEUI_CCHLABELMAX) ! 457: { ! 458: LPSTR lpszSecondLine; ! 459: ! 460: lpszSecondLine = szLabel + Index; ! 461: ! 462: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_GETTEXT, ! 463: OLEUI_CCHLABELMAX-Index, ! 464: (LPARAM)(LPSTR)lpszSecondLine); ! 465: } ! 466: ! 467: ci.hMetaPict = ! 468: OleUIMetafilePictFromIconAndLabel(hIcon, ! 469: (LPSTR)szLabel, ! 470: lpCV->lpszIconSource, ! 471: lpCV->IconIndex); ! 472: ! 473: ci.cbStruct =sizeof(ci); ! 474: ci.hWndOwner=hDlg; ! 475: ci.dwFlags = CIF_SELECTCURRENT; ! 476: ! 477: // Only show help if we're showing it for this dialog. ! 478: if (lpCV->dwFlags & CF_SHOWHELPBUTTON) ! 479: ci.dwFlags |= CIF_SHOWHELP; ! 480: ! 481: iSel = (int)SendMessage(lpCV->hListVisible, LB_GETCURSEL, 0, 0L); ! 482: ! 483: CoGetMalloc(MEMCTX_TASK, &pIMalloc); ! 484: ! 485: pszString = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHLABELMAX + OLEUI_CCHCLSIDSTRING); ! 486: ! 487: // Get whole string ! 488: SendMessage(lpCV->hListVisible, LB_GETTEXT, iSel, (LONG)pszString); ! 489: ! 490: // Set pointer to CLSID (string) ! 491: pszCLSID = PointerToNthField(pszString, 2, '\t'); ! 492: ! 493: // Get the clsid to pass to change icon. ! 494: CLSIDFromString((LPSTR)pszCLSID, (LPCLSID)&(ci.clsid)); ! 495: ! 496: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszString); ! 497: pIMalloc->lpVtbl->Release(pIMalloc); ! 498: ! 499: //Let the hook in to customize Change Icon if desired. ! 500: uRet=UStandardHook(lpCV, hDlg, uMsgChangeIcon ! 501: , 0, (LONG)(LPSTR)&ci); ! 502: ! 503: if (0==uRet) ! 504: uRet=(UINT)(OLEUI_OK==OleUIChangeIcon((LPOLEUICHANGEICON)&ci)); ! 505: ! 506: //Update the display if necessary. ! 507: if (0!=uRet) ! 508: { ! 509: HICON hIcon; ! 510: char szLabel[OLEUI_CCHLABELMAX]; ! 511: DWORD dwWrapIndex; ! 512: ! 513: ! 514: hIcon = OleUIMetafilePictExtractIcon(ci.hMetaPict); ! 515: ! 516: SendDlgItemMessage(hDlg, IDCV_ICON, STM_SETICON, (WPARAM)hIcon, 0L); ! 517: ! 518: OleUIMetafilePictExtractIconSource(ci.hMetaPict, lpCV->lpszIconSource, &(lpCV->IconIndex)); ! 519: ! 520: OleUIMetafilePictExtractLabel(ci.hMetaPict, szLabel, OLEUI_CCHLABELMAX, &dwWrapIndex); ! 521: ! 522: if (0 == dwWrapIndex) // no second line ! 523: { ! 524: SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_SETTEXT, 0, (LPARAM)(LPSTR)szLabel); ! 525: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)(LPSTR)""); ! 526: } ! 527: else ! 528: { ! 529: ! 530: LPSTR lpszSecondLine; ! 531: ! 532: lpszSecondLine = szLabel + dwWrapIndex; ! 533: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, ! 534: WM_SETTEXT, 0, (LPARAM)lpszSecondLine); ! 535: ! 536: *lpszSecondLine = '\0'; ! 537: SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, ! 538: WM_SETTEXT, 0, (LPARAM)(LPSTR)szLabel); ! 539: } ! 540: ! 541: ! 542: // Update our custom/default flag ! 543: ! 544: if (ci.dwFlags & CIF_SELECTDEFAULT) ! 545: lpCV->fCustomIcon = FALSE; // we're in default mode (icon changes on each LB selchange) ! 546: else if (ci.dwFlags & CIF_SELECTFROMFILE) ! 547: lpCV->fCustomIcon = TRUE; // we're in custom mode (icon doesn't change) ! 548: // no change in fCustomIcon if user selected current ! 549: ! 550: ! 551: lpCV->lpOCV->fObjectsIconChanged = TRUE; ! 552: } ! 553: } ! 554: break; ! 555: ! 556: } ! 557: break; ! 558: } ! 559: return FALSE; ! 560: } ! 561: ! 562: ! 563: /* ! 564: * FConvertInit ! 565: * ! 566: * Purpose: ! 567: * WM_INITIDIALOG handler for the Convert dialog box. ! 568: * ! 569: * Parameters: ! 570: * hDlg HWND of the dialog ! 571: * wParam WPARAM of the message ! 572: * lParam LPARAM of the message ! 573: * ! 574: * Return Value: ! 575: * BOOL Value to return for WM_INITDIALOG. ! 576: */ ! 577: ! 578: BOOL FConvertInit(HWND hDlg, WPARAM wParam, LPARAM lParam) ! 579: { ! 580: LPCONVERT lpCV; ! 581: LPOLEUICONVERT lpOCV; ! 582: LPMALLOC pIMalloc; ! 583: HFONT hFont; // non-bold version of dialog's font ! 584: RECT rc; ! 585: DWORD dw; ! 586: int cItemsActivate; ! 587: HKEY hKey; ! 588: LONG lRet; ! 589: ! 590: ! 591: //Copy the structure at lParam into our instance memory. ! 592: lpCV=(LPCONVERT)LpvStandardInit(hDlg, sizeof(CONVERT), TRUE, (HFONT FAR *)&hFont); ! 593: ! 594: //PvStandardInit send a termination to us already. ! 595: if (NULL==lpCV) ! 596: return FALSE; ! 597: ! 598: lpOCV=(LPOLEUICONVERT)lParam; ! 599: ! 600: lpCV->lpOCV=lpOCV; ! 601: ! 602: lpCV->fCustomIcon = FALSE; ! 603: ! 604: //Copy other information from lpOCV that we might modify. ! 605: lpCV->dwFlags = lpOCV->dwFlags; ! 606: lpCV->clsid = lpOCV->clsid; ! 607: lpCV->dvAspect = lpOCV->dvAspect; ! 608: lpCV->hListVisible = GetDlgItem(hDlg, IDCV_ACTIVATELIST); ! 609: lpCV->hListInvisible = GetDlgItem(hDlg, IDCV_CONVERTLIST); ! 610: lpCV->lpszCurrentObject = lpOCV->lpszUserType; ! 611: ! 612: lpOCV->clsidNew = CLSID_NULL; ! 613: ! 614: lpOCV->fObjectsIconChanged = FALSE; ! 615: ! 616: //Allocate space for our strings ! 617: if (NOERROR != CoGetMalloc(MEMCTX_TASK, &pIMalloc)) ! 618: return FALSE; ! 619: ! 620: lpCV->lpszConvertDefault = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHLABELMAX); ! 621: lpCV->lpszActivateDefault = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHLABELMAX); ! 622: lpCV->lpszIconSource = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHPATHMAX); ! 623: ! 624: //If we got a font, send it to the necessary controls. ! 625: if (NULL!=hFont) ! 626: { ! 627: SendDlgItemMessage(hDlg, IDCV_OBJECTTYPE, WM_SETFONT, (WPARAM)hFont, 0L); ! 628: SendDlgItemMessage(hDlg, IDCV_RESULTTEXT, WM_SETFONT, (WPARAM)hFont, 0L); ! 629: SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_SETFONT, (WPARAM)hFont, 0L); ! 630: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETFONT, (WPARAM)hFont, 0L); ! 631: } ! 632: ! 633: //Hide the help button if necessary ! 634: if (!(lpCV->dwFlags & CF_SHOWHELPBUTTON)) ! 635: StandardShowDlgItem(hDlg, IDCV_HELP, SW_HIDE); ! 636: ! 637: //Fill the Object Type listbox with entries from the reg DB. ! 638: FillClassList(lpOCV->clsid, ! 639: lpCV->hListVisible, ! 640: lpCV->hListInvisible, ! 641: &(lpCV->lpszCurrentObject), ! 642: lpOCV->fIsLinkedObject, ! 643: lpOCV->wFormat); ! 644: ! 645: // Set the name of the current object. ! 646: SetDlgItemText(hDlg, IDCV_OBJECTTYPE, (LPSTR)lpCV->lpszCurrentObject); ! 647: ! 648: // Disable the "Activate As" button if the Activate list doesn't ! 649: // have any objects in it. ! 650: ! 651: cItemsActivate = (int)SendMessage(lpCV->hListVisible, LB_GETCOUNT, 0, 0L); ! 652: ! 653: if (1 >= cItemsActivate) ! 654: EnableWindow(GetDlgItem(hDlg, IDCV_ACTIVATEAS), FALSE); ! 655: ! 656: //Set the tab width in the list to push all the tabs off the side. ! 657: GetClientRect(lpCV->hListVisible, (LPRECT)&rc); ! 658: dw=GetDialogBaseUnits(); ! 659: rc.right =(8*rc.right)/LOWORD(dw); //Convert pixels to 2x dlg units. ! 660: SendMessage(lpCV->hListVisible, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)(&rc.right)); ! 661: SendMessage(lpCV->hListInvisible, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)(&rc.right)); ! 662: ! 663: ! 664: // Make sure that either "Convert To" or "Activate As" is selected ! 665: // and initialize listbox contents and selection accordingly ! 666: if (lpCV->dwFlags & CF_SELECTACTIVATEAS) ! 667: { ! 668: // Don't need to adjust listbox here because FillClassList ! 669: // initializes to the "Activate As" state. ! 670: CheckRadioButton(hDlg, IDCV_CONVERTTO, IDCV_ACTIVATEAS, IDCV_ACTIVATEAS); ! 671: ! 672: // Hide the icon stuff when Activate is selected...it gets shown ! 673: // again when Convert is selected. ! 674: ! 675: StandardShowDlgItem(hDlg, IDCV_DISPLAYASICON, SW_HIDE); ! 676: StandardShowDlgItem(hDlg, IDCV_CHANGEICON, SW_HIDE); ! 677: StandardShowDlgItem(hDlg, IDCV_ICON, SW_HIDE); ! 678: StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, SW_HIDE); ! 679: StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, SW_HIDE); ! 680: } ! 681: else ! 682: { ! 683: // Default case. If user hasn't selected either flag, we will ! 684: // come here anyway. ! 685: // swap listboxes. ! 686: ! 687: HWND hWndTemp = lpCV->hListVisible; ! 688: ! 689: ! 690: lpCV->dwFlags |= CF_SELECTCONVERTTO; // Make sure flag is set ! 691: CheckRadioButton(hDlg, IDCV_CONVERTTO, IDCV_ACTIVATEAS, IDCV_CONVERTTO); ! 692: ! 693: SwapWindows(hDlg, lpCV->hListVisible, lpCV->hListInvisible); ! 694: ! 695: lpCV->hListVisible = lpCV->hListInvisible; ! 696: lpCV->hListInvisible = hWndTemp; ! 697: ! 698: EnableWindow(lpCV->hListInvisible, FALSE); ! 699: EnableWindow(lpCV->hListVisible, TRUE); ! 700: } ! 701: ! 702: ! 703: ! 704: // Initialize Default strings. ! 705: ! 706: // Default convert string is easy...just user the user type name from ! 707: // the clsid we got, or the current object ! 708: if ( (lpCV->dwFlags & CF_SETCONVERTDEFAULT) ! 709: && (IsValidClassID(lpCV->lpOCV->clsidConvertDefault)) ) ! 710: { ! 711: dw = OleStdGetUserTypeOfClass((LPCLSID)(&lpCV->lpOCV->clsidConvertDefault), ! 712: lpCV->lpszConvertDefault, ! 713: OLEUI_CCHLABELMAX, ! 714: NULL); ! 715: ! 716: if (0 == dw) ! 717: lstrcpy((LPSTR)lpCV->lpszConvertDefault, (LPSTR)lpCV->lpszCurrentObject); ! 718: } ! 719: else ! 720: lstrcpy((LPSTR)lpCV->lpszConvertDefault, (LPSTR)lpCV->lpszCurrentObject); ! 721: ! 722: ! 723: ! 724: // Default activate is a bit trickier. We want to use the user type ! 725: // name if from the clsid we got (assuming we got one), or the current ! 726: // object if it fails or we didn't get a clsid. But...if there's a ! 727: // Treat As entry in the reg db, then we use that instead. So... the ! 728: // logic boils down to this: ! 729: // ! 730: // if ("Treat As" in reg db) ! 731: // use it; ! 732: // else ! 733: // if (CF_SETACTIVATEDEFAULT) ! 734: // use it; ! 735: // else ! 736: // use current object; ! 737: ! 738: ! 739: ! 740: lRet = RegOpenKey(HKEY_CLASSES_ROOT, "CLSID", (HKEY FAR *)&hKey); ! 741: ! 742: if (lRet != ERROR_SUCCESS) ! 743: goto CheckInputFlag; ! 744: ! 745: else ! 746: { ! 747: LPSTR lpszCLSID; ! 748: char szKey[OLEUI_CCHKEYMAX]; ! 749: CLSID clsid; ! 750: char szValue[OLEUI_CCHKEYMAX]; ! 751: ! 752: StringFromCLSID(&(lpCV->lpOCV->clsid), &lpszCLSID); ! 753: lstrcpy(szKey, lpszCLSID); ! 754: lstrcat(szKey, (LPSTR)"\\TreatAs"); ! 755: ! 756: dw = OLEUI_CCHKEYMAX; ! 757: lRet = RegQueryValue(hKey, (LPSTR)szKey, (LPSTR)szValue, (LPDWORD)&dw); ! 758: ! 759: if (lRet != ERROR_SUCCESS) ! 760: { ! 761: ! 762: RegCloseKey(hKey); ! 763: OleStdFreeString(lpszCLSID, NULL); ! 764: goto CheckInputFlag; ! 765: } ! 766: else ! 767: { ! 768: CLSIDFromString((LPSTR)szValue, &clsid); ! 769: if (0 == OleStdGetUserTypeOfClass(&clsid, ! 770: lpCV->lpszActivateDefault, ! 771: OLEUI_CCHLABELMAX, ! 772: NULL)) ! 773: { ! 774: RegCloseKey(hKey); ! 775: OleStdFreeString(lpszCLSID, NULL); ! 776: goto CheckInputFlag; ! 777: } ! 778: } ! 779: RegCloseKey(hKey); ! 780: OleStdFreeString(lpszCLSID, NULL); ! 781: goto SelectStringInListbox; ! 782: } ! 783: ! 784: ! 785: CheckInputFlag: ! 786: if ( (lpCV->dwFlags & CF_SETACTIVATEDEFAULT) ! 787: && (IsValidClassID(lpCV->lpOCV->clsidActivateDefault)) ) ! 788: { ! 789: dw = OleStdGetUserTypeOfClass((LPCLSID)(&lpCV->lpOCV->clsidActivateDefault), ! 790: lpCV->lpszActivateDefault, ! 791: OLEUI_CCHLABELMAX, ! 792: NULL); ! 793: ! 794: if (0 == dw) ! 795: lstrcpy((LPSTR)lpCV->lpszActivateDefault, (LPSTR)lpCV->lpszCurrentObject); ! 796: } ! 797: else ! 798: lstrcpy((LPSTR)(lpCV->lpszActivateDefault), (LPSTR)lpCV->lpszCurrentObject); ! 799: ! 800: ! 801: SelectStringInListbox: ! 802: ! 803: if (lpCV->dwFlags & CF_SELECTCONVERTTO) ! 804: lRet = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPSTR)(lpCV->lpszConvertDefault)); ! 805: ! 806: else ! 807: lRet = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPSTR)(lpCV->lpszActivateDefault)); ! 808: ! 809: if (LB_ERR == lRet) ! 810: SendMessage(lpCV->hListVisible, LB_SETCURSEL, (WPARAM)0, 0L); ! 811: ! 812: ! 813: // Initialize icon stuff ! 814: if (DVASPECT_ICON == lpCV->dvAspect ) ! 815: { ! 816: SendDlgItemMessage(hDlg, IDCV_DISPLAYASICON, BM_SETCHECK, TRUE, 0L); ! 817: ! 818: if ((HGLOBAL)NULL != lpOCV->hMetaPict) ! 819: { ! 820: char szLabel[OLEUI_CCHLABELMAX]; ! 821: HICON hIcon; ! 822: DWORD dwWrapIndex; ! 823: ! 824: ! 825: // Set the icon to the icon from the hMetaPict, ! 826: // set the label to the label from the hMetaPict. ! 827: ! 828: if (0 != OleUIMetafilePictExtractLabel(lpOCV->hMetaPict, (LPSTR)szLabel, OLEUI_CCHLABELMAX, &dwWrapIndex)) ! 829: { ! 830: if (0 == dwWrapIndex) // no second line ! 831: { ! 832: SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_SETTEXT, 0, (LPARAM)(LPSTR)szLabel); ! 833: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)(LPSTR)""); ! 834: } ! 835: else ! 836: { ! 837: ! 838: LPSTR lpszSecondLine; ! 839: ! 840: lpszSecondLine = szLabel + dwWrapIndex; ! 841: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, ! 842: WM_SETTEXT, 0, (LPARAM)lpszSecondLine); ! 843: ! 844: *lpszSecondLine = '\0'; ! 845: SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, ! 846: WM_SETTEXT, 0, (LPARAM)(LPSTR)szLabel); ! 847: } ! 848: ! 849: ! 850: } ! 851: ! 852: hIcon = OleUIMetafilePictExtractIcon(lpOCV->hMetaPict); ! 853: ! 854: if (NULL != hIcon) ! 855: { ! 856: SendDlgItemMessage(hDlg, IDCV_ICON, STM_SETICON, (WPARAM)hIcon, 0L); ! 857: lpCV->fCustomIcon = TRUE; ! 858: } ! 859: ! 860: OleUIMetafilePictExtractIconSource(lpOCV->hMetaPict, ! 861: (LPSTR)(lpCV->lpszIconSource), ! 862: &(lpCV->IconIndex)); ! 863: ! 864: } ! 865: else ! 866: UpdateCVClassIcon(hDlg, lpCV, lpCV->hListVisible); ! 867: } ! 868: else ! 869: { ! 870: // Hide & disable icon stuff ! 871: StandardShowDlgItem(hDlg, IDCV_ICON, SW_HIDE); ! 872: StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, SW_HIDE); ! 873: StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, SW_HIDE); ! 874: StandardShowDlgItem(hDlg, IDCV_CHANGEICON, SW_HIDE); ! 875: } ! 876: ! 877: // Call the hook with lCustData in lParam ! 878: UStandardHook((LPVOID)lpCV, hDlg, WM_INITDIALOG, wParam, lpOCV->lCustData); ! 879: ! 880: // Update results window ! 881: SetConvertResults(hDlg, lpCV); ! 882: ! 883: // Update caption if lpszCaption was specified ! 884: if (lpCV->lpOCV->lpszCaption && !IsBadReadPtr(lpCV->lpOCV->lpszCaption, 1) ! 885: && lpCV->lpOCV->lpszCaption[0] != '\0') ! 886: SetWindowText(hDlg, (LPSTR)lpCV->lpOCV->lpszCaption); ! 887: ! 888: return TRUE; ! 889: } ! 890: ! 891: ! 892: /* ! 893: * FillClassList ! 894: * ! 895: * Purpose: ! 896: * Enumerates available OLE object classes from the registration ! 897: * database that we can convert or activate the specified clsid from. ! 898: * ! 899: * Note that this function removes any prior contents of the listbox. ! 900: * ! 901: * Parameters: ! 902: * clsid Class ID for class to find convert classes for ! 903: * hList HWND to the listbox to fill. ! 904: * hListActivate HWND to invisible listbox that stores "activate as" list. ! 905: * lpszClassName LPSTR to put the (hr) class name of the clsid; we ! 906: * do it here since we've already got the reg db open. ! 907: * wFormat WORD specifying the format of the original class. ! 908: * ! 909: * Return Value: ! 910: * UINT Number of strings added to the listbox, -1 on failure. ! 911: */ ! 912: ! 913: UINT FillClassList(CLSID clsid, HWND hList, HWND hListInvisible, LPSTR FAR *lplpszCurrentClass, BOOL fIsLinkedObject, WORD wFormat) ! 914: { ! 915: ! 916: DWORD dw; ! 917: UINT cStrings=0; ! 918: HKEY hKey; ! 919: LONG lRet; ! 920: char szFormatKey[OLEUI_CCHKEYMAX]; ! 921: char szClass[OLEUI_CCHKEYMAX]; ! 922: char szFormat[OLEUI_CCHKEYMAX]; ! 923: char szHRClassName[OLEUI_CCHKEYMAX]; ! 924: ! 925: LPSTR lpszCLSID; ! 926: ! 927: ! 928: //Clean out the existing strings. ! 929: SendMessage(hList, LB_RESETCONTENT, 0, 0L); ! 930: SendMessage(hListInvisible, LB_RESETCONTENT, 0, 0L); ! 931: ! 932: //Open up the root key. ! 933: lRet=RegOpenKey(HKEY_CLASSES_ROOT, (LPSTR)"CLSID", (HKEY FAR *)&hKey); ! 934: ! 935: if ((LONG)ERROR_SUCCESS!=lRet) ! 936: return (UINT)-1; ! 937: ! 938: if (NULL == *lplpszCurrentClass) ! 939: { ! 940: // alloc buffer here... ! 941: ! 942: LPMALLOC pIMalloc = NULL; ! 943: HRESULT hrErr; ! 944: ! 945: ! 946: hrErr = CoGetMalloc(MEMCTX_TASK, &pIMalloc); ! 947: ! 948: if (hrErr != NOERROR) ! 949: { ! 950: RegCloseKey(hKey); ! 951: return FALSE; ! 952: } ! 953: ! 954: // Allocate space for lpszCurrentClass ! 955: *lplpszCurrentClass = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX); ! 956: ! 957: lRet = OleStdGetUserTypeOfClass((REFCLSID)&clsid, ! 958: *lplpszCurrentClass, ! 959: OLEUI_CCHLABELMAX, ! 960: NULL); ! 961: ! 962: if (0 ==lRet) ! 963: { ! 964: RegCloseKey(hKey); ! 965: return (UINT)-1; ! 966: } ! 967: } ! 968: ! 969: // Get the class name of the original class. ! 970: StringFromCLSID((REFCLSID)&clsid, (LPSTR FAR *)&lpszCLSID); ! 971: ! 972: ! 973: // Here, we step through the entire registration db looking for ! 974: // class that can read or write the original class' format. We ! 975: // maintain two lists - an activate list and a convert list. The ! 976: // activate list is a subset of the convert list - activate == read/write ! 977: // and convert == read. We swap the listboxes as needed with ! 978: // SwapWindows, and keep track of which is which in the lpCV structure. ! 979: ! 980: // Every item has the following format: ! 981: // ! 982: // Class Name\tclsid\0 ! 983: ! 984: ! 985: cStrings=0; ! 986: lRet=RegEnumKey(hKey, cStrings++, (LPSTR)szClass, OLEUI_CCHKEYMAX); ! 987: ! 988: while ((LONG)ERROR_SUCCESS==lRet) ! 989: { ! 990: // Check for a \Conversion\ReadWriteable\Main entry first - if its ! 991: // readwriteable, then we don't need to bother checking to see if ! 992: // its readable. ! 993: ! 994: lstrcpy((LPSTR)szFormatKey, (LPSTR)szClass); ! 995: lstrcat((LPSTR)szFormatKey, (LPSTR)"\\Conversion\\Readwritable\\Main"); ! 996: ! 997: dw=OLEUI_CCHKEYMAX; ! 998: ! 999: lRet=RegQueryValue(hKey, (LPSTR)szFormatKey, (LPSTR)szFormat, (LONG FAR *)&dw); ! 1000: ! 1001: if ( (LONG)ERROR_SUCCESS != lRet) ! 1002: { ! 1003: // Try \\DataFormats\DefaultFile too ! 1004: ! 1005: lstrcpy((LPSTR)szFormatKey, (LPSTR)szClass); ! 1006: lstrcat((LPSTR)szFormatKey, (LPSTR)"\\DataFormats\\DefaultFile"); ! 1007: ! 1008: dw=OLEUI_CCHKEYMAX; ! 1009: ! 1010: lRet=RegQueryValue(hKey, (LPSTR)szFormatKey, (LPSTR)szFormat, (LONG FAR *)&dw); ! 1011: } ! 1012: ! 1013: ! 1014: if ( ((LONG)ERROR_SUCCESS==lRet) ! 1015: && (FormatIncluded((LPSTR)szFormat, wFormat)) ) ! 1016: { ! 1017: ! 1018: // Here, we've got a list of formats that this class can read ! 1019: // and write. We need to see if the original class' format is ! 1020: // in this list. We do that by looking for wFormat in ! 1021: // szFormat - if it in there, then we add this class to the ! 1022: // both lists and continue. If not, then we look at the ! 1023: // class' readable formats. ! 1024: ! 1025: ! 1026: dw=OLEUI_CCHKEYMAX; ! 1027: lRet=RegQueryValue(hKey, (LPSTR)szClass, (LPSTR)szHRClassName, (LPDWORD)&dw); ! 1028: ! 1029: if ((LONG)ERROR_SUCCESS==lRet) ! 1030: { ! 1031: ! 1032: lstrcat((LPSTR)szHRClassName, (LPSTR)"\t"); ! 1033: lstrcat((LPSTR)szHRClassName, (LPSTR)szClass); ! 1034: ! 1035: SendMessage(hList, LB_ADDSTRING, 0, (DWORD)(LPSTR)szHRClassName); ! 1036: ! 1037: // add to convert list too. ! 1038: SendMessage(hListInvisible, LB_ADDSTRING, 0, (DWORD)(LPSTR)szHRClassName); ! 1039: ! 1040: } ! 1041: ! 1042: } ! 1043: ! 1044: ! 1045: // We either didn't find the readwritable key, or the ! 1046: // list of readwritable formats didn't include the ! 1047: // original class format. So, here we'll check to ! 1048: // see if its in the readable list. ! 1049: ! 1050: ! 1051: // We've got a special case for a linked object here. ! 1052: // If an object is linked, then the only class that ! 1053: // should appear in the convert list is the object's ! 1054: // class. So, here we check to see if the object is ! 1055: // linked. If it is, then we compare the classes. If ! 1056: // they aren't the same, then we just go to the next key. ! 1057: ! 1058: else if ( (!fIsLinkedObject) ! 1059: || (lstrcmp((LPSTR)lpszCLSID, (LPSTR)szClass) == 0) ) ! 1060: { ! 1061: ! 1062: //Check for a \Conversion\Readable\Main entry ! 1063: lstrcpy((LPSTR)szFormatKey, (LPSTR)szClass); ! 1064: lstrcat((LPSTR)szFormatKey, (LPSTR)"\\Conversion\\Readable\\Main"); ! 1065: ! 1066: dw=OLEUI_CCHKEYMAX; ! 1067: ! 1068: // Check to see if this class can read the original class ! 1069: // format. If it can, add the string to the listbox as ! 1070: // CONVERT_LIST. ! 1071: ! 1072: lRet=RegQueryValue(hKey, (LPSTR)szFormatKey, (LPSTR)szFormat, (LPDWORD)&dw); ! 1073: ! 1074: if ( ((LONG)ERROR_SUCCESS==lRet) ! 1075: && (FormatIncluded((LPSTR)szFormat, wFormat)) ) ! 1076: { ! 1077: ! 1078: ! 1079: dw=OLEUI_CCHKEYMAX; ! 1080: lRet=RegQueryValue(hKey, (LPSTR)szClass, (LPSTR)szHRClassName, (LPDWORD)&dw); ! 1081: ! 1082: if ((LONG)ERROR_SUCCESS==lRet) ! 1083: { ! 1084: ! 1085: lstrcat((LPSTR)szHRClassName, (LPSTR)"\t"); ! 1086: lstrcat((LPSTR)szHRClassName, (LPSTR)szClass); ! 1087: ! 1088: SendMessage(hListInvisible, LB_ADDSTRING, 0, (DWORD)(LPSTR)szHRClassName); ! 1089: } // end if ! 1090: ! 1091: } // end if ! 1092: } // end else ! 1093: ! 1094: //Continue with the next key. ! 1095: lRet=RegEnumKey(hKey, cStrings++, (LPSTR)szClass, OLEUI_CCHKEYMAX); ! 1096: ! 1097: } // end while ! 1098: ! 1099: // If the original class isn't already in the list, add it. ! 1100: ! 1101: lstrcpy((LPSTR)szHRClassName, *lplpszCurrentClass); ! 1102: lstrcat((LPSTR)szHRClassName, (LPSTR)"\t"); ! 1103: lstrcat((LPSTR)szHRClassName, lpszCLSID); ! 1104: ! 1105: lRet = SendMessage(hList, LB_FINDSTRING, (WPARAM)-1, (LPARAM)(LPSTR)szHRClassName); ! 1106: ! 1107: // only add it if it's not there already. ! 1108: if (LB_ERR == lRet) ! 1109: SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(LPSTR)szHRClassName); ! 1110: ! 1111: ! 1112: lRet = SendMessage(hListInvisible, LB_FINDSTRING, (WPARAM)-1, (LPARAM)(LPSTR)szHRClassName); ! 1113: ! 1114: // only add it if it's not there already. ! 1115: if (LB_ERR == lRet) ! 1116: SendMessage(hListInvisible, LB_ADDSTRING, 0, (LPARAM)(LPSTR)szHRClassName); ! 1117: ! 1118: // Free the string we got from StringFromCLSID. ! 1119: // OLE2NOTE: StringFromCLSID uses your IMalloc to alloc a ! 1120: // string, so you need to be sure to free the string you ! 1121: // get back, otherwise you'll have leaky memory. ! 1122: ! 1123: OleStdFreeString(lpszCLSID, NULL); ! 1124: ! 1125: RegCloseKey(hKey); ! 1126: ! 1127: return cStrings; ! 1128: } ! 1129: ! 1130: ! 1131: /* ! 1132: * FormatIncluded ! 1133: * ! 1134: * Purpose: ! 1135: * Parses the string for format from the word. ! 1136: * ! 1137: * Parameters: ! 1138: * szStringToSearch String to parse ! 1139: * wFormat format to find ! 1140: * ! 1141: * Return Value: ! 1142: * BOOL TRUE if format is found in string, ! 1143: * FALSE otherwise. ! 1144: */ ! 1145: BOOL FormatIncluded(LPSTR szStringToSearch, WORD wFormat) ! 1146: { ! 1147: ! 1148: LPSTR lpToken; ! 1149: char seps[] = ","; ! 1150: static char szFormat[255]; // max size of atom (what GetClipboardName returns) ! 1151: ! 1152: ! 1153: if (wFormat < 0xC000) // RegisterClipboardFormat returns values ! 1154: _itoa(wFormat, szFormat, 10); // between 0xC000 and 0xFFFF. ! 1155: ! 1156: else ! 1157: GetClipboardFormatName(wFormat, szFormat, 255); ! 1158: ! 1159: ! 1160: lpToken = (LPSTR)_fstrtok(szStringToSearch, seps); ! 1161: ! 1162: while (lpToken != NULL) ! 1163: { ! 1164: ! 1165: if (0 == lstrcmpi(lpToken, szFormat)) ! 1166: return TRUE; ! 1167: ! 1168: else ! 1169: lpToken = (LPSTR)_fstrtok(NULL, seps); ! 1170: } ! 1171: ! 1172: return FALSE; ! 1173: } ! 1174: ! 1175: ! 1176: ! 1177: ! 1178: ! 1179: ! 1180: ! 1181: ! 1182: ! 1183: ! 1184: ! 1185: /* ! 1186: * UpdateCVClassIcon ! 1187: * ! 1188: * Purpose: ! 1189: * Handles LBN_SELCHANGE for the Object Type listbox. On a selection ! 1190: * change, we extract an icon from the server handling the currently ! 1191: * selected object type using the utility function HIconFromClass. ! 1192: * Note that we depend on the behavior of FillClassList to stuff the ! 1193: * object class after a tab in the listbox string that we hide from ! 1194: * view (see WM_INITDIALOG). ! 1195: * ! 1196: * Parameters ! 1197: * hDlg HWND of the dialog box. ! 1198: * lpCV LPCONVERT pointing to the dialog structure ! 1199: * hList HWND of the Object Type listbox. ! 1200: * ! 1201: * Return Value: ! 1202: * None ! 1203: */ ! 1204: ! 1205: void UpdateCVClassIcon(HWND hDlg, LPCONVERT lpCV, HWND hList) ! 1206: { ! 1207: UINT iSel; ! 1208: DWORD cb; ! 1209: HGLOBAL hMem; ! 1210: LPSTR pszName, pszCLSID; ! 1211: CLSID clsid; ! 1212: HICON hIcon, hOldIcon; ! 1213: UINT cch, uWrapIndex; ! 1214: RECT LabelRect; ! 1215: char szLabel[OLEUI_CCHLABELMAX]; ! 1216: HFONT hFont; ! 1217: HWND hLabel1; ! 1218: ! 1219: /* ! 1220: * When we change object type selection, get the new icon for that ! 1221: * type into our structure and update it in the display. ! 1222: */ ! 1223: ! 1224: iSel=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L); ! 1225: ! 1226: if (LB_ERR==(int)iSel) ! 1227: return; ! 1228: ! 1229: //Allocate a string to hold the entire listbox string ! 1230: cb=SendMessage(hList, LB_GETTEXTLEN, iSel, 0L); ! 1231: ! 1232: hMem=GlobalAlloc(GHND, cb+1); ! 1233: ! 1234: if (NULL==hMem) ! 1235: return; ! 1236: ! 1237: pszName=GlobalLock(hMem); ! 1238: ! 1239: // Get whole string ! 1240: SendMessage(hList, LB_GETTEXT, iSel, (LONG)pszName); ! 1241: ! 1242: // Set pointer to CLSID (string) ! 1243: pszCLSID = PointerToNthField(pszName, 2, '\t'); ! 1244: ! 1245: //Create the class ID with this string. ! 1246: CLSIDFromString((LPSTR)pszCLSID, (LPCLSID)&clsid); ! 1247: ! 1248: hIcon = HIconAndSourceFromClass(&clsid, (LPSTR)(lpCV->lpszIconSource), &(lpCV->IconIndex)); ! 1249: ! 1250: if (NULL == hIcon) // Use Vanilla Document ! 1251: { ! 1252: lstrcpy((LPSTR)(lpCV->lpszIconSource), (LPSTR)szOLE2DLL); ! 1253: lpCV->IconIndex = 0; // 1st icon in OLE2.DLL ! 1254: hIcon = ExtractIcon(ghInst, ! 1255: (LPSTR)(lpCV->lpszIconSource), ! 1256: lpCV->IconIndex); ! 1257: } ! 1258: ! 1259: //Replace the current display with this new one. ! 1260: hOldIcon = (HICON)SendDlgItemMessage(hDlg, IDCV_ICON, STM_SETICON, (WPARAM)hIcon, 0L); ! 1261: ! 1262: // Get the label ! 1263: if ((cch = OleStdGetAuxUserType(&clsid, AUXUSERTYPE_SHORTNAME, ! 1264: (LPSTR)szLabel, OLEUI_CCHLABELMAX, NULL)) == 0) { ! 1265: // If we can't get the AuxUserType2, then try the long name ! 1266: if ((cch = OleStdGetUserTypeOfClass(&clsid, (LPSTR)szLabel, ! 1267: OLEUI_CCHKEYMAX, NULL)) == 0) { ! 1268: // last resort; use "Document" as label ! 1269: LoadString(ghInst,IDS_DEFICONLABEL,(LPSTR)szLabel,sizeof(szLabel)); ! 1270: cch = lstrlen((LPSTR)szLabel); ! 1271: } ! 1272: } ! 1273: ! 1274: hLabel1 = GetDlgItem(hDlg, IDCV_ICONLABEL1); ! 1275: ! 1276: GetWindowRect(hLabel1, &LabelRect); ! 1277: ! 1278: hFont = (HFONT)SendMessage(hLabel1, WM_GETFONT, 0, 0L); ! 1279: ! 1280: // Figure out where to split the label ! 1281: uWrapIndex = OleStdIconLabelTextOut(NULL, hFont, 0, 0, 0, &LabelRect, (LPSTR)szLabel, cch, NULL); ! 1282: ! 1283: if (0 == uWrapIndex) ! 1284: { ! 1285: SendMessage(hLabel1, WM_SETTEXT, 0, (LPARAM)(LPSTR)szLabel); ! 1286: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)(LPSTR)""); ! 1287: } ! 1288: else ! 1289: { ! 1290: char chKeep; ! 1291: LPSTR lpszSecondLine; ! 1292: ! 1293: chKeep = szLabel[uWrapIndex]; ! 1294: szLabel[uWrapIndex] = '\0'; ! 1295: ! 1296: SendMessage(hLabel1, WM_SETTEXT, 0, (LPARAM)(LPSTR)szLabel); ! 1297: ! 1298: szLabel[uWrapIndex] = chKeep; ! 1299: lpszSecondLine = szLabel + uWrapIndex; ! 1300: ! 1301: SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)lpszSecondLine); ! 1302: } ! 1303: ! 1304: // get rid of the old icon ! 1305: if ((HICON)NULL != hOldIcon) ! 1306: DestroyIcon(hOldIcon); ! 1307: ! 1308: GlobalUnlock(hMem); ! 1309: GlobalFree(hMem); ! 1310: return; ! 1311: } ! 1312: ! 1313: ! 1314: ! 1315: ! 1316: ! 1317: ! 1318: BOOL IsValidClassID(CLSID cID) ! 1319: { ! 1320: if (0 == _fmemcmp(&cID, &CLSID_NULL, sizeof(CLSID))) // if (CLSID_NULL == cID) ! 1321: return FALSE; ! 1322: else ! 1323: return TRUE; ! 1324: } ! 1325: ! 1326: ! 1327: ! 1328: /* ! 1329: * SetConvertResults ! 1330: * ! 1331: * Purpose: ! 1332: * Centralizes setting of the Result display in the Convert ! 1333: * dialog. Handles loading the appropriate string from the module's ! 1334: * resources and setting the text, displaying the proper result picture, ! 1335: * and showing the proper icon. ! 1336: * ! 1337: * Parameters: ! 1338: * hDlg HWND of the dialog box so we can access controls. ! 1339: * lpCV LPCONVERT in which we assume that the dwFlags is ! 1340: * set to the appropriate radio button selection, and ! 1341: * the list box has the appropriate class selected. ! 1342: * ! 1343: * Return Value: ! 1344: * None ! 1345: */ ! 1346: ! 1347: void SetConvertResults(HWND hDlg, LPCONVERT lpCV) ! 1348: { ! 1349: LPSTR pszT, // temp ! 1350: lpszOutput, // text sent in SetDlgItemText ! 1351: lpszDefObj, // string containing default object class ! 1352: lpszSelObj, // string containing selected object class ! 1353: lpszString; // stirng we get from loadstring ! 1354: ! 1355: UINT i, cch; ! 1356: HGLOBAL hMem; ! 1357: ! 1358: HWND hList; // handle to listbox (so we can just use SendMsg i ! 1359: // instead of SendDlgItemMsg). ! 1360: ! 1361: ! 1362: hList = lpCV->hListVisible; ! 1363: /* ! 1364: * We need scratch memory for loading the stringtable string, loading ! 1365: * the object type from the listbox, loading the source object ! 1366: * type, and constructing the final string. We therefore allocate ! 1367: * four buffers as large as the maximum message length (512) plus ! 1368: * the object type, guaranteeing that we have enough ! 1369: * in all cases. ! 1370: */ ! 1371: i=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L); ! 1372: ! 1373: cch=512+(UINT)SendMessage(hList, LB_GETTEXTLEN, i, 0L); ! 1374: ! 1375: hMem=GlobalAlloc(GHND, (DWORD)(4*cch)); ! 1376: ! 1377: if (NULL==hMem) ! 1378: return; ! 1379: ! 1380: lpszOutput = (LPSTR)GlobalLock(hMem); ! 1381: lpszSelObj = lpszOutput + cch; ! 1382: lpszDefObj = lpszSelObj + cch; ! 1383: lpszString = lpszDefObj + cch; ! 1384: ! 1385: // Get selected object and null terminate human-readable name (1st field). ! 1386: SendMessage(hList, LB_GETTEXT, i, (LONG)lpszSelObj); ! 1387: ! 1388: pszT = PointerToNthField(lpszSelObj, 2, '\t'); ! 1389: ! 1390: pszT = AnsiPrev(lpszSelObj, pszT); ! 1391: ! 1392: *pszT = '\0'; ! 1393: ! 1394: ! 1395: // Get default object ! 1396: ! 1397: GetDlgItemText(hDlg, IDCV_OBJECTTYPE, lpszDefObj, 512); ! 1398: ! 1399: ! 1400: //Default is an empty string. ! 1401: *lpszOutput=0; ! 1402: ! 1403: ! 1404: if (lpCV->dwFlags & CF_SELECTCONVERTTO) ! 1405: { ! 1406: ! 1407: if (lpCV->lpOCV->fIsLinkedObject) // working with linked object ! 1408: LoadString(ghInst, IDS_CVRESULTCONVERTLINK, lpszOutput, cch); ! 1409: ! 1410: ! 1411: else ! 1412: { ! 1413: // converting to a new class ! 1414: if (0 != lstrcmp(lpszDefObj, lpszSelObj)) ! 1415: { ! 1416: if (0 != LoadString(ghInst, IDS_CVRESULTCONVERTTO, lpszString, cch)) ! 1417: wsprintf(lpszOutput, lpszString, lpszDefObj, lpszSelObj); ! 1418: ! 1419: } ! 1420: else // converting to the same class (no conversion) ! 1421: { ! 1422: ! 1423: if (0 != LoadString(ghInst, IDS_CVRESULTNOCHANGE, lpszString, cch)) ! 1424: wsprintf(lpszOutput, lpszString, lpszDefObj); ! 1425: } ! 1426: ! 1427: } ! 1428: ! 1429: if (lpCV->dvAspect == DVASPECT_ICON) // Display as icon is checked ! 1430: { ! 1431: if (0 != LoadString(ghInst, IDS_CVRESULTDISPLAYASICON, lpszString, cch)) ! 1432: lstrcat(lpszOutput, lpszString); ! 1433: } ! 1434: } ! 1435: ! 1436: if (lpCV->dwFlags & CF_SELECTACTIVATEAS) ! 1437: { ! 1438: ! 1439: if (0!=LoadString(ghInst, IDS_CVRESULTACTIVATEAS, lpszString, cch)) ! 1440: wsprintf(lpszOutput, lpszString, lpszDefObj, lpszSelObj); ! 1441: ! 1442: // activating as a new class ! 1443: if (0 != lstrcmp(lpszDefObj, lpszSelObj)) ! 1444: { ! 1445: if (0!=LoadString(ghInst, IDS_CVRESULTACTIVATEDIFF, lpszString, cch)) ! 1446: lstrcat(lpszOutput, lpszString); ! 1447: } ! 1448: else // activating as itself. ! 1449: { ! 1450: lstrcat(lpszOutput, "."); ! 1451: } ! 1452: } ! 1453: ! 1454: ! 1455: //If LoadString failed, we simply clear out the results (*lpszOutput=0 above) ! 1456: SetDlgItemText(hDlg, IDCV_RESULTTEXT, lpszOutput); ! 1457: ! 1458: GlobalUnlock(hMem); ! 1459: GlobalFree(hMem); ! 1460: return; ! 1461: } ! 1462: ! 1463: ! 1464: ! 1465: ! 1466: ! 1467: ! 1468: /* ! 1469: * ConvertCleanup ! 1470: * ! 1471: * Purpose: ! 1472: * Performs convert-specific cleanup before Convert termination. ! 1473: * ! 1474: * Parameters: ! 1475: * hDlg HWND of the dialog box so we can access controls. ! 1476: * ! 1477: * Return Value: ! 1478: * None ! 1479: */ ! 1480: void ConvertCleanup(HWND hDlg, LPCONVERT lpCV) ! 1481: { ! 1482: ! 1483: LPMALLOC pIMalloc; ! 1484: ! 1485: ! 1486: // Free our strings. Zero out the user type name string ! 1487: // the the calling app doesn't free to it. ! 1488: ! 1489: if (NOERROR != CoGetMalloc(MEMCTX_TASK, &pIMalloc)) ! 1490: { ! 1491: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpszConvertDefault); ! 1492: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpszActivateDefault); ! 1493: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpszIconSource); ! 1494: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpOCV->lpszUserType); ! 1495: ! 1496: lpCV->lpOCV->lpszUserType = NULL; ! 1497: ! 1498: pIMalloc->lpVtbl->Release(pIMalloc); ! 1499: } ! 1500: ! 1501: return; ! 1502: } ! 1503: ! 1504: ! 1505: ! 1506: ! 1507: ! 1508: /* ! 1509: * SwapWindows ! 1510: * ! 1511: * Purpose: ! 1512: * Moves hWnd1 to hWnd2's position and hWnd2 to hWnd1's position. ! 1513: * Does NOT change sizes. ! 1514: * ! 1515: * ! 1516: * Parameters: ! 1517: * hDlg HWND of the dialog box so we can turn redraw off ! 1518: * ! 1519: * Return Value: ! 1520: * None ! 1521: */ ! 1522: void SwapWindows(HWND hDlg, HWND hWnd1, HWND hWnd2) ! 1523: { ! 1524: ! 1525: RECT Rect1, Rect2; ! 1526: ! 1527: ! 1528: GetWindowRect(hWnd1, &Rect1); ! 1529: GetWindowRect(hWnd2, &Rect2); ! 1530: ! 1531: ScreenToClient(hDlg, (LPPOINT)&Rect1.left); ! 1532: ScreenToClient(hDlg, (LPPOINT)&Rect1.right); ! 1533: ! 1534: ScreenToClient(hDlg, (LPPOINT)&Rect2.left); ! 1535: ScreenToClient(hDlg, (LPPOINT)&Rect2.right); ! 1536: ! 1537: SetWindowPos(hWnd1, ! 1538: NULL, ! 1539: Rect2.left, ! 1540: Rect2.top, ! 1541: 0, ! 1542: 0, ! 1543: SWP_NOZORDER | SWP_NOSIZE); ! 1544: ! 1545: SetWindowPos(hWnd2, ! 1546: NULL, ! 1547: Rect1.left, ! 1548: Rect1.top, ! 1549: 0, ! 1550: 0, ! 1551: SWP_NOZORDER | SWP_NOSIZE); ! 1552: ! 1553: return; ! 1554: ! 1555: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.