|
|
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.