|
|
1.1 root 1: /*************************************************************************
2: **
3: ** OLE 2 Sample Code
4: **
5: ** dialogs.c
6: **
7: ** This file contains dialog functions and support function
8: **
9: ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
10: **
11: *************************************************************************/
12:
13: #include "outline.h"
14:
15: OLEDBGDATA
16:
17: extern LPOUTLINEAPP g_lpApp;
18:
19: static char g_szBuf[MAXSTRLEN+1];
20: static LPSTR g_lpszDlgTitle;
21:
22: // REVIEW: should use string resource for messages
23: static char ErrMsgInvalidRange[] = "Invalid Range entered!";
24: static char ErrMsgInvalidValue[] = "Invalid Value entered!";
25: static char ErrMsgInvalidName[] = "Invalid Name entered!";
26: static char ErrMsgNullName[] = "NULL string disallowed!";
27: static char ErrMsgNameNotFound[] = "Name doesn't exist!";
28:
29: /* InputTextDlg
30: * ------------
31: *
32: * Put up a dialog box to allow the user to edit text
33: */
34: BOOL InputTextDlg(HWND hWnd, LPSTR lpszText, LPSTR lpszDlgTitle)
35: {
36: int nResult;
37:
38: g_lpszDlgTitle = lpszDlgTitle;
39: lstrcpy((LPSTR)g_szBuf, lpszText); // preload dialog with input text
40:
41: nResult = DialogBox(g_lpApp->m_hInst, (LPSTR)"AddEditLine", hWnd,
42: (DLGPROC)AddEditDlgProc);
43: if (nResult) {
44: lstrcpy(lpszText, (LPSTR)g_szBuf);
45: return TRUE;
46: } else {
47: return FALSE;
48: }
49: }
50:
51:
52:
53: /* AddEditDlgProc
54: * --------------
55: *
56: * This procedure is associated with the dialog box that is included in
57: * the function name of the procedure. It provides the service routines
58: * for the events (messages) that occur because the end user operates
59: * one of the dialog box's buttons, entry fields, or controls.
60: */
61: BOOL CALLBACK EXPORT AddEditDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
62: {
63: HWND hEdit;
64:
65: switch(Message) {
66: case WM_INITDIALOG:
67: /* initialize working variables */
68: hEdit=GetDlgItem(hDlg,IDD_EDIT);
69: SendMessage(hEdit,EM_LIMITTEXT,(WPARAM)MAXSTRLEN,0L);
70: SetWindowText(hDlg, g_lpszDlgTitle);
71: SetDlgItemText(hDlg,IDD_EDIT, g_szBuf);
72: break; /* End of WM_INITDIALOG */
73:
74: case WM_CLOSE:
75: /* Closing the Dialog behaves the same as Cancel */
76: PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L);
77: break; /* End of WM_CLOSE */
78:
79: case WM_COMMAND:
80: switch (wParam) {
81: case IDOK:
82: /* save data values entered into the controls
83: ** and dismiss the dialog box returning TRUE
84: */
85: GetDlgItemText(hDlg,IDD_EDIT,(LPSTR)g_szBuf,MAXSTRLEN+1);
86: EndDialog(hDlg, TRUE);
87: break;
88:
89: case IDCANCEL:
90: /* ignore data values entered into the controls
91: ** and dismiss the dialog box returning FALSE
92: */
93: EndDialog(hDlg, FALSE);
94: break;
95: }
96: break; /* End of WM_COMMAND */
97:
98: default:
99: return FALSE;
100: }
101:
102: return TRUE;
103: } /* End of AddEditDlgProc */
104:
105:
106: /* SetLineHeightDlgProc
107: * --------------------
108: *
109: * Dialog procedure for set line height
110: */
111: BOOL CALLBACK EXPORT SetLineHeightDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
112: {
113: BOOL fTranslated;
114: BOOL fEnable;
115: static LPINT lpint;
116: int nHeight;
117: static int nMaxHeight;
118:
119: switch (Message) {
120: case WM_INITDIALOG:
121: {
122: char cBuf[80];
123:
124: nMaxHeight = XformHeightInPixelsToHimetric(NULL,
125: LISTBOX_HEIGHT_LIMIT);
126: lpint = (LPINT)lParam;
127: SetDlgItemInt(hDlg, IDD_EDIT, *lpint, FALSE);
128: wsprintf(cBuf, "Maximum value is %d units", nMaxHeight);
129: SetDlgItemText(hDlg, IDD_LIMIT, (LPSTR)cBuf);
130: break;
131: }
132:
133: case WM_COMMAND:
134: switch (wParam) {
135: case IDOK:
136: if (IsDlgButtonChecked(hDlg, IDD_CHECK)) {
137: *lpint = -1;
138: }
139: else {
140: /* save the value in the edit control */
141: nHeight = GetDlgItemInt(hDlg, IDD_EDIT,
142: (BOOL FAR*)&fTranslated, FALSE);
143: if (!fTranslated || !nHeight || (nHeight>nMaxHeight)){
144: OutlineApp_ErrorMessage(g_lpApp,
145: ErrMsgInvalidValue);
146: break;
147: }
148: *lpint = nHeight;
149: }
150: EndDialog(hDlg, TRUE);
151: break;
152:
153: case IDCANCEL:
154: *lpint = 0;
155: EndDialog(hDlg, FALSE);
156: break;
157:
158:
159: case IDD_CHECK:
160: fEnable = !IsDlgButtonChecked(hDlg, IDD_CHECK);
161: EnableWindow(GetDlgItem(hDlg, IDD_EDIT), fEnable);
162: EnableWindow(GetDlgItem(hDlg, IDD_TEXT), fEnable);
163: break;
164: }
165: break; /* WM_COMMAND */
166:
167: case WM_CLOSE: /* Closing the Dialog behaves the same as Cancel */
168: PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L);
169: break; /* End of WM_CLOSE */
170:
171: default:
172: return FALSE;
173: }
174:
175: return TRUE;
176:
177: } /* end of SetLineHeightProc */
178:
179:
180:
181:
182:
183: /* DefineNameDlgProc
184: * -----------------
185: *
186: * Dialog procedure for define name
187: */
188: BOOL CALLBACK EXPORT DefineNameDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
189: {
190: static HWND hCombo;
191: static LPOUTLINEDOC lpOutlineDoc = NULL;
192: static LPOUTLINENAMETABLE lpOutlineNameTable = NULL;
193: LPOUTLINENAME lpOutlineName = NULL;
194: UINT nIndex;
195: LINERANGE lrSel;
196: BOOL fTranslated;
197:
198: switch(Message) {
199: case WM_INITDIALOG:
200: /* initialize working variables */
201: hCombo=GetDlgItem(hDlg,IDD_COMBO);
202: lpOutlineDoc = (LPOUTLINEDOC) lParam;
203: lpOutlineNameTable = OutlineDoc_GetNameTable(lpOutlineDoc);
204:
205: SendMessage(hCombo,CB_LIMITTEXT,(WPARAM)MAXNAMESIZE,0L);
206: NameDlg_LoadComboBox(lpOutlineNameTable, hCombo);
207:
208: OutlineDoc_GetSel(lpOutlineDoc, (LPLINERANGE)&lrSel);
209: lpOutlineName = OutlineNameTable_FindNamedRange(
210: lpOutlineNameTable,
211: &lrSel
212: );
213:
214: /* if current selection already has a name, hilight it */
215: if (lpOutlineName) {
216: nIndex = (int) SendMessage(
217: hCombo,
218: CB_FINDSTRINGEXACT,
219: (WPARAM)0xffff,
220: (LPARAM)(LPCSTR)lpOutlineName->m_szName
221: );
222: if (nIndex != CB_ERR) {
223: SendMessage(hCombo, CB_SETCURSEL, (WPARAM)nIndex, 0L);
224: }
225: }
226:
227: SetDlgItemInt(hDlg, IDD_FROM, (UINT)lrSel.m_nStartLine+1,FALSE);
228: SetDlgItemInt(hDlg, IDD_TO, (UINT)lrSel.m_nEndLine+1, FALSE);
229:
230: break; /* End of WM_INITDIALOG */
231:
232: case WM_CLOSE:
233: /* Closing the Dialog behaves the same as Cancel */
234: PostMessage(hDlg, WM_COMMAND, IDD_CLOSE, 0L);
235: break; /* End of WM_CLOSE */
236:
237: case WM_COMMAND:
238: switch(wParam) {
239: case IDOK:
240: GetDlgItemText(hDlg,IDD_COMBO,(LPSTR)g_szBuf,MAXNAMESIZE);
241: if(! SendMessage(hCombo,WM_GETTEXTLENGTH,0,0L)) {
242: MessageBox(
243: hDlg,
244: ErrMsgNullName,
245: NULL,
246: MB_ICONEXCLAMATION
247: );
248: break;
249: } else if(SendMessage(hCombo,CB_GETCURSEL,0,0L)==CB_ERR &&
250: _fstrchr(g_szBuf, ' ')) {
251: MessageBox(
252: hDlg,
253: ErrMsgInvalidName,
254: NULL,
255: MB_ICONEXCLAMATION
256: );
257: break;
258: } else {
259: nIndex = (int) SendMessage(hCombo,CB_FINDSTRINGEXACT,
260: (WPARAM)0xffff,(LPARAM)(LPCSTR)g_szBuf);
261:
262: /* Line indices are 1 less than the number in
263: ** the row heading
264: */
265: lrSel.m_nStartLine = GetDlgItemInt(hDlg, IDD_FROM,
266: (BOOL FAR*)&fTranslated, FALSE) - 1;
267: if(! fTranslated) {
268: OutlineApp_ErrorMessage(g_lpApp,
269: ErrMsgInvalidRange);
270: break;
271: }
272: lrSel.m_nEndLine = GetDlgItemInt(hDlg, IDD_TO,
273: (BOOL FAR*)&fTranslated, FALSE) - 1;
274: if (!fTranslated ||
275: (lrSel.m_nStartLine < 0) ||
276: (lrSel.m_nEndLine < lrSel.m_nStartLine) ||
277: (lrSel.m_nEndLine >= OutlineDoc_GetLineCount(
278: lpOutlineDoc))) {
279: OutlineApp_ErrorMessage(g_lpApp,
280: ErrMsgInvalidRange);
281: break;
282: }
283:
284: if(nIndex != CB_ERR) {
285: NameDlg_UpdateName(
286: hCombo,
287: lpOutlineDoc,
288: nIndex,
289: g_szBuf,
290: &lrSel
291: );
292: } else {
293: NameDlg_AddName(
294: hCombo,
295: lpOutlineDoc,
296: g_szBuf,
297: &lrSel
298: );
299: }
300: }
301: // fall through
302:
303: case IDD_CLOSE:
304: /* Ignore data values entered into the controls */
305: /* and dismiss the dialog window returning FALSE */
306: EndDialog(hDlg,0);
307: break;
308:
309: case IDD_DELETE:
310: GetDlgItemText(hDlg,IDD_COMBO,(LPSTR)g_szBuf,MAXNAMESIZE);
311: if((nIndex=(int)SendMessage(hCombo,CB_FINDSTRINGEXACT,
312: (WPARAM)0xffff,(LPARAM)(LPCSTR)g_szBuf))==CB_ERR)
313: MessageBox(hDlg, ErrMsgNameNotFound, NULL, MB_ICONEXCLAMATION);
314: else {
315: NameDlg_DeleteName(hCombo, lpOutlineDoc, nIndex);
316: }
317: break;
318:
319: case IDD_COMBO:
320: if(HIWORD(lParam) == CBN_SELCHANGE) {
321: nIndex=(int)SendMessage(hCombo, CB_GETCURSEL, 0, 0L);
322: lpOutlineName = (LPOUTLINENAME)SendMessage(
323: hCombo,
324: CB_GETITEMDATA,
325: (WPARAM)nIndex,
326: 0L
327: );
328: SetDlgItemInt(
329: hDlg,
330: IDD_FROM,
331: (UINT) lpOutlineName->m_nStartLine + 1,
332: FALSE
333: );
334: SetDlgItemInt(
335: hDlg,
336: IDD_TO,
337: (UINT) lpOutlineName->m_nEndLine + 1,
338: FALSE
339: );
340: }
341: }
342: break; /* End of WM_COMMAND */
343:
344: default:
345: return FALSE;
346: }
347:
348: return TRUE;
349: } /* End of DefineNameDlgProc */
350:
351:
352: /* GotoNameDlgProc
353: * ---------------
354: *
355: * Dialog procedure for goto name
356: */
357: BOOL CALLBACK EXPORT GotoNameDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
358: {
359: static HWND hLBName;
360: static LPOUTLINEDOC lpOutlineDoc = NULL;
361: static LPOUTLINENAMETABLE lpOutlineNameTable = NULL;
362: UINT nIndex;
363: LINERANGE lrLineRange;
364: LPOUTLINENAME lpOutlineName;
365:
366: switch(Message) {
367: case WM_INITDIALOG:
368: /* initialize working variables */
369: lpOutlineDoc = (LPOUTLINEDOC) lParam;
370: lpOutlineNameTable = OutlineDoc_GetNameTable(lpOutlineDoc);
371:
372: hLBName=GetDlgItem(hDlg,IDD_LINELISTBOX);
373: NameDlg_LoadListBox(lpOutlineNameTable, hLBName);
374:
375: // highlight 1st item
376: SendMessage(hLBName, LB_SETCURSEL, 0, 0L);
377: // trigger to initialize edit control
378: SendMessage(hDlg, WM_COMMAND, (WPARAM)IDD_LINELISTBOX,
379: MAKELONG(hLBName, LBN_SELCHANGE));
380:
381: break; /* End of WM_INITDIALOG */
382:
383: case WM_CLOSE:
384: /* Closing the Dialog behaves the same as Cancel */
385: PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L);
386: break; /* End of WM_CLOSE */
387:
388: case WM_COMMAND:
389: switch(wParam) {
390: case IDD_LINELISTBOX:
391: if(HIWORD(lParam) == LBN_SELCHANGE) {
392: // update the line range display
393: nIndex=(int)SendMessage(hLBName, LB_GETCURSEL, 0, 0L);
394: lpOutlineName = (LPOUTLINENAME)SendMessage(hLBName, LB_GETITEMDATA,
395: (WPARAM)nIndex,0L);
396: if (lpOutlineName) {
397: SetDlgItemInt(
398: hDlg,
399: IDD_FROM,
400: (UINT) lpOutlineName->m_nStartLine + 1,
401: FALSE
402: );
403: SetDlgItemInt(
404: hDlg,
405: IDD_TO,
406: (UINT) lpOutlineName->m_nEndLine + 1,
407: FALSE
408: );
409: }
410: break;
411: }
412: // double click will fall through
413: else if(HIWORD(lParam) != LBN_DBLCLK)
414: break;
415:
416: case IDOK:
417: nIndex=(int)SendMessage(hLBName,LB_GETCURSEL,0,0L);
418: if(nIndex!=LB_ERR) {
419: lpOutlineName = (LPOUTLINENAME)SendMessage(hLBName,
420: LB_GETITEMDATA, (WPARAM)nIndex, 0L);
421: lrLineRange.m_nStartLine=lpOutlineName->m_nStartLine;
422: lrLineRange.m_nEndLine = lpOutlineName->m_nEndLine;
423: OutlineDoc_SetSel(lpOutlineDoc, &lrLineRange);
424: } // fall through
425:
426: case IDCANCEL:
427: /* Ignore data values entered into the controls */
428: /* and dismiss the dialog window returning FALSE */
429: EndDialog(hDlg,0);
430: break;
431:
432: }
433: break; /* End of WM_COMMAND */
434:
435: default:
436: return FALSE;
437: }
438:
439: return TRUE;
440: } /* End of GotoNameDlgProc */
441:
442:
443:
444: /* NameDlg_LoadComboBox
445: * --------------------
446: *
447: * Load defined names into combo box
448: */
449: void NameDlg_LoadComboBox(LPOUTLINENAMETABLE lpOutlineNameTable,HWND hCombo)
450: {
451: LPOUTLINENAME lpOutlineName;
452: int i, nIndex;
453: int nCount;
454:
455: nCount=OutlineNameTable_GetCount((LPOUTLINENAMETABLE)lpOutlineNameTable);
456: if(!nCount) return;
457:
458: SendMessage(hCombo,WM_SETREDRAW,(WPARAM)FALSE,0L);
459: for(i=0; i<nCount; i++) {
460: lpOutlineName=OutlineNameTable_GetName((LPOUTLINENAMETABLE)lpOutlineNameTable,i);
461: nIndex = (int)SendMessage(
462: hCombo,
463: CB_ADDSTRING,
464: 0,
465: (LPARAM)(LPCSTR)lpOutlineName->m_szName
466: );
467: SendMessage(hCombo,CB_SETITEMDATA,(WPARAM)nIndex,(LPARAM)lpOutlineName);
468: }
469: SendMessage(hCombo,WM_SETREDRAW,(WPARAM)TRUE,0L);
470: }
471:
472:
473: /* NameDlg_LoadListBox
474: * -------------------
475: *
476: * Load defined names into list box
477: */
478: void NameDlg_LoadListBox(LPOUTLINENAMETABLE lpOutlineNameTable,HWND hListBox)
479: {
480: int i;
481: int nCount;
482: int nIndex;
483: LPOUTLINENAME lpOutlineName;
484:
485: nCount=OutlineNameTable_GetCount((LPOUTLINENAMETABLE)lpOutlineNameTable);
486:
487: SendMessage(hListBox,WM_SETREDRAW,(WPARAM)FALSE,0L);
488: for(i=0; i<nCount; i++) {
489: lpOutlineName=OutlineNameTable_GetName((LPOUTLINENAMETABLE)lpOutlineNameTable,i);
490: nIndex = (int)SendMessage(
491: hListBox,
492: LB_ADDSTRING,
493: 0,
494: (LPARAM)(LPCSTR)lpOutlineName->m_szName
495: );
496: SendMessage(hListBox,LB_SETITEMDATA,(WPARAM)nIndex,(LPARAM)lpOutlineName);
497: }
498: SendMessage(hListBox,WM_SETREDRAW,(WPARAM)TRUE,0L);
499: }
500:
501:
502: /* NameDlg_AddName
503: * ---------------
504: *
505: * Add a name to the name table corresponding to the name dialog
506: * combo box.
507: */
508: void NameDlg_AddName(HWND hCombo, LPOUTLINEDOC lpOutlineDoc, LPSTR lpszName, LPLINERANGE lplrSel)
509: {
510: LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
511: LPOUTLINENAME lpOutlineName;
512:
513: lpOutlineName = OutlineApp_CreateName(lpOutlineApp);
514:
515: if (lpOutlineName) {
516: lstrcpy(lpOutlineName->m_szName, lpszName);
517: lpOutlineName->m_nStartLine = lplrSel->m_nStartLine;
518: lpOutlineName->m_nEndLine = lplrSel->m_nEndLine;
519: OutlineDoc_AddName(lpOutlineDoc, lpOutlineName);
520: } else {
521: // REVIEW: do we need error message here?
522: }
523: }
524:
525:
526: /* NameDlg_UpdateName
527: * ------------------
528: *
529: * Update a name in the name table corresponding to a name in
530: * the name dialog combo box.
531: */
532: void NameDlg_UpdateName(HWND hCombo, LPOUTLINEDOC lpOutlineDoc, int nIndex, LPSTR lpszName, LPLINERANGE lplrSel)
533: {
534: LPOUTLINENAME lpOutlineName;
535:
536: lpOutlineName = (LPOUTLINENAME)SendMessage(
537: hCombo,
538: CB_GETITEMDATA,
539: (WPARAM)nIndex,
540: 0L
541: );
542:
543: OutlineName_SetName(lpOutlineName, lpszName);
544: OutlineName_SetSel(lpOutlineName, lplrSel, TRUE /* name modified */);
545: OutlineDoc_SetModified(lpOutlineDoc, TRUE, FALSE, FALSE);
546: }
547:
548:
549: /* NameDlg_DeleteName
550: * ------------------
551: *
552: * Delete a name from the name dialog combo box and corresponding
553: * name table.
554: */
555: void NameDlg_DeleteName(HWND hCombo, LPOUTLINEDOC lpOutlineDoc, UINT nIndex)
556: {
557: SendMessage(hCombo,CB_DELETESTRING,(WPARAM)nIndex,0L);
558: OutlineDoc_DeleteName(lpOutlineDoc, nIndex);
559: }
560:
561: /* PlaceBitmap
562: * -----------
563: *
564: * Places a bitmap centered in the specified control in the dialog on the
565: * specified DC.
566: *
567: */
568:
569: PlaceBitmap(HWND hDlg, int control, HDC hDC, HBITMAP hBitmap)
570: {
571: BITMAP bm;
572: HDC hdcmem;
573: HBITMAP hbmOld;
574: RECT rcControl; // Rect of dialog control
575: int width, height;
576:
577: GetObject(hBitmap, sizeof(BITMAP), &bm);
578:
579: hdcmem= CreateCompatibleDC(hDC);
580: hbmOld = SelectObject(hdcmem, hBitmap);
581:
582: // Get rect of control in screen coords, and translate to our dialog
583: // box's coordinates
584: GetWindowRect(GetDlgItem(hDlg, control), &rcControl);
585: MapWindowPoints(NULL, hDlg, (LPPOINT)&rcControl, 2);
586:
587: width = rcControl.right - rcControl.left;
588: height = rcControl.bottom - rcControl.top;
589:
590: BitBlt(hDC, rcControl.left + (width - bm.bmWidth) / 2,
591: rcControl.top + (height - bm.bmHeight) /2,
592: bm.bmWidth, bm.bmHeight,
593: hdcmem, 0, 0, SRCCOPY);
594:
595: SelectObject(hdcmem, hbmOld);
596: DeleteDC(hdcmem);
597: return 1;
598: }
599:
600:
601:
602: /* AboutDlgProc
603: * ------------
604: *
605: * Dialog procedure for the About function
606: */
607: BOOL CALLBACK EXPORT AboutDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
608: {
609: int narrVersion[2];
610: static HBITMAP hbmLogo;
611:
612: switch(Message) {
613:
614: case WM_INITDIALOG:
615: // get version number of app
616: wsprintf(g_szBuf, "About %s", (LPCSTR)APPNAME);
617: SetWindowText(hDlg, (LPCSTR)g_szBuf);
618: OutlineApp_GetAppVersionNo(g_lpApp, narrVersion);
619: wsprintf(g_szBuf, "%s version %d.%d", (LPSTR) APPDESC,
620: narrVersion[0], narrVersion[1]);
621: SetDlgItemText(hDlg, IDD_APPTEXT, (LPCSTR)g_szBuf);
622:
623: // Load bitmap for displaying later
624: hbmLogo = LoadBitmap(g_lpApp->m_hInst, "LogoBitmap");
625: TraceDebug(hDlg, IDD_BITMAPLOCATION);
626: ShowWindow(GetDlgItem(hDlg, IDD_BITMAPLOCATION), SW_HIDE);
627: break;
628:
629: case WM_PAINT:
630: {
631: PAINTSTRUCT ps;
632: BeginPaint(hDlg, &ps);
633:
634: // Display bitmap in IDD_BITMAPLOCATION control area
635: PlaceBitmap(hDlg, IDD_BITMAPLOCATION, ps.hdc, hbmLogo);
636: EndPaint(hDlg, &ps);
637: }
638: break;
639:
640: case WM_CLOSE :
641: PostMessage(hDlg, WM_COMMAND, IDOK, 0L);
642: break;
643:
644: case WM_COMMAND :
645: switch(wParam) {
646: case IDOK:
647: if (hbmLogo) DeleteObject(hbmLogo);
648: EndDialog(hDlg,0);
649: break;
650: }
651: break;
652:
653: default :
654: return FALSE;
655:
656: }
657: return TRUE;
658: }
659:
660:
661: #if defined( OLE_CNTR )
662:
663: /* ProcessError
664: * ------------
665: *
666: * Popup up appropriate message according to the error and/or take action
667: * specified button pressed by the user.
668: */
669: void ProcessError(HRESULT hrErr, LPCONTAINERLINE lpContainerLine, BOOL fAction)
670: {
671: LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerLine->m_lpDoc;
672: HWND hwndParent = OutlineDoc_GetWindow(lpOutlineDoc);
673: SCODE sc = GetScode(hrErr);
674:
675: OleDbgOutHResult("ProcessError", hrErr);
676:
677: if ((sc >= MK_E_FIRST) && (sc <= MK_E_LAST))
678: goto LinkSourceUnavailable;
679: if (sc == OLE_E_CANT_BINDTOSOURCE)
680: goto LinkSourceUnavailable;
681: if (sc == STG_E_PATHNOTFOUND)
682: goto LinkSourceUnavailable;
683: if (sc == REGDB_E_CLASSNOTREG)
684: goto ServerNotReg;
685: if (sc == OLE_E_STATIC)
686: goto ServerNotReg; // user dblclk'ed a static object w/ no svr reg'd
687: if (sc == OLE_E_CLASSDIFF)
688: goto LinkTypeChanged;
689: if (sc == CO_E_APPDIDNTREG)
690: goto ServerNotFound;
691: if (sc == CO_E_APPNOTFOUND)
692: goto ServerNotFound;
693:
694: if (ContainerLine_IsOleLink(lpContainerLine))
695: goto LinkSourceUnavailable;
696: else
697: goto ServerNotFound;
698:
699:
700: /*************************************************************************
701: ** Error handling routines **
702: *************************************************************************/
703: LinkSourceUnavailable:
704: if (ID_PU_LINKS == OleUIPromptUser(
705: IDD_LINKSOURCEUNAVAILABLE,
706: hwndParent,
707: (LPSTR)APPNAME)) {
708: if (fAction) {
709: ContainerDoc_EditLinksCommand(lpContainerLine->m_lpDoc);
710: }
711: }
712: return;
713:
714: ServerNotReg:
715: {
716: LPSTR lpszUserType = NULL;
717: CLIPFORMAT cfFormat; // not used
718:
719: hrErr = ReadFmtUserTypeStg(
720: lpContainerLine->m_lpStg, &cfFormat, &lpszUserType);
721:
722: if (ID_PU_CONVERT == OleUIPromptUser(
723: IDD_SERVERNOTREG,
724: hwndParent,
725: (LPSTR)APPNAME,
726: (hrErr == NOERROR) ? lpszUserType : (LPSTR)"Object")) {
727: if (fAction) {
728: ContainerDoc_ConvertCommand(
729: lpContainerLine->m_lpDoc,
730: TRUE // fMustActivate
731: );
732: }
733: }
734:
735: if (lpszUserType)
736: OleStdFreeString(lpszUserType, NULL);
737:
738: return;
739: }
740:
741:
742: LinkTypeChanged:
743: OleUIPromptUser(
744: IDD_LINKTYPECHANGED,
745: hwndParent,
746: (LPSTR)APPNAME);
747: return;
748:
749:
750: ServerNotFound:
751: OleUIPromptUser(
752: IDD_SERVERNOTFOUND,
753: hwndParent,
754: (LPSTR)APPNAME);
755: return;
756:
757: // OutOfMemory:
758: OleUIPromptUser(
759: IDD_OUTOFMEMORY,
760: hwndParent,
761: (LPSTR)APPNAME);
762: return;
763:
764: }
765:
766:
767: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.