1321 lines
43 KiB
C
1321 lines
43 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
|
||
*/
|
||
/* $TOG: Print.c /main/10 1999/02/09 19:45:00 mgreess $ */
|
||
/************************************<+>*************************************
|
||
****************************************************************************
|
||
**
|
||
** File: Print.c
|
||
**
|
||
** Project: Cache Creek (Rivers) Project
|
||
**
|
||
** Description: Builds and displays an instance of a Cache Creek Print
|
||
** Dialog.
|
||
**
|
||
** (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 <sys/param.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h> /* for getenv() */
|
||
#include <string.h>
|
||
#include <unistd.h>
|
||
|
||
|
||
#include <Xm/Xm.h>
|
||
#include <Xm/XmP.h>
|
||
#include <Xm/Form.h>
|
||
#include <Xm/Frame.h>
|
||
#include <Xm/Label.h>
|
||
#include <Xm/LabelG.h>
|
||
#include <Xm/TextF.h>
|
||
#include <Xm/SeparatoG.h>
|
||
#include <Xm/PushBG.h>
|
||
#include <Xm/DialogS.h>
|
||
#include <Xm/ToggleBG.h>
|
||
#include <Xm/RowColumn.h>
|
||
#include <Xm/MwmUtil.h>
|
||
#include <Xm/Protocols.h>
|
||
#include <Xm/ToggleB.h>
|
||
|
||
#include <X11/Intrinsic.h>
|
||
#include <X11/Shell.h>
|
||
#include <X11/ShellP.h>
|
||
#include <X11/Xutil.h>
|
||
#include <X11/keysymdef.h>
|
||
|
||
/*
|
||
* private includes
|
||
*/
|
||
#include "DisplayAreaI.h"
|
||
|
||
#include "bufioI.h"
|
||
#include "Access.h"
|
||
#include "AccessI.h"
|
||
#include "MessagesP.h"
|
||
#include "FormatI.h"
|
||
#include "HelpI.h"
|
||
#include "HelposI.h"
|
||
#include "HelpUtilI.h"
|
||
#include "HelpAccessI.h"
|
||
#include "HelpDialogI.h"
|
||
#include "HelpDialogP.h"
|
||
#include "PrintI.h"
|
||
|
||
|
||
/***** helper structures ****/
|
||
typedef struct _DtHelpPrintCBRec {
|
||
Widget widget;
|
||
_DtHelpDisplayWidgetStuff * display;
|
||
_DtHelpCommonHelpStuff * help;
|
||
_DtHelpPrintStuff * print;
|
||
} _DtHelpPrintCBRec;
|
||
|
||
/***** Global Variables ****/
|
||
char _DtHelpDefaultHelpPrint[] = "/usr/dt/bin/dthelpprint";
|
||
|
||
/* The order of these names must match the constants DtHELP_PAPERSIZE_xxx */
|
||
char *_DtHelpPaperSizeNames[] =
|
||
{ "help_papersize_letter",
|
||
"help_papersize_legal",
|
||
"help_papersize_executive",
|
||
"help_papersize_a4",
|
||
"help_papersize_b5",
|
||
};
|
||
int _DtHelpPaperSizeNamesCnt = (sizeof(_DtHelpPaperSizeNames) / sizeof(char *));
|
||
|
||
/***** Constants ******/
|
||
#define EOS '\0' /* end of string */
|
||
#define EMPTYSTR s_EmptyStr
|
||
|
||
#define PRSET 4 /* msg catalog set for print dialog */
|
||
|
||
#define PrintMessage001 _DtHelpMsg_0004
|
||
|
||
/***** Static Variables ******/
|
||
static char s_EmptyStr[] = "";
|
||
|
||
/****** Protos ******/
|
||
static void ClosePrintCB (
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData);
|
||
static void StartPrintingCB (
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData);
|
||
static void CreatePrintDialog(
|
||
Widget widget,
|
||
_DtHelpPrintStuff * print,
|
||
_DtHelpDisplayWidgetStuff * display,
|
||
_DtHelpCommonHelpStuff * help);
|
||
|
||
/************************************************************************
|
||
* Function: CreatePrintCBRec()
|
||
*
|
||
* Create the data required by a print callback
|
||
*
|
||
* This routine allocates memory for the callback record using XtCalloc().
|
||
* When the record is no longer needed, free it with XtFree().
|
||
************************************************************************/
|
||
static
|
||
_DtHelpPrintCBRec * CreatePrintCBRec(
|
||
Widget widget,
|
||
_DtHelpDisplayWidgetStuff * display,
|
||
_DtHelpCommonHelpStuff * help,
|
||
_DtHelpPrintStuff * print)
|
||
{
|
||
_DtHelpPrintCBRec * rec = NULL;
|
||
|
||
rec = (_DtHelpPrintCBRec *) XtCalloc(1,sizeof(_DtHelpPrintCBRec));
|
||
if (NULL == rec) return NULL;
|
||
rec->widget = widget;
|
||
rec->display = display;
|
||
rec->help = help;
|
||
rec->print = print;
|
||
return rec;
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: _DtHelpInitPrintStuff()
|
||
*
|
||
* Init print-related data
|
||
*
|
||
************************************************************************/
|
||
void _DtHelpInitPrintStuff (
|
||
_DtHelpPrintStuff * print)
|
||
{
|
||
/* Set our print display stuff to initial values */
|
||
if (print->printer != NULL)
|
||
print->printer = XtNewString(print->printer);
|
||
|
||
if (print->helpPrint != _DtHelpDefaultHelpPrint)
|
||
print->helpPrint = XtNewString(print->helpPrint);
|
||
|
||
print->paperSize = DtHELP_PAPERSIZE_LETTER;
|
||
print->printVolume = NULL;
|
||
|
||
/* print dialog widgets */
|
||
print->printForm = NULL;
|
||
print->subject = NULL;
|
||
print->printerField = NULL;
|
||
print->copiesField = NULL;
|
||
print->letterBtn = NULL;
|
||
print->legalBtn = NULL;
|
||
print->execBtn = NULL;
|
||
print->b5Btn = NULL;
|
||
print->a4Btn = NULL;
|
||
print->topicsFrame = NULL;
|
||
print->curTopicBtn = NULL;
|
||
print->subTopicsBtn = NULL;
|
||
print->tocBtn = NULL;
|
||
print->allTopicsBtn = NULL;
|
||
print->paperTopicsSeparator = NULL;
|
||
print->topicsBtnsSeparator = NULL;
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: _DtHelpFreePrintStuff()
|
||
*
|
||
* Init print-related data
|
||
*
|
||
************************************************************************/
|
||
void _DtHelpFreePrintStuff (
|
||
_DtHelpPrintStuff * print,
|
||
int cleanUpKind)
|
||
{
|
||
XtFree(print->printVolume);
|
||
print->printVolume = NULL;
|
||
|
||
if (print->printForm != NULL)
|
||
{
|
||
XtUnmanageChild(print->printForm);
|
||
}
|
||
|
||
if (cleanUpKind == DtCLEAN_FOR_DESTROY)
|
||
{
|
||
if (print->helpPrint != _DtHelpDefaultHelpPrint)
|
||
XtFree(print->helpPrint);
|
||
print->helpPrint = NULL;
|
||
|
||
XtFree(print->printer);
|
||
print->printer = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: _DtHelpPrintSetValues()
|
||
*
|
||
* set print-related data
|
||
*
|
||
************************************************************************/
|
||
void _DtHelpPrintSetValues (
|
||
_DtHelpPrintStuff * currentPrint,
|
||
_DtHelpPrintStuff * newPrint,
|
||
_DtHelpDisplayWidgetStuff * newDisplay,
|
||
_DtHelpCommonHelpStuff * newCommonHelp)
|
||
{
|
||
/* Check DtNhelpPrint resource for change */
|
||
if (currentPrint->helpPrint != newPrint->helpPrint)
|
||
{
|
||
newPrint->helpPrint = XtNewString(newPrint->helpPrint);
|
||
|
||
if (currentPrint->helpPrint != _DtHelpDefaultHelpPrint)
|
||
XtFree(currentPrint->helpPrint);
|
||
}
|
||
|
||
/* Check DtNprinter resource for change */
|
||
if (currentPrint->printer != newPrint->printer)
|
||
{
|
||
newPrint->printer = XtNewString(newPrint->printer);
|
||
XtFree(currentPrint->printer);
|
||
}
|
||
|
||
|
||
/* Do NOT check DtNpaperSize resource for change */
|
||
/* It is a C-only resource */
|
||
}
|
||
|
||
|
||
|
||
/************************************************************************
|
||
* Function: ClosePrintCB()
|
||
*
|
||
* Close the Print dialog.
|
||
*
|
||
************************************************************************/
|
||
static void ClosePrintCB (
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData)
|
||
{
|
||
_DtHelpPrintCBRec * printrec = (_DtHelpPrintCBRec *) clientData;
|
||
|
||
/* We unmap the print dialog */
|
||
XtUnmanageChild(printrec->print->printForm);
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: DestroyDialogCB()
|
||
*
|
||
* Free allocated memory
|
||
*
|
||
************************************************************************/
|
||
static void DestroyDialogCB(
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData)
|
||
{
|
||
_DtHelpPrintCBRec * printrec = (_DtHelpPrintCBRec *) clientData;
|
||
XtFree((char *)printrec);
|
||
}
|
||
|
||
/************************************************************************
|
||
* Function: CheckCopiesCB()
|
||
*
|
||
* Check whether the copies in the copies field is valid
|
||
*
|
||
************************************************************************/
|
||
static void CheckCopiesCB(
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData)
|
||
{
|
||
/* _DtHelpPrintCBRec * printrec = (_DtHelpPrintCBRec *) clientData; */
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: CheckPrinterCB()
|
||
*
|
||
* Check whether the printer in the printer field is valid
|
||
* and store a valid printer string in printPrinter.
|
||
*
|
||
************************************************************************/
|
||
static void CheckPrinterCB(
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData)
|
||
{
|
||
/* _DtHelpPrintCBRec * printrec = (_DtHelpPrintCBRec *) clientData; */
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: StartPrintingCB()
|
||
*
|
||
* Start printing and close the PRINT Dialog
|
||
*
|
||
************************************************************************/
|
||
static void StartPrintingCB(
|
||
Widget w,
|
||
XtPointer clientData,
|
||
XtPointer callData)
|
||
{
|
||
_DtHelpPrintCBRec * printrec = (_DtHelpPrintCBRec *) clientData;
|
||
int printType=0;
|
||
char *printTopic=NULL;
|
||
char *topicTitle=NULL;
|
||
Boolean printAll=False;
|
||
Boolean printSub=False;
|
||
Boolean printTocIndex=False;
|
||
char * printer;
|
||
XmString titleLbl = NULL;
|
||
int paperSize;
|
||
int copyCnt;
|
||
char * copies;
|
||
Widget dfltSize = NULL;
|
||
Arg args[5];
|
||
|
||
/* Determine the current selected print type */
|
||
|
||
if (XmToggleButtonGetState(printrec->print->allTopicsBtn))
|
||
{
|
||
printType = _DtPRINT_ALL;
|
||
printTopic = printrec->help->topLevelId;
|
||
printAll = True;
|
||
}
|
||
else
|
||
if (XmToggleButtonGetState(printrec->print->tocBtn))
|
||
{
|
||
printType = _DtPRINT_TOC;
|
||
printTopic = NULL;
|
||
printTocIndex = True;
|
||
}
|
||
else
|
||
if (XmToggleButtonGetState(printrec->print->subTopicsBtn))
|
||
{
|
||
printType = _DtPRINT_SUB;
|
||
printTopic = printrec->display->locationId;
|
||
printSub = True;
|
||
}
|
||
else
|
||
if (XmToggleButtonGetState(printrec->print->curTopicBtn))
|
||
{
|
||
printType = _DtPRINT_CURRENT;
|
||
switch (printrec->display->helpType)
|
||
{
|
||
case DtHELP_TYPE_TOPIC:
|
||
printTopic = printrec->display->locationId;
|
||
break;
|
||
|
||
case DtHELP_TYPE_MAN_PAGE:
|
||
printTopic = printrec->display->manPage;
|
||
break;
|
||
|
||
case DtHELP_TYPE_FILE:
|
||
printTopic = printrec->display->helpFile;
|
||
titleLbl = printrec->display->topicTitleLbl;
|
||
break;
|
||
|
||
case DtHELP_TYPE_STRING:
|
||
case DtHELP_TYPE_DYNAMIC_STRING:
|
||
/* ??? Full support for dynamic string types */
|
||
printTopic = printrec->display->stringData;
|
||
titleLbl = printrec->display->topicTitleLbl;
|
||
break;
|
||
|
||
} /* End Switch Statement */
|
||
}
|
||
|
||
/*
|
||
* change the XmString into a char *.
|
||
*/
|
||
if (titleLbl != NULL)
|
||
{
|
||
int len;
|
||
int newLen = 0;
|
||
XmStringContext theContext;
|
||
XmStringCharSet theSet;
|
||
XmStringDirection theDir;
|
||
char *newTxt;
|
||
Boolean theSep;
|
||
|
||
if (XmStringInitContext(&theContext, titleLbl) == True)
|
||
{
|
||
while (XmStringGetNextSegment(theContext,
|
||
&newTxt,
|
||
&theSet,
|
||
&theDir,
|
||
&theSep) == True)
|
||
{
|
||
len = strlen(newTxt);
|
||
if (len > 0)
|
||
{
|
||
topicTitle = XtRealloc(topicTitle, len + 1);
|
||
if (topicTitle != NULL)
|
||
{
|
||
strcpy(&topicTitle[newLen], newTxt);
|
||
newLen += len;
|
||
}
|
||
}
|
||
}
|
||
XmStringFreeContext(theContext);
|
||
}
|
||
}
|
||
|
||
/* get printer */
|
||
printer = XmTextFieldGetString(printrec->print->printerField);
|
||
if (printer && printer[0] == EOS)
|
||
{ XtFree(printer); printer = NULL; }
|
||
|
||
/* get copies */
|
||
copies = XmTextFieldGetString(printrec->print->copiesField);
|
||
copyCnt = 1;
|
||
if ( NULL == copies
|
||
|| (copies && copies[0] == EOS)
|
||
|| (copies && sscanf(copies,"%d",©Cnt) != 1 )
|
||
|| (copyCnt < 0 || copyCnt > 500) )
|
||
{ XtFree(copies); copies = XtNewString("1"); }
|
||
|
||
/* get paper size */
|
||
/* Get the chosen size */
|
||
XtSetArg (args[0], XmNmenuHistory, &dfltSize);
|
||
XtGetValues (printrec->print->paperSizeOptMenu, args, 1);
|
||
if (dfltSize == printrec->print->legalBtn)
|
||
paperSize = DtHELP_PAPERSIZE_LEGAL;
|
||
else if (dfltSize == printrec->print->execBtn)
|
||
paperSize = DtHELP_PAPERSIZE_EXECUTIVE;
|
||
else if (dfltSize == printrec->print->a4Btn)
|
||
paperSize = DtHELP_PAPERSIZE_A4;
|
||
else if (dfltSize == printrec->print->b5Btn)
|
||
paperSize = DtHELP_PAPERSIZE_B5;
|
||
else
|
||
paperSize = DtHELP_PAPERSIZE_LETTER;
|
||
|
||
if (printType != 0)
|
||
{
|
||
/* Call the print setup routine to start the print job */
|
||
_DtHelpPrintJob(
|
||
printrec->widget,
|
||
printrec->print->helpPrint,
|
||
printer,
|
||
paperSize,
|
||
copies,
|
||
printrec->print->printVolume,
|
||
printrec->display->helpType,
|
||
printTopic,
|
||
printAll,
|
||
printSub,
|
||
printTocIndex,
|
||
topicTitle);
|
||
}
|
||
|
||
XtFree(printer);
|
||
XtFree(copies);
|
||
XtFree(topicTitle);
|
||
|
||
/* We unmap the print dialog */
|
||
XtUnmanageChild(printrec->print->printForm);
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
* Function: void _DtHelpUpdatePrintDialog();
|
||
*
|
||
*
|
||
* Parameters: new Specifies the help widget.
|
||
*
|
||
* Return Value:
|
||
*
|
||
* Purpose: Updates the print dialog to reflect current topic
|
||
*
|
||
*****************************************************************************/
|
||
void _DtHelpUpdatePrintDialog(
|
||
_DtHelpPrintStuff * print,
|
||
_DtHelpDisplayWidgetStuff * display,
|
||
_DtHelpCommonHelpStuff * help,
|
||
Boolean setDefaults)
|
||
{
|
||
int n;
|
||
Arg args[5];
|
||
char * titleStr;
|
||
XmString labelString=NULL;
|
||
XmString volumeString=NULL;
|
||
XmFontList fontList = NULL;
|
||
Boolean mod = False;
|
||
char buf[400];
|
||
|
||
/* only work on print dialog if we need to */
|
||
if (print->printForm == NULL) return;
|
||
|
||
/* Set the proper default toggle button value */
|
||
if ( setDefaults )
|
||
{
|
||
if(print->curTopicBtn)
|
||
XmToggleButtonSetState(print->curTopicBtn, True, False);
|
||
if(print->subTopicsBtn)
|
||
XmToggleButtonSetState(print->subTopicsBtn,False,False);
|
||
if(print->tocBtn)
|
||
XmToggleButtonSetState(print->tocBtn,False,False);
|
||
if(print->allTopicsBtn)
|
||
XmToggleButtonSetState(print->allTopicsBtn,False,False);
|
||
}
|
||
|
||
/* adj where the TopicsBtn separator is attached */
|
||
/* if attached to the PaperTopics separator, the topics are hidden */
|
||
n = 0;
|
||
if ( display->helpType == DtHELP_TYPE_TOPIC )
|
||
{
|
||
#if 1
|
||
XtSetSensitive(print->topicsFrame,True);
|
||
#else
|
||
XtManageChild(print->topicsFrame);
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, print->topicsFrame); n++;
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
#if 1
|
||
XtSetSensitive(print->topicsFrame,False);
|
||
#else
|
||
XtUnmanageChild(print->topicsFrame);
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, print->paperTopicsSeparator); n++;
|
||
#endif
|
||
}
|
||
XtSetValues (print->topicsBtnsSeparator, args, n);
|
||
|
||
/* update the dialog's print subject label string */
|
||
switch ( display->helpType )
|
||
{
|
||
/* coming out of the case, volumeString & titleStr should be set */
|
||
case DtHELP_TYPE_TOPIC:
|
||
titleStr = _DTGETMESSAGE(PRSET, 50,"Help Volume: ");
|
||
|
||
/* get volume title and allow for localized fonts */
|
||
|
||
/* get the font list of the label */
|
||
XtSetArg (args[0], XmNfontList, &fontList);
|
||
XtGetValues (print->subject, args, 1);
|
||
|
||
#if defined(DONT_USE_CDExc22774)
|
||
/* Don't need to copy, _DtHelpFormatVolumeTitle copies
|
||
* before modifying.
|
||
*/
|
||
|
||
/* copy the list before passing it in for modification */
|
||
/* we must free this now */
|
||
fontList = XmFontListCopy (fontList);
|
||
#endif
|
||
|
||
/* get formated volume title; volumeString is owned by caller */
|
||
_DtHelpFormatVolumeTitle(help->pDisplayArea,display->volumeHandle,
|
||
&volumeString,&fontList,&mod);
|
||
|
||
/* if volumeString caused a font list change, add it back */
|
||
if (mod)
|
||
{ /* Add the title's font to the label */
|
||
XtSetArg (args[0], XmNfontList, fontList);
|
||
XtSetValues (print->subject, args, 1);
|
||
if (fontList) XmFontListFree(fontList);
|
||
}
|
||
|
||
break;
|
||
case DtHELP_TYPE_STRING:
|
||
case DtHELP_TYPE_DYNAMIC_STRING:
|
||
titleStr = _DTGETMESSAGE(PRSET, 51,"Help Message");
|
||
break;
|
||
case DtHELP_TYPE_FILE:
|
||
titleStr = _DTGETMESSAGE(PRSET, 52,"Help File");
|
||
break;
|
||
case DtHELP_TYPE_MAN_PAGE:
|
||
/* assumption: buf won't overflow */
|
||
sprintf(buf,"%s%s", _DTGETMESSAGE(PRSET, 53,"Manual Page: "),
|
||
display->manPage);
|
||
titleStr = buf;
|
||
break;
|
||
default:
|
||
titleStr = _DTGETMESSAGE(PRSET, 54,"Error message");
|
||
break;
|
||
}
|
||
|
||
/* at this point, titleStr and volumeString are set */
|
||
|
||
/* set the dialog label strings only if needed */
|
||
labelString = XmStringCreateLocalized(titleStr);
|
||
|
||
/* if there is a valid volumeString, concatenate it */
|
||
if (volumeString)
|
||
{
|
||
XmString fullTitle;
|
||
fullTitle = XmStringConcat(labelString,volumeString);
|
||
XmStringFree(labelString);
|
||
XmStringFree(volumeString);
|
||
labelString = fullTitle;
|
||
}
|
||
|
||
/* set the dialog label string */
|
||
XtSetArg (args[0], XmNlabelString, labelString);
|
||
XtSetValues (print->subject, args, 1);
|
||
XmStringFree (labelString);
|
||
|
||
XmUpdateDisplay(print->printForm);
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
* Function: void _DtHelpDisplayPrintDialog();
|
||
*
|
||
*
|
||
* Parameters:
|
||
* new Specifies the help widget.
|
||
* print print stuff
|
||
* display display widget stuff
|
||
* help common help stuff
|
||
*
|
||
* Return Value:
|
||
*
|
||
* Purpose: Creates and displays an instance of the print dialog.
|
||
*
|
||
*****************************************************************************/
|
||
void _DtHelpDisplayPrintDialog(
|
||
Widget widget,
|
||
_DtHelpPrintStuff * print,
|
||
_DtHelpDisplayWidgetStuff * display,
|
||
_DtHelpCommonHelpStuff * help)
|
||
{
|
||
Arg args[5];
|
||
Widget dfltSize = NULL;
|
||
|
||
/* Build a print dialog if we need to */
|
||
if (print->printForm == NULL)
|
||
{
|
||
CreatePrintDialog(widget,print,display,help);
|
||
|
||
/*** Only init the values if creating dialog for first time ***/
|
||
|
||
switch(print->paperSize)
|
||
{
|
||
case DtHELP_PAPERSIZE_LEGAL:
|
||
dfltSize = print->legalBtn;
|
||
break;
|
||
case DtHELP_PAPERSIZE_EXECUTIVE:
|
||
dfltSize = print->execBtn;
|
||
break;
|
||
case DtHELP_PAPERSIZE_A4:
|
||
dfltSize = print->a4Btn;
|
||
break;
|
||
case DtHELP_PAPERSIZE_B5:
|
||
dfltSize = print->b5Btn;
|
||
break;
|
||
case DtHELP_PAPERSIZE_LETTER:
|
||
default:
|
||
dfltSize = print->letterBtn;
|
||
break;
|
||
}
|
||
/* Set the default size */
|
||
XtSetArg (args[0], XmNmenuHistory, dfltSize);
|
||
XtSetValues (print->paperSizeOptMenu, args, 1);
|
||
|
||
/* update the variable contents of the dialog; do set defaults */
|
||
_DtHelpUpdatePrintDialog(print,display,help,True);
|
||
}
|
||
else
|
||
{
|
||
/* update the variable contents of the dialog; dont set defaults */
|
||
_DtHelpUpdatePrintDialog(print,display,help,False);
|
||
}
|
||
|
||
|
||
if ( XtIsManaged(print->printForm) == False )
|
||
{
|
||
/* Make sure the Print Dialog is managed */
|
||
/* recall that the printForm is the form inside the dlg shell */
|
||
XtManageChild(print->printForm);
|
||
XtMapWidget(XtParent((Widget)print->printForm));
|
||
}
|
||
else
|
||
{
|
||
/* raise the window to top of the stack */
|
||
Widget parent = XtParent(print->printForm);
|
||
XRaiseWindow ( XtDisplay(parent), XtWindow(parent) );
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
* Function: Widget CreatePrintDialog(Widget nw);
|
||
*
|
||
*
|
||
* Parameters:
|
||
*
|
||
* Return Value:
|
||
*
|
||
* Purpose: Creates an instance of the print dialog.
|
||
*
|
||
*****************************************************************************/
|
||
static void CreatePrintDialog(
|
||
Widget widget,
|
||
_DtHelpPrintStuff * print,
|
||
_DtHelpDisplayWidgetStuff * display,
|
||
_DtHelpCommonHelpStuff * help)
|
||
{
|
||
Widget printShell;
|
||
Widget printForm;
|
||
Widget topicsForm;
|
||
Widget menupane;
|
||
Widget frameTitle;
|
||
Widget printerLabel;
|
||
Widget copiesLabel;
|
||
Widget radioBox;
|
||
Widget separator;
|
||
Widget okBtn, cancelBtn, helpBtn;
|
||
XmString labelString;
|
||
char * chrStr;
|
||
DtHelpListStruct *pHelpInfo;
|
||
_DtHelpPrintCBRec * printCBRec = NULL;
|
||
int n;
|
||
Arg args[20];
|
||
|
||
/* Create the shell and form used for the dialog. */
|
||
chrStr = XtNewString(((char *)_DTGETMESSAGE(PRSET, 1, "Help - Print")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtitle, chrStr); n++;
|
||
printShell = XmCreateDialogShell(widget, "printShell", args, n);
|
||
XtFree(chrStr);
|
||
|
||
/* Set the useAsyncGeo on the shell */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
|
||
/* XtSetValues (XtParent(printShell), args, n);*/
|
||
XtSetValues (printShell, args, n);
|
||
|
||
/* Allocate the printRec and arrange to free it when dialog destroyed */
|
||
printCBRec = CreatePrintCBRec(widget,display,help,print);
|
||
XtAddCallback (printShell, XmNdestroyCallback,
|
||
DestroyDialogCB, (XtPointer) printCBRec);
|
||
|
||
/* create the form in the dialog to hold the contents */
|
||
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++;
|
||
printForm = XmCreateForm (printShell, "printForm", args, n);
|
||
|
||
/**** create the printing-related widgets ****/
|
||
|
||
/* create print subject label */
|
||
labelString = XmStringCreateLocalized(EMPTYSTR);
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 10); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 15); n++;
|
||
#if 0
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightOffset, 10); n++;
|
||
#endif
|
||
XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
|
||
print->subject =
|
||
XmCreateLabelGadget (printForm, "printSubject", args, n);
|
||
XtManageChild (print->subject);
|
||
XmStringFree (labelString);
|
||
|
||
/* create printer label */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 10,"Printer:")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, print->subject); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 15); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 15); n++;
|
||
XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
|
||
printerLabel = XmCreateLabelGadget (printForm, "printerLabel", args, n);
|
||
XtManageChild (printerLabel);
|
||
XmStringFree (labelString);
|
||
|
||
/* create the printer name text field */
|
||
n = 0;
|
||
/* get the printer value from printer resource, LPDEST, or leave blank */
|
||
if ( print->printer != NULL && print->printer[0] != EOS )
|
||
chrStr = print->printer;
|
||
else if ( (chrStr = getenv("LPDEST")) == NULL || chrStr[0] == EOS)
|
||
chrStr = (char *)_DTGETMESSAGE(PRSET, 60,""); /* dflt printer value */
|
||
XtSetArg (args[n], XmNvalue, chrStr ); n++;
|
||
XtSetArg (args[n], XmNcursorPosition, strlen(chrStr) ); n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, print->subject); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 10); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftWidget, printerLabel); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 60); n++;
|
||
XtSetArg(args[n], XmNhighlightOnEnter, True); n++;
|
||
print->printerField =
|
||
XmCreateTextField (printForm,"printerField",args, n);
|
||
XtManageChild (print->printerField);
|
||
XtAddCallback (print->printerField, XmNactivateCallback,
|
||
CheckPrinterCB, (XtPointer) printCBRec);
|
||
XtAddCallback (print->printerField, XmNvalueChangedCallback,
|
||
CheckPrinterCB, (XtPointer) printCBRec);
|
||
|
||
/* create copies label */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 11,"Copies:")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget,print->subject); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 15); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 10); n++;
|
||
XtSetArg (args[n], XmNleftWidget, print->printerField); n++;
|
||
XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
|
||
copiesLabel = XmCreateLabelGadget (printForm, "copiesLabel", args, n);
|
||
XtManageChild (copiesLabel);
|
||
XmStringFree (labelString);
|
||
|
||
/* create the copies text field */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNvalue,(char *)_DTGETMESSAGE(PRSET, 61,"1")); n++;/*dflt copy cnt*/
|
||
XtSetArg (args[n], XmNcursorPosition, 1 ); /* 1=strlen("1") */ n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget,print->subject); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 10); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftWidget, copiesLabel); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightOffset, 10); n++;
|
||
XtSetArg(args[n], XmNhighlightOnEnter, True); n++;
|
||
print->copiesField =
|
||
XmCreateTextField (printForm,"copiesField",args, n);
|
||
XtManageChild (print->copiesField);
|
||
XtAddCallback (print->copiesField, XmNactivateCallback,
|
||
CheckCopiesCB, (XtPointer) printCBRec);
|
||
XtAddCallback (print->copiesField, XmNvalueChangedCallback,
|
||
CheckCopiesCB, (XtPointer) printCBRec);
|
||
|
||
/* papersize option menu */
|
||
/*******************************************************
|
||
* Menupane: Papersize buttons
|
||
* No callback on each button is needed because we compare widget ptrs
|
||
*******************************************************/
|
||
|
||
n = 0;
|
||
XtSetArg(args[n], XmNmarginWidth, 0); ++n;
|
||
XtSetArg(args[n], XmNmarginHeight, 0); ++n;
|
||
menupane = XmCreatePulldownMenu(printForm, "paperSizeMenu", args, n);
|
||
|
||
/* Letter button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE(PRSET, 21,"Letter 8.5 x 11 in")));
|
||
n = 0;
|
||
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
||
print->letterBtn = XmCreatePushButtonGadget(menupane, "letter", args, n);
|
||
XtManageChild(print->letterBtn);
|
||
XmStringFree(labelString);
|
||
|
||
/* Legal button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE(PRSET, 22,"Legal 8.5 x 14 in")));
|
||
n = 0;
|
||
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
||
print->legalBtn = XmCreatePushButtonGadget(menupane, "legal", args, n);
|
||
XtManageChild(print->legalBtn);
|
||
XmStringFree(labelString);
|
||
|
||
/* Executive button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE(PRSET, 23,"Executive 7.25 x 10.5 in")));
|
||
n = 0;
|
||
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
||
print->execBtn = XmCreatePushButtonGadget(menupane, "executive", args, n);
|
||
XtManageChild(print->execBtn);
|
||
XmStringFree(labelString);
|
||
|
||
/* A4 button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE(PRSET, 24,"A4 210 x 297 mm")));
|
||
n = 0;
|
||
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
||
print->a4Btn = XmCreatePushButtonGadget(menupane, "A4", args, n);
|
||
XtManageChild(print->a4Btn);
|
||
XmStringFree(labelString);
|
||
|
||
/* B5 button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE(PRSET, 25,"B5 182 x 257 mm")));
|
||
n = 0;
|
||
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
||
print->b5Btn = XmCreatePushButtonGadget(menupane, "B5", args, n);
|
||
XtManageChild(print->b5Btn);
|
||
XmStringFree(labelString);
|
||
|
||
/* Option Menu */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE(PRSET, 20,"Paper Size:")));
|
||
n = 0;
|
||
XtSetArg(args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg(args[n], XmNsubMenuId, menupane); n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget,printerLabel); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 15); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightOffset, 5); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 10); n++;
|
||
XtSetArg (args[n], XmNmarginWidth, 5); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 2); n++;
|
||
print->paperSizeOptMenu = XmCreateOptionMenu(printForm,
|
||
"paperSizeOptionMenu", args, n);
|
||
XtManageChild(print->paperSizeOptMenu);
|
||
XmStringFree(labelString);
|
||
|
||
/* the DtNpaperSize resource is used to set the default item
|
||
in _DtHelpDisplayPrintDialog() */
|
||
|
||
/* Create a separator between the paper size and topic range selection/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, print->paperSizeOptMenu); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 0); n++;
|
||
XtSetArg (args[n], XmNseparatorType, XmNO_LINE); n++;
|
||
print->paperTopicsSeparator =
|
||
XmCreateSeparatorGadget (printForm, "separator", args, n);
|
||
XtManageChild (print->paperTopicsSeparator);
|
||
|
||
/* if currently showing a topic, display the topic selection box */
|
||
/****** Create the topics selection frame ******/
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, print->paperTopicsSeparator); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 5); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightOffset, 5); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 5); n++;
|
||
XtSetArg (args[n], XmNmarginWidth, 5); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 2); n++;
|
||
XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;/*EXP*/
|
||
print->topicsFrame =
|
||
XmCreateFrame(printForm, "topicsFrame", args, n);
|
||
XtManageChild (print->topicsFrame);
|
||
|
||
/* FIX: consider eliminating the form and just putting the RowColumn
|
||
RadioBox inside the frame */
|
||
|
||
/* unused message catalog entries: 8: Executive, 9: Legal */
|
||
|
||
/* put form inside frame */
|
||
topicsForm = XmCreateForm (
|
||
print->topicsFrame,"topicsForm", NULL, 0);
|
||
XtManageChild (topicsForm);
|
||
|
||
/* create the frame title */
|
||
labelString = XmStringCreateLocalized ((_DTGETMESSAGE(
|
||
PRSET,30,"Topics To Print")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNchildType, XmFRAME_TITLE_CHILD); n++;
|
||
XtSetArg (args[n], XmNtraversalOn, False); n++;
|
||
frameTitle = XmCreateLabelGadget(
|
||
print->topicsFrame,"topicsFrameTitle",args,n);
|
||
XtManageChild (frameTitle);
|
||
XmStringFree (labelString);
|
||
|
||
/* Create the Radio Box widget to hold the toggle buttons */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
radioBox = XmCreateRadioBox(topicsForm, "radioBox", args, n);
|
||
XtManageChild (radioBox);
|
||
|
||
/* Create the print current topic button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 31,"Current Topic")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
print->curTopicBtn =
|
||
XmCreateToggleButtonGadget(radioBox,"printCurTopicBtn",args,n);
|
||
XtManageChild (print->curTopicBtn);
|
||
XmStringFree (labelString);
|
||
|
||
/* Create the print current chapter button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 32,"Current and Subtopics")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
print->subTopicsBtn =
|
||
XmCreateToggleButtonGadget(radioBox,"print.subTopicsBtn",args,n);
|
||
XtManageChild (print->subTopicsBtn);
|
||
XmStringFree (labelString);
|
||
|
||
/* Create the print TOC buttion */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 33,"Table of Contents and Index")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
print->tocBtn = XmCreateToggleButtonGadget
|
||
(radioBox, "printTocBtn", args, n);
|
||
XtManageChild (print->tocBtn);
|
||
XmStringFree (labelString);
|
||
|
||
/* Create the print all topics buttion */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 34,"Entire Volume")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
print->allTopicsBtn = XmCreateToggleButtonGadget
|
||
(radioBox, "printAllTopicsBtn", args, n);
|
||
XtManageChild (print->allTopicsBtn);
|
||
XmStringFree (labelString);
|
||
|
||
/* create a separator */
|
||
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, print->topicsFrame); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 10); n++;
|
||
print->topicsBtnsSeparator =
|
||
XmCreateSeparatorGadget (printForm, "separator", args, n);
|
||
XtManageChild (print->topicsBtnsSeparator);
|
||
|
||
/* for easy ref */
|
||
separator = print->topicsBtnsSeparator;
|
||
|
||
/* Create the action buttons along the bottom */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 40,"Print")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 3); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 32); n++;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, separator); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 5); n++;
|
||
#if 0
|
||
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
||
#endif
|
||
XtSetArg (args[n], XmNbottomOffset, 5); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 4); n++;
|
||
okBtn = XmCreatePushButtonGadget (printForm, "okBtn", args, n);
|
||
XtAddCallback(okBtn, XmNactivateCallback, StartPrintingCB,
|
||
(XtPointer) printCBRec);
|
||
XtManageChild (okBtn);
|
||
XmStringFree (labelString);
|
||
|
||
/* Build the Cancel Button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 41,"Cancel")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 35); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 64); 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++;
|
||
cancelBtn = XmCreatePushButtonGadget (printForm, "cancelBtn", args, n);
|
||
XtAddCallback(cancelBtn, XmNactivateCallback, ClosePrintCB,
|
||
(XtPointer) printCBRec);
|
||
XtManageChild (cancelBtn);
|
||
XmStringFree (labelString);
|
||
|
||
/* Build the Help button */
|
||
labelString = XmStringCreateLocalized(((char *)_DTGETMESSAGE
|
||
(PRSET, 42,"Help")));
|
||
n = 0;
|
||
XtSetArg (args[n], XmNlabelString, labelString); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 68); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 97); 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++;
|
||
helpBtn = XmCreatePushButtonGadget (printForm, "helpBtn", args, n);
|
||
XtManageChild (helpBtn);
|
||
pHelpInfo = _DtHelpListAdd(DtHELP_printHelpBtn_STR,
|
||
widget, help, &help->pHelpListHead);
|
||
XtAddCallback(helpBtn, XmNactivateCallback,
|
||
_DtHelpCB, (XtPointer) pHelpInfo);
|
||
XmStringFree (labelString);
|
||
|
||
/*** now do some setup ***/
|
||
/* make OK the default btn btn */
|
||
/* make Cancel the cancel (KCancel) btn */
|
||
/* set focus on the printer field */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNdefaultButton, okBtn); n++;
|
||
XtSetArg (args[n], XmNcancelButton, cancelBtn); n++;
|
||
XtSetArg (args[n], XmNinitialFocus, print->printerField); n++;
|
||
XtSetValues (printForm,args,n);
|
||
|
||
/* Adjust the decorations for the dialog shell of the dialog */
|
||
n = 0;
|
||
XtSetArg(args[n], XmNmwmFunctions, MWM_FUNC_MOVE); n++;
|
||
XtSetArg (args[n], XmNmwmDecorations,
|
||
MWM_DECOR_BORDER | MWM_DECOR_TITLE); n++;
|
||
XtSetValues (printShell, args, n);
|
||
|
||
/* Add the popup position callback to our print dialog */
|
||
XtAddCallback (printShell, XmNpopupCallback, (XtCallbackProc) _DtHelpMapCB,
|
||
(XtPointer) XtParent(widget));
|
||
|
||
/* Add the proper help callback to the print dialog shell "F1" support */
|
||
pHelpInfo = _DtHelpListAdd(DtHELP_printShell_STR,
|
||
widget, help, &help->pHelpListHead);
|
||
XtAddCallback(printForm, XmNhelpCallback,
|
||
_DtHelpCB, (XtPointer) pHelpInfo);
|
||
|
||
/* Assign our new print dialog to our widget instance */
|
||
print->printForm = printForm;
|
||
|
||
/* Set the tab navigation order */
|
||
XtSetArg (args[0], XmNnavigationType, XmSTICKY_TAB_GROUP);
|
||
XtSetValues (print->printerField,args,1);
|
||
XtSetValues (print->copiesField,args,1);
|
||
XtSetValues (print->paperSizeOptMenu,args,1);
|
||
XtSetValues (print->topicsFrame,args,1);
|
||
XtSetValues (okBtn,args,1);
|
||
XtSetValues (cancelBtn,args,1);
|
||
XtSetValues (helpBtn,args,1);
|
||
}
|
||
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
* Function: void _DtHelpPrintJob(
|
||
*
|
||
*
|
||
*
|
||
* Parameters:
|
||
*
|
||
* Return Value: Void.
|
||
*
|
||
* Purpose: Sets up and forks off a print job to helpprint
|
||
*
|
||
*****************************************************************************/
|
||
void _DtHelpPrintJob(
|
||
Widget widget,
|
||
char * printExec,
|
||
char * printer,
|
||
int paperSize,
|
||
char * copies,
|
||
char * helpVolume,
|
||
int helpType,
|
||
char * helpData,
|
||
Boolean printAll,
|
||
Boolean printSub,
|
||
Boolean printTocIndex,
|
||
char * topicTitle)
|
||
{
|
||
char * argv[20];
|
||
char * quotes="''";
|
||
int i;
|
||
int pid;
|
||
char tmpHelpType[4];
|
||
|
||
/* Setup the helpprint command and let it go */
|
||
i = 0;
|
||
argv[i++] = printExec;
|
||
|
||
if (printer != NULL && printer[0] != EOS)
|
||
{
|
||
argv[i++] = "-printer";
|
||
argv[i++] = printer;
|
||
}
|
||
|
||
if (copies != NULL && copies[0] != EOS)
|
||
{
|
||
argv[i++] = "-copies";
|
||
argv[i++] = copies;
|
||
}
|
||
|
||
if (NULL != topicTitle)
|
||
{
|
||
argv[i++] = "-topicTitle";
|
||
argv[i++] = topicTitle;
|
||
}
|
||
|
||
if (paperSize >= _DtHelpPaperSizeNamesCnt) paperSize = 0;
|
||
argv[i++] = "-paperSize";
|
||
argv[i++] = _DtHelpPaperSizeNames[paperSize];
|
||
|
||
argv[i++] = "-display";
|
||
argv[i++] = (char*)XDisplayString(XtDisplay(widget));
|
||
|
||
argv[i++] = "-helpType";
|
||
sprintf(tmpHelpType, "%d", helpType);
|
||
argv[i++] = tmpHelpType;
|
||
|
||
if (printAll)
|
||
argv[i++] = "-allTopics";
|
||
|
||
if (printSub)
|
||
argv[i++] = "-subTopics";
|
||
|
||
if (printTocIndex)
|
||
{
|
||
argv[i++] = "-toc";
|
||
argv[i++] = "-index";
|
||
argv[i++] = "-frontMatter";
|
||
}
|
||
|
||
if (!printSub && !printAll && !printTocIndex)
|
||
argv[i++] = "-oneTopic";
|
||
|
||
if (NULL == helpData) helpData = quotes;
|
||
switch (helpType)
|
||
{
|
||
case DtHELP_TYPE_TOPIC:
|
||
argv[i++] = "-locationId";
|
||
argv[i++] = helpData;
|
||
argv[i++] = "-helpVolume";
|
||
argv[i++] = helpVolume;
|
||
break;
|
||
|
||
case DtHELP_TYPE_MAN_PAGE:
|
||
argv[i++] = "-manPage";
|
||
argv[i++] = helpData;
|
||
break;
|
||
|
||
case DtHELP_TYPE_FILE:
|
||
argv[i++] = "-helpFile";
|
||
argv[i++] = helpData;
|
||
break;
|
||
|
||
case DtHELP_TYPE_STRING:
|
||
case DtHELP_TYPE_DYNAMIC_STRING:
|
||
argv[i++] = "-stringData";
|
||
argv[i++] = helpData;
|
||
break;
|
||
|
||
default:
|
||
/* ERROR-MESSAGE */
|
||
/* We should never get here, but just in case... */
|
||
XmeWarning(widget, (char*)PrintMessage001);
|
||
break;
|
||
} /* End Switch Statement */
|
||
|
||
argv[i++] = NULL;
|
||
|
||
#if 0 /* DBG */
|
||
{ /* for debugging, print out the command line */
|
||
char * * tmpargv;
|
||
for ( tmpargv = argv; *tmpargv; tmpargv++ ) fprintf(stderr,"%s ", *tmpargv);
|
||
fprintf(stderr,"\n");
|
||
}
|
||
#endif
|
||
|
||
#ifdef __hpux
|
||
pid = vfork();
|
||
#else
|
||
pid = fork();
|
||
#endif /* __hpux */
|
||
|
||
if (pid == 0)
|
||
{
|
||
(void) execvp (argv[0], argv);
|
||
_exit (1);
|
||
}
|
||
|
||
/* Return an error if bad pid? */
|
||
}
|
||
|
||
|