|
|
1.1 root 1: /*
2: * dialog.c - Handles the Windows 3.1 common dialogs.
3: *
4: * Created by Microsoft Corporation.
5: * (c) Copyright Microsoft Corp. 1990 - 1992 All Rights Reserved
6: */
7:
8: //*** INCLUDES ****
9:
10: #include <windows.h> //* WINDOWS
11: #include <ole.h> //* OLE
12:
13: #include "global.h" //* global
14: #include "demorc.h" //* String table constants
15: #include "register.h" //* Class registration library
16: #include "utility.h"
17: #include "dialog.h"
18: #include "object.h"
19:
20: //*** GLOBALS ***
21: //* strings used with commdlg
22: CHAR szDefExtension[CBMESSAGEMAX];
23: CHAR szFilterSpec[CBFILTERMAX];
24: CHAR szInsertFilter[CBFILTERMAX];
25: CHAR szLastDir[CBPATHMAX];
26: OPENFILENAME OFN;
27: HWND hwndProp = NULL;
28: HWND hRetry;
29:
30: /***************************************************************************
31: * OfnInit()
32: * Initializes the standard file dialog OFN structure.
33: **************************************************************************/
34:
35: VOID FAR OfnInit( //* ENTRY:
36: HANDLE hInst //* instance handle
37: ){ //* LOCAL:
38: LPSTR lpstr; //* string pointer
39:
40: LoadString(hInst, IDS_FILTER, szFilterSpec, CBMESSAGEMAX);
41: LoadString(hInst, IDS_EXTENSION, szDefExtension, CBMESSAGEMAX);
42:
43: OFN.lStructSize = sizeof(OPENFILENAME);
44: OFN.hInstance = hInst;
45: OFN.nMaxCustFilter = CBFILTERMAX;
46: OFN.nMaxFile = CBPATHMAX;
47: OFN.lCustData = NULL;
48: OFN.lpfnHook = NULL;
49: OFN.lpTemplateName = NULL;
50: OFN.lpstrFileTitle = NULL;
51: //* Construct the filter string
52: //* for the Open and Save dialogs
53: lpstr = (LPSTR)szFilterSpec;
54: lstrcat(lpstr, " (*.");
55: lstrcat(lpstr, szDefExtension);
56: lstrcat(lpstr, ")");
57: lpstr += lstrlen(lpstr) + 1;
58:
59: lstrcpy(lpstr, "*.");
60: lstrcat(lpstr, szDefExtension);
61: lpstr += lstrlen(lpstr) + 1;
62: *lpstr = 0;
63:
64: RegMakeFilterSpec(NULL, NULL, (LPSTR)szInsertFilter);
65:
66: }
67:
68: /***************************************************************************
69: * OfnGetName()
70: *
71: * Calls the standard file dialogs to get a file name
72: **************************************************************************/
73:
74: BOOL FAR OfnGetName( //* ENTRY:
75: HWND hwnd, //* parent window handle
76: LPSTR szFileName, //* File name
77: WORD msg //* operation
78: ){ //* LOCAL:
79: BOOL frc; //* return flag
80: CHAR szCaption[CBMESSAGEMAX];//* dialog caption
81:
82: OFN.hwndOwner = hwnd; //* window
83: OFN.nFilterIndex = 1;
84: OFN.lpstrInitialDir = (LPSTR)szLastDir;
85: OFN.Flags = OFN_HIDEREADONLY;
86:
87: switch (msg) //* message
88: {
89: case IDM_OPEN: //* open file
90: Normalize(szFileName);
91: OFN.lpstrDefExt = (LPSTR)szDefExtension;
92: OFN.lpstrFile = (LPSTR)szFileName;
93: OFN.lpstrFilter = (LPSTR)szFilterSpec;
94: LoadString(hInst, IDS_OPENFILE, szCaption, CBMESSAGEMAX);
95: OFN.lpstrTitle = (LPSTR)szCaption;
96: OFN.Flags |= OFN_FILEMUSTEXIST;
97: return GetOpenFileName((LPOPENFILENAME)&OFN);
98: break;
99:
100: case IDM_SAVEAS: //* save as file
101: Normalize(szFileName);
102: OFN.lpstrDefExt = (LPSTR)szDefExtension;
103: OFN.lpstrFile = (LPSTR)szFileName;
104: OFN.lpstrFilter = (LPSTR)szFilterSpec;
105: LoadString(hInst, IDS_SAVEFILE, szCaption, CBMESSAGEMAX);
106: OFN.lpstrTitle = (LPSTR)szCaption;
107: OFN.Flags |= OFN_PATHMUSTEXIST;
108: return GetSaveFileName((LPOPENFILENAME)&OFN);
109: break;
110:
111: case IDM_INSERTFILE: //* insert file
112: OFN.lpstrDefExt = NULL;
113: OFN.lpstrFile = (LPSTR)szFileName;
114: OFN.lpstrFilter = (LPSTR)szInsertFilter;
115: LoadString(hInst, IDS_INSERTFILE, szCaption, CBMESSAGEMAX);
116: OFN.lpstrTitle = (LPSTR)szCaption;
117: OFN.Flags |= OFN_FILEMUSTEXIST;
118: frc = GetOpenFileName((LPOPENFILENAME)&OFN);
119: AddExtension(&OFN);
120: return frc;
121: break;
122:
123: default: //* default
124: break;
125: }
126:
127: }
128:
129: /***************************************************************************
130: * OfnGetNewLinkName() - Sets up the "Change Link..." dialog box
131: *
132: * returns LPSTR - fully qualified filename
133: **************************************************************************/
134:
135: LPSTR FAR OfnGetNewLinkName( //* ENTRY:
136: HWND hwnd, //* calling window or dialog
137: LPSTR lpstrData //* link data
138: ){ //* LOCAL:
139: LPSTR lpReturn = NULL; //* return string
140: LPSTR lpstrFile = NULL; //* non-qualified file name
141: LPSTR lpstrPath = NULL; //* pathname
142: LPSTR lpstrTemp = NULL; //* work string
143: CHAR szDocFile[CBPATHMAX];//* document name
144: CHAR szDocPath[CBPATHMAX];//* document path name
145: CHAR szServerFilter[CBPATHMAX];
146: CHAR szCaption[CBMESSAGEMAX];
147:
148: //* Figure out the link's path
149: //* name and file name
150: lpstrTemp = lpstrData;
151: while (*lpstrTemp++);
152: lpstrPath = lpstrFile = lpstrTemp;
153:
154: while (*(lpstrTemp = AnsiNext(lpstrTemp)))
155: if (*lpstrTemp == '\\')
156: lpstrFile = lpstrTemp + 1;
157: //* Copy the document name
158: lstrcpy(szDocFile, lpstrFile);
159: *(lpstrFile - 1) = 0;
160: //* Copy the path name
161: lstrcpy(szDocPath, ((lpstrPath != lpstrFile) ? lpstrPath : ""));
162: if (lpstrPath != lpstrFile) //* Restore the backslash
163: *(lpstrFile - 1) = '\\';
164: while (*lpstrFile != '.' && *lpstrFile)//* Get the extension
165: lpstrFile++;
166: //* Make a filter that respects
167: //* the link's class name
168: OFN.hwndOwner = hwnd;
169: OFN.nFilterIndex = RegMakeFilterSpec(lpstrData, lpstrFile, szServerFilter);
170: OFN.lpstrDefExt = NULL;
171: OFN.lpstrFile = (LPSTR)szDocFile;
172: OFN.lpstrFilter = (LPSTR)szServerFilter;
173: OFN.lpstrInitialDir = (LPSTR)szDocPath;
174: LoadString(hInst, IDS_CHANGELINK, szCaption, CBMESSAGEMAX);
175: OFN.lpstrTitle = (LPSTR)szCaption;
176: OFN.lpstrCustomFilter = NULL;
177: OFN.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST;
178:
179: //* If we get a file... */
180: if (GetOpenFileName((LPOPENFILENAME)&OFN))
181: {
182: if (!(lpReturn = GlobalLock(GlobalAlloc(LHND, CBPATHMAX))))
183: goto Error;
184:
185: AddExtension(&OFN);
186: lstrcpy(lpReturn, szDocFile);
187:
188: OFN.lpstrInitialDir = (LPSTR)szLastDir;
189: }
190:
191: return lpReturn; //* SUCCESS return
192:
193: Error: //* ERROR Tag
194:
195: return NULL; //* ERROR return
196:
197: }
198:
199: /***************************************************************************
200: * Normalize()
201: * Removes the path specification from the file name.
202: *
203: * Note: It isn't possible to get "<drive>:<filename>" as input because
204: * the path received will always be fully qualified.
205: **************************************************************************/
206:
207: VOID Normalize( //* ENTRY:
208: LPSTR lpstrFile //* file name
209: ){ //* LOCAL:
210: LPSTR lpstrBackslash = NULL;//* back slash
211: LPSTR lpstrTemp = lpstrFile;//* file name
212:
213: while (*lpstrTemp)
214: {
215: if (*lpstrTemp == '\\')
216: lpstrBackslash = lpstrTemp;
217:
218: lpstrTemp = AnsiNext(lpstrTemp);
219: }
220: if (lpstrBackslash)
221: lstrcpy(lpstrFile, lpstrBackslash + 1);
222:
223: }
224:
225: /***************************************************************************
226: * AddExtension()
227: *
228: * Adds the extension corresponding to the filter dropdown.
229: **************************************************************************/
230:
231: VOID AddExtension( //* ENTRY:
232: LPOPENFILENAME lpOFN //* open file structure
233: ){
234:
235: if (lpOFN->nFileExtension == (WORD)lstrlen(lpOFN->lpstrFile)
236: && lpOFN->nFilterIndex)
237: {
238: LPSTR lpstrFilter = (LPSTR)lpOFN->lpstrFilter;
239:
240: while (*lpstrFilter && --lpOFN->nFilterIndex)
241: {
242: while (*lpstrFilter++) ;
243: while (*lpstrFilter++) ;
244: }
245: //* If we got to the filter,
246: if (*lpstrFilter) //* retrieve the extension
247: {
248: while (*lpstrFilter++) ;
249: lpstrFilter++;
250: //* Copy the extension
251: if (lpstrFilter[1] != '*')
252: lstrcat(lpOFN->lpstrFile, lpstrFilter);
253: }
254: }
255:
256: }
257: /****************************************************************************
258: * fnInsertNew()
259: *
260: * Dialog procedure for the Insert New dialog.
261: *
262: * Returns int - TRUE if message processed, FALSE otherwise
263: ***************************************************************************/
264:
265: BOOL APIENTRY fnInsertNew( //* ENTRY:
266: HWND hDlg, //* standard dialog box paramters
267: UINT msg,
268: DWORD wParam,
269: LONG lParam //* (LPSTR) class name
270: ){ //* LOCAL:
271: HWND hwndList; //* handle to listbox
272: static LPSTR lpClassName; //* classname for return value
273:
274: hwndList = GetDlgItem(hDlg, IDD_LISTBOX);
275:
276: switch (msg)
277: {
278: case WM_INITDIALOG:
279: if (!RegGetClassNames(hwndList))
280: EndDialog(hDlg, IDCANCEL);
281:
282: lpClassName = (LPSTR)lParam;
283: SetFocus(hwndList);
284: SendMessage(hwndList, LB_SETCURSEL, 0, 0L);
285: return (FALSE);
286:
287: case WM_COMMAND:
288: {
289: WORD wID = LOWORD(wParam);
290: WORD wCmd = HIWORD(wParam);
291:
292: switch (wID)
293: {
294: case IDD_LISTBOX:
295: if (wCmd != LBN_DBLCLK)
296: break;
297:
298: case IDOK:
299: if (!RegCopyClassName(hwndList, lpClassName))
300: wParam = IDCANCEL;
301:
302: case IDCANCEL:
303: EndDialog(hDlg, wParam);
304: break;
305: }
306: break;
307: }
308: }
309: return FALSE;
310:
311: }
312:
313: /***************************************************************************
314: * LinkProperties();
315: *
316: * Manage the link properties dialog box.
317: **************************************************************************/
318:
319: VOID FAR LinkProperties()
320: { //* LOCAL
321:
322: DialogBox (
323: hInst,
324: MAKEINTRESOURCE(DTPROP),
325: hwndFrame,
326: (DLGPROC)fnProperties
327: );
328: FreeProcInstance(lpfnProperties);
329:
330: }
331:
332: /***************************************************************************
333: * fnProperties()
334: *
335: * Dialog procedure for link properties. The Links dialog allows the user to
336: * change the link options, edit/play the object, cancel the link as
337: * well change links.
338: *
339: * returns BOOL - TRUE if processed, FALSE otherwise
340: **************************************************************************/
341:
342: BOOL APIENTRY fnProperties( //* ENTRY:
343: HWND hDlg, //* standard dialog box parameters
344: UINT msg,
345: DWORD wParam,
346: LONG lParam //* (HWND) child window with focus
347: ){ //* LOCAL:
348: static APPITEMPTR *pLinks; //* pointer to links (associated windows)
349: static INT nLinks; //* number of links
350: static HWND hwndList; //* handle to listbox window
351: static BOOL fTry;
352:
353: switch (msg)
354: {
355: case WM_INITDIALOG:
356: hwndProp = hDlg;
357: hwndList = GetDlgItem(hDlg, IDD_LINKNAME);
358: if (!(InitLinkDlg(hDlg, &nLinks, hwndList, &pLinks)))
359: EndDialog(hDlg, TRUE);
360: UpdateLinkButtons(hDlg,nLinks,hwndList,pLinks);
361: break;
362:
363: case WM_COMMAND:
364: {
365: WORD wID = LOWORD(wParam);
366:
367: switch (wID)
368: {
369: case IDD_CHANGE: //* change links
370: BLOCK_BUSY(fTry);
371: if (ChangeLinks(hDlg,nLinks,hwndList,pLinks))
372: DisplayUpdate(nLinks,hwndList,pLinks, FALSE);
373: return TRUE;
374:
375: case IDD_FREEZE: //* cancel links
376: BLOCK_BUSY(fTry);
377: CancelLinks(hDlg,nLinks,hwndList,pLinks);
378: UpdateLinkButtons(hDlg,nLinks,hwndList,pLinks);
379: return TRUE;
380:
381: case IDD_UPDATE: //* update links
382: BLOCK_BUSY(fTry);
383: DisplayUpdate(nLinks,hwndList,pLinks,TRUE);
384: UpdateLinkButtons(hDlg,nLinks,hwndList,pLinks);
385: return TRUE;
386:
387: case IDD_AUTO:
388: case IDD_MANUAL: //* change link update options
389: BLOCK_BUSY(fTry);
390: if (!SendMessage(GetDlgItem(hDlg,wParam),BM_GETCHECK, 0, 0L))
391: {
392: CheckRadioButton(hDlg, IDD_AUTO ,IDD_MANUAL ,wParam);
393: ChangeUpdateOptions(hDlg,nLinks,hwndList,pLinks,
394: (wParam == IDD_AUTO ? oleupdate_always : oleupdate_oncall));
395: UpdateLinkButtons(hDlg,nLinks,hwndList,pLinks);
396: }
397: return TRUE;
398:
399: case IDD_LINKNAME:
400: if (HIWORD(lParam) == LBN_SELCHANGE)
401: UpdateLinkButtons(hDlg,nLinks,hwndList,pLinks);
402: return TRUE;
403:
404: case IDCANCEL:
405: BLOCK_BUSY(fTry);
406: UndoObjects();
407: END_PROP_DLG(hDlg,pLinks);
408: return TRUE;
409:
410: case IDOK:
411: BLOCK_BUSY(fTry);
412: DelUndoObjects(FALSE);
413: END_PROP_DLG(hDlg,pLinks);
414: return TRUE;
415: }
416: }
417: }
418: return FALSE;
419: }
420:
421:
422: /****************************************************************************
423: * InitLinkDlg();
424: *
425: * Initialize the list box of links.
426: ***************************************************************************/
427:
428: static BOOL InitLinkDlg ( //* ENTRY:
429: HWND hDlg, //* dialog box handle
430: INT *nLinks, //* pointer to number of links
431: HWND hwndList, //* listbox handle
432: APPITEMPTR **pLinks //* list of window handles of links
433: ){ //* LOCAL
434: APPITEMPTR pItem; //* application item pointer
435: LPSTR lpstrData = NULL; //* pointer to link data
436: CHAR szFull[CBMESSAGEMAX * 4];//* list box entry string
437: CHAR pLinkData[OBJECT_LINK_MAX];//* holder of link data
438: BOOL fSelect = FALSE; //* item selected flag
439: HANDLE hWork; //* working memory handle
440: APPITEMPTR pTop; //* pointer to the top object
441:
442: if (!(*pLinks = (APPITEMPTR *)LocalLock(LocalAlloc(LHND,sizeof(APPITEMPTR)*10))))
443: {
444: ErrorMessage(E_FAILED_TO_ALLOC);
445: return NULL;
446: }
447: *nLinks = 0;
448: //* set tabs
449: SendMessage(hwndList,WM_SETREDRAW,FALSE,0L);
450: //* enumerate child windows
451: for (pTop = pItem = GetTopItem(); pItem; pItem = GetNextItem(pItem))
452: {
453: if (pItem->otObject == OT_LINK && pItem->fVisible)
454: {
455: *(*pLinks + *nLinks) = pItem;
456: if (!((*nLinks += 1)%10))
457: { //* add blocks of ten
458: hWork = LocalHandle((LPSTR)(*pLinks));
459: LocalUnlock(hWork);
460: if (!(hWork = LocalReAlloc(hWork,(*nLinks+10)*sizeof(APPITEMPTR),NULL)))
461: {
462: ErrorMessage(E_FAILED_TO_ALLOC);
463: return FALSE; //* ERROR return
464: }
465: *pLinks = (APPITEMPTR *)LocalLock(hWork);
466: }
467:
468: if (pTop == pItem)
469: fSelect = TRUE;
470:
471: if (!ObjGetData(pItem, pLinkData))
472: continue;
473: //* make listbox entry
474: MakeListBoxString(pLinkData, szFull, pItem->uoObject);
475: //* add listbox entry
476: SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)(LPSTR)szFull);
477: }
478: }
479:
480: if (fSelect)
481: SendMessage(hwndList, LB_SETSEL, 1, 0L);
482:
483: SendMessage(hwndList,WM_SETREDRAW,TRUE,0L);
484: UpdateWindow(hwndList);
485:
486: return TRUE; //* SUCCESS return
487:
488: }
489:
490: /****************************************************************************
491: * MakeListBoxString()
492: *
493: * build an listbox entry string
494: ***************************************************************************/
495:
496: static VOID MakeListBoxString( //* ENTRY:
497: LPSTR lpLinkData, //* pointer to link data
498: LPSTR lpBoxData, //* return string
499: OLEOPT_UPDATE oleopt_update //* OLE update option
500: ){ //* LOCAL:
501: CHAR szType[CBMESSAGEMAX];//* holds update option string
502: LPSTR lpTemp; //* working string pointer
503: INT i; //* index
504:
505: //* get classname
506: RegGetClassId(lpBoxData, lpLinkData);
507: lstrcat(lpBoxData, " - "); //* ads tab
508:
509: while (*lpLinkData++); //* skip to document name
510:
511: lpTemp = lpLinkData;
512: while (*lpTemp) //* copy document name;
513: { //* strip drive an directory
514: if (*lpTemp == '\\' || *lpTemp == ':')
515: lpLinkData = lpTemp + 1;
516: lpTemp = AnsiNext(lpTemp);
517: }
518: lstrcat(lpBoxData, lpLinkData);
519: lstrcat(lpBoxData, " - ");
520:
521: while (*lpLinkData++); //* copy item data
522: lstrcat(lpBoxData, lpLinkData);
523: lstrcat(lpBoxData, " - ");
524: //* add update option string
525: switch (oleopt_update)
526: {
527: case oleupdate_always: i = SZAUTO; break;
528: case oleupdate_oncall: i = SZMANUAL; break;
529: default: i = SZFROZEN;
530: }
531: LoadString(hInst, i, szType, CBMESSAGEMAX);
532: lstrcat(lpBoxData, szType);
533:
534: } //* SUCCESS return
535:
536: /***************************************************************************
537: * UpdateLinkButtons()
538: *
539: * Keep link buttons active as appropriate. This routine is called after
540: * a selection is made so the buttons reflect the selected items.
541: **************************************************************************/
542:
543: static VOID UpdateLinkButtons( //* ENTRY:
544: HWND hDlg, //* dialog box handle
545: INT nLinks, //* number of links
546: HWND hwndList, //* listbox handle
547: APPITEMPTR *pLinks //* pointer to link's window handles
548: ){ //* LOCAL:
549: ATOM aCurName=0; //* atom of current doc
550: BOOL fChangeLink = TRUE; //* enable/disable changelink button
551: INT iAuto,iManual,i; //* count of manual and auto links
552: APPITEMPTR pItem; //* application item pointer
553: INT iStatic;
554:
555: iStatic = iAuto = iManual = 0;
556:
557: for (i = 0; i < nLinks; i++) //* enum selected links
558: {
559: if (SendMessage(hwndList, LB_GETSEL, i, 0L))
560: {
561: pItem = *(pLinks+i);
562: if (pItem->otObject == OT_STATIC)
563: iStatic++;
564: else
565: {
566: switch(pItem->uoObject)
567: { //* count number of manual and
568: case oleupdate_always: //* automatic links selected
569: iAuto++;
570: break;
571: case oleupdate_oncall:
572: iManual++;
573: break;
574: }
575: //* check if all selected links are
576: if (!aCurName) //* linked to same file
577: aCurName = pItem->aLinkName;
578: else if (aCurName != pItem->aLinkName)
579: fChangeLink = FALSE;
580: }
581: }
582: }
583:
584: if (!(iAuto || iManual || iStatic) //* if no links disable all buttons
585: || (!iAuto && !iManual && iStatic))
586: {
587: EnableWindow(GetDlgItem(hDlg, IDD_FREEZE), FALSE );
588: EnableWindow(GetDlgItem(hDlg, IDD_CHANGE), FALSE );
589: EnableWindow(GetDlgItem(hDlg, IDD_UPDATE), FALSE );
590: CheckDlgButton(hDlg, IDD_AUTO, FALSE);
591: EnableWindow(GetDlgItem(hDlg, IDD_AUTO),FALSE);
592: CheckDlgButton(hDlg, IDD_MANUAL, FALSE);
593: EnableWindow(GetDlgItem(hDlg, IDD_MANUAL),FALSE);
594: }
595: else
596: {
597: EnableWindow(GetDlgItem(hDlg, IDD_UPDATE), TRUE );
598: EnableWindow(GetDlgItem(hDlg, IDD_FREEZE), TRUE );
599:
600: if (iAuto && iManual || !(iAuto || iManual))
601: { //* Set update buttons
602: CheckDlgButton(hDlg, IDD_AUTO, FALSE);
603: EnableWindow(GetDlgItem(hDlg, IDD_AUTO),FALSE);
604: CheckDlgButton(hDlg, IDD_MANUAL, FALSE);
605: EnableWindow(GetDlgItem(hDlg, IDD_MANUAL),FALSE);
606: }
607: else
608: {
609: EnableWindow(GetDlgItem(hDlg, IDD_MANUAL), TRUE);
610: EnableWindow(GetDlgItem(hDlg, IDD_AUTO), TRUE);
611: if (iAuto)
612: {
613: CheckDlgButton(hDlg, IDD_AUTO, TRUE);
614: CheckDlgButton(hDlg, IDD_MANUAL, FALSE);
615: }
616: else
617: {
618: CheckDlgButton(hDlg, IDD_AUTO, FALSE);
619: CheckDlgButton(hDlg, IDD_MANUAL, TRUE);
620: }
621: }
622: }
623:
624: EnableWindow(GetDlgItem(hDlg, IDD_CHANGE),fChangeLink && aCurName);
625:
626: }
627:
628: /****************************************************************************
629: * ChangeLinks()
630: *
631: * This routine changes the linked data if the user chooses a new file to
632: * replace the old document data portion of the linked date. The routine
633: * does nothing if the user cancels.
634: *
635: * returns TRUE - if data changed FALSE if user cancel or err.
636: ***************************************************************************/
637:
638: static BOOL ChangeLinks( //* ENTRY:
639: HWND hDlg, //* dialog handle
640: INT nLinks, //* number of links in listbox
641: HWND hwndList, //* listbox
642: APPITEMPTR *pLinks //* list of application link handles
643: ){ //* LOCAL
644: INT i; //* general index
645: HANDLE hWork; //* work
646: APPITEMPTR pItem; //* application item
647: LPSTR lpNewDoc = NULL; //* new document
648: ATOM aOldDoc; //* atom of old doc. name
649: ATOM aCurDoc = NULL; //* atom of change-to doc. name
650: BOOL fMessage = FALSE; //* error message flag
651: LPSTR lpLinkData; //* pointer to link data
652:
653: lpLinkData = NULL;
654: //* This loop finds all selected links
655: for (i = 0; i < nLinks; i++) //* and updates them
656: {
657: if (SendMessage(hwndList, LB_GETSEL, i, 0L))
658: {
659: pItem = *(pLinks+i);
660: CHECK_IF_STATIC(pItem);
661:
662: pItem->lpLinkData = lpLinkData;
663: if (!ObjGetData(pItem,NULL))
664: continue;
665:
666: if (!lpNewDoc)
667: {
668: if (!(lpNewDoc = OfnGetNewLinkName(hDlg, pItem->lpLinkData)))
669: return FALSE; //* ERROR jump
670: aOldDoc = pItem->aLinkName;
671: aCurDoc = AddAtom(lpNewDoc);
672: SendMessage(hwndList,WM_SETREDRAW,FALSE,0L);
673: }
674:
675: ObjSaveUndo(pItem);
676: ObjChangeLinkData(pItem,lpNewDoc);
677: pItem->aLinkName = aCurDoc;
678: lpLinkData = pItem->lpLinkData;
679:
680: CHANGE_LISTBOX_STRING(hwndList, i, pItem, pItem->lpLinkData);
681:
682: pItem->lpLinkData = NULL;
683: }
684: }
685:
686: /*************************************************************************
687: * now deal with non-selected links and look for a match...
688: *************************************************************************/
689:
690: //* this loop finds non-selected links
691: for (i = 0; i < nLinks; i++) //* and asks the user to update these?
692: {
693: if (!SendMessage(hwndList, LB_GETSEL, i, 0L))
694: {
695: pItem = *(pLinks+i);
696: if (pItem->otObject == OT_STATIC)
697: continue;
698:
699: if (!ObjGetData(pItem,NULL))
700: continue;
701:
702: if (pItem->aLinkName == aOldDoc)
703: {
704: if (!fMessage)
705: {
706: CHAR szMessage[2*CBMESSAGEMAX+3*CBPATHMAX];
707: CHAR szRename[2*CBMESSAGEMAX];
708: CHAR szOldDoc[CBMESSAGEMAX];
709: LPSTR pOldDoc;
710:
711: GetAtomName(aOldDoc,szOldDoc,CBMESSAGEMAX);
712: pOldDoc =(LPSTR)UnqualifyPath(szOldDoc);
713: LoadString(hInst, IDS_RENAME, szRename, 2*CBMESSAGEMAX);
714: wsprintf(
715: szMessage,
716: szRename,
717: pOldDoc,
718: (LPSTR)UnqualifyPath(szFileName),
719: pOldDoc
720: );
721:
722: if (MessageBox(hDlg, szMessage,
723: szAppName, MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
724: break;
725: fMessage = TRUE;
726: }
727:
728: ObjSaveUndo(pItem);
729: ObjChangeLinkData(pItem,lpNewDoc);
730: CHANGE_LISTBOX_STRING(hwndList, i, pItem, pItem->lpLinkData);
731:
732: pItem->aLinkName = aCurDoc;
733: }
734: }
735: }
736:
737: if(lpNewDoc)
738: {
739: hWork = GlobalHandle(lpNewDoc);
740: GlobalUnlock(hWork);
741: GlobalFree(hWork);
742: }
743:
744: if (lpLinkData)
745: FreeLinkData(lpLinkData);
746:
747: SendMessage(hwndList,WM_SETREDRAW,TRUE,0L);
748: InvalidateRect(hwndList,NULL,TRUE);
749: UpdateWindow(hwndList);
750:
751: WaitForAllObjects();
752:
753: if (aCurDoc)
754: DeleteAtom(aCurDoc);
755:
756: return(TRUE);
757: }
758:
759: /****************************************************************************
760: * DisplayUpdate()
761: *
762: * Get the most up to date rendering information and show it.
763: ***************************************************************************/
764:
765: static VOID DisplayUpdate( //* ENTRY:
766: INT nLinks, //* number of links in listbox
767: HWND hwndList, //* listbox
768: APPITEMPTR *pLinks, //* list of application link handles
769: BOOL fSaveUndo //* save undo objects
770: ){ //* LOCAL:
771: INT i; //* index
772: APPITEMPTR pItem; //* temporary item pointer
773:
774:
775: for (i = 0; i < nLinks; i++)
776: if (SendMessage(hwndList, LB_GETSEL, i, 0L))
777: {
778: pItem = *(pLinks+i);
779: CHECK_IF_STATIC(pItem);
780: if (fSaveUndo)
781: ObjSaveUndo(pItem);
782: Error(OleUpdate(pItem->lpObject));
783: }
784:
785: WaitForAllObjects();
786:
787: }
788:
789: /****************************************************************************
790: * UndoObjects()
791: *
792: * Bring objects back to their original state.
793: ***************************************************************************/
794:
795: static VOID UndoObjects()
796: {
797: APPITEMPTR pItem; //* application item pointer
798: //* enum objects
799: for (pItem = GetTopItem(); pItem; pItem = GetNextItem(pItem))
800: if (pItem->lpObjectUndo)
801: ObjUndo(pItem);
802:
803: WaitForAllObjects();
804:
805: }
806:
807:
808: /****************************************************************************
809: * DelUndoObjects()
810: *
811: * remove all objects created for undo operation.
812: ***************************************************************************/
813:
814: static VOID DelUndoObjects( //* ENTRY:
815: BOOL fPrompt //* prompt user?
816: ){ //* LOCAL:
817: APPITEMPTR pItem; //* application item pointer
818: BOOL fPrompted = FALSE; //* prompted user?
819:
820: for (pItem = GetTopItem(); pItem; pItem = GetNextItem(pItem))
821: {
822: if (pItem->lpObjectUndo)
823: {
824: if (fPrompt && !fPrompted) //* prompt user in activation case
825: {
826: CHAR szPrompt[CBMESSAGEMAX];
827:
828: LoadString(hInst, IDS_SAVE_CHANGES, szPrompt, CBMESSAGEMAX);
829:
830: if (MessageBox(hwndFrame, szPrompt,
831: szAppName, MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
832: {
833: UndoObjects();
834: return; //* user canceled operation
835: }
836: fPrompted = TRUE;
837: }
838: ObjDelUndo(pItem); //* delete udo object
839: }
840: }
841:
842: WaitForAllObjects();
843:
844: } //* SUCCESS return
845:
846: /****************************************************************************
847: * CancelLinks()
848: ***************************************************************************/
849:
850: static VOID CancelLinks( //* ENTRY:
851: HWND hDlg, //* calling dialog
852: INT nLinks, //* number of links in listbox
853: HWND hwndList, //* listbox
854: APPITEMPTR *pLinks //* list of application link handles
855: ){ //* LOCAL:
856: APPITEMPTR pItem; //* application item pointer
857: INT i; //* index
858: CHAR pLinkData[OBJECT_LINK_MAX];//* holder of link data
859:
860: SendMessage(hwndList,WM_SETREDRAW,FALSE,0L);
861: for (i = 0; i < nLinks; i++)
862: if (SendMessage(hwndList, LB_GETSEL, i, 0L))
863: {
864: pItem = *(pLinks+i);
865: CHECK_IF_STATIC(pItem);
866: ObjGetData(pItem,pLinkData);
867: ObjSaveUndo(pItem);
868: ObjFreeze(pItem);
869:
870: CHANGE_LISTBOX_STRING(hwndList, i, pItem, pLinkData);
871: }
872:
873: SendMessage(hwndList,WM_SETREDRAW,TRUE,0L);
874: InvalidateRect(hwndList,NULL,TRUE);
875: UpdateWindow(hwndList);
876:
877: }
878:
879:
880: /****************************************************************************
881: * ChangeUpdateOptions()
882: *
883: * Change the update options for all selected objects.
884: ***************************************************************************/
885:
886: static VOID ChangeUpdateOptions( //* ENTRY:
887: HWND hDlg, //* calling dialog
888: INT nLinks, //* number of links in listbox
889: HWND hwndList, //* listbox
890: APPITEMPTR *pLinks, //* list of application link handles
891: OLEOPT_UPDATE lUpdate //* update option
892: ){ //* LOCAL:
893: APPITEMPTR pItem; //* application item
894: INT i; //* index
895: CHAR pLinkData[OBJECT_LINK_MAX];
896:
897: SendMessage(hwndList,WM_SETREDRAW,FALSE,0L);
898:
899: for (i = 0; i < nLinks; i++) //* enum selected objects
900: {
901: if (SendMessage(hwndList, LB_GETSEL, i, 0L))
902: {
903: pItem = *(pLinks+i);
904: CHECK_IF_STATIC(pItem);
905: ObjGetData(pItem,pLinkData);
906: ObjSaveUndo(pItem);
907: if (Error(OleSetLinkUpdateOptions(pItem->lpObject,lUpdate)))
908: continue;
909: pItem->uoObject = lUpdate;
910:
911: CHANGE_LISTBOX_STRING(hwndList, i, pItem, pLinkData);
912: }
913: }
914:
915: SendMessage(hwndList,WM_SETREDRAW,TRUE,0L);
916: InvalidateRect(hwndList,NULL,TRUE);
917: UpdateWindow(hwndList);
918: WaitForAllObjects();
919:
920: }
921: /****************************************************************************
922: * InvalidLink()
923: *
924: * Deal with letting the user know that the program has inadvertently come
925: * across an invalid link.
926: *
927: * Global fPropBoxActive - flag to determine whether or not the link dialog
928: * box is active. If it is not active we give the
929: * user an opportunity to enter the links property
930: * dialog directly from here.
931: ***************************************************************************/
932:
933: VOID FAR InvalidLink()
934: {
935:
936: if (!hwndProp)
937: DialogBox(hInst, "InvalidLink", hwndFrame, (DLGPROC)fnInvalidLink);
938: else
939: ErrorMessage(E_FAILED_TO_CONNECT);
940:
941: }
942:
943: /****************************************************************************
944: * fnABout()
945: *
946: * About box dialog box procedure.
947: ***************************************************************************/
948:
949: BOOL APIENTRY fnInvalidLink( //* ENTRY:
950: HWND hDlg, //* standard windows dialog box
951: UINT message,
952: DWORD wParam,
953: LONG lParam
954: ){
955:
956: switch (message)
957: {
958: case WM_INITDIALOG:
959: return (TRUE);
960:
961: case WM_COMMAND:
962: if (LOWORD(wParam) == IDD_CHANGE)
963: LinkProperties();
964: EndDialog(hDlg, TRUE);
965: return (TRUE);
966: }
967: return (FALSE);
968:
969: }
970:
971: /****************************************************************************
972: * AboutBox()
973: *
974: * Show the About Box dialog.
975: ***************************************************************************/
976:
977: VOID FAR AboutBox()
978: {
979:
980: DialogBox(hInst, "AboutBox", hwndFrame, (DLGPROC)fnAbout);
981:
982: }
983:
984: /****************************************************************************
985: * fnABout()
986: *
987: * About box dialog box procedure.
988: ***************************************************************************/
989:
990: BOOL APIENTRY fnAbout( //* ENTRY:
991: HWND hDlg, //* standard windows dialog box
992: UINT message,
993: DWORD wParam,
994: LONG lParam
995: ){
996:
997: switch (message)
998: {
999: case WM_INITDIALOG:
1000: return (TRUE);
1001:
1002: case WM_COMMAND:
1003: {
1004: WORD wID = LOWORD(wParam);
1005:
1006: if (wID == IDOK || wID == IDCANCEL)
1007: {
1008: EndDialog(hDlg, TRUE);
1009: return (TRUE);
1010: }
1011: break;
1012: }
1013: }
1014: return (FALSE);
1015:
1016: }
1017:
1018:
1019:
1020: /***************************************************************************
1021: * RetryMessage()
1022: *
1023: * give the user the chance to abort when a server is in retry case.
1024: *
1025: * Returns BOOL - TRUE if user chooses to cancel
1026: **************************************************************************/
1027:
1028: VOID FAR RetryMessage ( //* ENTRY:
1029: APPITEMPTR paItem, //* application item pointer
1030: LONG lParam
1031: ){
1032: RETRYPTR pRetry;
1033: LONG objectType;
1034: HANDLE hData;
1035: static CHAR szServerName[KEYNAMESIZE];
1036: HWND hwnd; //* window handle
1037:
1038: if (IsWindow(hwndProp))
1039: hwnd = hwndProp;
1040: else if (IsWindow(hwndFrame))
1041: hwnd = hwndFrame;
1042: else
1043: return; //* should not happen
1044: //* get the busy servers name
1045: lstrcpy(szServerName, "server application");
1046:
1047: if (paItem)
1048: {
1049: if (!paItem->aServer)
1050: {
1051: OleQueryType(paItem->lpObject, &objectType );
1052: if (OLE_OK == OleGetData(paItem->lpObject, (OLECLIPFORMAT) (objectType == OT_LINK ? vcfLink : vcfOwnerLink), &hData ))
1053: {
1054: RegGetClassId(szServerName, GlobalLock(hData));
1055: paItem->aServer = AddAtom(szServerName);
1056: GlobalUnlock( hData );
1057: }
1058: }
1059: else
1060: GetAtomName(paItem->aServer,szServerName,KEYNAMESIZE);
1061:
1062: }
1063:
1064: hData = LocalAlloc(LHND,sizeof(RETRYSTRUCT));
1065: if(!(pRetry = (RETRYPTR)LocalLock(hData)))
1066: return;
1067:
1068: pRetry->lpserver = (LPSTR)szServerName;
1069: pRetry->bCancel = (BOOL)(lParam & RD_CANCEL);
1070: pRetry->paItem = paItem;
1071:
1072: DialogBoxParam(hInst, "RetryBox", hwnd, (DLGPROC)fnRetry, (LONG)pRetry );
1073:
1074: LocalUnlock(hData);
1075: LocalFree(hData);
1076:
1077: hRetry = NULL;
1078:
1079: }
1080:
1081: /****************************************************************************
1082: * fnRetry()
1083: *
1084: * Retry message box nothing to tricky; however, when a server becomes
1085: * unbusy a message is posted to automatically get rid of this dialog.
1086: * I send a no.
1087: ***************************************************************************/
1088:
1089: BOOL APIENTRY fnRetry( //* ENTRY
1090: HWND hDlg, //* standard dialog entry
1091: UINT message,
1092: DWORD wParam,
1093: LONG lParam
1094: ){
1095: static RETRYPTR pRetry;
1096:
1097: switch (message)
1098: {
1099: case WM_COMMAND:
1100: {
1101: WORD wID = LOWORD(wParam);
1102:
1103: switch (wParam)
1104: {
1105: case IDD_SWITCH:
1106: DefWindowProc( hDlg, WM_SYSCOMMAND, SC_TASKLIST, NULL);
1107: break;
1108:
1109: case IDCANCEL:
1110: if (pRetry->paItem)
1111: pRetry->paItem->fRetry = FALSE;
1112: EndDialog(hDlg, TRUE);
1113: return TRUE;
1114:
1115: default:
1116: break;
1117: }
1118: break;
1119: }
1120:
1121: case WM_INITDIALOG:
1122: {
1123: CHAR szBuffer[CBMESSAGEMAX];
1124: CHAR szText[2*CBMESSAGEMAX];
1125:
1126: pRetry = (RETRYPTR)lParam;
1127: hRetry = hDlg;
1128:
1129: LoadString(hInst, IDS_RETRY_TEXT1, szBuffer, CBMESSAGEMAX);
1130: wsprintf(szText, szBuffer, pRetry->lpserver);
1131: SetWindowText (GetDlgItem(hDlg, IDD_RETRY_TEXT1), szText);
1132:
1133: LoadString(hInst, IDS_RETRY_TEXT2, szBuffer, CBMESSAGEMAX);
1134: wsprintf(szText, szBuffer, pRetry->lpserver);
1135: SetWindowText (GetDlgItem(hDlg, IDD_RETRY_TEXT2), szText);
1136:
1137: EnableWindow (GetDlgItem(hDlg, IDCANCEL), pRetry->bCancel);
1138:
1139: return TRUE;
1140: }
1141:
1142: default:
1143: break;
1144: }
1145:
1146: return FALSE;
1147: }
1148:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.