cdesktopenv/cde/lib/DtHelp/HelpAccess.c

348 lines
10 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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: HelpAccess.c /main/6 1996/08/28 16:46:12 drk $ */
/************************************<+>*************************************
****************************************************************************
**
** File: HelpAccess.c
**
** Project: Cache Creek (Rivers) Project
**
** Description: This module handles all the help requests within a given
** help dialog widget.
**
** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
**
** (c) Copyright 1993, 1994 Hewlett-Packard Company
** (c) Copyright 1993, 1994 International Business Machines Corp.
** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
** (c) Copyright 1993, 1994 Novell, Inc.
**
**
**
****************************************************************************
************************************<+>*************************************/
#include <stdio.h>
#include <signal.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <Xm/RowColumnP.h>
#include <Xm/LabelG.h>
#include <Xm/PushBG.h>
#include <Xm/CascadeB.h>
#include <Xm/CascadeBG.h>
/* Help Library Includes */
#include "DisplayAreaI.h"
#include "Access.h"
#include "StringFuncsI.h"
#include "HelpDialogI.h"
#include "HelpDialogP.h"
#include <Dt/Help.h>
#include "HelpI.h"
#include "HelposI.h"
#include "HelpUtilI.h"
#include "HelpQuickD.h"
#include "HelpQuickDP.h"
#include "HelpQuickDI.h"
/******** Static Function Declarations ********/
static void CloseOnHelpCB(
Widget w,
XtPointer client_data,
XtPointer call_data);
static void SetupHelpDialog(
Widget parent,
char *helpOnHelpVolume,
Widget *helpWidget,
char *locationId);
/******** End Static Function Declarations ********/
/*****************************************************************************
* Function: static void CloseOnHelpCB(
* Widget w,
* XtPointer client_data,
* XtPointer call_data);
*
* Parameters:
*
* Return Value:
*
* Purpose: This routine closes the onhelp dialog Widget that we
* created for our help on help stuff.
*
****************************************************************************/
static void CloseOnHelpCB(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
XtUnmanageChild(w);
}
/****************************************************************************
* Function: void _DtHelpCB ()
*
* Parameters: widget
* clientData
* callData
*
*
* Return Value: Void.
*
* Purpose: Called when any "F1" key is pressed in a help dialog
* widget, or a user selects any of the help buttons in
* any of the help dialogs dialogs.
*
***************************************************************************/
void _DtHelpCB(
Widget widget,
XtPointer clientData,
XtPointer callData)
{
char *errorStr;
DtHelpListStruct * pHelpInfo = (DtHelpListStruct *) clientData;
_DtHelpCommonHelpStuff * help = pHelpInfo->help;
/* If helpOnHelp resource is set use it, else post an error dialog */
if (help->helpOnHelpVolume != NULL)
{
SetupHelpDialog((Widget)pHelpInfo->widget, help->helpOnHelpVolume,
&(help->onHelpDialog), pHelpInfo->locationId);
}
else
{
/* We have no help available for the help stuff so generate an error */
/* Do NOT EVER provide a help button */
/* ??? ERROR */
errorStr = XtNewString(((char *) _DTGETMESSAGE(6, 4,
"Help On Help not provided for this application!")));
_DtHelpErrorDialog(XtParent(pHelpInfo->widget), errorStr);
XtFree(errorStr);
}
}
/*****************************************************************************
* Function: void SetupHelpDialog ();
*
*
* Parameters:
*
* Return Value: Void.
*
* Purpose: Creates or re-uses a help on help quick help widget.
*
*****************************************************************************/
static void SetupHelpDialog(
Widget parent,
char *helpOnHelpVolume,
Widget *helpDialog,
char *locationId)
{
Arg args[10];
int n;
XmString printString;
XmString closeString;
XmString backString;
XmString helpString;
char *title;
if (*helpDialog == NULL)
{
/* Create the QuickHelpDialog widget for help on help */
title = XtNewString(((char *)_DTGETMESSAGE(6, 1, "Help On Help")));
printString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
(6, 2,"Print ...")));
closeString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
(6, 3,"Close")));
backString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
(6, 5,"Backtrack")));
helpString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
(6, 6,"Help ...")));
n =0;
XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg (args[n], XmNtitle, title); n++;
XtSetArg (args[n], DtNprintLabelString, printString); n++;
XtSetArg (args[n], DtNcloseLabelString, closeString); n++;
XtSetArg (args[n], DtNbackLabelString, backString); n++;
XtSetArg (args[n], DtNhelpLabelString, helpString); n++;
XtSetArg (args[n], DtNhelpVolume,helpOnHelpVolume); n++;
XtSetArg (args[n], DtNlocationId, locationId); n++;
*helpDialog = DtCreateHelpQuickDialog((Widget)parent,
"onHelpDialog", args, n);
XmStringFree(printString);
XmStringFree(closeString);
XmStringFree(backString);
XmStringFree(helpString);
XtFree((char*) title);
/* Catch the close callback so we can destroy the widget */
XtAddCallback(*helpDialog, DtNcloseCallback,
CloseOnHelpCB, (XtPointer) NULL);
/* Add the popup position callback to our history dialog */
XtAddCallback (XtParent(*helpDialog), XmNpopupCallback,
(XtCallbackProc)_DtHelpMapCB,
(XtPointer)XtParent(parent));
}
else
{
n = 0;
XtSetArg (args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg (args[n], DtNhelpVolume,helpOnHelpVolume); n++;
XtSetArg (args[n], DtNlocationId, locationId); n++;
XtSetValues(*helpDialog, args, n);
}
/* Display the dialog */
XtManageChild(*helpDialog);
XtMapWidget(XtParent((Widget)*helpDialog));
}
/*****************************************************************************
* Function: void _DtHelpListFree (DtHelpListStruct * * pHead);
*
*
* Parameters: pHead Specifies the head pointer to the help list.
*
* Return Value: Void.
*
* Purpose: Frees all elements in a Help List.
*
*****************************************************************************/
void _DtHelpListFree(
DtHelpListStruct * * pHead)
{
DtHelpListStruct *pTemp = NULL;
DtHelpListStruct *pTmpHead = *pHead;
while (pTmpHead != NULL)
{
/* Free up each element in the current node */
pTemp = pTmpHead;
pTmpHead = pTmpHead->pNext;
pTemp->pNext = NULL;
/* Free the id String */
XtFree(pTemp->locationId);
/* Now, free the whole node */
XtFree((char *)pTemp);
}
*pHead = NULL; /* reset pointer */
}
/*****************************************************************************
* Function: DtHelpListStruct * _DtHelpListAdd(
* char *locationId,
* Widget new,
* DtHelpListStruct **pHead)
*
*
*
* Parameters:
*
* Return Value: Void.
*
* Purpose: Adds an element to the top of the given topicList.
*
*****************************************************************************/
DtHelpListStruct * _DtHelpListAdd(
char *locationId,
Widget widget,
_DtHelpCommonHelpStuff * help,
DtHelpListStruct **pHead)
{
DtHelpListStruct *pTemp=NULL;
/* Add locationId as first element if pHead = NULL */
if (*pHead == NULL)
{
*pHead = (DtHelpListStruct *) XtMalloc((sizeof(DtHelpListStruct)));
/* Assign the passed in values to our first element */
(*pHead)->locationId = XtNewString(locationId);
(*pHead)->widget = widget;
(*pHead)->help = help;
(*pHead)->pNext = NULL;
(*pHead)->pPrevious = NULL;
}
else
{ /* We have a list so add the new Help item to the top */
pTemp = (DtHelpListStruct *) XtMalloc((sizeof(DtHelpListStruct)));
pTemp->pNext = (*pHead);
pTemp->pPrevious = NULL;
(*pHead)->pPrevious = pTemp;
pTemp->locationId = XtNewString(locationId);
pTemp->widget = widget;
pTemp->help = help;
/* Re-Assign our head pointer to point to the new head of the list */
(*pHead) = pTemp;
}
return (*pHead);
}