mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
550 lines
14 KiB
C
550 lines
14 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these librararies and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: Help.c /main/6 1996/10/29 17:08:14 mustafa $ */
|
|
/************************************<+>*************************************
|
|
****************************************************************************
|
|
*
|
|
* FILE: Help.c
|
|
*
|
|
* COMPONENT_NAME: Desktop File Manager (dtfile)
|
|
*
|
|
* Description: Source file for the help dialog.
|
|
*
|
|
* FUNCTIONS: Create
|
|
* FreeValues
|
|
* GetDefaultValues
|
|
* GetResourceValues
|
|
* GetValues
|
|
* InstallClose
|
|
* MapFileTypeToHelpString
|
|
* SetValues
|
|
* WriteResourceValues
|
|
*
|
|
* (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
|
|
* (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
|
|
* (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
|
|
* (c) Copyright 1993, 1994, 1995 Novell, Inc.
|
|
*
|
|
****************************************************************************
|
|
************************************<+>*************************************/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include <time.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <limits.h>
|
|
|
|
|
|
#include <Xm/XmP.h>
|
|
#include <Xm/DialogS.h>
|
|
#include <Xm/VendorSEP.h>
|
|
#include <Xm/MwmUtil.h>
|
|
|
|
#include <X11/ShellP.h>
|
|
#include <X11/Shell.h>
|
|
#include <X11/Xatom.h>
|
|
#include <Xm/Protocols.h>
|
|
|
|
#include <Dt/Action.h>
|
|
#include <Dt/Connect.h>
|
|
#include <Dt/DtNlUtils.h>
|
|
#include <Dt/FileM.h>
|
|
#include <Dt/Dts.h>
|
|
#include "Encaps.h"
|
|
#include "SharedProcs.h"
|
|
|
|
#include <Dt/HelpDialog.h>
|
|
|
|
#include "Desktop.h"
|
|
#include "FileMgr.h"
|
|
#include "Main.h"
|
|
#include "Help.h"
|
|
#include "SharedMsgs.h"
|
|
|
|
|
|
/* Resource definitions for the help dialog */
|
|
|
|
static DialogResource resources[] =
|
|
{
|
|
{ "idString", XmRString, sizeof(String),
|
|
XtOffset(HelpDataPtr, idString),
|
|
(caddr_t) NULL, _DtStringToString },
|
|
|
|
{ "volString", XmRString, sizeof(String),
|
|
XtOffset(HelpDataPtr, volString),
|
|
(caddr_t) NULL, _DtStringToString },
|
|
|
|
{ "topicTitle", XmRString, sizeof(String),
|
|
XtOffset(HelpDataPtr, topicTitle),
|
|
(caddr_t) NULL, _DtStringToString },
|
|
|
|
{ "fileType", XmRString, sizeof(String),
|
|
XtOffset(HelpDataPtr, fileType),
|
|
(caddr_t) NULL, _DtStringToString },
|
|
|
|
{ "helpType", XmRInt, sizeof(int),
|
|
XtOffset(HelpDataPtr, helpType),
|
|
(caddr_t) DtHELP_TYPE_TOPIC, _DtIntToString },
|
|
};
|
|
|
|
|
|
static char * HELP_DIALOG = "HelpDialog";
|
|
|
|
/******** Static Function Declarations ********/
|
|
|
|
static void Create(
|
|
Display *display,
|
|
Widget parent,
|
|
Widget *return_widget,
|
|
XtPointer *dialog) ;
|
|
static void InstallClose(
|
|
HelpRec *helpRec,
|
|
XtCallbackProc callback,
|
|
XtPointer clientData) ;
|
|
static XtPointer GetValues(
|
|
HelpRec *helpRec) ;
|
|
static XtPointer GetDefaultValues( void ) ;
|
|
static XtPointer GetResourceValues(
|
|
XrmDatabase data_base,
|
|
char **name_list) ;
|
|
static void SetValues(
|
|
HelpRec *helpRec,
|
|
HelpData *helpData) ;
|
|
static void WriteResourceValues(
|
|
DialogData *values,
|
|
int fd,
|
|
char **name_list) ;
|
|
static void FreeValues(
|
|
HelpData *helpData) ;
|
|
|
|
/******** End Static Function Declarations ********/
|
|
|
|
/*
|
|
* The Dialog Class structure.
|
|
*/
|
|
|
|
static DialogClass helpClassRec =
|
|
{
|
|
resources,
|
|
XtNumber(resources),
|
|
(DialogCreateProc)Create,
|
|
(DialogInstallChangeProc)NULL,
|
|
(DialogInstallCloseProc)InstallClose,
|
|
(DialogDestroyProc)_DtGenericDestroy,
|
|
(DialogGetValuesProc)GetValues,
|
|
(DialogGetDefaultValuesProc)GetDefaultValues,
|
|
(DialogGetResourceValuesProc)GetResourceValues,
|
|
(DialogSetValuesProc)SetValues,
|
|
(DialogWriteResourceValuesProc)WriteResourceValues,
|
|
(DialogFreeValuesProc)FreeValues,
|
|
(DialogMapWindowProc)_DtGenericMapWindow,
|
|
(DialogSetFocusProc)NULL,
|
|
};
|
|
|
|
DialogClass * helpClass = (DialogClass *) &helpClassRec;
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* Create
|
|
*
|
|
************************************************************************/
|
|
|
|
static void
|
|
Create(
|
|
Display *display,
|
|
Widget parent,
|
|
Widget *return_widget,
|
|
XtPointer *dialog )
|
|
|
|
{
|
|
HelpRec * helpRec;
|
|
Arg args[2];
|
|
Widget helpDialog;
|
|
int mwmDecs;
|
|
|
|
/* Allocate the audio annotation dialog instance record. */
|
|
|
|
helpRec = (HelpRec *) XtMalloc(sizeof(HelpRec));
|
|
|
|
|
|
/* Create the canned help dialog. */
|
|
|
|
helpDialog = DtCreateHelpDialog(parent, "helpDialog", args, 0);
|
|
|
|
/* Fill in our instance structure */
|
|
helpRec->shell = XtParent(helpDialog);
|
|
helpRec->helpDialog = helpDialog;
|
|
|
|
/* Set the return values for the dialog widget and dialog instance. */
|
|
*return_widget = helpDialog;
|
|
*dialog = (XtPointer) helpRec;
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* InstallClose
|
|
*
|
|
************************************************************************/
|
|
|
|
static void
|
|
InstallClose(
|
|
HelpRec *helpRec,
|
|
XtCallbackProc callback,
|
|
XtPointer clientData )
|
|
|
|
{
|
|
XtAddCallback(helpRec->helpDialog, DtNcloseCallback, callback,
|
|
clientData);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* GetValues
|
|
*
|
|
************************************************************************/
|
|
|
|
static XtPointer
|
|
GetValues(
|
|
HelpRec *helpRec )
|
|
|
|
{
|
|
DialogData * dialog_data;
|
|
HelpData * helpData;
|
|
HelpData * oldData;
|
|
Arg args[4];
|
|
int n;
|
|
|
|
|
|
/* Allocate and initialize the help dialog data. */
|
|
|
|
helpData = (HelpData *) XtMalloc(sizeof(HelpData));
|
|
|
|
helpData->displayed = True;
|
|
|
|
n = 0;
|
|
XtSetArg(args[n], XmNx, &helpData->x); n++;
|
|
XtSetArg(args[n], XmNy, &helpData->y); n++;
|
|
XtSetArg(args[n], XmNwidth, &helpData->width); n++;
|
|
XtSetArg(args[n], XmNheight, &helpData->height); n++;
|
|
XtGetValues(helpRec->helpDialog, args, n);
|
|
|
|
dialog_data = _DtGetInstanceData((XtPointer)helpRec);
|
|
oldData = (HelpData *) dialog_data->data;
|
|
helpData->idString = XtNewString(oldData->idString);
|
|
helpData->volString = XtNewString(oldData->volString);
|
|
helpData->topicTitle = XtNewString(oldData->topicTitle);
|
|
helpData->fileType = XtNewString(oldData->fileType);
|
|
helpData->helpType = oldData->helpType;
|
|
|
|
return((XtPointer)helpData);
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* GetDefaultValues
|
|
*
|
|
************************************************************************/
|
|
|
|
static XtPointer
|
|
GetDefaultValues( void )
|
|
|
|
|
|
{
|
|
HelpData * helpData;
|
|
|
|
/* Allocate and initialize the default help dialog data. */
|
|
helpData = (HelpData *) XtMalloc(sizeof(HelpData));
|
|
|
|
helpData->displayed = False;
|
|
helpData->x = 0;
|
|
helpData->y = 0;
|
|
helpData->height = 0;
|
|
helpData->width = 0;
|
|
|
|
helpData->idString = NULL;
|
|
helpData->volString = NULL;
|
|
helpData->topicTitle = NULL;
|
|
helpData->fileType = NULL;
|
|
helpData->helpType = 0;
|
|
|
|
return((XtPointer) helpData);
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* GetResourceValues
|
|
*
|
|
************************************************************************/
|
|
|
|
static XtPointer
|
|
GetResourceValues(
|
|
XrmDatabase data_base,
|
|
char **name_list )
|
|
|
|
{
|
|
HelpData * helpData;
|
|
|
|
helpData = (HelpData *) XtMalloc(sizeof(HelpData));
|
|
|
|
_DtDialogGetResources(data_base, name_list, HELP_DIALOG, (char *)helpData,
|
|
resources, helpClass->resource_count);
|
|
|
|
/* We need copies of all strings returned by the resource manager */
|
|
if (helpData->idString)
|
|
helpData->idString = XtNewString(helpData->idString);
|
|
if (helpData->volString)
|
|
helpData->volString = XtNewString(helpData->volString);
|
|
if (helpData->topicTitle)
|
|
helpData->topicTitle = XtNewString(helpData->topicTitle);
|
|
if (helpData->fileType)
|
|
helpData->fileType = XtNewString(helpData->fileType);
|
|
|
|
return((XtPointer) helpData);
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* SetValues
|
|
*
|
|
************************************************************************/
|
|
|
|
static void
|
|
SetValues(
|
|
HelpRec *helpRec,
|
|
HelpData *helpData )
|
|
|
|
{
|
|
Arg args[10];
|
|
int n;
|
|
String helpString = NULL;
|
|
DtHelpDialogWidget diaShell;
|
|
|
|
diaShell = (DtHelpDialogWidget)helpRec->helpDialog;
|
|
|
|
n = 0;
|
|
XtSetArg(args[n], DtNhelpVolume, helpData->volString); n++;
|
|
XtSetArg(args[n], DtNhelpType, (unsigned char) helpData->helpType); n++;
|
|
if (helpData->helpType == DtHELP_TYPE_TOPIC)
|
|
{
|
|
XtSetArg(args[n], DtNlocationId, helpData->idString); n++;
|
|
}
|
|
else
|
|
{
|
|
helpString = MapFileTypeToHelpString(helpData->idString,
|
|
helpData->fileType);
|
|
XtSetArg(args[n], DtNstringData, helpString); n++;
|
|
XtSetArg(args[n], DtNtopicTitle, helpData->topicTitle); n++;
|
|
}
|
|
XtSetValues(helpRec->helpDialog, args, n);
|
|
XtFree(helpString);
|
|
diaShell = (DtHelpDialogWidget)helpRec->helpDialog;
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* WriteResourceValues
|
|
*
|
|
************************************************************************/
|
|
|
|
static void
|
|
WriteResourceValues(
|
|
DialogData *values,
|
|
int fd,
|
|
char **name_list )
|
|
|
|
{
|
|
Arg args[5];
|
|
HelpRec * helpRec;
|
|
HelpData * helpData = (HelpData *) values->data;
|
|
String volString;
|
|
String idString;
|
|
String topicTitle;
|
|
String stringData;
|
|
unsigned char helpType;
|
|
int n;
|
|
|
|
|
|
/* If the dialog is currently displayed, update the geometry */
|
|
/* fields to their current values. */
|
|
if (helpData->displayed == True)
|
|
{
|
|
_DtGenericUpdateWindowPosition(values);
|
|
helpRec = (HelpRec *)_DtGetDialogInstance(values);
|
|
|
|
/* Get the current help volume and locationId */
|
|
n = 0;
|
|
XtSetArg(args[n], DtNhelpVolume, &volString); n++;
|
|
XtSetArg(args[n], DtNlocationId, &idString); n++;
|
|
XtSetArg(args[n], DtNtopicTitle, &topicTitle); n++;
|
|
XtSetArg(args[n], DtNstringData, &stringData); n++;
|
|
XtSetArg(args[n], DtNhelpType, &helpType); n++;
|
|
XtGetValues(helpRec->helpDialog, args, n);
|
|
XtFree(helpData->volString);
|
|
helpData->helpType = (int) helpType;
|
|
helpData->volString = XtNewString(volString);
|
|
if (helpData->helpType == DtHELP_TYPE_TOPIC)
|
|
{
|
|
XtFree(helpData->idString);
|
|
XtFree(helpData->topicTitle);
|
|
helpData->idString = XtNewString(idString);
|
|
helpData->topicTitle = NULL;
|
|
}
|
|
|
|
_DtDialogPutResources(fd, name_list, HELP_DIALOG, values->data,
|
|
resources, helpClass->resource_count);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
*
|
|
* FreeValues
|
|
*
|
|
************************************************************************/
|
|
|
|
static void
|
|
FreeValues(
|
|
HelpData *helpData )
|
|
|
|
{
|
|
XtFree((char *) helpData->topicTitle);
|
|
XtFree((char *) helpData->idString);
|
|
XtFree((char *) helpData->volString);
|
|
XtFree((char *) helpData->fileType);
|
|
XtFree((char *) helpData);
|
|
}
|
|
|
|
|
|
/*
|
|
* The application must free up the returned string.
|
|
* If 'miscData' is not NULL, then we are attempting to get the description
|
|
* for a specific action, as defined for a specific filetype.
|
|
*/
|
|
|
|
XtPointer
|
|
MapFileTypeToHelpString(
|
|
String filetype,
|
|
String miscData )
|
|
|
|
{
|
|
char * buf;
|
|
char * helpPattern;
|
|
char * desc;
|
|
Boolean isAction;
|
|
char * tmpStr;
|
|
char * label = NULL;
|
|
|
|
/* Special case for the 2 built in directory commands */
|
|
if (strcmp(filetype, openNewView) == 0)
|
|
{
|
|
tmpStr = (GETMESSAGE(29,7, "The `%s` action opens a new File Manager view window\nof the requested folder."));
|
|
desc = XtNewString(tmpStr);
|
|
|
|
buf = XtMalloc(strlen(desc) + strlen(filetype) + 100);
|
|
sprintf(buf, desc, filetype);
|
|
XtFree(desc);
|
|
return(buf);
|
|
}
|
|
if (strcmp(filetype, openInPlace) == 0)
|
|
{
|
|
tmpStr =
|
|
(GETMESSAGE(29,8, "The `%s` action displays the requested folder in\nthe current File Manager view window."));
|
|
desc = XtNewString(tmpStr);
|
|
|
|
buf = XtMalloc(strlen(desc) + strlen(filetype) + 100);
|
|
sprintf(buf, desc, filetype);
|
|
XtFree(desc);
|
|
return(buf);
|
|
}
|
|
|
|
#ifdef old
|
|
if (miscData)
|
|
/* The DtGetActionDescription function must be modified to
|
|
accept a non-integral second parameter. (Filetypes are no
|
|
longer expressed as integers. */
|
|
desc = DtGetActionDescription(filetype, -1);
|
|
else
|
|
#endif
|
|
desc = DtDtsDataTypeToAttributeValue(filetype,
|
|
DtDTS_DA_DESCRIPTION,
|
|
NULL);
|
|
|
|
isAction = DtDtsDataTypeIsAction(filetype);
|
|
|
|
if (desc)
|
|
return(XtNewString(desc));
|
|
|
|
/* No description found for this filetype */
|
|
if (isAction)
|
|
{
|
|
tmpStr=(GETMESSAGE(29,5, "There is no help available for the %s action"));
|
|
helpPattern = XtNewString(tmpStr);
|
|
}
|
|
else
|
|
{
|
|
tmpStr =
|
|
(GETMESSAGE(29,6, "There is no help available for the %s filetype"));
|
|
helpPattern = XtNewString(tmpStr);
|
|
}
|
|
|
|
label = DtDtsDataTypeToAttributeValue(filetype,
|
|
DtDTS_DA_LABEL,
|
|
NULL);
|
|
if(label)
|
|
{
|
|
buf = XtMalloc(strlen(label) + strlen(helpPattern) + 100);
|
|
sprintf(buf, helpPattern, label);
|
|
DtDtsFreeAttributeValue(label);
|
|
label = NULL;
|
|
}
|
|
else
|
|
{
|
|
buf = XtMalloc(strlen(filetype) + strlen(helpPattern) + 100);
|
|
sprintf(buf, helpPattern, filetype);
|
|
}
|
|
|
|
XtFree(helpPattern);
|
|
DtDtsFreeAttributeValue(label);
|
|
return (buf);
|
|
}
|