cdesktopenv/cde/programs/dtcalc/help.c

587 lines
17 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/4 1996/03/25 13:12:20 ageorge $ */
/* *
* help.c *
* Contains all support for help in the Calculator. *
* *
* (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 <Xm/Xm.h>
#include <Xm/XmP.h>
#include <Xm/MwmUtil.h>
#include <Xm/MessageB.h>
#include <Dt/Dt.h>
#include <Dt/HelpDialog.h>
#include "calctool.h"
#include "motif.h"
#define DIALOG_MWM_FUNC MWM_FUNC_MOVE | MWM_FUNC_CLOSE
extern char *base_str[] ; /* Strings for each base value. */
extern char *dtype_str[] ; /* Strings for each display mode value. */
extern char *mode_str[] ; /* Strings for each mode value. */
extern char *ttype_str[] ; /* Strings for each trig type value. */
extern Vars v ; /* Calctool variables and options. */
extern struct button buttons[] ; /* Calculator button values. */
extern Boolean ignore_event;
extern XtIntervalId timerId;
extern void _DtChildPosition P((Widget, Widget, Position *, Position *)) ;
typedef struct _helpStruct {
struct _helpStruct *pNext;
struct _helpStruct *pPrev;
Widget dialog;
Boolean inUse;
} HelpStruct;
static Widget GetHelpDialog P(()) ;
static void UnmanageCB P(()) ;
void
Help(helpVolume, locationId)
char *helpVolume;
char *locationId;
{
Arg args[10];
Position newX, newY;
int n;
if(X->helpDialog == NULL)
{
n = 0;
XtSetArg(args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg(args[n], DtNhelpVolume, helpVolume); n++;
XtSetArg(args[n], DtNlocationId, locationId); n++;
XtSetArg(args[n], XmNtitle, GETMESSAGE(4, 1, "Calculator - Help")); n++;
X->helpDialog = DtCreateHelpDialog(X->mainWin, "helpDlg", args, n);
DtWsmRemoveWorkspaceFunctions(X->dpy,
XtWindow(XtParent(X->helpDialog)));
XtAddCallback(X->helpDialog, DtNhyperLinkCallback,
(XtCallbackProc)HelpHyperlinkCB, NULL);
XtAddCallback(X->helpDialog, DtNcloseCallback,
(XtCallbackProc)HelpCloseCB, NULL);
}
else
{
n = 0;
XtSetArg(args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg(args[n], DtNhelpVolume, helpVolume); n++;
XtSetArg(args[n], DtNlocationId, locationId); n++;
XtSetValues(X->helpDialog, args, n);
}
XtSetMappedWhenManaged(XtParent(X->helpDialog), False);
XSync(X->dpy, False);
XtManageChild(X->helpDialog) ;
_DtChildPosition(X->helpDialog, X->kframe, &newX, &newY);
XtSetArg(args[0], XmNx, newX);
XtSetArg(args[1], XmNy, newY);
XtSetValues(X->helpDialog, args, 2);
XtSetMappedWhenManaged(XtParent(X->helpDialog), True);
XSync(X->dpy, False);
XtMapWidget(XtParent(X->helpDialog));
X->helpMapped = True;
}
void
HelpCloseCB(widget, client_data, call_data)
Widget widget;
caddr_t client_data, call_data;
{
HelpStruct *pHelpCache = (HelpStruct *)client_data;
HelpStruct *pHelp;
for (pHelp = pHelpCache; pHelp != (HelpStruct *)NULL && pHelp->dialog !=widget;
pHelp = pHelp->pNext);
if (pHelp != (HelpStruct *)NULL)
{
pHelp->inUse = False;
}
XtUnmapWidget(XtParent(widget));
X->helpMapped = False;
}
void
HelpHyperlinkCB(widget, client_data, call_data)
Widget widget;
caddr_t client_data, call_data;
{
DtHelpDialogCallbackStruct *pHyper = (DtHelpDialogCallbackStruct *) call_data;
switch(pHyper->hyperType)
{
case DtHELP_LINK_TOPIC:
DisplayHelp(pHyper->helpVolume, pHyper->locationId);
break;
default:
;
}
}
void
HelpRequestCB(widget, client_data, call_data)
Widget widget;
caddr_t client_data, call_data;
{
char *helpVolume, *locationId;
int topic;
topic = ((int) client_data) & 0xFFFF;
helpVolume = HELP_VOLUME;
if(topic < 56)
{
switch (topic)
{
case 0:
locationId = HELP_BLANK_STR;
break;
case 8:
locationId = HELP_ACC_STR;
break;
case 12:
if(v->modetype == LOGICAL)
locationId = HELP_LSHIFT_STR;
else
locationId = buttons[topic].str;
break;
case 13:
if(v->modetype == LOGICAL)
locationId = HELP_RSHIFT_STR;
else if(v->modetype == FINANCIAL)
locationId = HELP_INT_STR;
else
locationId = buttons[topic].str;
break;
case 14:
if(v->modetype == LOGICAL)
locationId = HELP_TRUNC16_STR;
else if(v->modetype == SCIENTIFIC)
locationId = HELP_ETOX_STR;
else
locationId = buttons[topic].str;
break;
case 15:
if(v->modetype == LOGICAL)
locationId = HELP_TRUNC32_STR;
else if(v->modetype == SCIENTIFIC)
locationId = HELP_TENTOX_STR;
else
locationId = buttons[topic].str;
break;
case 16:
if(v->modetype == SCIENTIFIC)
locationId = HELP_YTOX_STR;
else
locationId = buttons[topic].str;
break;
case 17:
if(v->modetype == SCIENTIFIC)
locationId = HELP_XFACT_STR;
else if(v->modetype == FINANCIAL)
locationId = HELP_PAYPYR_STR;
else
locationId = buttons[topic].str;
break;
case 21:
if(v->modetype == LOGICAL)
locationId = HELP_BLANK_STR;
else
locationId = buttons[topic].str;
break;
case 22:
if(v->modetype == LOGICAL)
locationId = HELP_BLANK_STR;
else
locationId = buttons[topic].str;
break;
case 23:
if(v->modetype == LOGICAL || v->modetype == FINANCIAL)
locationId = HELP_BLANK_STR;
else
locationId = buttons[topic].str;
break;
case 24:
locationId = HELP_RECIP_STR;
break;
case 25:
locationId = HELP_SQUARE_STR;
break;
case 26:
locationId = HELP_SQRT_STR;
break;
case 27:
locationId = HELP_PERCENT_STR;
break;
case 28:
locationId = HELP_LPAREN_STR;
break;
case 29:
locationId = HELP_RPAREN_STR;
break;
case 35:
locationId = HELP_CHGSIGN_STR;
break;
case 39:
locationId = HELP_TIMES_STR;
break;
case 40:
locationId = HELP_SEVEN_STR;
break;
case 41:
locationId = HELP_EIGHT_STR;
break;
case 42:
locationId = HELP_NINE_STR;
break;
case 43:
locationId = HELP_DIVIDE_STR;
break;
case 44:
locationId = HELP_FOUR_STR;
break;
case 45:
locationId = HELP_FIVE_STR;
break;
case 46:
locationId = HELP_SIX_STR;
break;
case 47:
locationId = HELP_MINUS_STR;
break;
case 48:
locationId = HELP_ONE_STR;
break;
case 49:
locationId = HELP_TWO_STR;
break;
case 50:
locationId = HELP_THREE_STR;
break;
case 51:
locationId = HELP_PLUS_STR;
break;
case 52:
locationId = HELP_ZERO_STR;
break;
case 53:
locationId = HELP_DECIMAL_STR;
break;
case 54:
locationId = HELP_EQUAL_STR;
break;
default:
locationId = buttons[topic].str;
}
}
else
{
switch (topic)
{
case HELP_HELP_MENU:
locationId = HELP_HELP_MENU_STR;
break;
case HELP_INTRODUCTION:
locationId = HELP_INTRODUCTION_STR;
break;
case HELP_TABLEOFCONTENTS:
locationId = HELP_TABLEOFCONTENTS_STR;
break;
case HELP_TASKS:
locationId = HELP_TASKS_STR;
break;
case HELP_REFERENCE:
locationId = HELP_REFERENCE_STR;
break;
case HELP_ITEM:
locationId = HELP_ITEM_STR;
break;
case HELP_USING:
locationId = HELP_USING_STR;
helpVolume = HELP_USING_HELP_VOLUME;
break;
case HELP_VERSION:
locationId = HELP_VERSION_STR;
break;
case HELP_ASCII:
locationId = HELP_ASCII_STR;
break;
case HELP_CONSTANT:
locationId = HELP_CONSTANT_STR;
break;
case HELP_FUNCTION:
locationId = HELP_FUNCTION_STR;
break;
case HELP_DISPLAY:
locationId = HELP_DISPLAY_STR;
break;
case HELP_MODELINE:
locationId = HELP_MODELINE_STR;
break;
case HELP_MODE:
locationId = mode_str[(int) v->modetype];
break;
case HELP_BASE:
locationId = base_str[(int) v->base];
break;
case HELP_NOTATION:
locationId = dtype_str[(int) v->dtype];
break;
case HELP_TRIG:
locationId = ttype_str[(int) v->ttype];
break;
case HELP_MENUBAR:
locationId = HELP_MENUBAR_STR;
break;
default:
locationId = HELP_INTRODUCTION_STR;
}
}
Help(helpVolume, locationId);
ignore_event = True;
timerId = XtAppAddTimeOut (XtWidgetToApplicationContext (X->kframe), 300,
(XtTimerCallbackProc) TimerEvent, (XtPointer) NULL);
}
void
HelpModeCB(w, client_data, call_data)
Widget w;
caddr_t client_data, call_data;
{
Widget widget;
char *errorMsg, *tmp;
switch(DtHelpReturnSelectedWidgetId(X->mainWin, (Cursor)NULL, &widget))
{
case DtHELP_SELECT_VALID:
while (!XtIsShell(widget))
{
if(XtHasCallbacks(widget, XmNhelpCallback) == XtCallbackHasSome)
{
XtCallCallbacks(widget, XmNhelpCallback,
(XtPointer)client_data);
return;
}
widget = XtParent(widget);
}
break;
case DtHELP_SELECT_INVALID:
errorMsg = GETMESSAGE(4, 2, "You must select an item within Calculator");
tmp = XtNewString(errorMsg);
ErrDialog((char *) tmp, X->mainWin);
XtFree(tmp);
break;
}
}
void
DisplayHelp( helpVolume, locationId)
char *helpVolume;
char *locationId;
{
Arg args[10];
int n;
X->helpDialog = GetHelpDialog();
n = 0;
XtSetArg(args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg(args[n], DtNhelpVolume, helpVolume); n++;
XtSetArg(args[n], DtNlocationId, locationId); n++;
XtSetValues(X->helpDialog, args, n);
XtManageChild(X->helpDialog);
XtMapWidget(XtParent(X->helpDialog));
X->helpMapped = True;
}
static Widget
GetHelpDialog()
{
static HelpStruct *pHelpCache;
HelpStruct *pHelp;
Arg args[5];
int n;
if(pHelpCache == (HelpStruct *)NULL)
{
pHelp = pHelpCache = (HelpStruct *)XtMalloc(sizeof(HelpStruct));
pHelp->pNext = (HelpStruct *)NULL;
pHelp->pPrev = (HelpStruct *)NULL;
pHelp->inUse = True;
XtSetArg(args[0], XmNtitle, GETMESSAGE(4, 1, "Calculator - Help"));
pHelp->dialog = DtCreateHelpDialog(X->mainWin, "helpDlg", args, 1);
DtWsmRemoveWorkspaceFunctions(X->dpy,
XtWindow(XtParent(pHelp->dialog)));
XtAddCallback(pHelp->dialog, DtNhyperLinkCallback,
(XtCallbackProc)HelpHyperlinkCB, NULL);
XtAddCallback(pHelp->dialog, DtNcloseCallback,
(XtCallbackProc)HelpCloseCB, pHelpCache);
return pHelp->dialog;
}
else
{
for(pHelp = pHelpCache;
pHelp != (HelpStruct *)NULL;
pHelp = pHelp->pNext)
{
if(pHelp->inUse == False)
{
pHelp->inUse = True;
return pHelp->dialog;
}
}
pHelp = (HelpStruct *) XtMalloc(sizeof(HelpStruct));
pHelpCache->pPrev = pHelp;
pHelp->pNext = pHelpCache;
pHelpCache = pHelp;
pHelp->pPrev = (HelpStruct *)NULL;
pHelp->inUse = True;
XtSetArg(args[0], XmNtitle, GETMESSAGE(4, 1, "Calculator - Help"));
pHelp->dialog = DtCreateHelpDialog(X->mainWin, "helpDlg", args, 1);
DtWsmRemoveWorkspaceFunctions(X->dpy,
XtWindow(XtParent(pHelp->dialog)));
XtAddCallback(pHelp->dialog, DtNhyperLinkCallback,
(XtCallbackProc)HelpHyperlinkCB, NULL);
XtAddCallback(pHelp->dialog, DtNcloseCallback,
(XtCallbackProc)HelpCloseCB, pHelpCache);
return pHelp->dialog;
}
}
void
ErrDialog( errString, visualParent )
char *errString ;
Widget visualParent ;
{
int n;
Arg args[10];
XmString label, ok;
label = XmStringCreateLocalized(errString) ;
X->errParent = visualParent;
if (X->errDialog == NULL)
{
ok = XmStringCreateLocalized(GETMESSAGE(4, 4, "OK"));
n = 0;
XtSetArg (args[n], XmNokLabelString, ok); n++;
XtSetArg (args[n], XmNmessageString, label); n++;
XtSetArg (args[n], XmNmwmFunctions, DIALOG_MWM_FUNC); n++;
XtSetArg (args[n], XmNautoUnmanage, FALSE); n++;
XtSetArg (args[n], XmNdefaultPosition, FALSE); n++;
X->errDialog = XmCreateErrorDialog (X->mainWin, "ErroNotice", args, n);
XtAddCallback (X->errDialog, XmNokCallback, UnmanageCB, NULL);
XtAddCallback (X->errDialog, XmNmapCallback, CenterMsgCB, NULL);
XtUnmanageChild (XmMessageBoxGetChild (X->errDialog,
XmDIALOG_CANCEL_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (X->errDialog, XmDIALOG_HELP_BUTTON));
n = 0;
XtSetArg (args[n], XmNmwmInputMode,
MWM_INPUT_PRIMARY_APPLICATION_MODAL);n++;
XtSetArg (args[n], XmNuseAsyncGeometry, TRUE); n++;
XtSetArg (args[n], XmNtitle, GETMESSAGE(4, 3, "Error")); n++;
XtSetValues (XtParent(X->errDialog), args, n);
}
else
{
XtSetArg (args[0], XmNmessageString, label);
XtSetValues (X->errDialog, args, 1);
}
XmStringFree (label);
XtManageChild(X->errDialog);
}
static void
UnmanageCB(widget, client_data, call_data)
Widget widget;
XtPointer client_data, call_data;
{
XtUnmanageChild(widget);
}
void
CenterMsgCB (widget, client_data, call_data)
Widget widget;
XtPointer client_data, call_data;
{
int n;
Position newX, newY;
Arg args[4];
Widget shell;
shell = (Widget)client_data;
if (shell == NULL)
{
if (!X->errParent || !XtParent(X->errParent) ||
!XtIsManaged(X->errParent))
shell = X->mainWin;
else
shell = XtParent(X->errParent);
}
else
shell = XtParent (shell);
newX = XtX(shell) + XtWidth(shell)/2 - XtWidth(widget)/2;
newY = XtY(shell) + XtHeight(shell)/2 - XtHeight(widget)/2;
if (newX < 0) newX = 0;
if (newY < 0) newY = 0;
n = 0;
XtSetArg (args[n], XmNx, newX); n++;
XtSetArg (args[n], XmNy, newY); n++;
XtSetValues(widget, args, n);
}