/* * 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 #include #include #include #include
#include
#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); }