cdesktopenv/cde/programs/dthelp/dthelpview/ManPage.c

399 lines
12 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 libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: ManPage.c /main/5 1996/09/30 11:28:22 cde-hp $ */
/*************************************<+>*************************************
*****************************************************************************
**
** File: ManPage.c
**
** Project: Cache Creek
**
** Description: Contains the code for generating the man page dialog
** used in the helpview program.
**
** (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.
**
****************************************************************************
************************************<+>*************************************/
/* System Include Files */
#include <stdio.h>
#include <signal.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <Xm/Protocols.h>
#include <Xm/MwmUtil.h>
#include <Xm/Xm.h>
#include <Xm/XmP.h>
#include <Xm/TextF.h>
#include <Xm/Text.h>
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xm/SeparatoG.h>
#include <Xm/PushBG.h>
#include <Xm/DialogS.h>
#include <Dt/Help.h>
#include <Dt/HelpDialog.h>
#include <DtI/HelposI.h>
#include <DtI/HourGlassI.h>
/* Local Includes */
#include "Main.h"
#include "UtilI.h"
#include "ManPageI.h"
/******** Static Function Declarations ********/
static void ManTextUpdateCB(
Widget widget,
XtPointer client_data,
XtPointer call_data);
static void ManDisplayCB(
Widget widget,
XtPointer client_data,
XtPointer callback);
static void CatchClose(
Widget widget);
/****************************************************************************
* Function: CatchClose( Widget w);
*
* Parameters:
*
* Return Value: Void.
*
* Purpose: Catches the window manager close requests and assigns our
* CloseHelpCB to handel them.
*
***************************************************************************/
static void CatchClose (
Widget widget)
{
Atom wm_delete_window;
Arg args[2];
/* Grab the window mgr close */
wm_delete_window = XmInternAtom(XtDisplay(XtParent(widget)),
"WM_DELETE_WINDOW", FALSE);
XtSetArg(args[0], XmNdeleteResponse, XmDO_NOTHING);
/* Current Help Dialog Window */
XmAddWMProtocolCallback(XtParent(widget),wm_delete_window,
(XtCallbackProc)CloseAndExitCB, (XtPointer)widget);
XtSetValues(XtParent(widget), args, 1);
}
/****************************************************************************
* Function: static void PostManDialog();
*
* Parameters:
*
* Return Value: Void.
*
* Purpose: Creates and manages a simple prompt dialog that allows a
* user to type in and display any manpage on the system.
*
****************************************************************************/
void PostManDialog(
Widget parent,
int argc,
char **argv)
{
Widget separator;
Widget manLabel;
XmString labelStr;
Arg args[20];
int n;
char * title;
Pixel foreground;
Pixel background;
Colormap colormap;
Pixel selectColor;
Pixel topShadowColor;
Pixel bottomShadowColor;
Pixel foregroundColor;
/* Create the shell and form used for the dialog. */
title = XtNewString(((char *)_DTGETMESSAGE(7, 11, "Man Page")));
n = 0;
XtSetArg (args[n], XmNtitle, title); n++;
XtSetArg (args[n], XmNallowShellResize, False); n++;
manWidget = XmCreateDialogShell(parent, "manWidget", args, n);
XtFree(title);
/* Set the useAsyncGeo on the shell */
n = 0;
XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
XtSetValues (XtParent(manWidget), args, n);
n = 0;
XtSetArg (args[n], XmNmarginWidth, 1); n++;
XtSetArg (args[n], XmNmarginHeight, 1); n++;
XtSetArg (args[n], XmNshadowThickness, 1); n++;
XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
XtSetArg (args[n], XmNautoUnmanage, False); n++;
manForm = XmCreateForm (manWidget, "manForm", args, n);
/* Get the select color and margin widths and heights */
n = 0;
XtSetArg(args[n], XmNforeground, &foreground); ++n;
XtSetArg(args[n], XmNbackground, &background); ++n;
XtSetArg (args[n], XmNcolormap, &colormap); ++n;
XtGetValues(manForm, args, n);
XmGetColors (XtScreen (manForm), colormap, background,
&foregroundColor, &topShadowColor,
&bottomShadowColor, &selectColor);
labelStr = XmStringCreateLocalized((char *)_DTGETMESSAGE(7, 12,"Man Page:"));
n = 0;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
XtSetArg(args[n], XmNleftOffset,5); ++n;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
XtSetArg(args[n], XmNtopOffset, 15); ++n;
XtSetArg(args[n], XmNlabelType, XmSTRING); ++n;
XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n;
XtSetArg(args[n], XmNtraversalOn, False); ++n;
XtSetArg(args[n], XmNlabelString, labelStr); ++n;
manLabel = XmCreateLabelGadget(manForm, "manLabel", args, n);
XtManageChild (manLabel);
XmStringFree(labelStr);
n = 0;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
XtSetArg(args[n], XmNleftWidget, manLabel); ++n;
XtSetArg(args[n], XmNleftOffset, 5); ++n;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
XtSetArg(args[n], XmNtopOffset, 10); ++n;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
XtSetArg(args[n], XmNrightOffset, 5); ++n;
XtSetArg(args[n], XmNeditable, True); ++n;
XtSetArg(args[n], XmNeditMode, XmSINGLE_LINE_EDIT); ++n;
XtSetArg(args[n], XmNbackground, selectColor); ++n;
manText = XmCreateTextField(manForm, "man_text", args, n);
XtManageChild (manText);
XtAddCallback(manText, XmNvalueChangedCallback,
ManTextUpdateCB,(XtPointer) NULL);
/* Create a separator between the buttons */
n = 0;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg (args[n], XmNtopWidget,manLabel);n++;
XtSetArg (args[n], XmNtopOffset, 20); n++;
separator = XmCreateSeparatorGadget (manForm, "separator", args, n);
XtManageChild (separator);
/* Create the action buttons along the bottom */
labelStr = XmStringCreateLocalized ((char *)_DTGETMESSAGE(7, 13,
"Show Man Page"));
n = 0;
XtSetArg (args[n], XmNlabelString, labelStr); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 1); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 49); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg (args[n], XmNtopWidget, separator); n++;
XtSetArg (args[n], XmNtopOffset, 5); n++;
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNbottomOffset, 5); n++;
XtSetArg (args[n], XmNmarginHeight, 4); n++;
manBtn = XmCreatePushButtonGadget(manForm, "manBtn", args, n);
XtManageChild (manBtn);
XmStringFree(labelStr);
XtSetSensitive(manBtn, False);
XtAddCallback(manBtn, XmNactivateCallback, ManDisplayCB,
(XtPointer) manForm);
/* Build the Close button */
labelStr = XmStringCreateLocalized((char *)_DTGETMESSAGE(7, 16,"Exit"));
n = 0;
XtSetArg (args[n], XmNlabelString, labelStr); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNleftPosition, 51); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
XtSetArg (args[n], XmNrightPosition, 99); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg (args[n], XmNtopWidget, separator); n++;
XtSetArg (args[n], XmNtopOffset, 5); n++;
XtSetArg (args[n], XmNmarginHeight, 4); n++;
closeBtn = XmCreatePushButtonGadget (manForm, "closeBtn", args, n);
XtManageChild (closeBtn);
XtAddCallback(closeBtn, XmNactivateCallback, CloseAndExitCB,
(XtPointer) NULL);
XmStringFree (labelStr);
XtSetArg (args[0], XmNdefaultButton, closeBtn);
XtSetValues (manForm, args, 1);
/** force tabs to go to each widget and in right order **/
XtSetArg (args[0], XmNnavigationType, XmSTICKY_TAB_GROUP);
XtSetValues (manText,args,1);
XtSetValues (manBtn,args,1);
XtSetValues (closeBtn,args,1);
/** put focus on the text field **/
XtSetArg (args[0], XmNinitialFocus, manText);
XtSetValues (manForm,args,1);
/* Adjust the decorations for the dialog shell of the dialog */
n = 0;
XtSetArg(args[n], XmNmwmFunctions,
MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE |
MWM_FUNC_CLOSE); n++;
XtSetArg (args[n], XmNmwmDecorations,
MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MENU |
MWM_DECOR_MINIMIZE | MWM_DECOR_MAXIMIZE); n++;
XtSetValues (manWidget, args, n);
XtManageChild(manForm);
/* Add the CatchClose here so we catch the window manager close requests */
CatchClose(manForm);
/* Set the wm_command property on the help dialog window */
if (argc != 0)
XSetCommand(XtDisplay(manWidget), XtWindow(manWidget), argv, argc);
}
/**************************************************************************
* Function: ManTextUpdateCB
*
* ManText is called when the string in the man text Widget changes. We
* activate or deactivate the display man page PushButton.
*
* Called by:
**************************************************************************/
static void ManTextUpdateCB(
Widget widget,
XtPointer client_data,
XtPointer call_data )
{
char *textString;
Arg args[2];
/* Get the text string to check its length, then set the search buttons' */
/* sensitivity appropriately. */
textString = XmTextFieldGetString(widget);
if (strlen(textString) == 0)
{
XtSetSensitive(manBtn, False);
XtSetArg (args[0], XmNdefaultButton, closeBtn);
XtSetValues (manForm, args, 1);
}
else
{
XtSetSensitive(manBtn, True);
XtSetArg (args[0], XmNdefaultButton, manBtn);
XtSetValues (manForm, args, 1);
}
XtFree(textString);
} /* End ManTextCB */
/*******************************************************************
* Function: ManDisplayCB
*
* ManDisplayCB is called when the user hits Return in the man text
* Widget or clicks the display man PushButton.
*******************************************************************/
static void ManDisplayCB(
Widget widget,
XtPointer client_data,
XtPointer call_data )
{
char *manPageStr;
_DtHelpTurnOnHourGlass((Widget) client_data);
manPageStr = XmTextFieldGetString(manText);
DisplayMan(topLevel, manPageStr, NO_EXIT_ON_CLOSE);
_DtHelpTurnOffHourGlass((Widget) client_data);
XtFree(manPageStr);
} /* End ManDisplayCB */