|
|
1.1 root 1: /*
2: * INSOBJ.C
3: *
4: * Implements the OleUIInsertObject function which invokes the complete
5: * Insert Object dialog. Makes use of the OleChangeIcon function in
6: * ICON.C.
7: *
8: * Copyright (c)1993 Microsoft Corporation, All Rights Reserved
9: */
10:
11: #define STRICT 1
12: #include "ole2ui.h"
13: #include <commdlg.h>
14: #include <memory.h>
15: #include <direct.h>
16: #include <malloc.h>
17: #include <dos.h>
18: #include "common.h"
19: #include "utility.h"
20: #include "icon.h"
21: #include "insobj.h"
22: #include "resimage.h"
23: #include "iconbox.h"
24: #include "geticon.h"
25:
26: #define IS_FILENAME_DELIM(c) ( (c) == '\\' || (c) == '/' || (c) == ':' )
27:
28: /*
29: * OleUIInsertObject
30: *
31: * Purpose:
32: * Invokes the standard OLE Insert Object dialog box allowing the
33: * user to select an object source and classname as well as the option
34: * to display the object as itself or as an icon.
35: *
36: * Parameters:
37: * lpIO LPOLEUIINSERTOBJECT pointing to the in-out structure
38: * for this dialog.
39: *
40: * Return Value:
41: * UINT OLEUI_SUCCESS or OLEUI_OK if all is well, otherwise
42: * an error value.
43: */
44:
45: STDAPI_(UINT) OleUIInsertObject(LPOLEUIINSERTOBJECT lpIO)
46: {
47: UINT uRet;
48: HGLOBAL hMemDlg=NULL;
49: HRESULT hrErr;
50:
51: uRet=UStandardValidation((LPOLEUISTANDARD)lpIO, sizeof(OLEUIINSERTOBJECT)
52: , &hMemDlg);
53:
54: if (OLEUI_SUCCESS!=uRet)
55: return uRet;
56:
57: //Now we can do Insert Object specific validation.
58:
59:
60: // NULL is NOT valid for lpszFile
61: if ( (NULL == lpIO->lpszFile)
62: || (IsBadReadPtr(lpIO->lpszFile, lpIO->cchFile))
63: || (IsBadWritePtr(lpIO->lpszFile, lpIO->cchFile)) )
64: uRet=OLEUI_IOERR_LPSZFILEINVALID;
65:
66: if (NULL != lpIO->lpszFile
67: && (lpIO->cchFile <= 0 || lpIO->cchFile > OLEUI_CCHPATHMAX))
68: uRet=OLEUI_IOERR_CCHFILEINVALID;
69:
70: if (0!=lpIO->cClsidExclude)
71: {
72: if (NULL!=lpIO->lpClsidExclude && IsBadReadPtr(lpIO->lpClsidExclude
73: , lpIO->cClsidExclude*sizeof(CLSID)))
74: uRet=OLEUI_IOERR_LPCLSIDEXCLUDEINVALID;
75: }
76:
77: //If we have flags to create any object, validate necessary data.
78: if (lpIO->dwFlags & (IOF_CREATENEWOBJECT | IOF_CREATEFILEOBJECT | IOF_CREATELINKOBJECT))
79: {
80: if (NULL!=lpIO->lpFormatEtc
81: && IsBadReadPtr(lpIO->lpFormatEtc, sizeof(FORMATETC)))
82: uRet=OLEUI_IOERR_LPFORMATETCINVALID;
83:
84: if (NULL!=lpIO->ppvObj && IsBadWritePtr(lpIO->ppvObj, sizeof(LPVOID)))
85: uRet=OLEUI_IOERR_PPVOBJINVALID;
86:
87: if (NULL!=lpIO->lpIOleClientSite
88: && IsBadReadPtr(lpIO->lpIOleClientSite->lpVtbl, sizeof(IOleClientSiteVtbl)))
89: uRet=OLEUI_IOERR_LPIOLECLIENTSITEINVALID;
90:
91: if (NULL!=lpIO->lpIStorage
92: && IsBadReadPtr(lpIO->lpIStorage->lpVtbl, sizeof(IStorageVtbl)))
93: uRet=OLEUI_IOERR_LPISTORAGEINVALID;
94: }
95:
96: if (OLEUI_ERR_STANDARDMIN <= uRet)
97: {
98: if (NULL!=hMemDlg)
99: FreeResource(hMemDlg);
100:
101: return uRet;
102: }
103:
104: //Now that we've validated everything, we can invoke the dialog.
105: uRet=UStandardInvocation(InsertObjectDialogProc, (LPOLEUISTANDARD)lpIO
106: , hMemDlg, MAKEINTRESOURCE(IDD_INSERTOBJECT));
107:
108:
109: //Stop here if we cancelled or had an error.
110: if (OLEUI_SUCCESS !=uRet && OLEUI_OK!=uRet)
111: return uRet;
112:
113:
114: /*
115: * If any of the flags specify that we're to create objects on return
116: * from this dialog, then do so. If we encounter an error in this
117: * processing, we return OLEUI_IOERR_SCODEHASERROR. Since the
118: * three select flags are mutually exclusive, we don't have to
119: * if...else here, just if each case (keeps things cleaner that way).
120: */
121:
122: lpIO->sc=S_OK;
123:
124: //Check if Create New was selected and we have IOF_CREATENEWOBJECT
125: if ((lpIO->dwFlags & IOF_SELECTCREATENEW) && (lpIO->dwFlags & IOF_CREATENEWOBJECT))
126: {
127: hrErr=OleCreate(&lpIO->clsid, &lpIO->iid, lpIO->oleRender
128: , lpIO->lpFormatEtc, lpIO->lpIOleClientSite, lpIO->lpIStorage
129: , lpIO->ppvObj);
130: lpIO->sc = GetScode(hrErr);
131: }
132:
133: //Try Create From File
134: if ((lpIO->dwFlags & IOF_SELECTCREATEFROMFILE))
135: {
136: if (!(lpIO->dwFlags & IOF_CHECKLINK) && (lpIO->dwFlags & IOF_CREATEFILEOBJECT))
137: {
138: hrErr=OleCreateFromFile(&CLSID_NULL, lpIO->lpszFile, &lpIO->iid
139: , lpIO->oleRender, lpIO->lpFormatEtc, lpIO->lpIOleClientSite
140: , lpIO->lpIStorage, lpIO->ppvObj);
141: lpIO->sc = GetScode(hrErr);
142: }
143:
144: if ((lpIO->dwFlags & IOF_CHECKLINK) && (lpIO->dwFlags & IOF_CREATELINKOBJECT))
145: {
146: hrErr=OleCreateLinkToFile(lpIO->lpszFile, &lpIO->iid
147: , lpIO->oleRender, lpIO->lpFormatEtc, lpIO->lpIOleClientSite
148: , lpIO->lpIStorage, lpIO->ppvObj);
149: lpIO->sc = GetScode(hrErr);
150: }
151: }
152:
153: //If we tried but failed a create option, then return the appropriate error
154: if (S_OK!=lpIO->sc)
155: uRet=OLEUI_IOERR_SCODEHASERROR;
156:
157: return uRet;
158: }
159:
160:
161:
162:
163:
164: /*
165: * InsertObjectDialogProc
166: *
167: * Purpose:
168: * Implements the OLE Insert Object dialog as invoked through the
169: * OleUIInsertObject function.
170: */
171:
172: BOOL CALLBACK EXPORT InsertObjectDialogProc(HWND hDlg, UINT iMsg
173: , WPARAM wParam, LPARAM lParam)
174: {
175: LPOLEUIINSERTOBJECT lpOIO;
176: LPINSERTOBJECT lpIO;
177: OLEUICHANGEICON ci;
178: UINT i;
179: BOOL fCheck=FALSE;
180: UINT uRet=0;
181:
182: //Declare Win16/Win32 compatible WM_COMMAND parameters.
183: COMMANDPARAMS(wID, wCode, hWndMsg);
184:
185: //This will fail under WM_INITDIALOG, where we allocate it.
186: lpIO=(LPINSERTOBJECT)LpvStandardEntry(hDlg, iMsg, wParam, lParam, &uRet);
187:
188: //If the hook processed the message, we're done.
189: if (0!=uRet)
190: return (BOOL)uRet;
191:
192: //Process help message from Change Icon
193: if (iMsg==uMsgHelp)
194: {
195: PostMessage(lpIO->lpOIO->hWndOwner, uMsgHelp, wParam, lParam);
196: return FALSE;
197: }
198:
199: //Process the temination message
200: if (iMsg==uMsgEndDialog)
201: {
202: InsertObjectCleanup(hDlg);
203: StandardCleanup(lpIO, hDlg);
204: EndDialog(hDlg, wParam);
205: return TRUE;
206: }
207:
208: switch (iMsg)
209: {
210: case WM_INITDIALOG:
211: return FInsertObjectInit(hDlg, wParam, lParam);
212:
213: case WM_COMMAND:
214: switch (wID)
215: {
216: case ID_IO_CREATENEW:
217: FToggleObjectSource(hDlg, lpIO, IOF_SELECTCREATENEW);
218: break;
219:
220: case ID_IO_CREATEFROMFILE:
221: FToggleObjectSource(hDlg, lpIO, IOF_SELECTCREATEFROMFILE);
222: break;
223:
224: case ID_IO_LINKFILE:
225: fCheck=IsDlgButtonChecked(hDlg, wID);
226:
227: if (fCheck)
228: lpIO->dwFlags |=IOF_CHECKLINK;
229: else
230: lpIO->dwFlags &=~IOF_CHECKLINK;
231:
232: //Results change here, so be sure to update it.
233: SetInsertObjectResults(hDlg, lpIO);
234: UpdateClassIcon(hDlg, lpIO, NULL);
235: break;
236:
237: case ID_IO_OBJECTTYPELIST:
238: switch (wCode)
239: {
240: case LBN_SELCHANGE:
241: UpdateClassIcon(hDlg, lpIO, hWndMsg);
242: SetInsertObjectResults(hDlg, lpIO);
243: break;
244:
245: case LBN_DBLCLK:
246: //Same as pressing OK.
247: SendCommand(hDlg, IDOK, BN_CLICKED, hWndMsg);
248: break;
249: }
250: break;
251:
252:
253: case ID_IO_FILEDISPLAY:
254: //If there are characters, enable OK and Display As Icon
255: if (EN_CHANGE==wCode)
256: {
257: lpIO->fFileDirty = TRUE;
258: lpIO->fFileValid = FALSE;
259:
260: lpIO->fFileSelected=
261: (0L!=SendMessage(hWndMsg, EM_LINELENGTH, 0, 0L));
262: EnableWindow(GetDlgItem(hDlg, ID_IO_LINKFILE), lpIO->fFileSelected);
263: EnableWindow(GetDlgItem(hDlg, ID_IO_DISPLAYASICON), lpIO->fFileSelected);
264: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), lpIO->fFileSelected);
265: EnableWindow(GetDlgItem(hDlg, IDOK), lpIO->fFileSelected);
266: }
267:
268: if (EN_KILLFOCUS==wCode && NULL!=lpIO)
269: {
270: if (FValidateInsertFile(hDlg,FALSE,&lpIO->nErrCode)) {
271: lpIO->fFileDirty = FALSE;
272: lpIO->fFileValid = TRUE;
273: UpdateClassIcon(hDlg, lpIO, NULL);
274: UpdateClassType(hDlg, lpIO, TRUE);
275: } else {
276: lpIO->fFileDirty = FALSE;
277: lpIO->fFileValid = FALSE;
278: UpdateClassType(hDlg, lpIO, FALSE);
279: }
280: }
281: break;
282:
283:
284: case ID_IO_DISPLAYASICON:
285: fCheck=IsDlgButtonChecked(hDlg, wID);
286: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), fCheck);
287:
288: if (fCheck)
289: lpIO->dwFlags |=IOF_CHECKDISPLAYASICON;
290: else
291: lpIO->dwFlags &=~IOF_CHECKDISPLAYASICON;
292:
293: //Update the internal flag based on this checking
294: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
295: lpIO->fAsIconNew=fCheck;
296: else
297: lpIO->fAsIconFile=fCheck;
298:
299: //Re-read the class icon on Display checked
300: if (fCheck)
301: {
302: if (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE)
303: {
304: if (FValidateInsertFile(hDlg, TRUE,&lpIO->nErrCode))
305: {
306: lpIO->fFileDirty = FALSE;
307: lpIO->fFileValid = TRUE;
308: UpdateClassIcon(hDlg, lpIO,
309: GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST));
310:
311: UpdateClassType(hDlg, lpIO, TRUE);
312: }
313:
314: else
315: {
316: HWND hWndEC;
317:
318: lpIO->fAsIconFile= FALSE;
319: lpIO->fFileDirty = FALSE;
320: lpIO->fFileValid = FALSE;
321: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, 0, 0L);
322: UpdateClassType(hDlg, lpIO, FALSE);
323:
324: lpIO->dwFlags &=~IOF_CHECKDISPLAYASICON;
325: CheckDlgButton(hDlg, ID_IO_DISPLAYASICON, 0);
326:
327: hWndEC = GetDlgItem(hDlg, ID_IO_FILEDISPLAY);
328: SetFocus(hWndEC);
329: SendMessage(hWndEC, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1));
330: return TRUE;
331: }
332: }
333: else
334: UpdateClassIcon(hDlg, lpIO,
335: GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST));
336: }
337:
338:
339: //Results change here, so be sure to update it.
340: SetInsertObjectResults(hDlg, lpIO);
341:
342:
343: /*
344: * Show or hide controls as appropriate. Do the icon
345: * display last because it will take some time to repaint.
346: * If we do it first then the dialog looks too sluggish.
347: */
348: i=(fCheck) ? SW_SHOWNORMAL : SW_HIDE;
349: StandardShowDlgItem(hDlg, ID_IO_CHANGEICON, i);
350: StandardShowDlgItem(hDlg, ID_IO_ICONDISPLAY, i);
351:
352: break;
353:
354:
355: case ID_IO_CHANGEICON:
356: {
357:
358: LPMALLOC pIMalloc;
359: HWND hList;
360: LPSTR pszString, pszCLSID;
361:
362: int iCurSel;
363:
364: // if we're in SELECTCREATEFROMFILE mode, then we need to Validate
365: // the contents of the edit control first.
366:
367: if (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE)
368: {
369: if ( lpIO->fFileDirty
370: && !FValidateInsertFile(hDlg, TRUE, &lpIO->nErrCode) )
371: {
372: HWND hWndEC;
373:
374: lpIO->fFileDirty = TRUE;
375: hWndEC = GetDlgItem(hDlg, ID_IO_FILEDISPLAY);
376: SetFocus(hWndEC);
377: SendMessage(hWndEC, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1));
378: return TRUE;
379: }
380: else
381: lpIO->fFileDirty = FALSE;
382: }
383:
384:
385:
386: //Initialize the structure for the hook.
387: _fmemset((LPOLEUICHANGEICON)&ci, 0, sizeof(ci));
388:
389: ci.hMetaPict=(HGLOBAL)SendDlgItemMessage(hDlg
390: , ID_IO_ICONDISPLAY, IBXM_IMAGEGET, 0, 0L);
391:
392: ci.cbStruct =sizeof(ci);
393: ci.hWndOwner=hDlg;
394: ci.dwFlags =CIF_SELECTCURRENT;
395:
396: if (lpIO->dwFlags & IOF_SHOWHELP)
397: ci.dwFlags |= CIF_SHOWHELP;
398:
399:
400:
401:
402: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
403: {
404: // Initialize clsid...
405: if (NOERROR != CoGetMalloc(MEMCTX_TASK, &pIMalloc))
406: return FALSE;
407:
408: pszString = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX + OLEUI_CCHCLSIDSTRING);
409:
410:
411: hList = GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST);
412: iCurSel = (int)SendMessage(hList, LB_GETCURSEL, 0, 0L);
413: SendMessage(hList, LB_GETTEXT, iCurSel, (LONG)pszString);
414:
415: pszCLSID = PointerToNthField(pszString, 2, '\t');
416:
417: CLSIDFromString((LPSTR)pszCLSID, (LPCLSID)&(ci.clsid));
418:
419: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszString);
420: pIMalloc->lpVtbl->Release(pIMalloc);
421: }
422: else // IOF_SELECTCREATEFROMFILE
423: {
424:
425: char szFileName[OLEUI_CCHPATHMAX];
426:
427: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, (LPSTR)szFileName, OLEUI_CCHPATHMAX);
428:
429: if (NOERROR != GetClassFile((LPSTR)szFileName, (LPCLSID)&(ci.clsid)))
430: {
431: LPSTR lpszExtension;
432: int istrlen;
433:
434: istrlen = lstrlen(szFileName);
435:
436: lpszExtension = (LPSTR)szFileName + istrlen -1;
437:
438: while ( (lpszExtension > szFileName) &&
439: (*lpszExtension != '.') )
440: lpszExtension--;
441:
442: GetAssociatedExecutable(lpszExtension, (LPSTR)ci.szIconExe);
443: ci.cchIconExe = lstrlen(ci.szIconExe);
444: ci.dwFlags |= CIF_USEICONEXE;
445:
446: }
447: }
448:
449:
450: //Let the hook in to customize Change Icon if desired.
451: uRet=UStandardHook(lpIO, hDlg, uMsgChangeIcon
452: , 0, (LONG)(LPSTR)&ci);
453:
454: if (0==uRet)
455: uRet=(UINT)(OLEUI_OK==OleUIChangeIcon(&ci));
456:
457: //Update the display and itemdata if necessary.
458: if (0!=uRet)
459: {
460:
461: /*
462: * OleUIChangeIcon will have already freed our
463: * current hMetaPict that we passed in when OK is
464: * pressed in that dialog. So we use 0L as lParam
465: * here so the IconBox doesn't try to free the
466: * metafilepict again.
467: */
468: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET
469: , (WPARAM)ci.hMetaPict, 0L);
470:
471: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
472: SendMessage(hList, LB_SETITEMDATA, iCurSel, MAKELPARAM(ci.hMetaPict, 0));
473: }
474: }
475: break;
476:
477:
478: case ID_IO_FILE:
479: {
480: /*
481: * To allow the hook to customize the browse dialog, we
482: * send OLEUI_MSG_BROWSE. If the hook returns FALSE
483: * we use the default, otherwise we trust that it retrieved
484: * a filename for us. This mechanism prevents hooks from
485: * trapping ID_IO_BROWSE to customize the dialog and from
486: * trying to figure out what we do after we have the name.
487: */
488:
489: char szTemp[OLEUI_CCHPATHMAX];
490: char szInitialDir[OLEUI_CCHPATHMAX];
491: DWORD dwOfnFlags;
492: int nChars;
493: BOOL fUseInitialDir = FALSE;
494:
495:
496: nChars = GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, (LPSTR)szTemp, OLEUI_CCHPATHMAX);
497:
498: if (FValidateInsertFile(hDlg, FALSE, &lpIO->nErrCode))
499: {
500:
501: int istrlen;
502:
503: GetFileTitle((LPSTR)szTemp, lpIO->szFile, OLEUI_CCHPATHMAX);
504:
505: istrlen = lstrlen(lpIO->szFile);
506:
507: lstrcpyn((LPSTR)szInitialDir, szTemp, nChars - istrlen);
508: fUseInitialDir = TRUE;
509:
510: }
511: else // file name isn't valid...lop off end of szTemp to get a
512: // valid directory
513: {
514: #if defined( WIN32 )
515: char szBuffer[OLEUI_CCHPATHMAX];
516: DWORD Attribs;
517:
518: lstrcpyn(szBuffer, szTemp, sizeof(szBuffer)-1);
519: szBuffer[sizeof(szBuffer)-1] = '\0';
520:
521: if ('\\' == szBuffer[nChars-1])
522: szBuffer[nChars-1] = '\0';
523:
524: Attribs = GetFileAttributes(szBuffer);
525: if (Attribs != 0xffffffff &&
526: (Attribs & FILE_ATTRIBUTE_DIRECTORY) )
527: {
528: lstrcpy(szInitialDir, (LPSTR)szBuffer);
529: fUseInitialDir = TRUE;
530: }
531: #else
532: static char szBuffer[OLEUI_CCHPATHMAX];
533: static int attrib ;
534:
535: lstrcpyn(szBuffer, szTemp, sizeof(szBuffer)-1);
536: szBuffer[sizeof(szBuffer)-1] = '\0';
537:
538: if ('\\' == szBuffer[nChars-1])
539: szBuffer[nChars-1] = '\0';
540:
541: AnsiToOem(szBuffer, szBuffer);
542: if(0 == _dos_getfileattr(szBuffer, &attrib))
543: {
544: lstrcpy(szInitialDir, (LPSTR)szBuffer);
545: fUseInitialDir = TRUE;
546: }
547: #endif
548: *lpIO->szFile = '\0';
549: }
550:
551: uRet=UStandardHook(lpIO, hDlg, uMsgBrowse
552: , OLEUI_CCHPATHMAX, (LPARAM)(LPSTR)lpIO->szFile);
553:
554: dwOfnFlags = OFN_FILEMUSTEXIST;
555:
556: // dont show the help button: easiest fix for #4567, since there is no hook proc
557: // if (lpIO->lpOIO->dwFlags & IOF_SHOWHELP)
558: // dwOfnFlags |= OFN_SHOWHELP;
559:
560: if (0==uRet)
561: uRet=(UINT)Browse(hDlg,
562: lpIO->szFile,
563: fUseInitialDir ? (LPSTR)szInitialDir : NULL,
564: OLEUI_CCHPATHMAX,
565: IDS_FILTERS,
566: dwOfnFlags);
567:
568: //Only update if the file changed.
569: if (0!=uRet && 0!=lstrcmpi(szTemp, lpIO->szFile))
570: {
571: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, lpIO->szFile);
572: lpIO->fFileSelected=TRUE;
573:
574: if (FValidateInsertFile(hDlg, TRUE, &lpIO->nErrCode))
575: {
576: lpIO->fFileDirty = FALSE;
577: lpIO->fFileValid = TRUE;
578: UpdateClassIcon(hDlg, lpIO, NULL);
579: UpdateClassType(hDlg, lpIO, TRUE);
580: }
581: else // filename is invalid - set focus back to ec
582: {
583: HWND hWnd;
584:
585: lpIO->fFileDirty = FALSE;
586: lpIO->fFileValid = FALSE;
587: hWnd = GetDlgItem(hDlg, ID_IO_FILEDISPLAY);
588: SetFocus(hWnd);
589: SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1));
590: }
591:
592: //Once we have a file, Display As Icon is always enabled
593: EnableWindow(GetDlgItem(hDlg, ID_IO_DISPLAYASICON), TRUE);
594:
595: //As well as OK
596: EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
597:
598: }
599: }
600: break;
601:
602:
603: case IDOK:
604: {
605: HWND hListBox;
606: WORD iCurSel;
607: char szBuffer[OLEUI_CCHKEYMAX + OLEUI_CCHCLSIDSTRING];
608: LPSTR lpszCLSID;
609:
610: if ((HWND)(LOWORD(lParam)) != GetFocus())
611: SetFocus((HWND)(LOWORD(lParam)));
612:
613:
614:
615: // If the file name is clean (already validated), or
616: // if Create New is selected, then we can skip this part.
617:
618: if ( (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE)
619: && (TRUE == lpIO->fFileDirty) )
620: {
621:
622: if (FValidateInsertFile(hDlg, TRUE, &lpIO->nErrCode))
623: {
624: lpIO->fFileDirty = FALSE;
625: lpIO->fFileValid = TRUE;
626: UpdateClassIcon(hDlg, lpIO, NULL);
627: UpdateClassType(hDlg, lpIO, TRUE);
628: }
629: else // filename is invalid - set focus back to ec
630: {
631: HWND hWnd;
632:
633: lpIO->fFileDirty = FALSE;
634: lpIO->fFileValid = FALSE;
635: hWnd = GetDlgItem(hDlg, ID_IO_FILEDISPLAY);
636: SetFocus(hWnd);
637: SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1));
638: UpdateClassType(hDlg, lpIO, FALSE);
639: }
640:
641: return TRUE; // eat this message
642: }
643: else if ( (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE)
644: && (FALSE == lpIO->fFileValid) )
645: {
646: // filename is invalid - set focus back to ec
647: HWND hWnd;
648: char szFile[OLEUI_CCHPATHMAX];
649:
650: if (0!=GetDlgItemText(hDlg, ID_IO_FILEDISPLAY,
651: szFile, sizeof(szFile)))
652: {
653: OpenFileError(hDlg, lpIO->nErrCode, szFile);
654: }
655: lpIO->fFileDirty = FALSE;
656: lpIO->fFileValid = FALSE;
657: hWnd = GetDlgItem(hDlg, ID_IO_FILEDISPLAY);
658: SetFocus(hWnd);
659: SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1));
660: UpdateClassType(hDlg, lpIO, FALSE);
661: return TRUE; // eat this message
662: }
663:
664: //Copy the necessary information back to the original struct
665: lpOIO=lpIO->lpOIO;
666: lpOIO->dwFlags=lpIO->dwFlags;
667:
668: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
669: {
670: hListBox=GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST);
671: iCurSel=(WORD)SendMessage(hListBox, LB_GETCURSEL, 0, 0);
672:
673: if (lpIO->dwFlags & IOF_CHECKDISPLAYASICON)
674: {
675: lpOIO->hMetaPict=(HGLOBAL)SendMessage(hListBox,
676: LB_GETITEMDATA, iCurSel, 0L);
677:
678: /*
679: * Set the item data to 0 here so that the cleanup
680: * code doesn't delete the metafile.
681: */
682: SendMessage(hListBox, LB_SETITEMDATA, iCurSel, 0L);
683: }
684: else
685: lpOIO->hMetaPict = (HGLOBAL)NULL;
686:
687: SendMessage(hListBox, LB_GETTEXT, iCurSel
688: , (LPARAM)(LPSTR)szBuffer);
689:
690: lpszCLSID=PointerToNthField((LPSTR)szBuffer, 2, '\t');
691: CLSIDFromString(lpszCLSID, &lpOIO->clsid);
692:
693: }
694: else // IOF_SELECTCREATEFROMFILE
695: {
696: if (lpIO->dwFlags & IOF_CHECKDISPLAYASICON)
697: {
698: // get metafile here
699: lpOIO->hMetaPict = (HGLOBAL)SendDlgItemMessage(hDlg,
700: ID_IO_ICONDISPLAY,
701: IBXM_IMAGEGET,
702: 0, 0L);
703:
704:
705: }
706: else
707: lpOIO->hMetaPict = (HGLOBAL)NULL;
708:
709: }
710:
711: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY,
712: lpIO->szFile, lpOIO->cchFile);
713:
714: lstrcpyn(lpOIO->lpszFile, lpIO->szFile, lpOIO->cchFile);
715:
716: SendMessage(hDlg, uMsgEndDialog, OLEUI_OK, 0L);
717: }
718: break;
719:
720: case IDCANCEL:
721: SendMessage(hDlg, uMsgEndDialog, OLEUI_CANCEL, 0L);
722: break;
723:
724: case ID_OLEUIHELP:
725: PostMessage(lpIO->lpOIO->hWndOwner, uMsgHelp
726: , (WPARAM)hDlg, MAKELPARAM(IDD_INSERTOBJECT, 0));
727: break;
728: }
729: break;
730: }
731:
732: return FALSE;
733: }
734:
735:
736:
737:
738: /*
739: * FInsertObjectInit
740: *
741: * Purpose:
742: * WM_INITIDIALOG handler for the Insert Object dialog box.
743: *
744: * Parameters:
745: * hDlg HWND of the dialog
746: * wParam WPARAM of the message
747: * lParam LPARAM of the message
748: *
749: * Return Value:
750: * BOOL Value to return for WM_INITDIALOG.
751: */
752:
753: BOOL FInsertObjectInit(HWND hDlg, WPARAM wParam, LPARAM lParam)
754: {
755: LPOLEUIINSERTOBJECT lpOIO;
756: LPINSERTOBJECT lpIO;
757: RECT rc;
758: DWORD dw;
759: HFONT hFont;
760: HWND hList;
761: UINT u;
762: BOOL fCheck;
763: char *pch;
764:
765: //1. Copy the structure at lParam into our instance memory.
766: lpIO=(LPINSERTOBJECT)LpvStandardInit(hDlg, sizeof(INSERTOBJECT), TRUE, &hFont);
767:
768: //PvStandardInit send a termination to us already.
769: if (NULL==lpIO)
770: return FALSE;
771:
772: lpOIO=(LPOLEUIINSERTOBJECT)lParam;
773:
774: //2. Save the original pointer and copy necessary information.
775: lpIO->lpOIO =lpOIO;
776: lpIO->dwFlags=lpOIO->dwFlags;
777: lpIO->clsid =lpOIO->clsid;
778:
779: if ( (lpOIO->lpszFile) && ('\0' != *lpOIO->lpszFile) )
780: lstrcpyn((LPSTR)lpIO->szFile, lpOIO->lpszFile, OLEUI_CCHPATHMAX);
781: else
782: *(lpIO->szFile) = '\0';
783:
784: lpIO->hMetaPictFile = (HGLOBAL)NULL;
785:
786: //3. If we got a font, send it to the necessary controls.
787: if (NULL!=hFont)
788: {
789: SendDlgItemMessage(hDlg, ID_IO_RESULTTEXT, WM_SETFONT, (WPARAM)hFont, 0L);
790: SendDlgItemMessage(hDlg, ID_IO_FILETYPE, WM_SETFONT, (WPARAM)hFont, 0L);
791: }
792:
793:
794: //4. Fill the Object Type listbox with entries from the reg DB.
795: hList=GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST);
796: UFillClassList(hList, lpOIO->cClsidExclude, lpOIO->lpClsidExclude
797: , (BOOL)(lpOIO->dwFlags & IOF_VERIFYSERVERSEXIST));
798:
799: //Set the tab width in the list to push all the tabs off the side.
800: GetClientRect(hList, &rc);
801: dw=GetDialogBaseUnits();
802: rc.right =(8*rc.right)/LOWORD(dw); //Convert pixels to 2x dlg units.
803: SendMessage(hList, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&rc.right);
804:
805:
806: //5. Initilize the file name display to cwd if we don't have any name.
807: if ('\0' == *(lpIO->szFile))
808: {
809: pch=_getcwd(NULL, OLEUI_CCHPATHMAX);
810: if (*(pch+lstrlen(pch)-1) != '\\')
811: lstrcat(pch, "\\"); // put slash on end of cwd
812: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, pch);
813: lpIO->fFileDirty = TRUE; // cwd is not a valid filename
814: #ifndef __TURBOC__
815: free(pch);
816: #endif
817: }
818: else
819: {
820: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, lpIO->szFile);
821:
822: if (FValidateInsertFile(hDlg, FALSE, &lpIO->nErrCode))
823: lpIO->fFileDirty = FALSE;
824: else
825: lpIO->fFileDirty = TRUE;
826: }
827:
828:
829: //6. Initialize the selected type radiobutton.
830: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
831: {
832: StandardShowDlgItem(hDlg, ID_IO_FILETEXT, SW_HIDE);
833: StandardShowDlgItem(hDlg, ID_IO_FILETYPE, SW_HIDE);
834: StandardShowDlgItem(hDlg, ID_IO_FILEDISPLAY, SW_HIDE);
835: StandardShowDlgItem(hDlg, ID_IO_FILE, SW_HIDE);
836: StandardShowDlgItem(hDlg, ID_IO_LINKFILE, SW_HIDE);
837:
838: CheckRadioButton(hDlg, ID_IO_CREATENEW, ID_IO_CREATEFROMFILE, ID_IO_CREATENEW);
839:
840: lpIO->fAsIconNew=(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON));
841: SetFocus(hList);
842: }
843: else
844: {
845: /*
846: * Use pszType as the initial File. If there's no initial
847: * file then we have to remove any check from Display As
848: * Icon. We also check Link if so indicated for this option.
849: */
850: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPELIST, SW_HIDE);
851: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPETEXT, SW_HIDE);
852:
853: // Don't preselect display as icon if the filename isn't valid
854: if (TRUE == lpIO->fFileDirty)
855: lpIO->dwFlags &= ~(IOF_CHECKDISPLAYASICON);
856:
857: if (IOF_DISABLELINK & lpIO->dwFlags)
858: StandardShowDlgItem(hDlg, ID_IO_LINKFILE, SW_HIDE);
859: else
860: {
861: CheckDlgButton(hDlg, ID_IO_LINKFILE
862: , (BOOL)(0L!=(lpIO->dwFlags & IOF_CHECKLINK)));
863: }
864:
865: CheckRadioButton(hDlg, ID_IO_CREATENEW, ID_IO_CREATEFROMFILE, ID_IO_CREATEFROMFILE);
866:
867: lpIO->fAsIconFile=(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON));
868: SetFocus(GetDlgItem(hDlg, ID_IO_FILEDISPLAY));
869: }
870:
871:
872: //7. Initialize the Display as Icon state
873: fCheck=(BOOL)(lpIO->dwFlags & IOF_CHECKDISPLAYASICON);
874: u=fCheck ? SW_SHOWNORMAL : SW_HIDE;
875:
876: StandardShowDlgItem(hDlg, ID_IO_CHANGEICON, u);
877: StandardShowDlgItem(hDlg, ID_IO_ICONDISPLAY, u);
878:
879: CheckDlgButton(hDlg, ID_IO_DISPLAYASICON, fCheck);
880:
881:
882: //8. Show or hide the help button
883: if (!(lpIO->dwFlags & IOF_SHOWHELP))
884: StandardShowDlgItem(hDlg, ID_OLEUIHELP, SW_HIDE);
885:
886:
887: //9. Initialize the result display
888: UpdateClassIcon(hDlg, lpIO, GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST));
889: SetInsertObjectResults(hDlg, lpIO);
890:
891: //10. Change the caption
892: if (NULL!=lpOIO->lpszCaption)
893: SetWindowText(hDlg, lpOIO->lpszCaption);
894:
895:
896: //All Done: call the hook with lCustData
897: UStandardHook(lpIO, hDlg, WM_INITDIALOG, wParam, lpOIO->lCustData);
898:
899: /*
900: * We either set focus to the listbox or the edit control. In either
901: * case we don't want Windows to do any SetFocus, so we return FALSE.
902: */
903: return FALSE;
904: }
905:
906:
907:
908:
909:
910:
911: /*
912: * UFillClassList
913: *
914: * Purpose:
915: * Enumerates available OLE object classes from the registration
916: * database and fills a listbox with those names.
917: *
918: * Note that this function removes any prior contents of the listbox.
919: *
920: * Parameters:
921: * hList HWND to the listbox to fill.
922: * cIDEx UINT number of CLSIDs to exclude in lpIDEx
923: * lpIDEx LPCLSID to CLSIDs to leave out of the listbox.
924: * fVerify BOOL indicating if we are to validate existence of
925: * servers before putting them in the list.
926: *
927: * Return Value:
928: * UINT Number of strings added to the listbox, -1 on failure.
929: */
930:
931: UINT UFillClassList(HWND hList, UINT cIDEx, LPCLSID lpIDEx, BOOL fVerify)
932: {
933: DWORD dw;
934: UINT cStrings=0;
935: UINT i;
936: UINT cch;
937: HKEY hKey;
938: LONG lRet;
939: HFILE hFile;
940: OFSTRUCT of;
941: BOOL fExclude;
942: LPMALLOC pIMalloc;
943: LPSTR pszExec;
944: LPSTR pszClass;
945: LPSTR pszKey;
946: LPSTR pszID;
947: CLSID clsid;
948:
949: //Get some work buffers
950: if (NOERROR!=CoGetMalloc(MEMCTX_TASK, &pIMalloc))
951: return (UINT)-1;
952:
953: pszExec=(LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX*4);
954:
955: if (NULL==pszExec)
956: {
957: pIMalloc->lpVtbl->Release(pIMalloc);
958: return (UINT)-1;
959: }
960:
961: pszClass=pszExec+OLEUI_CCHKEYMAX;
962: pszKey=pszClass+OLEUI_CCHKEYMAX;
963: pszID=pszKey+OLEUI_CCHKEYMAX;
964:
965: //Open up the root key.
966: lRet=RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey);
967:
968: if ((LONG)ERROR_SUCCESS!=lRet)
969: {
970: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszExec);
971: pIMalloc->lpVtbl->Release(pIMalloc);
972: return (UINT)-1;
973: }
974:
975: //Clean out the existing strings.
976: SendMessage(hList, LB_RESETCONTENT, 0, 0L);
977:
978: cStrings=0;
979:
980: while (TRUE)
981: {
982: lRet=RegEnumKey(hKey, cStrings++, pszClass, OLEUI_CCHKEYMAX);
983:
984: if ((LONG)ERROR_SUCCESS!=lRet)
985: break;
986:
987: //Cheat on lstrcat by using lstrcpy after this string, saving time
988: cch=lstrlen(pszClass);
989:
990: //Check for a \protocol\StdFileEditing\server entry.
991: lstrcpy(pszClass+cch, "\\protocol\\StdFileEditing\\server");
992:
993: dw=OLEUI_CCHKEYMAX;
994: lRet=RegQueryValue(hKey, pszClass, pszKey, &dw);
995:
996: if ((LONG)ERROR_SUCCESS==lRet)
997: {
998: /*
999: * Check if the EXE actually exists. By default we don't do this
1000: * to bring up the dialog faster. If an application wants to be
1001: * stringent, they can provide IOF_VERIFYSERVERSEXIST.
1002: */
1003:
1004: hFile = !HFILE_ERROR;
1005:
1006: if (fVerify)
1007: hFile=OpenFile(pszKey, &of, OF_EXIST);
1008:
1009: if (HFILE_ERROR!=hFile)
1010: {
1011: dw=OLEUI_CCHKEYMAX;
1012: *(pszClass+cch)=0; // set back to rootkey
1013: // Get full user type name
1014: lRet=RegQueryValue(hKey, pszClass, pszKey, &dw);
1015:
1016: if ((LONG)ERROR_SUCCESS!=lRet)
1017: continue; // error getting type name--skip this class
1018:
1019: //Tell the code below to get the string for us.
1020: pszID=NULL;
1021: }
1022: }
1023: else
1024: {
1025: /*
1026: * No \protocol\StdFileEditing\server entry. Look to see if
1027: * there's an Insertable entry. If there is, then use the
1028: * Clsid to look at CLSID\clsid\LocalServer and \InprocServer
1029: */
1030:
1031: lstrcpy(pszClass+cch, "\\Insertable");
1032:
1033: dw=OLEUI_CCHKEYMAX;
1034: lRet=RegQueryValue(hKey, pszClass, pszKey, &dw);
1035:
1036: if ((LONG)ERROR_SUCCESS!=lRet)
1037: continue; // Insertable NOT found--skip this class
1038:
1039: //Get memory for pszID
1040: pszID=pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX);
1041:
1042: if (NULL==pszID)
1043: continue;
1044:
1045: *(pszClass+cch)=0; // set back to rootkey
1046: lstrcat(pszClass+cch, "\\CLSID");
1047:
1048: dw=OLEUI_CCHKEYMAX;
1049: lRet=RegQueryValue(hKey, pszClass, pszID, &dw);
1050:
1051: if ((LONG)ERROR_SUCCESS!=lRet)
1052: continue; // CLSID subkey not found
1053:
1054: lstrcpy(pszExec, "CLSID\\");
1055: lstrcat(pszExec, pszID);
1056:
1057: //CLSID\ is 6, dw contains pszID length.
1058: cch=6+(UINT)dw;
1059:
1060: lstrcpy(pszExec+cch, "\\LocalServer");
1061: dw=OLEUI_CCHKEYMAX;
1062: lRet=RegQueryValue(hKey, pszExec, pszKey, &dw);
1063:
1064: if ((LONG)ERROR_SUCCESS!=lRet)
1065: {
1066: //Try InprocServer
1067: lstrcpy(pszExec+cch, "\\InProcServer");
1068: dw=OLEUI_CCHKEYMAX;
1069: lRet=RegQueryValue(hKey, pszExec, pszKey, &dw);
1070:
1071: if ((LONG)ERROR_SUCCESS!=lRet)
1072: continue;
1073: }
1074:
1075: if (fVerify)
1076: {
1077: if (HFILE_ERROR==OpenFile(pszKey, &of, OF_EXIST))
1078: continue;
1079: }
1080:
1081: dw=OLEUI_CCHKEYMAX;
1082: lRet=RegQueryValue(hKey, pszExec, pszKey, &dw);
1083: *(pszExec+cch)=0; //Remove \\*Server
1084:
1085: if ((LONG)ERROR_SUCCESS!=lRet)
1086: continue;
1087: }
1088:
1089: //Get CLSID to add to listbox.
1090: if (NULL==pszID)
1091: {
1092: CLSIDFromProgID(pszClass, &clsid);
1093: StringFromCLSID(&clsid, &pszID);
1094: }
1095: else
1096: CLSIDFromString(pszID, &clsid);
1097:
1098: //Check if this CLSID is in the exclusion list.
1099: fExclude=FALSE;
1100:
1101: for (i=0; i < cIDEx; i++)
1102: {
1103: if (IsEqualCLSID(&clsid, (LPCLSID)(lpIDEx+i)))
1104: {
1105: fExclude=TRUE;
1106: break;
1107: }
1108: }
1109:
1110: if (fExclude)
1111: continue;
1112:
1113: //We go through all the conditions, add the string.
1114: lstrcat(pszKey, "\t");
1115: lstrcat(pszKey, pszID);
1116: SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)pszKey);
1117:
1118: //We always allocated this regardless of the path
1119: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszID);
1120: }
1121:
1122:
1123: //Select the first item by default
1124: SendMessage(hList, LB_SETCURSEL, 0, 0L);
1125: RegCloseKey(hKey);
1126:
1127: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszExec);
1128: pIMalloc->lpVtbl->Release(pIMalloc);
1129:
1130: return cStrings;
1131: }
1132:
1133:
1134:
1135:
1136:
1137: /*
1138: * FToggleObjectSource
1139: *
1140: * Purpose:
1141: * Handles enabling, disabling, showing, and flag manipulation when the
1142: * user changes between Create New, Insert File, and Link File in the
1143: * Insert Object dialog.
1144: *
1145: * Parameters:
1146: * hDlg HWND of the dialog
1147: * lpIO LPINSERTOBJECT pointing to the dialog structure
1148: * dwOption DWORD flag indicating the option just selected:
1149: * IOF_SELECTCREATENEW or IOF_SELECTCREATEFROMFILE
1150: *
1151: * Return Value:
1152: * BOOL TRUE if the option was already selected, FALSE otherwise.
1153: */
1154:
1155: BOOL FToggleObjectSource(HWND hDlg, LPINSERTOBJECT lpIO, DWORD dwOption)
1156: {
1157: BOOL fTemp;
1158: UINT uTemp;
1159: DWORD dwTemp;
1160: int i;
1161:
1162: //Skip all of this if we're already selected.
1163: if (lpIO->dwFlags & dwOption)
1164: return TRUE;
1165:
1166:
1167: // if we're switching from "from file" to "create new" and we've got
1168: // an icon for "from file", then we need to save it so that we can
1169: // show it if the user reselects "from file".
1170:
1171: if ( (IOF_SELECTCREATENEW == dwOption) &&
1172: (lpIO->dwFlags & IOF_CHECKDISPLAYASICON) )
1173: lpIO->hMetaPictFile = (HGLOBAL)SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGEGET, 0, 0L);
1174:
1175: /*
1176: * 1. Change the Display As Icon checked state to reflect the
1177: * selection for this option, stored in the fAsIcon* flags.
1178: */
1179: fTemp=(IOF_SELECTCREATENEW==dwOption) ? lpIO->fAsIconNew : lpIO->fAsIconFile;
1180:
1181: if (fTemp)
1182: lpIO->dwFlags |=IOF_CHECKDISPLAYASICON;
1183: else
1184: lpIO->dwFlags &=~IOF_CHECKDISPLAYASICON;
1185:
1186: CheckDlgButton(hDlg, ID_IO_DISPLAYASICON
1187: , (BOOL)(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON)));
1188:
1189: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), fTemp);
1190:
1191: /*
1192: * 2. Display Icon: Enabled on Create New or on Create from File if
1193: * there is a selected file.
1194: */
1195: fTemp=(IOF_SELECTCREATENEW==dwOption) ? TRUE : lpIO->fFileSelected;
1196: EnableWindow(GetDlgItem(hDlg, ID_IO_DISPLAYASICON), fTemp);
1197:
1198: //OK and Link follow the same enabling as Display As Icon.
1199: EnableWindow(GetDlgItem(hDlg, IDOK), fTemp);
1200: EnableWindow(GetDlgItem(hDlg, ID_IO_LINKFILE), fTemp);
1201:
1202: //3. Enable Browse... when Create from File is selected.
1203: fTemp=(IOF_SELECTCREATENEW==dwOption);
1204: EnableWindow(GetDlgItem(hDlg, ID_IO_FILE), !fTemp);
1205: EnableWindow(GetDlgItem(hDlg, ID_IO_FILEDISPLAY), !fTemp);
1206:
1207: /*
1208: * 4. Switch between Object Type listbox on Create New and
1209: * file buttons on others.
1210: */
1211: uTemp=(fTemp) ? SW_SHOWNORMAL : SW_HIDE;
1212: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPELIST, uTemp);
1213: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPETEXT, uTemp);
1214:
1215: uTemp=(fTemp) ? SW_HIDE : SW_SHOWNORMAL;
1216: StandardShowDlgItem(hDlg, ID_IO_FILETEXT, uTemp);
1217: StandardShowDlgItem(hDlg, ID_IO_FILETYPE, uTemp);
1218: StandardShowDlgItem(hDlg, ID_IO_FILEDISPLAY, uTemp);
1219: StandardShowDlgItem(hDlg, ID_IO_FILE, uTemp);
1220:
1221: //Link is always hidden if IOF_DISABLELINK is set.
1222: if (IOF_DISABLELINK & lpIO->dwFlags)
1223: uTemp=SW_HIDE;
1224:
1225: StandardShowDlgItem(hDlg, ID_IO_LINKFILE, uTemp); //last use of uTemp
1226:
1227:
1228: //5. Clear out existing any flags selection and set the new one
1229: dwTemp=IOF_SELECTCREATENEW | IOF_SELECTCREATEFROMFILE;
1230: lpIO->dwFlags=(lpIO->dwFlags & ~dwTemp) | dwOption;
1231:
1232:
1233: /*
1234: * Show or hide controls as appropriate. Do the icon
1235: * display last because it will take some time to repaint.
1236: * If we do it first then the dialog looks too sluggish.
1237: */
1238:
1239: i=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON) ? SW_SHOWNORMAL : SW_HIDE;
1240: StandardShowDlgItem(hDlg, ID_IO_CHANGEICON, i);
1241: StandardShowDlgItem(hDlg, ID_IO_ICONDISPLAY, i);
1242:
1243:
1244: //6.Change result display
1245: SetInsertObjectResults(hDlg, lpIO);
1246:
1247: /*
1248: * 7. For Create New, twiddle the listbox to think we selected it
1249: * so it updates the icon from the object type.
1250: *
1251: * For Insert or Link file, set the focus to the filename button
1252: * and update the icon if necessary.
1253: */
1254: if (fTemp)
1255: UpdateClassIcon(hDlg, lpIO, GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST));
1256:
1257: else
1258: {
1259: if (lpIO->fAsIconFile && (NULL != lpIO->hMetaPictFile) )
1260: {
1261: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, (WPARAM)lpIO->hMetaPictFile, 0L);
1262: lpIO->hMetaPictFile = 0;
1263: }
1264: else
1265: UpdateClassIcon(hDlg, lpIO, NULL);
1266:
1267: SetFocus(GetDlgItem(hDlg, ID_IO_FILE));
1268: }
1269:
1270: return FALSE;
1271: }
1272:
1273:
1274: /*
1275: * UpdateClassType
1276: *
1277: * Purpose:
1278: * Updates static text control to reflect current file type. Assumes
1279: * a valid filename.
1280: *
1281: * Parameters
1282: * hDlg HWND of the dialog box.
1283: * lpIO LPINSERTOBJECT pointing to the dialog structure
1284: * fSet TRUE to set the text, FALSE to explicitly clear it
1285: *
1286: * Return Value:
1287: * None
1288: */
1289:
1290: void UpdateClassType(HWND hDlg, LPINSERTOBJECT lpIO, BOOL fSet)
1291: {
1292:
1293: CLSID clsid;
1294: char szFileName[OLEUI_CCHPATHMAX];
1295: char szFileType[OLEUI_CCHLABELMAX];
1296:
1297: *szFileType = '\0';
1298:
1299: if (fSet)
1300: {
1301: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, (LPSTR)szFileName, OLEUI_CCHPATHMAX);
1302:
1303: if (NOERROR == GetClassFile((LPSTR)szFileName, &clsid) )
1304: OleStdGetUserTypeOfClass(&clsid, szFileType, OLEUI_CCHLABELMAX, NULL);
1305:
1306: }
1307:
1308: SetDlgItemText(hDlg, ID_IO_FILETYPE, (LPSTR)szFileType);
1309:
1310: return;
1311: }
1312:
1313:
1314: /*
1315: * UpdateClassIcon
1316: *
1317: * Purpose:
1318: * Handles LBN_SELCHANGE for the Object Type listbox. On a selection
1319: * change, we extract an icon from the server handling the currently
1320: * selected object type using the utility function HIconFromClass.
1321: * Note that we depend on the behavior of FillClassList to stuff the
1322: * object class after a tab in the listbox string that we hide from
1323: * view (see WM_INITDIALOG).
1324: *
1325: * Parameters
1326: * hDlg HWND of the dialog box.
1327: * lpIO LPINSERTOBJECT pointing to the dialog structure
1328: * hList HWND of the Object Type listbox.
1329: *
1330: * Return Value:
1331: * None
1332: */
1333:
1334: void UpdateClassIcon(HWND hDlg, LPINSERTOBJECT lpIO, HWND hList)
1335: {
1336: UINT iSel;
1337: DWORD cb;
1338: LPMALLOC pIMalloc;
1339: LPSTR pszName, pszCLSID, pszTemp;
1340: HGLOBAL hMetaPict;
1341:
1342: LRESULT dwRet;
1343:
1344:
1345: //If Display as Icon is not selected, exit
1346: if (!(lpIO->dwFlags & IOF_CHECKDISPLAYASICON))
1347: return;
1348:
1349: /*
1350: * When we change object type selection, get the new icon for that
1351: * type into our structure and update it in the display. We use the
1352: * class in the listbox when Create New is selected or the association
1353: * with the extension in Create From File.
1354: */
1355:
1356: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
1357: {
1358: iSel=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L);
1359:
1360: if (LB_ERR==(int)iSel)
1361: return;
1362:
1363: //Check to see if we've already got the hMetaPict for this item
1364: dwRet=SendMessage(hList, LB_GETITEMDATA, (WPARAM)iSel, 0L);
1365:
1366: hMetaPict=(HGLOBAL)(UINT)dwRet;
1367:
1368: if (hMetaPict)
1369: {
1370: //Yep, we've already got it, so just display it and return.
1371: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, (WPARAM)hMetaPict, 0L);
1372: return;
1373: }
1374:
1375: iSel=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L);
1376:
1377: if (LB_ERR==(int)iSel)
1378: return;
1379:
1380: //Allocate a string to hold the entire listbox string
1381: cb=SendMessage(hList, LB_GETTEXTLEN, iSel, 0L);
1382: }
1383: else
1384: cb=OLEUI_CCHPATHMAX;
1385:
1386: if (NOERROR!=CoGetMalloc(MEMCTX_TASK, &pIMalloc))
1387: return;
1388:
1389: pszName=(LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, cb+1);
1390:
1391: if (NULL==pszName)
1392: {
1393: pIMalloc->lpVtbl->Release(pIMalloc);
1394: return;
1395: }
1396:
1397: *pszName=0;
1398:
1399: //Get the clsid we want.
1400: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
1401: {
1402: //Grab the classname string from the list
1403: SendMessage(hList, LB_GETTEXT, iSel, (LONG)pszName);
1404:
1405: //Set pointer to CLSID (string)
1406: pszCLSID=PointerToNthField(pszName, 2, '\t');
1407:
1408: //Null terminate pszName string
1409: pszTemp=AnsiPrev(pszName, pszCLSID);
1410:
1411: *pszTemp='\0';
1412: CLSIDFromString(pszCLSID, &lpIO->clsid);
1413:
1414: hMetaPict = GetIconOfClass(ghInst, &lpIO->clsid, NULL, TRUE);
1415: }
1416:
1417: else
1418: {
1419: //Get the class from the filename
1420: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, pszName, OLEUI_CCHPATHMAX);
1421:
1422: hMetaPict = GetIconOfFile(ghInst,
1423: pszName,
1424: lpIO->dwFlags & IOF_CHECKLINK ? TRUE : FALSE);
1425: }
1426:
1427:
1428: //Replace the current display with this new one.
1429: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, (WPARAM)hMetaPict, 0L);
1430:
1431: //Enable or disable "Change Icon" button depending on whether
1432: //we've got a valid filename or not.
1433: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), hMetaPict ? TRUE : FALSE);
1434:
1435: //Save the hMetaPict so that we won't have to re-create
1436: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
1437: SendMessage(hList, LB_SETITEMDATA, (WPARAM)iSel, MAKELPARAM(hMetaPict,0));
1438:
1439: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszName);
1440: pIMalloc->lpVtbl->Release(pIMalloc);
1441: return;
1442: }
1443:
1444:
1445:
1446:
1447: /*
1448: * SetInsertObjectResults
1449: *
1450: * Purpose:
1451: * Centralizes setting of the Result and icon displays in the Insert Object
1452: * dialog. Handles loading the appropriate string from the module's
1453: * resources and setting the text, displaying the proper result picture,
1454: * and showing the proper icon.
1455: *
1456: * Parameters:
1457: * hDlg HWND of the dialog box so we can access controls.
1458: * lpIO LPINSERTOBJECT in which we assume that the
1459: * current radiobutton and Display as Icon selections
1460: * are set. We use the state of those variables to
1461: * determine which string we use.
1462: *
1463: * Return Value:
1464: * None
1465: */
1466:
1467: void SetInsertObjectResults(HWND hDlg, LPINSERTOBJECT lpIO)
1468: {
1469: LPSTR pszT, psz1, psz2, psz3, psz4, pszTemp;
1470: UINT i, iString1, iString2, iImage, cch;
1471: LPMALLOC pIMalloc;
1472: BOOL fAsIcon;
1473:
1474: /*
1475: * We need scratch memory for loading the stringtable string, loading
1476: * the object type from the listbox, and constructing the final string.
1477: * We therefore allocate three buffers as large as the maximum message
1478: * length (512) plus the object type, guaranteeing that we have enough
1479: * in all cases.
1480: */
1481: i=(UINT)SendDlgItemMessage(hDlg, ID_IO_OBJECTTYPELIST, LB_GETCURSEL, 0, 0L);
1482: cch=512+(UINT)SendDlgItemMessage(hDlg, ID_IO_OBJECTTYPELIST, LB_GETTEXTLEN, i, 0L);
1483:
1484: if (NOERROR!=CoGetMalloc(MEMCTX_TASK, &pIMalloc))
1485: return;
1486:
1487: pszTemp=(LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, (DWORD)(4*cch));
1488:
1489: if (NULL==pszTemp)
1490: {
1491: pIMalloc->lpVtbl->Release(pIMalloc);
1492: return;
1493: }
1494:
1495: psz1=pszTemp;
1496: psz2=psz1+cch;
1497: psz3=psz2+cch;
1498: psz4=psz3+cch;
1499:
1500: fAsIcon=(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON));
1501:
1502: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
1503: {
1504: iString1 = fAsIcon ? IDS_IORESULTNEWICON : IDS_IORESULTNEW;
1505: iString2 = 0;
1506: iImage = fAsIcon ? RESULTIMAGE_EMBEDICON : RESULTIMAGE_EMBED;
1507: }
1508:
1509: if (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE)
1510: {
1511: //Pay attention to Link checkbox
1512: if (lpIO->dwFlags & IOF_CHECKLINK)
1513: {
1514: iString1 = fAsIcon ? IDS_IORESULTLINKFILEICON1 : IDS_IORESULTLINKFILE1;
1515: iString2 = fAsIcon ? IDS_IORESULTLINKFILEICON2 : IDS_IORESULTLINKFILE2;
1516: iImage =fAsIcon ? RESULTIMAGE_LINKICON : RESULTIMAGE_LINK;
1517: }
1518: else
1519: {
1520: iString1 = IDS_IORESULTFROMFILE1;
1521: iString2 = fAsIcon ? IDS_IORESULTFROMFILEICON2 : IDS_IORESULTFROMFILE2;
1522: iImage =fAsIcon ? RESULTIMAGE_EMBEDICON : RESULTIMAGE_EMBED;
1523: }
1524: }
1525:
1526: //Default is an empty string.
1527: *psz1=0;
1528:
1529: if (0!=LoadString(ghInst, iString1, psz1, cch))
1530: {
1531:
1532: // Load second string, if necessary
1533: if ( (0 != iString2)
1534: && (0 != LoadString(ghInst, iString2, psz4, cch)) )
1535: {
1536: lstrcat(psz1, psz4); // concatenate strings together.
1537: }
1538:
1539:
1540:
1541: //In Create New, do the extra step of inserting the object type string
1542: if (lpIO->dwFlags & IOF_SELECTCREATENEW)
1543: {
1544: SendDlgItemMessage(hDlg, ID_IO_OBJECTTYPELIST, LB_GETTEXT
1545: , i, (LONG)psz2);
1546:
1547: //Null terminate at any tab (before the classname)
1548: pszT=psz2;
1549: while ('\t'!=*pszT && 0!=*pszT)
1550: pszT++;
1551: *pszT=0;
1552:
1553: //Build the string and point psz1 to it.
1554: wsprintf(psz3, psz1, psz2);
1555: psz1=psz3;
1556: }
1557: }
1558:
1559: //If LoadString failed, we simply clear out the results (*psz1=0 above)
1560: SetDlgItemText(hDlg, ID_IO_RESULTTEXT, psz1);
1561:
1562: //Go change the image and Presto! There you have it.
1563: SendDlgItemMessage(hDlg, ID_IO_RESULTIMAGE, RIM_IMAGESET, iImage, 0L);
1564:
1565: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszTemp);
1566: pIMalloc->lpVtbl->Release(pIMalloc);
1567: return;
1568: }
1569:
1570:
1571:
1572: /*
1573: * FValidateInsertFile
1574: *
1575: * Purpose:
1576: * Given a possibly partial pathname from the file edit control,
1577: * attempt to locate the file and if found, store the full path
1578: * in the edit control ID_IO_FILEDISPLAY.
1579: *
1580: * Parameters:
1581: * hDlg HWND of the dialog box.
1582: * fTellUser BOOL TRUE if function should tell user, FALSE if
1583: * function should validate silently.
1584: *
1585: * Return Value:
1586: * BOOL TRUE if the file is acceptable, FALSE otherwise.
1587: */
1588:
1589: BOOL FValidateInsertFile(HWND hDlg, BOOL fTellUser, UINT FAR* lpnErrCode)
1590: {
1591: OFSTRUCT of;
1592: HFILE hFile;
1593: char szFile[OLEUI_CCHPATHMAX];
1594:
1595: *lpnErrCode = 0;
1596: /*
1597: * To validate we attempt OpenFile on the string. If OpenFile
1598: * fails then we display an error. If not, OpenFile will store
1599: * the complete path to that file in the OFSTRUCT which we can
1600: * then stuff in the edit control.
1601: */
1602:
1603: if (0==GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, szFile, sizeof(szFile)))
1604: return FALSE; // #4569 : return FALSE when there is no text in ctl
1605:
1606: hFile=OpenFile(szFile, &of, OF_EXIST);
1607:
1608: // if file is currently open (ie. sharing violation) OleCreateFromFile
1609: // and OleCreateLinkToFile can still succeed; do not consider it an
1610: // error.
1611: if (HFILE_ERROR==hFile && 0x0020/*sharing violation*/!=of.nErrCode)
1612: {
1613: *lpnErrCode = of.nErrCode;
1614: if (fTellUser)
1615: OpenFileError(hDlg, of.nErrCode, szFile);
1616: return FALSE;
1617: }
1618:
1619: //OFSTRUCT contains an OEM name, not ANSI as we need for the edit box.
1620: OemToAnsi(of.szPathName, of.szPathName);
1621: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, of.szPathName);
1622: return TRUE;
1623: }
1624:
1625:
1626: /*
1627: * InsertObjectCleanup
1628: *
1629: * Purpose:
1630: * Clears cached icon metafiles from those stored in the listbox.
1631: *
1632: * Parameters:
1633: * hDlg HWND of the dialog.
1634: *
1635: * Return Value:
1636: * None
1637: */
1638:
1639: void InsertObjectCleanup(HWND hDlg)
1640: {
1641: HWND hList;
1642: UINT iItems;
1643: HGLOBAL hMetaPict;
1644: LRESULT dwRet;
1645: UINT i;
1646:
1647: hList=GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST);
1648: iItems=(UINT)SendMessage(hList, LB_GETCOUNT, 0, 0L);
1649:
1650: for (i=0; i < iItems; i++)
1651: {
1652: dwRet=SendMessage(hList, LB_GETITEMDATA, (WPARAM)i, 0L);
1653:
1654: //Cast of LRESULT to UINT to HGLOBAL portable to Win32.
1655: hMetaPict=(HGLOBAL)(UINT)dwRet;
1656:
1657: if (hMetaPict)
1658: OleUIMetafilePictIconFree(hMetaPict);
1659: }
1660:
1661: return;
1662: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.