Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / dtmail / MotifApp / Help.C
1 /*
2  *+SNOTICE
3  *
4  *      $XConsortium: Help.C /main/7 1996/10/11 20:04:16 cde-hp $
5  *
6  *      RESTRICTED CONFIDENTIAL INFORMATION:
7  *
8  *      The information in this document is subject to special
9  *      restrictions in a confidential disclosure agreement between
10  *      HP, IBM, Sun, USL, SCO and Univel.  Do not distribute this
11  *      document outside HP, IBM, Sun, USL, SCO, or Univel without
12  *      Sun's specific written approval.  This document and all copies
13  *      and derivative works thereof must be returned or destroyed at
14  *      Sun's request.
15  *
16  *      Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
17  *
18  *+ENOTICE
19  */
20  
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <ctype.h>
24 #include <Xm/Xm.h>
25 #include <Dt/HelpDialog.h>
26 #include <Dt/HelpQuickD.h>
27 #include <Dt/Help.h>
28 #include <Dt/Editor.h>
29 #include "Help.hh"
30
31 #include <nl_types.h>
32 extern nl_catd catd;
33
34 #include "NLS.hh"
35
36 void DisplayMain( Widget, char *, char *);
37 static Widget helpMain = NULL;
38 static Widget helpError = NULL;
39 static Widget versionMain = NULL;
40
41 Widget
42 getErrorHelpWidget(void)
43 {
44     return (helpError);
45 }
46
47 void
48 clearErrorHelpWidget(void)
49 {
50     helpError = NULL;
51 }
52
53 char *
54 getHelpId (Widget w)
55 {
56     char *helpId;
57     char *buf;
58     char *index;
59     int i = 0, j = 0;
60  
61     if (XtParent(w) == NULL) {
62         helpId = (char *) malloc(1000);
63         index = helpId;
64         buf = XtName(w);
65         while(*buf) {
66             if (isalnum(*buf)) {
67                 *index++ = toupper(*buf);
68             } else if ('_' == *buf) {
69                 *index++ = '-';
70             }
71             buf++;
72         }
73         *index++ = '\0';
74         return (helpId);
75     } else {
76         helpId = getHelpId (XtParent(w));
77         i = strlen(helpId);
78         buf = XtName(w);
79         while(*buf) {
80             if (isalnum(*buf)) {
81                 helpId[i++] = toupper(*buf);
82             } else if ('_' == *buf) {
83                 helpId[i++] = '-';
84             }
85             buf++;
86         }
87         helpId[i++] = '\0';
88         return (helpId);
89     }
90  
91 }
92
93
94 void
95 DisplayVersion (
96         Widget parent,
97         char *helpVolume,
98         char *locationId )
99 {
100     Arg         args[10];
101     int         n;
102     Widget      printWidget;
103     Widget      helpWidget;
104
105     if (versionMain != NULL) {
106         n = 0;
107         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 4,
108           "DtMail Version Dialog")); n++;
109         if (helpVolume != NULL) {
110             XtSetArg (args[n], DtNhelpVolume, helpVolume); n++;
111         }
112         XtSetArg (args[n], DtNlocationId, locationId); n++;
113         XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
114         XtSetValues(versionMain, args, n);
115         XtManageChild(versionMain);
116     } else {
117         while (!XtIsSubclass(parent, applicationShellWidgetClass))
118             parent = XtParent(parent);
119
120         // Build a new one in our cached list
121         n = 0;
122         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 5,
123           "DtMail Version Dialog")); n++;
124         if (helpVolume != NULL) {
125             XtSetArg (args[n], DtNhelpVolume, helpVolume); n++;
126         }
127         XtSetArg (args[n], DtNlocationId, locationId); n++;
128         XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
129         versionMain = DtCreateQuickHelpDialog(parent, "versionWidget", args, n);
130         XtAddCallback(versionMain, XmNokCallback,
131                     CloseMainCB, (XtPointer) versionMain);
132         
133         // We do not want a print button for now so we unmap it
134         printWidget = DtHelpQuickDialogGetChild (versionMain,
135                                             DtHELP_QUICK_PRINT_BUTTON);
136         XtUnmanageChild (printWidget);
137
138         // We do not want a help button for now so we unmap it 
139
140         helpWidget = DtHelpQuickDialogGetChild (versionMain,
141                                             DtHELP_QUICK_PRINT_BUTTON);
142         XtUnmanageChild (helpWidget);
143         XtManageChild(versionMain);
144     }
145 }
146
147
148 #ifdef DEAD_WOOD
149 // The callback for the Help Menu in the combo window.
150
151 void
152 HelpMenuCB (
153         Widget widget,
154         XtPointer       clientdata,
155         XtPointer)
156 {
157     Widget selWidget = NULL;
158     int status = DtHELP_SELECT_ERROR;
159
160     // Determine which help button was activated and display the
161     // appropriate help information.
162
163     switch ((long) clientdata) {
164         case HELP_ON_ITEM:
165             while (!XtIsSubclass(widget, applicationShellWidgetClass))
166                 widget = XtParent(widget);
167             status = DtHelpReturnSelectedWidgetId(widget, NULL, &selWidget);
168
169             switch ((int) status) {
170                 case DtHELP_SELECT_ERROR:
171                     printf(GETMSG(catd, 2, 1, "Selection Error, cannot continue\n"));
172                     break;
173                 case DtHELP_SELECT_VALID:
174                     while (selWidget != NULL) {
175                         if ((XtHasCallbacks(selWidget, XmNhelpCallback)
176                                         == XtCallbackHasSome)) {
177                             XtCallCallbacks((Widget)selWidget,
178                                         XmNhelpCallback, NULL);
179                             break;
180                         } else {
181                             selWidget = XtParent(selWidget);
182                         }
183                     }
184                     break;
185                 case DtHELP_SELECT_ABORT:
186                     printf(GETMSG(catd, 2, 2, "Selection aborted by user.\n"));
187                     break;
188                 case DtHELP_SELECT_INVALID:
189                     printf(GETMSG(catd, 1, 6, 
190                            "You must select a component withing your app.\n"));
191                     break;
192             }
193             break;
194         case HELP_ON_TOPIC:
195             DisplayMain(widget, NULL, APP_MENU_ID);
196             break;
197         case HELP_ON_VERSION:
198             DisplayVersion(widget, NULL, VER_MENU_ID);
199             break;
200         default:
201             break;
202     }
203 }
204 #endif /* DEAD_WOOD */
205
206         
207 // Callback to process JUMP-NEW and APP-LINK hypertext requests in a
208 // given Help Dialog Window.
209 //
210 // This is the callback used for the DtNhyperLinkCallback
211 // on each of the help dialog widgets created.
212
213 static void
214 ProcessLinkCB (
215         Widget,
216         XtPointer,
217         XtPointer callData)
218 {
219 //    Arg       args[20];
220 //    Position  xPos, yPos;
221     int         appLinkNum = 0;
222
223     DtHelpDialogCallbackStruct * hyperData =
224                 (DtHelpDialogCallbackStruct *) callData;
225     
226 }
227
228
229 void
230 DisplayMain(
231         Widget parent,
232         char *helpVolume,
233         char *locationId)
234 {
235     Arg args[10];
236     int n;
237
238     if (helpMain != NULL) {
239         n = 0;
240 #ifdef undef
241         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 7, "DtMail Help")); n++;
242 #endif
243         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 12, "Mailer : Help")); n++;
244         if (helpVolume != NULL) {
245             XtSetArg (args[n], DtNhelpVolume, helpVolume); n++;
246         }
247         XtSetArg (args[n], DtNlocationId, locationId); n++;
248         XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
249         XtSetValues (helpMain, args, n);
250         XtUnmanageChild(helpMain);
251         XtManageChild(helpMain);
252     } else {
253         while (!XtIsSubclass(parent, applicationShellWidgetClass))
254             parent = XtParent(parent);
255         
256         // Build a new one in our cached list
257         n = 0;
258         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 12, "Mailer : Help")); n++;
259         if (helpVolume != NULL) {
260             XtSetArg (args[n], DtNhelpVolume, helpVolume); n++;
261         }
262         XtSetArg (args[n], DtNlocationId, locationId); n++;
263         XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
264         helpMain = DtCreateHelpDialog(parent, "Mailer", args, n);
265
266         XtAddCallback(helpMain, DtNhyperLinkCallback, ProcessLinkCB, NULL);
267         XtAddCallback(
268                 helpMain,
269                 DtNcloseCallback, CloseMainCB, (XtPointer) helpMain);
270         
271         XtManageChild(helpMain);
272     }
273 }
274
275 void
276 DisplayErrorHelp(
277         Widget parent,
278         char *helpVolume,
279         char *locationId)
280 {
281     Arg args[10];
282     int n;
283
284     if (helpError) {
285         n = 0;
286 #ifdef undef
287         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 7, "DtMail Help")); n++;
288 #endif
289         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 12, "Mailer : Help")); n++;
290         if (helpVolume != NULL) {
291             XtSetArg (args[n], DtNhelpVolume, helpVolume); n++;
292         }
293         XtSetArg (args[n], DtNlocationId, locationId); n++;
294         XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
295         //XtSetArg (args[n], DtNlocationId, "DTMAILVIEWMAINWINDOWWORK-AREA"); n++;
296         XtSetValues (helpError, args, n);
297         XtManageChild(helpError);
298     } else {
299     
300         // Create a new help on the error dialogs each time, destroy it
301         // when done.
302         n = 0;
303 #ifdef undef
304         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 8, "DtMail Help")); n++;
305 #endif
306         XtSetArg (args[n], XmNtitle, GETMSG(catd, 1, 12, "Mailer : Help")); n++;
307         if (helpVolume != NULL) {
308         XtSetArg (args[n], DtNhelpVolume, helpVolume); n++;
309         }
310         //XtSetArg (args[n], DtNlocationId, "DTMAILVIEWMAINWINDOWWORK-AREAPANEDWFORM2ROWCOLUMNPREVIOUS"); n++;
311         XtSetArg (args[n], DtNlocationId, locationId); n++;
312         XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
313         helpError = DtCreateHelpDialog(parent, "Mailer", args, n);
314
315         XtAddCallback(helpError, DtNhyperLinkCallback, ProcessLinkCB, NULL);
316
317         XtAddCallback(helpError, DtNcloseCallback, 
318                 CloseMainCB, (XtPointer) helpError);
319
320         XtUnmanageChild(helpError);
321         XtManageChild(helpError);
322     }
323 }
324
325
326 // The Help Callback for when the F1 key is pressed or when On Item
327 // Help is selected from the Help menu.
328
329 void
330 HelpCB (
331         Widget w,
332         XtPointer clientData,
333         XtPointer)
334 {
335     char *locationId = (char *) clientData;
336
337     // printf("locationId = %s\n", locationId);
338     // Just display the proper help based on the id string passed in.
339
340     // We pass in a NULL for our helpVolume and let the value defined
341     // in the app-defaults file be used.
342
343     DisplayMain (w, "Mailer", locationId);
344 }
345
346 void
347 HelpErrorCB (
348         Widget w,
349         XtPointer clientData,
350         XtPointer)
351 {
352     char *locationId = (char *) clientData;
353
354     // printf("locationId = %s\n", locationId);
355     // Just display the proper help based on the id string passed in.
356
357     // We pass in a NULL for our helpVolume and let the value defined
358     // in the app-defaults file be used.
359
360     DisplayErrorHelp (w, "Mailer", locationId);
361 }
362
363 void
364 HelpTexteditCB (
365         Widget w,
366         XtPointer clientData,
367         XtPointer callData )
368 {
369
370      char *locationId = NULL;
371      Widget wEditor = (Widget) clientData;
372      DtEditorHelpCallbackStruct *editorHelp =
373                          (DtEditorHelpCallbackStruct *) callData;
374  
375      switch (editorHelp->reason) {
376  
377         /* -----> edit area */
378         case DtEDITOR_HELP_EDIT_WINDOW:
379             locationId = EDIT_AREA_HELP;
380             break;
381  
382         /* -----> status line area and fields */
383         case DtEDITOR_HELP_STATUS_LINE:
384             locationId = STATUS_LINE_HELP;
385             break;
386         case DtEDITOR_HELP_STATUS_CURRENT_LINE:
387             locationId = STATUS_CURRENT_LINE_HELP;
388             break;
389         case DtEDITOR_HELP_STATUS_TOTAL_LINES:
390             locationId = STATUS_TOTAL_LINES_HELP;
391             break;
392         case DtEDITOR_HELP_STATUS_MESSAGE:
393             locationId = STATUS_MESSAGE_HELP;
394             break;
395         case DtEDITOR_HELP_STATUS_OVERSTRIKE:
396             locationId = STATUS_OVERSTRIKE_HELP;
397  
398         /* -----> Format Settings dialog and dialog fields */
399         case DtEDITOR_HELP_FORMAT_DIALOG:
400             locationId = FORMAT_SETTINGS_HELP;
401             break;
402         case DtEDITOR_HELP_FORMAT_LEFT_MARGIN:
403             locationId = FORMAT_LEFT_MARGIN_HELP;
404             break;
405         case DtEDITOR_HELP_FORMAT_RIGHT_MARGIN:
406             locationId = FORMAT_RIGHT_MARGIN_HELP;
407             break;
408         case DtEDITOR_HELP_FORMAT_ALIGNMENT:
409             locationId = FORMAT_ALIGNMENT_HELP;
410             break;
411  
412         /* -----> Find/Change dialog and dialog fields */
413         case DtEDITOR_HELP_CHANGE_DIALOG:
414             locationId = FINDCHANGE_HELP;
415             break;
416         case DtEDITOR_HELP_CHANGE_FIND:
417             locationId = FINDCHANGE_FIND_HELP;
418             break;
419         case DtEDITOR_HELP_CHANGE_CHANGE:
420             locationId = FINDCHANGE_CHANGETO_HELP;
421             break;
422  
423         /* -----> Check Spelling dialog and dialog fields */
424         case DtEDITOR_HELP_SPELL_DIALOG:
425             locationId = SPELL_HELP;
426             break;
427         case DtEDITOR_HELP_SPELL_MISSPELLED_WORDS:
428             locationId = SPELL_MISSPELLED_WORDS_HELP;
429             break;
430         case DtEDITOR_HELP_SPELL_CHANGE:
431             locationId = SPELL_CHANGETO_HELP;
432             break;
433  
434         default:
435             ;
436  
437      } /* switch (editorHelp->reason) */
438  
439    DisplayMain (w, "Textedit", locationId);
440 }
441   
442
443 // Callback to process close requests on our main help dialog.
444
445 static void
446 CloseMainCB (
447         Widget,
448         XtPointer       clientData,
449         XtPointer)
450 {
451     Widget currentDialog = (Widget) clientData;
452
453     // Unmap and clean up help widget
454
455     XtUnmanageChild(currentDialog);
456 }
457
458 #if defined(PRINT_HELPIDS)
459
460 void
461 printHelpId (char *w_name, Widget w)
462 {
463     char *helpId;
464  
465     helpId = getHelpId (w);
466     printf("%s = %s\n", w_name, helpId);
467     free(helpId);
468  
469 }
470
471 #else
472
473 void
474 printHelpId (char *, Widget)
475 {
476 }
477
478 #endif