/* * 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 libraries 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 #include #include #include #include #include #include #include #include /* Help Library Includes */ #include "DisplayAreaI.h" #include "Access.h" #include "StringFuncsI.h" #include "HelpDialogI.h" #include "HelpDialogP.h" #include
#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); }