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