Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / dtfile / HelpP.c
1 /* $XConsortium: HelpP.c /main/4 1995/11/02 14:40:13 rswiston $ */
2 /************************************<+>*************************************
3  ****************************************************************************
4  *
5  *   FILE:           HelpP.c
6  *
7  *   COMPONENT_NAME: Desktop File Manager (dtfile)
8  *
9  *   Description:    Processing functions for the help dialog.
10  *
11  *   FUNCTIONS: DTHelpClose
12  *              DTHyperLink
13  *              MainWinHyperLink
14  *              MainWindowHelpClose
15  *              ShowDTHelpDialog
16  *              ShowHelpDialog
17  *              ShowTrashHelpDialog
18  *              TrashHelpClose
19  *              TrashHyperLink
20  *
21  *   (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
22  *   (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
23  *   (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
24  *   (c) Copyright 1993, 1994, 1995 Novell, Inc.
25  *
26  ****************************************************************************
27  ************************************<+>*************************************/
28
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <unistd.h>
32 #include <time.h>
33
34 #include <Xm/Xm.h>
35 #include <Xm/XmP.h>
36
37 #include <Dt/Connect.h>
38 #include <Dt/HourGlass.h>
39 #include "Encaps.h"
40 #include "SharedProcs.h"
41
42 #include <Dt/HelpDialog.h>
43
44 #include "Desktop.h"
45 #include "Main.h"
46 #include "Help.h"
47 #include "FileMgr.h"
48
49
50 /********    Static Function Declarations    ********/
51
52 static void MainWindowHelpClose( 
53                         XtPointer client_data,
54                         DialogData *old_dialog_data,
55                         DialogData *new_dialog_data) ;
56 static void MainWinHyperLink(
57                         Widget w,
58                         XtPointer clientData,
59                         XtPointer callData) ;
60 static void TrashHelpClose( 
61                         XtPointer client_data,
62                         DialogData *old_dialog_data,
63                         DialogData *new_dialog_data) ;
64 static void TrashHyperLink(
65                         Widget w,
66                         XtPointer clientData,
67                         XtPointer callData) ;
68 static void DTHelpClose(
69                         XtPointer client_data,
70                         DialogData *old_dialog_data,
71                         DialogData *new_dialog_data) ;
72 static void DTHyperLink(
73                         Widget w,
74                         XtPointer clientData,
75                         XtPointer callData) ;
76
77 /********    End Static Function Declarations    ********/
78
79
80
81 /************************************************************************
82  *
83  *  ShowHelpDialog
84  *      Used to display a primary or a hyperlink help dialog
85  *
86  ************************************************************************/
87
88 void
89 ShowHelpDialog(
90         Widget parentShell,
91         XtPointer topLevelRec,
92         int dialogType,
93         DialogData *dialogData,
94         char *idString,
95         char *volString,
96         char *topicTitle,
97         char *fileType,
98         int helpType)
99
100 {
101    HelpRec * helpRec;
102    HelpData * helpData;
103    int count;
104    char *helpName;
105    char *tmpStr;
106    DialogData * fmDialogData;
107    FileMgrData * fileMgrData;
108    Arg args[5];
109
110
111    /* 
112     * DialogData is not NULL, if doing a restore session */
113    if (dialogData == NULL)
114    {
115       /* We are not restoring a session, so get the default values */
116       dialogData = _DtGetDefaultDialogData(help_dialog);
117
118       /* Add to the array of visible help annotation dialogs for this view */
119       fmDialogData = _DtGetInstanceData(topLevelRec);
120       fileMgrData = (FileMgrData *) fmDialogData->data;
121
122       if (dialogType == MAIN_HELP_DIALOG)
123       {
124          fileMgrData->primaryHelpDialog = dialogData;
125       }
126       else
127       {
128          /* Hyperlink help window */
129          _DtAddOneSubdialog (dialogData,
130                           &fileMgrData->secondaryHelpDialogList,
131                           &fileMgrData->secondaryHelpDialogCount);
132       }
133
134       helpData = (HelpData *)dialogData->data;
135       helpData->idString = XtNewString(idString);
136       helpData->volString = XtNewString(volString);
137       helpData->topicTitle = XtNewString(topicTitle);
138       helpData->fileType = XtNewString(fileType);
139       helpData->helpType = helpType;
140    }
141
142    _DtShowDialog(parentShell, NULL, topLevelRec, dialogData, 
143               NULL, NULL, MainWindowHelpClose, topLevelRec, NULL, False,
144               False, NULL, NULL);
145
146    /* lets set the title appropriately */
147    fmDialogData = _DtGetInstanceData(topLevelRec);
148    fileMgrData = (FileMgrData *) fmDialogData->data;
149    helpData = (HelpData *)dialogData->data;
150    if(fileMgrData->title == NULL || fileMgrData->helpVol == NULL ||
151            strcmp(fileMgrData->helpVol, DTFILE_HELP_NAME) == 0 ||
152                      strcmp(helpData->volString, "Help4Help") == 0)
153    {
154       if(fileMgrData->title)
155       {
156         tmpStr = GETMESSAGE(29,2, "%s Help"); 
157         helpName = (char *)XtMalloc(strlen(fileMgrData->title) + 
158                                   strlen(tmpStr) + 1); 
159         sprintf(helpName, tmpStr, fileMgrData->title); 
160         XtSetArg(args[0], XmNtitle, helpName);
161       }
162       else
163       {
164         XtSetArg(args[0], XmNtitle, (GETMESSAGE(29,1, "File Manager Help")));
165         helpName = NULL;
166       }
167    }
168    else
169    {
170       tmpStr = GETMESSAGE(29,2, "%s Help"); 
171       helpName = (char *)XtMalloc(strlen(fileMgrData->title) + 
172                                   strlen(tmpStr) + 1); 
173       sprintf(helpName, tmpStr, fileMgrData->title); 
174       XtSetArg(args[0], XmNtitle, helpName);
175    }
176    helpRec = (HelpRec *)_DtGetDialogInstance(dialogData);
177    XtSetValues(XtParent(helpRec->helpDialog), args, 1);
178    if(helpName != NULL)
179       XtFree(helpName);
180
181    /* Add hyperlink callback */
182    XtRemoveAllCallbacks(helpRec->helpDialog, DtNhyperLinkCallback);
183    XtAddCallback(helpRec->helpDialog, DtNhyperLinkCallback,
184                  MainWinHyperLink, topLevelRec);
185 }
186
187
188
189
190 /************************************************************************
191  *
192  *  MainWindowHelpClose
193  *      Callback function invoked from the help dialog's close button.
194  *
195  ************************************************************************/
196
197 static void
198 MainWindowHelpClose(
199         XtPointer client_data,
200         DialogData *old_dialog_data,
201         DialogData *new_dialog_data )
202
203 {
204    FileMgrRec  * fileMgrRec = (FileMgrRec *) client_data;
205    FileMgrData * fileMgrData;
206    DialogData  * dialog_data;
207    int count;
208    int i, j;
209
210    dialog_data = _DtGetInstanceData((XtPointer)fileMgrRec);
211    fileMgrData = (FileMgrData *)dialog_data->data;
212
213    /*  Remove the dialog data from the top level window's list  */
214    if (old_dialog_data == fileMgrData->primaryHelpDialog)
215    {
216       fileMgrData->primaryHelpDialog = NULL;
217    }
218    else
219    {
220       _DtHideOneSubdialog( old_dialog_data,
221                         &fileMgrData->secondaryHelpDialogList,
222                         &fileMgrData->secondaryHelpDialogCount);
223    }
224
225    _DtHideDialog(old_dialog_data, False);
226    _DtFreeDialogData(old_dialog_data);
227    _DtFreeDialogData(new_dialog_data);
228 }
229
230
231
232 /************************************************************************
233  *
234  *  MainWinHyperLink
235  *      Callback function responsible for handling a hyperlink help
236  *      request for a help window associated with a main window view.
237  *
238  ************************************************************************/
239
240 static void 
241 MainWinHyperLink(
242         Widget w,
243         XtPointer clientData,
244         XtPointer callData )
245
246 {
247    FileMgrRec * fileMgrRec = (FileMgrRec *)clientData;
248    DtHelpDialogCallbackStruct * hyperData;
249
250    hyperData = (DtHelpDialogCallbackStruct *)callData;
251    if (hyperData->hyperType == DtHELP_LINK_JUMP_NEW)
252    {
253       ShowHelpDialog(fileMgrRec->shell, (XtPointer)fileMgrRec,
254                      HYPER_HELP_DIALOG, 
255                      NULL, hyperData->locationId,
256                      hyperData->helpVolume, NULL, NULL, DtHELP_TYPE_TOPIC);
257    }
258 }
259
260
261 /************************************************************************
262  *
263  *  ShowTrashHelpDialog
264  *      Used to display a primary or a hyperlink help dialog for trash
265  *      window.
266  *
267  ************************************************************************/
268
269 void
270 ShowTrashHelpDialog(
271         Widget parentShell,
272         int dialogType,
273         DialogData *dialogData,
274         char *idString,
275         char *volString  )
276
277 {
278    HelpRec * helpRec;
279    HelpData * helpData;
280    int count;
281    Arg args[3];
282
283    /* Get the default values */
284    dialogData = _DtGetDefaultDialogData(help_dialog);
285
286    if (dialogType == MAIN_HELP_DIALOG)
287    {
288       primaryTrashHelpDialog = dialogData;
289    }
290    else
291    {
292       /* Hyperlink help window */
293       _DtAddOneSubdialog (dialogData,
294                        &secondaryTrashHelpDialogList,
295                        &secondaryTrashHelpDialogCount);
296    }
297
298    helpData = (HelpData *)dialogData->data;
299    helpData->idString = XtNewString(idString);
300    helpData->volString = XtNewString(volString);
301    helpData->helpType  = DtHELP_TYPE_TOPIC;
302
303    _DtShowDialog(parentShell, NULL, NULL, dialogData, NULL, NULL, TrashHelpClose, 
304               NULL, NULL, False, False, NULL, NULL);
305
306    /* lets set the title appropriately */
307    XtSetArg(args[0], XmNtitle, (GETMESSAGE(29,9, "Trash Can Help")));
308    helpRec = (HelpRec *)_DtGetDialogInstance(dialogData);
309    XtSetValues(XtParent(helpRec->helpDialog), args, 1);
310
311    /* Add hyperlink callback */
312    helpRec = (HelpRec *)_DtGetDialogInstance(dialogData);
313    XtRemoveAllCallbacks(helpRec->helpDialog, DtNhyperLinkCallback);
314    XtAddCallback(helpRec->helpDialog, DtNhyperLinkCallback,
315                  TrashHyperLink, NULL);
316 }
317
318
319
320
321 /************************************************************************
322  *
323  *  TrashHelpClose
324  *      Callback function invoked from the help dialog's close button,
325  *      for the Trash help dialogs.
326  *
327  ************************************************************************/
328
329 static void
330 TrashHelpClose(
331         XtPointer client_data,
332         DialogData *old_dialog_data,
333         DialogData *new_dialog_data )
334
335 {
336    int count;
337    int i, j;
338
339    /*  Remove the dialog data from the trash window's list  */
340    if (old_dialog_data == primaryTrashHelpDialog)
341    {
342       primaryTrashHelpDialog = NULL;
343    }
344    else
345    {
346       _DtHideOneSubdialog( old_dialog_data,
347                         &secondaryTrashHelpDialogList,
348                         &secondaryTrashHelpDialogCount);
349    }
350
351    _DtHideDialog(old_dialog_data, False);
352    _DtFreeDialogData(old_dialog_data);
353    _DtFreeDialogData(new_dialog_data);
354 }
355
356
357
358 /************************************************************************
359  *
360  *  TrashHyperLink
361  *      Callback function responsible for handling a hyperlink help
362  *      request for a help window associated with the trash window.
363  *
364  ************************************************************************/
365
366 static void 
367 TrashHyperLink(
368         Widget w,
369         XtPointer clientData,
370         XtPointer callData )
371
372 {
373    DtHelpDialogCallbackStruct * hyperData;
374
375    hyperData = (DtHelpDialogCallbackStruct *)callData;
376    if (hyperData->hyperType == DtHELP_LINK_JUMP_NEW)
377    {
378       ShowTrashHelpDialog(trashShell, HYPER_HELP_DIALOG, NULL, 
379                           hyperData->locationId, hyperData->helpVolume);
380    }
381 }
382
383
384 /************************************************************************
385  *
386  *  ShowDTHelpDialog
387  *      Used to display a primary or a hyperlink help dialog
388  *
389  ************************************************************************/
390
391 void
392 ShowDTHelpDialog(
393         Widget parentShell,
394         int workspaceNum,
395         int dialogType,
396         DialogData *dialogData,
397         char *idString,
398         char *volString,
399         char *topicTitle,
400         char *fileType,
401         int helpType)
402
403 {
404    HelpRec * helpRec;
405    HelpData * helpData;
406    int count;
407    Arg args[3];
408
409    /* 
410     * DialogData is not NULL, if doing a restore session */
411    if (dialogData == NULL)
412    {
413       /* We are not restoring a session, so get the default values */
414       dialogData = _DtGetDefaultDialogData(help_dialog);
415
416       /* Add to the array of visible help annotation dialogs for this view */
417       if (dialogType == MAIN_HELP_DIALOG)
418       {
419          desktop_data->workspaceData[workspaceNum]->primaryHelpDialog =
420                  dialogData;
421       }
422       else
423       {
424          WorkspaceRec * wsInfo;
425
426          /* Hyperlink help window */
427          wsInfo = desktop_data->workspaceData[workspaceNum];
428          _DtAddOneSubdialog (dialogData,
429                           &wsInfo->secondaryHelpDialogList,
430                           &wsInfo->secondaryHelpDialogCount);
431       }
432
433       helpData = (HelpData *)dialogData->data;
434       helpData->idString = XtNewString(idString);
435       helpData->volString = XtNewString(volString);
436       helpData->topicTitle = XtNewString(topicTitle);
437       helpData->fileType = XtNewString(fileType);
438       helpData->helpType = helpType;
439    }
440
441    _DtShowDialog(parentShell, NULL, NULL, dialogData, NULL, NULL, 
442               DTHelpClose, (XtPointer)workspaceNum, 
443               desktop_data->workspaceData[workspaceNum]->name,
444               False, False, NULL, NULL);
445
446    /* lets set the title appropriately */
447    XtSetArg(args[0], XmNtitle, (GETMESSAGE(29,1, "File Manager Help")));
448    helpRec = (HelpRec *)_DtGetDialogInstance(dialogData);
449    XtSetValues(XtParent(helpRec->helpDialog), args, 1);
450
451    /* Add hyperlink callback */
452    helpRec = (HelpRec *)_DtGetDialogInstance(dialogData);
453    XtRemoveAllCallbacks(helpRec->helpDialog, DtNhyperLinkCallback);
454    XtAddCallback(helpRec->helpDialog, DtNhyperLinkCallback,
455                  DTHyperLink, (XtPointer)workspaceNum);
456 }
457
458
459
460
461 /************************************************************************
462  *
463  *  DTHelpClose
464  *      Callback function invoked from the help dialog's close button.
465  *
466  ************************************************************************/
467
468 static void
469 DTHelpClose(
470         XtPointer client_data,
471         DialogData *old_dialog_data,
472         DialogData *new_dialog_data )
473
474 {
475    int  workspaceNum = (int) client_data;
476    int count;
477    int i, j;
478    WorkspaceRec * wsInfo;
479
480    wsInfo = desktop_data->workspaceData[workspaceNum];
481
482    /*  Remove the dialog data from the top level window's list  */
483    if (old_dialog_data == wsInfo->primaryHelpDialog)
484    {
485       wsInfo->primaryHelpDialog = NULL;
486    }
487    else
488    {
489       _DtHideOneSubdialog( old_dialog_data,
490                         &wsInfo->secondaryHelpDialogList,
491                         &wsInfo->secondaryHelpDialogCount);
492    }
493
494    _DtHideDialog(old_dialog_data, False);
495    _DtFreeDialogData(old_dialog_data);
496    _DtFreeDialogData(new_dialog_data);
497 }
498
499
500
501 /************************************************************************
502  *
503  *  DTHyperLink
504  *      Callback function responsible for handling a hyperlink help
505  *      request for a help window associated with a main window view.
506  *
507  ************************************************************************/
508
509 static void 
510 DTHyperLink(
511         Widget w,
512         XtPointer clientData,
513         XtPointer callData )
514
515 {
516    int  workspaceNum = (int) clientData;
517    DtHelpDialogCallbackStruct * hyperData;
518
519    hyperData = (DtHelpDialogCallbackStruct *)callData;
520    if (hyperData->hyperType == DtHELP_LINK_JUMP_NEW)
521    {
522       ShowDTHelpDialog(NULL, workspaceNum, HYPER_HELP_DIALOG, 
523                      NULL, hyperData->locationId,
524                      hyperData->helpVolume, NULL, NULL, DtHELP_TYPE_TOPIC);
525    }
526 }
527