07d8ce2b0ded680b1e762a7a48f624ce20b9c091
[oweals/cde.git] / cde / programs / dtfile / Help.c
1 /* $XConsortium: Help.c /main/6 1996/10/29 17:08:14 mustafa $ */
2 /************************************<+>*************************************
3  ****************************************************************************
4  *
5  *   FILE:           Help.c
6  *
7  *   COMPONENT_NAME: Desktop File Manager (dtfile)
8  *
9  *   Description:    Source file for the help dialog.
10  *
11  *   FUNCTIONS: Create
12  *              FreeValues
13  *              GetDefaultValues
14  *              GetResourceValues
15  *              GetValues
16  *              InstallClose
17  *              MapFileTypeToHelpString
18  *              SetValues
19  *              WriteResourceValues
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
30 #include <stdio.h>
31 #include <errno.h>
32 #include <time.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <unistd.h>
36 #include <limits.h>
37
38
39 #include <Xm/XmP.h>
40 #include <Xm/DialogS.h>
41 #include <Xm/VendorSEP.h>
42 #include <Xm/MwmUtil.h>
43
44 #include <X11/ShellP.h>
45 #include <X11/Shell.h>
46 #include <X11/Xatom.h>
47 #include <Xm/Protocols.h>
48
49 #include <Dt/Action.h>
50 #include <Dt/Connect.h>
51 #include <Dt/DtNlUtils.h>
52 #include <Dt/FileM.h>
53 #include <Dt/Dts.h>
54 #include "Encaps.h"
55 #include "SharedProcs.h"
56
57 #include <Dt/HelpDialog.h>
58
59 #include "Desktop.h"
60 #include "FileMgr.h"
61 #include "Main.h"
62 #include "Help.h"
63 #include "SharedMsgs.h"
64
65
66 /*  Resource definitions for the help dialog  */
67
68 static DialogResource resources[] =
69 {
70    { "idString", XmRString, sizeof(String),
71      XtOffset(HelpDataPtr, idString),
72      (caddr_t) NULL, _DtStringToString },
73
74    { "volString", XmRString, sizeof(String),
75      XtOffset(HelpDataPtr, volString),
76      (caddr_t) NULL, _DtStringToString },
77
78    { "topicTitle", XmRString, sizeof(String),
79      XtOffset(HelpDataPtr, topicTitle),
80      (caddr_t) NULL, _DtStringToString },
81
82    { "fileType", XmRString, sizeof(String),
83      XtOffset(HelpDataPtr, fileType),
84      (caddr_t) NULL, _DtStringToString },
85
86    { "helpType", XmRInt, sizeof(int),
87       XtOffset(HelpDataPtr, helpType),
88       (caddr_t) DtHELP_TYPE_TOPIC, _DtIntToString },
89 };
90
91
92 static char * HELP_DIALOG = "HelpDialog";
93
94 /********    Static Function Declarations    ********/
95
96 static void Create(
97                         Display *display,
98                         Widget parent,
99                         Widget *return_widget,
100                         XtPointer *dialog) ;
101 static void InstallClose(
102                         HelpRec *helpRec,
103                         XtCallbackProc callback,
104                         XtPointer clientData) ;
105 static XtPointer GetValues(
106                         HelpRec *helpRec) ;
107 static XtPointer GetDefaultValues( void ) ;
108 static XtPointer GetResourceValues(
109                         XrmDatabase data_base,
110                         char **name_list) ;
111 static void SetValues(
112                         HelpRec *helpRec,
113                         HelpData *helpData) ;
114 static void WriteResourceValues(
115                         DialogData *values,
116                         int fd,
117                         char **name_list) ;
118 static void FreeValues(
119                         HelpData *helpData) ;
120
121 /********    End Static Function Declarations    ********/
122
123 /*
124  *  The Dialog Class structure.
125  */
126
127 static DialogClass helpClassRec =
128 {
129    resources,
130    XtNumber(resources),
131    (DialogCreateProc)Create,
132    (DialogInstallChangeProc)NULL,
133    (DialogInstallCloseProc)InstallClose,
134    (DialogDestroyProc)_DtGenericDestroy,
135    (DialogGetValuesProc)GetValues,
136    (DialogGetDefaultValuesProc)GetDefaultValues,
137    (DialogGetResourceValuesProc)GetResourceValues,
138    (DialogSetValuesProc)SetValues,
139    (DialogWriteResourceValuesProc)WriteResourceValues,
140    (DialogFreeValuesProc)FreeValues,
141    (DialogMapWindowProc)_DtGenericMapWindow,
142    (DialogSetFocusProc)NULL,
143 };
144
145 DialogClass * helpClass = (DialogClass *) &helpClassRec;
146
147
148
149
150 /************************************************************************
151  *
152  *  Create
153  *
154  ************************************************************************/
155
156 static void
157 Create(
158         Display *display,
159         Widget parent,
160         Widget *return_widget,
161         XtPointer *dialog )
162
163 {
164    HelpRec * helpRec;
165    Arg args[2];
166    Widget helpDialog;
167    int mwmDecs;
168
169    /*  Allocate the audio annotation dialog instance record.  */
170
171    helpRec = (HelpRec *) XtMalloc(sizeof(HelpRec));
172
173
174    /*  Create the canned help dialog.  */
175
176    helpDialog = DtCreateHelpDialog(parent, "helpDialog", args, 0);
177
178    /* Fill in our instance structure */
179    helpRec->shell = XtParent(helpDialog);
180    helpRec->helpDialog = helpDialog;
181
182    /*  Set the return values for the dialog widget and dialog instance.  */
183    *return_widget = helpDialog;
184    *dialog = (XtPointer) helpRec;
185 }
186
187
188 /************************************************************************
189  *
190  *  InstallClose
191  *
192  ************************************************************************/
193
194 static void
195 InstallClose(
196         HelpRec *helpRec,
197         XtCallbackProc callback,
198         XtPointer clientData )
199
200 {
201    XtAddCallback(helpRec->helpDialog, DtNcloseCallback, callback,
202                  clientData);
203 }
204
205
206 /************************************************************************
207  *
208  *  GetValues
209  *
210  ************************************************************************/
211
212 static XtPointer
213 GetValues(
214         HelpRec *helpRec )
215
216 {
217    DialogData * dialog_data;
218    HelpData * helpData;
219    HelpData * oldData;
220    Arg args[4];
221    int n;
222
223
224    /*  Allocate and initialize the help dialog data.  */
225
226    helpData = (HelpData *) XtMalloc(sizeof(HelpData));
227
228    helpData->displayed = True;
229
230    n = 0;
231    XtSetArg(args[n], XmNx, &helpData->x);           n++;
232    XtSetArg(args[n], XmNy, &helpData->y);           n++;
233    XtSetArg(args[n], XmNwidth, &helpData->width);   n++;
234    XtSetArg(args[n], XmNheight, &helpData->height); n++;
235    XtGetValues(helpRec->helpDialog, args, n);
236
237    dialog_data = _DtGetInstanceData((XtPointer)helpRec);
238    oldData = (HelpData *) dialog_data->data;
239    helpData->idString = XtNewString(oldData->idString);
240    helpData->volString = XtNewString(oldData->volString);
241    helpData->topicTitle = XtNewString(oldData->topicTitle);
242    helpData->fileType = XtNewString(oldData->fileType);
243    helpData->helpType = oldData->helpType;
244
245    return((XtPointer)helpData);
246 }
247
248
249
250
251 /************************************************************************
252  *
253  *  GetDefaultValues
254  *
255  ************************************************************************/
256
257 static XtPointer
258 GetDefaultValues( void )
259
260
261 {
262    HelpData * helpData;
263
264    /*  Allocate and initialize the default help dialog data.  */
265    helpData = (HelpData *) XtMalloc(sizeof(HelpData));
266
267    helpData->displayed = False;
268    helpData->x = 0;
269    helpData->y = 0;
270    helpData->height = 0;
271    helpData->width = 0;
272
273    helpData->idString = NULL;
274    helpData->volString = NULL;
275    helpData->topicTitle = NULL;
276    helpData->fileType = NULL;
277    helpData->helpType = 0;
278
279    return((XtPointer) helpData);
280 }
281
282
283
284
285 /************************************************************************
286  *
287  *  GetResourceValues
288  *
289  ************************************************************************/
290
291 static XtPointer
292 GetResourceValues(
293         XrmDatabase data_base,
294         char **name_list )
295
296 {
297    HelpData * helpData;
298
299    helpData = (HelpData *) XtMalloc(sizeof(HelpData));
300
301    _DtDialogGetResources(data_base, name_list, HELP_DIALOG, (char *)helpData,
302                       resources, helpClass->resource_count);
303
304    /* We need copies of all strings returned by the resource manager */
305    if (helpData->idString)
306       helpData->idString = XtNewString(helpData->idString);
307    if (helpData->volString)
308       helpData->volString = XtNewString(helpData->volString);
309    if (helpData->topicTitle)
310       helpData->topicTitle = XtNewString(helpData->topicTitle);
311    if (helpData->fileType)
312       helpData->fileType = XtNewString(helpData->fileType);
313
314    return((XtPointer) helpData);
315 }
316
317
318
319
320 /************************************************************************
321  *
322  *  SetValues
323  *
324  ************************************************************************/
325
326 static void
327 SetValues(
328         HelpRec *helpRec,
329         HelpData *helpData )
330
331 {
332    Arg args[10];
333    int n;
334    String helpString = NULL;
335    DtHelpDialogWidget diaShell;
336
337    diaShell = (DtHelpDialogWidget)helpRec->helpDialog;
338
339    n = 0;
340    XtSetArg(args[n], DtNhelpVolume, helpData->volString); n++;
341    XtSetArg(args[n], DtNhelpType, (unsigned char) helpData->helpType); n++;
342    if (helpData->helpType == DtHELP_TYPE_TOPIC)
343    {
344       XtSetArg(args[n], DtNlocationId, helpData->idString); n++;
345    }
346    else
347    {
348       helpString = MapFileTypeToHelpString(helpData->idString,
349                                            helpData->fileType);
350       XtSetArg(args[n], DtNstringData, helpString); n++;
351       XtSetArg(args[n], DtNtopicTitle, helpData->topicTitle); n++;
352    }
353    XtSetValues(helpRec->helpDialog, args, n);
354    XtFree(helpString);
355    diaShell = (DtHelpDialogWidget)helpRec->helpDialog;
356 }
357
358
359
360
361 /************************************************************************
362  *
363  *  WriteResourceValues
364  *
365  ************************************************************************/
366
367 static void
368 WriteResourceValues(
369         DialogData *values,
370         int fd,
371         char **name_list )
372
373 {
374    Arg args[5];
375    HelpRec * helpRec;
376    HelpData * helpData = (HelpData *) values->data;
377    String volString;
378    String idString;
379    String topicTitle;
380    String stringData;
381    unsigned char helpType;
382    int n;
383
384
385    /*  If the dialog is currently displayed, update the geometry  */
386    /*  fields to their current values.                            */
387    if (helpData->displayed == True)
388    {
389       _DtGenericUpdateWindowPosition(values);
390       helpRec = (HelpRec *)_DtGetDialogInstance(values);
391
392       /* Get the current help volume and locationId */
393       n = 0;
394       XtSetArg(args[n], DtNhelpVolume, &volString); n++;
395       XtSetArg(args[n], DtNlocationId, &idString); n++;
396       XtSetArg(args[n], DtNtopicTitle, &topicTitle); n++;
397       XtSetArg(args[n], DtNstringData, &stringData); n++;
398       XtSetArg(args[n], DtNhelpType, &helpType); n++;
399       XtGetValues(helpRec->helpDialog, args, n);
400       XtFree(helpData->volString);
401       helpData->helpType = (int) helpType;
402       helpData->volString = XtNewString(volString);
403       if (helpData->helpType == DtHELP_TYPE_TOPIC)
404       {
405          XtFree(helpData->idString);
406          XtFree(helpData->topicTitle);
407          helpData->idString = XtNewString(idString);
408          helpData->topicTitle = NULL;
409       }
410
411       _DtDialogPutResources(fd, name_list, HELP_DIALOG, values->data,
412                           resources, helpClass->resource_count);
413    }
414 }
415
416
417
418 /************************************************************************
419  *
420  *  FreeValues
421  *
422  ************************************************************************/
423
424 static void
425 FreeValues(
426         HelpData *helpData )
427
428 {
429    XtFree((char *) helpData->topicTitle);
430    XtFree((char *) helpData->idString);
431    XtFree((char *) helpData->volString);
432    XtFree((char *) helpData->fileType);
433    XtFree((char *) helpData);
434 }
435
436
437 /*
438  * The application must free up the returned string.
439  * If 'miscData' is not NULL, then we are attempting to get the description
440  * for a specific action, as defined for a specific filetype.
441  */
442
443 XtPointer
444 MapFileTypeToHelpString(
445    String filetype,
446    String miscData )
447
448 {
449    char * buf;
450    char * helpPattern;
451    char * desc;
452    Boolean isAction;
453    char * tmpStr;
454    char * label;
455
456    /* Special case for the 2 built in directory commands */
457    if (strcmp(filetype, openNewView) == 0)
458    {
459       tmpStr = (GETMESSAGE(29,7, "The `%s` action opens a new File Manager view window\nof the requested folder."));
460       desc = XtNewString(tmpStr);
461
462       buf = XtMalloc(strlen(desc) + strlen(filetype) + 100);
463       sprintf(buf, desc, filetype);
464       XtFree(desc);
465       return(buf);
466    }
467    if (strcmp(filetype, openInPlace) == 0)
468    {
469       tmpStr =
470        (GETMESSAGE(29,8, "The `%s` action displays the requested folder in\nthe current File Manager view window."));
471       desc = XtNewString(tmpStr);
472
473       buf = XtMalloc(strlen(desc) + strlen(filetype) + 100);
474       sprintf(buf, desc, filetype);
475       XtFree(desc);
476       return(buf);
477    }
478
479 #ifdef old
480    if (miscData)
481       /* The DtGetActionDescription function must be modified to
482          accept a non-integral second parameter.  (Filetypes are no
483          longer expressed as integers. */
484       desc = DtGetActionDescription(filetype, -1);
485    else
486 #endif
487       desc = DtDtsDataTypeToAttributeValue(filetype,
488                                            DtDTS_DA_DESCRIPTION,
489                                            NULL);
490
491    isAction = DtDtsDataTypeIsAction(filetype);
492
493    if (desc)
494       return(XtNewString(desc));
495
496    /* No description found for this filetype */
497    if (isAction)
498    {
499       tmpStr=(GETMESSAGE(29,5, "There is no help available for the %s action"));
500       helpPattern = XtNewString(tmpStr);
501    }
502    else
503    {
504       tmpStr =
505          (GETMESSAGE(29,6, "There is no help available for the %s filetype"));
506       helpPattern = XtNewString(tmpStr);
507    }
508
509    label = DtDtsDataTypeToAttributeValue(filetype,
510                                          DtDTS_DA_LABEL,
511                                          NULL);
512    if(label)
513    {
514        buf = XtMalloc(strlen(label) + strlen(helpPattern) + 100);
515        sprintf(buf, helpPattern, label);
516        DtDtsFreeAttributeValue(label);
517    }
518    else
519    {
520        buf = XtMalloc(strlen(filetype) + strlen(helpPattern) + 100);
521        sprintf(buf, helpPattern, filetype);
522    }
523
524    XtFree(helpPattern);
525    DtDtsFreeAttributeValue(label);
526    return (buf);
527 }