1075 lines
30 KiB
C
1075 lines
30 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 libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $TOG: printJob.c /main/29 1997/08/01 14:32:04 samborn $ */
|
|
/**********************************<+>*************************************
|
|
***************************************************************************
|
|
**
|
|
** File: printJob.c
|
|
**
|
|
** Project: HP DT dtpad, a memo maker type editor based on the
|
|
** Dt Editor widget.
|
|
**
|
|
** Description: Routines which manipulate the print setup dialog
|
|
**
|
|
**************************************************************************
|
|
**********************************<+>*************************************/
|
|
/*
|
|
* Common Desktop Environment
|
|
*
|
|
* (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
|
|
* (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
|
|
* (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
|
|
* (c) Copyright 1993, 1994, 1995 Novell, Inc.
|
|
* (c) Copyright 1995 Digital Equipment Corp.
|
|
* (c) Copyright 1995 Fujitsu Limited
|
|
* (c) Copyright 1995 Hitachi, Ltd.
|
|
*
|
|
*
|
|
* RESTRICTED RIGHTS LEGEND
|
|
*
|
|
*Use, duplication, or disclosure by the U.S. Government is subject to
|
|
*restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
|
|
*Technical Data and Computer Software clause in DFARS 252.227-7013. Rights
|
|
*for non-DOD U.S. Government Departments and Agencies are as set forth in
|
|
*FAR 52.227-19(c)(1,2).
|
|
|
|
*Hewlett-Packard Company, 3000 Hanover Street, Palo Alto, CA 94304 U.S.A.
|
|
*International Business Machines Corp., Route 100, Somers, NY 10589 U.S.A.
|
|
*Sun Microsystems, Inc., 2550 Garcia Avenue, Mountain View, CA 94043 U.S.A.
|
|
*Novell, Inc., 190 River Road, Summit, NJ 07901 U.S.A.
|
|
*Digital Equipment Corp., 111 Powdermill Road, Maynard, MA 01754, U.S.A.
|
|
*Fujitsu Limited, 1015, Kamikodanaka Nakahara-Ku, Kawasaki 211, Japan
|
|
*Hitachi, Ltd., 6, Kanda Surugadai 4-Chome, Chiyoda-ku, Tokyo 101, Japan
|
|
*/
|
|
|
|
|
|
#include <errno.h>
|
|
#include <pwd.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <time.h>
|
|
|
|
#include <X11/Intrinsic.h>
|
|
#include <X11/Shell.h>
|
|
#include <Xm/Xm.h>
|
|
#include <Xm/DialogS.h>
|
|
#include <Xm/Form.h>
|
|
#include <Xm/Label.h>
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
#include <Xm/Print.h>
|
|
#endif /* PRINTING_SUPPORTED */
|
|
#include <Dt/Editor.h>
|
|
#include <Dt/Print.h>
|
|
|
|
#include "dtpad.h"
|
|
|
|
static void _pjCreatePrintShell(PrintJob *pJob);
|
|
static void _pjCreateOutputWidgets(PrintJob *pJob);
|
|
static void _pjDoPrint(PrintJob*);
|
|
static void _pjUpdatePageHeaders(
|
|
PrintJob*,
|
|
PrintStringTypeEnum,
|
|
PrintStringTypeEnum,
|
|
PrintStringTypeEnum,
|
|
PrintStringTypeEnum);
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
static void _pjFinishedPrintToFile(
|
|
Display*,
|
|
XPContext,
|
|
XPGetDocStatus,
|
|
XPointer);
|
|
#endif /* PRINTING_SUPPORTED */
|
|
static char * _pjGetPageHeaderString(PrintJob*, PrintStringTypeEnum);
|
|
|
|
static void _pjCancelCB (Widget, XtPointer client_data, XtPointer);
|
|
static void _pjCloseDisplayCB (Widget, XtPointer client_data, XtPointer);
|
|
static void _pjPdmSetupCB (Widget, XtPointer client_data, XtPointer);
|
|
static void _pjPdmNotificationCB (Widget, XtPointer client_data, XtPointer);
|
|
static void _pjPrintCB (Widget, XtPointer client_data, XtPointer);
|
|
static void _pjPrintOnePageCB(Widget, XtPointer, XtPointer);
|
|
|
|
static void _pjRegisterActivePrintDisplay(Display*);
|
|
static void _pjUnregisterActivePrintDisplay(Display*);
|
|
|
|
static Display *_pjErrorPrintDisplay = NULL;
|
|
static Display **_pjActivePrintDisplay = NULL;
|
|
static int _pjMaxActivePrintDisplay = 0;
|
|
|
|
/************************************************************************
|
|
* PrintJobCreate
|
|
* Creates a new print job for the specified document file.
|
|
************************************************************************/
|
|
PrintJob *
|
|
PrintJobCreate(
|
|
char *documentName,
|
|
char *tempFileName,
|
|
Boolean silent,
|
|
Editor *pPad
|
|
)
|
|
{
|
|
PrintJob *pJob;
|
|
|
|
pJob = (PrintJob *) XtMalloc( sizeof(PrintJob) );
|
|
memset(pJob, 0, sizeof(PrintJob));
|
|
|
|
pJob->pPad = pPad;
|
|
pJob->parentShell = pPad->app_shell;
|
|
pJob->documentName = strdup(documentName);
|
|
pJob->tempFileName = strdup(tempFileName);
|
|
pJob->silent = silent;
|
|
|
|
pJob->pOutput = NULL;
|
|
pJob->pSetup = NULL;
|
|
pJob->pShell = NULL;
|
|
pJob->printData = (DtPrintSetupData*) XtMalloc(sizeof(DtPrintSetupData));
|
|
memset(pJob->printData, 0, sizeof(DtPrintSetupData));
|
|
|
|
pJob->npagesDone = 0;
|
|
pJob->npagesTotal = 0;
|
|
|
|
pJob->nextpageShell = NULL;
|
|
pJob->nextpageButton = NULL;
|
|
|
|
return pJob;
|
|
}
|
|
|
|
/************************************************************************
|
|
* PrintJobDestroy
|
|
* Destroys the specified PrintJob.
|
|
************************************************************************/
|
|
void
|
|
PrintJobDestroy(PrintJob *pJob)
|
|
{
|
|
if (pJob == NULL)
|
|
return;
|
|
|
|
if (pJob->pPad)
|
|
{
|
|
pJob->pPad->numPendingTasks--;
|
|
ClearStatusMessage(pJob->pPad);
|
|
XtSetSensitive(pJob->pPad->fileStuff.fileWidgets.printBtn, True);
|
|
/*
|
|
XtSetSensitive(pJob->pPad->fileStuff.fileWidgets.silentPrintBtn, True);
|
|
*/
|
|
}
|
|
if (pJob->documentName != NULL)
|
|
{
|
|
free((char*) pJob->documentName);
|
|
pJob->documentName = NULL;
|
|
}
|
|
if (pJob->tempFileName != NULL)
|
|
{
|
|
free((char*) pJob->tempFileName);
|
|
pJob->tempFileName = NULL;
|
|
}
|
|
if (pJob->pOutput != NULL)
|
|
{
|
|
PrintOutputDestroy(pJob->pOutput);
|
|
pJob->pOutput = NULL;
|
|
}
|
|
if (pJob->pShell != NULL)
|
|
{
|
|
_pjRegisterActivePrintDisplay(XtDisplay(pJob->pShell));
|
|
if (XtDisplay(pJob->pShell) == PrintJobGetErrorPrintDisplay())
|
|
{
|
|
char *errMsg;
|
|
|
|
/*
|
|
* Need to display an error dialog;
|
|
*/
|
|
errMsg =
|
|
GETMESSAGE(
|
|
14, 24,
|
|
"The X Print Server is temporarily out of resources.");
|
|
|
|
Warning(pJob->pPad, (char *) errMsg, XmDIALOG_ERROR);
|
|
PrintJobSetErrorPrintDisplay(NULL);
|
|
}
|
|
|
|
XtDestroyWidget(pJob->pShell);
|
|
pJob->pShell = NULL;
|
|
}
|
|
if (pJob->pSetup != NULL)
|
|
{
|
|
PrintSetupDestroy(pJob->pSetup);
|
|
pJob->pSetup = NULL;
|
|
}
|
|
if (pJob->printData)
|
|
{
|
|
DtPrintFreeSetupData(pJob->printData);
|
|
XtFree((XtPointer) pJob->printData);
|
|
pJob->printData = NULL;
|
|
}
|
|
if (pJob->nextpageShell)
|
|
{
|
|
XtDestroyWidget(pJob->nextpageShell);
|
|
pJob->nextpageShell = NULL;
|
|
}
|
|
|
|
XtFree((char *) pJob);
|
|
}
|
|
|
|
/************************************************************************
|
|
* PrintJobExecute
|
|
* Executes the specified PrintJob
|
|
************************************************************************/
|
|
void
|
|
PrintJobExecute(PrintJob *pJob)
|
|
{
|
|
if (pJob == NULL) return;
|
|
|
|
pJob->pSetup = PrintSetupCreate(
|
|
pJob->parentShell,
|
|
pJob->documentName,
|
|
pJob->pPad->xrdb.wordWrap,
|
|
pJob->pPad,
|
|
(XtCallbackProc) _pjCancelCB, pJob,
|
|
(XtCallbackProc) _pjCloseDisplayCB, pJob,
|
|
(XtCallbackProc) _pjPrintCB, pJob,
|
|
(XtCallbackProc) _pjPdmSetupCB, pJob);
|
|
if (pJob->silent)
|
|
{
|
|
/*
|
|
* The DtPrintSetupDialog will display itself automatically
|
|
* along with an error message in the event of an error.
|
|
*/
|
|
if (FALSE == PrintSetupGetDefaultPrintData(
|
|
pJob->pSetup,
|
|
pJob->printData))
|
|
return;
|
|
|
|
_pjCreatePrintShell(pJob);
|
|
_pjDoPrint(pJob);
|
|
}
|
|
else
|
|
PrintSetupDisplay(pJob->pSetup);
|
|
}
|
|
|
|
/************************************************************************
|
|
* PrintJobCancel
|
|
* Cancels and deletes the specified print job.
|
|
************************************************************************/
|
|
void
|
|
PrintJobCancel(PrintJob *pJob)
|
|
{
|
|
PrintJobDestroy(pJob);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* PrintJobGetErrorPrintDisplay
|
|
* Returns the last print display on which an error occurred.
|
|
************************************************************************/
|
|
Display *
|
|
PrintJobGetErrorPrintDisplay(void)
|
|
{
|
|
return _pjErrorPrintDisplay;
|
|
}
|
|
|
|
/************************************************************************
|
|
* PrintJobSetErrorPrintDisplay
|
|
* Save a pointer to the print display on which an error occurred.
|
|
************************************************************************/
|
|
void
|
|
PrintJobSetErrorPrintDisplay(Display *display)
|
|
{
|
|
_pjErrorPrintDisplay = display;
|
|
}
|
|
|
|
/************************************************************************
|
|
* PrintJobIsActivePrintDisplay
|
|
* Save a pointer to the print display on which an error occurred.
|
|
************************************************************************/
|
|
Boolean
|
|
PrintJobIsActivePrintDisplay(Display *display)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < _pjMaxActivePrintDisplay; i++)
|
|
if (display == _pjActivePrintDisplay[i])
|
|
return True;
|
|
|
|
return False;
|
|
}
|
|
|
|
/************************************************************************
|
|
* _pjRegisterActivePrintDisplay
|
|
* Save the Display pointer for an active print display connection
|
|
************************************************************************/
|
|
static void
|
|
_pjRegisterActivePrintDisplay(Display *display)
|
|
{
|
|
size_t size;
|
|
int i;
|
|
|
|
if (0 == _pjMaxActivePrintDisplay)
|
|
{
|
|
_pjMaxActivePrintDisplay = 10;
|
|
size = _pjMaxActivePrintDisplay * sizeof(Display*);
|
|
_pjActivePrintDisplay = (Display**) malloc(size);
|
|
memset((char*) _pjActivePrintDisplay, 0, size);
|
|
}
|
|
|
|
for (i = 0; i < _pjMaxActivePrintDisplay; i++)
|
|
{
|
|
if (NULL == _pjActivePrintDisplay[i])
|
|
{
|
|
_pjActivePrintDisplay[i] = display;
|
|
return;
|
|
}
|
|
}
|
|
|
|
size = _pjMaxActivePrintDisplay * sizeof(Display*);
|
|
_pjActivePrintDisplay =
|
|
(Display**) realloc((void*) _pjActivePrintDisplay, 2*size);
|
|
memset((char*) (_pjActivePrintDisplay + size), 0, size);
|
|
_pjActivePrintDisplay[_pjMaxActivePrintDisplay] = display;
|
|
_pjMaxActivePrintDisplay *= 2;
|
|
}
|
|
|
|
/************************************************************************
|
|
* _pjUnregisterActivePrintDisplay
|
|
* Delete the Display pointer for an active print display connection
|
|
************************************************************************/
|
|
static void
|
|
_pjUnregisterActivePrintDisplay(Display *display)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < _pjMaxActivePrintDisplay; i++)
|
|
if (display == _pjActivePrintDisplay[i])
|
|
_pjActivePrintDisplay[i] = NULL;
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* _pjCreatePrintShell
|
|
* Creates the print shell (XmPrintShell or XmDialogShell) to control
|
|
* printing.
|
|
************************************************************************/
|
|
static void
|
|
_pjCreatePrintShell(PrintJob *pJob)
|
|
{
|
|
DtPrintSetupData *psd = NULL;
|
|
|
|
if (pJob == NULL ||
|
|
pJob->pShell != NULL ||
|
|
pJob->parentShell == NULL ||
|
|
pJob->pSetup == NULL) return;
|
|
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
|
|
/*
|
|
* Create the print shell and
|
|
* the print output widgets
|
|
*/
|
|
#ifdef PRINT_TO_VIDEO
|
|
/*
|
|
* Create a dialog shell widget on the video display.
|
|
*/
|
|
pJob->pShell = XmCreateDialogShell(
|
|
pJob->parentShell,
|
|
"PrintVideo",
|
|
NULL, 0);
|
|
{
|
|
XmString xms;
|
|
|
|
pJob->nextpageShell = XmCreateDialogShell(
|
|
pJob->parentShell,
|
|
"PrintNextPage",
|
|
NULL, 0);
|
|
|
|
xms = XmStringCreateLocalized("Push for Next Page");
|
|
pJob->nextpageButton = XtVaCreateManagedWidget(
|
|
"NextPageButton",
|
|
xmPushButtonWidgetClass,
|
|
pJob->nextpageShell,
|
|
XmNlabelString, xms,
|
|
XmNwidth, 200,
|
|
XmNheight, 200,
|
|
NULL);
|
|
XmStringFree(xms);
|
|
|
|
XtAddCallback(
|
|
pJob->nextpageButton,
|
|
XmNactivateCallback,
|
|
_pjPrintOnePageCB,
|
|
(XtPointer) pJob);
|
|
|
|
XtManageChild(pJob->nextpageShell);
|
|
XtRealizeWidget(pJob->nextpageShell);
|
|
}
|
|
#else
|
|
|
|
/*
|
|
* Create an XmPrintShell widget on the print display.
|
|
*/
|
|
psd = pJob->printData;
|
|
if (psd != NULL)
|
|
pJob->pShell = XmPrintSetup(
|
|
pJob->parentShell,
|
|
XpGetScreenOfContext(psd->print_display, psd->print_context),
|
|
"Print",
|
|
NULL, 0);
|
|
|
|
XtAddCallback(
|
|
pJob->pShell,
|
|
XmNpageSetupCallback,
|
|
_pjPrintOnePageCB,
|
|
(XtPointer) pJob);
|
|
XtAddCallback(
|
|
pJob->pShell,
|
|
XmNpdmNotificationCallback,
|
|
_pjPdmNotificationCB,
|
|
(XtPointer) pJob);
|
|
#endif
|
|
|
|
if (pJob->pShell == NULL) return;
|
|
#endif /* PRINTING_SUPPORTED */
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
* _pjCreateOutputWidgets
|
|
* Actually run the specified PrintJob.
|
|
* Creates the PrintOutput object to be used for printing.
|
|
* Initializes the mailbox to iterate through the messages.
|
|
* Calls spoolOne to send a print job to the Xp server.
|
|
************************************************************************/
|
|
static void
|
|
_pjCreateOutputWidgets(PrintJob *pJob)
|
|
{
|
|
DtEditorErrorCode errorCode;
|
|
Boolean parseError;
|
|
DtPrintSetupData *psd = NULL;
|
|
int save_data;
|
|
|
|
/*
|
|
* Notify the user that we're printing
|
|
*/
|
|
/* TBD: Is there a status bar on pPad? */
|
|
|
|
if (pJob->pShell == NULL)
|
|
{
|
|
{/* TBD error dialog */}
|
|
PrintJobDestroy(pJob);
|
|
return;
|
|
}
|
|
|
|
pJob->pOutput = PrintOutputCreate(pJob->pShell);
|
|
PrintOutputSetWordWrap(pJob->pOutput, PrintSetupUseWordWrap(pJob->pSetup));
|
|
PrintOutputSetPageMargins(
|
|
pJob->pOutput,
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_TOP),
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_RIGHT),
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_BOTTOM),
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_LEFT),
|
|
&parseError
|
|
);
|
|
if (parseError)
|
|
{
|
|
/*
|
|
* Display an error dialog.
|
|
DtMailGenDialog *genDialog = new DtMailGenDialog(
|
|
"Dialog",
|
|
_parent->baseWidget());
|
|
*/
|
|
char *i18nMsg;
|
|
char *errMsg;
|
|
|
|
i18nMsg = GETMESSAGE(
|
|
14, 1,
|
|
"One of the following margin specifiers \n has incorrect syntax: \n %s \n %s \n %s \n %s \nContinue using default margins?"
|
|
);
|
|
|
|
errMsg = (char *) XtMalloc(1024);
|
|
sprintf(
|
|
errMsg,
|
|
i18nMsg,
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_TOP),
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_RIGHT),
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_BOTTOM),
|
|
PrintSetupGetMarginSpec(pJob->pSetup, DTPRINT_OPTION_MARGIN_LEFT)
|
|
);
|
|
|
|
Warning(pJob->pPad, (char *) errMsg, XmDIALOG_WARNING);
|
|
XtFree(errMsg);
|
|
}
|
|
|
|
/*
|
|
* Load the file
|
|
*/
|
|
errorCode = PrintOutputLoadFile(pJob->pOutput, pJob->tempFileName);
|
|
switch (errorCode)
|
|
{
|
|
case DtEDITOR_NO_ERRORS:
|
|
case DtEDITOR_READ_ONLY_FILE:
|
|
break;
|
|
case DtEDITOR_NONEXISTENT_FILE:
|
|
Warning(
|
|
pJob->pPad,
|
|
(char *) GETMESSAGE(14, 2, "File does not exist."),
|
|
XmDIALOG_WARNING);
|
|
break;
|
|
case DtEDITOR_DIRECTORY:
|
|
Warning(
|
|
pJob->pPad,
|
|
(char *) GETMESSAGE(14, 3, "Specified file is a directory."),
|
|
XmDIALOG_WARNING);
|
|
break;
|
|
case DtEDITOR_CHAR_SPECIAL_FILE:
|
|
case DtEDITOR_BLOCK_MODE_FILE:
|
|
Warning(
|
|
pJob->pPad,
|
|
(char *) GETMESSAGE(14, 4, "File type error."),
|
|
XmDIALOG_WARNING);
|
|
break;
|
|
case DtEDITOR_NULLS_REMOVED:
|
|
Warning(
|
|
pJob->pPad,
|
|
(char *) GETMESSAGE(14, 5, "File contains NULL characters."),
|
|
XmDIALOG_WARNING);
|
|
break;
|
|
case DtEDITOR_INSUFFICIENT_MEMORY:
|
|
Warning(
|
|
pJob->pPad,
|
|
(char*)
|
|
GETMESSAGE(14, 6, "Unable to load file (insufficient memory)."),
|
|
XmDIALOG_ERROR);
|
|
break;
|
|
case DtEDITOR_NO_FILE_ACCESS:
|
|
case DtEDITOR_UNREADABLE_FILE:
|
|
default:
|
|
Warning(
|
|
pJob->pPad,
|
|
(char *)
|
|
GETMESSAGE(14, 7, "File does not have read permissions"),
|
|
XmDIALOG_WARNING);
|
|
break;
|
|
}
|
|
|
|
XtRealizeWidget( pJob->pShell );
|
|
|
|
PrintOutputFirstPage(pJob->pOutput);
|
|
pJob->npagesTotal = PrintOutputGetNumLines(pJob->pOutput) +
|
|
PrintOutputGetLinesPerPage(pJob->pOutput) - 1;
|
|
pJob->npagesTotal /= PrintOutputGetLinesPerPage(pJob->pOutput);
|
|
pJob->npagesDone = 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
* _pjDoPrint
|
|
* Actually run the specified PrintJob.
|
|
* Creates the PrintOutput object to be used for printing.
|
|
* Initializes the mailbox to iterate through the messages.
|
|
* Calls spoolOne to send a print job to the Xp server.
|
|
************************************************************************/
|
|
static void
|
|
_pjDoPrint(PrintJob *pJob)
|
|
{
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
|
|
static char buf[1024];
|
|
static char *format;
|
|
DtPrintSetupData *psd = NULL;
|
|
int dest = XPSpool;
|
|
|
|
/*
|
|
* Notify the user that we're printing
|
|
*/
|
|
if (pJob->pPad != NULL) {
|
|
pJob->pPad->numPendingTasks++;
|
|
format = GETMESSAGE(14, 21, "Printing %s ...");
|
|
sprintf(buf, format, pJob->documentName);
|
|
SetStatusMessage(pJob->pPad, buf);
|
|
XtSetSensitive(pJob->pPad->fileStuff.fileWidgets.printBtn, False);
|
|
}
|
|
|
|
#ifndef PRINT_TO_VIDEO
|
|
psd = pJob->printData;
|
|
|
|
if (psd->destination == DtPRINT_TO_FILE)
|
|
dest = XPGetData;
|
|
|
|
_pjRegisterActivePrintDisplay(XtDisplay(pJob->pShell));
|
|
XpStartJob(XtDisplay(pJob->pShell), dest);
|
|
XFlush(XtDisplay(pJob->pShell));
|
|
|
|
if (psd->destination == DtPRINT_TO_FILE)
|
|
{
|
|
if (FALSE == XmPrintToFile(
|
|
XtDisplay(pJob->pShell),
|
|
psd->dest_info,
|
|
_pjFinishedPrintToFile,
|
|
(XPointer) pJob))
|
|
{
|
|
char *fmt = "%s\n%s: %s";
|
|
char *message;
|
|
char *appmessage = NULL;
|
|
char *sysmessage = strerror(errno);
|
|
|
|
appmessage = (char *) GETMESSAGE(
|
|
14, 14,
|
|
"'Print to File' was unsuccessful.");
|
|
|
|
if (NULL == sysmessage)
|
|
{
|
|
message = XtMalloc(strlen(appmessage) + 1);
|
|
sprintf(message, "%s", appmessage);
|
|
}
|
|
else
|
|
{
|
|
message = XtMalloc(
|
|
strlen(appmessage) +
|
|
strlen(sysmessage) +
|
|
strlen(psd->dest_info) +
|
|
strlen(fmt) + 1);
|
|
sprintf(message, fmt, appmessage, psd->dest_info, sysmessage);
|
|
}
|
|
|
|
Warning(pJob->pPad, message, XmDIALOG_WARNING);
|
|
XtFree(message);
|
|
|
|
XpCancelJob(XtDisplay(pJob->pShell), False);
|
|
PrintJobDestroy(pJob);
|
|
}
|
|
}
|
|
#endif
|
|
#endif /* PRINTING_SUPPORTED */
|
|
|
|
|
|
}
|
|
|
|
/************************************************************************
|
|
* _pjUpdatePageHeaders
|
|
* Configures the header and footer string in the PrintOutput.
|
|
************************************************************************/
|
|
static void
|
|
_pjUpdatePageHeaders(
|
|
PrintJob *pJob,
|
|
PrintStringTypeEnum hl_type,
|
|
PrintStringTypeEnum hr_type,
|
|
PrintStringTypeEnum fl_type,
|
|
PrintStringTypeEnum fr_type
|
|
)
|
|
{
|
|
char *hl_string,
|
|
*hr_string,
|
|
*fl_string,
|
|
*fr_string;
|
|
|
|
if (pJob == (PrintJob *) NULL) return;
|
|
|
|
hl_string = _pjGetPageHeaderString(pJob, hl_type);
|
|
hr_string = _pjGetPageHeaderString(pJob, hr_type);
|
|
fl_string = _pjGetPageHeaderString(pJob, fl_type);
|
|
fr_string = _pjGetPageHeaderString(pJob, fr_type);
|
|
|
|
if (PRINT_NONE_STRING_TYPE_ENUM == hl_type &&
|
|
PRINT_NONE_STRING_TYPE_ENUM == hr_type)
|
|
PrintOutputHideHeaders(pJob->pOutput);
|
|
else
|
|
PrintOutputShowHeaders(pJob->pOutput);
|
|
|
|
if (PRINT_NONE_STRING_TYPE_ENUM == fl_type &&
|
|
PRINT_NONE_STRING_TYPE_ENUM == fr_type)
|
|
PrintOutputHideFooters(pJob->pOutput);
|
|
else
|
|
PrintOutputShowFooters(pJob->pOutput);
|
|
|
|
|
|
PrintOutputSetHdrFtrStrings(
|
|
pJob->pOutput,
|
|
hl_string,
|
|
hr_string,
|
|
fl_string,
|
|
fr_string
|
|
);
|
|
free(hl_string);
|
|
free(hr_string);
|
|
free(fl_string);
|
|
free(fr_string);
|
|
}
|
|
|
|
/************************************************************************
|
|
* _pjGetPageHeaderString
|
|
* Returns a header and footer string of the specified type.
|
|
************************************************************************/
|
|
static char *
|
|
_pjGetPageHeaderString(PrintJob *pJob, PrintStringTypeEnum type)
|
|
{
|
|
char *format,
|
|
*buf = (char *) NULL;
|
|
|
|
switch (type)
|
|
{
|
|
case PRINT_NONE_STRING_TYPE_ENUM:
|
|
buf = strdup(" ");
|
|
break;
|
|
case PRINT_DATE_STRING_TYPE_ENUM:
|
|
{
|
|
time_t clock;
|
|
char *date;
|
|
|
|
clock = time((time_t*) NULL);
|
|
date = ctime(&clock);
|
|
/* Strip off the trailing newline. */
|
|
date[strlen(date)-1] = '\0';
|
|
format = GETMESSAGE(14, 8, "Date: %s");
|
|
buf = (char *) malloc(strlen(format) + strlen(date) + 1);
|
|
if (buf != (char *) NULL)
|
|
sprintf(buf, format, date);
|
|
}
|
|
break;
|
|
case PRINT_DOCNAME_STRING_TYPE_ENUM:
|
|
{
|
|
unsigned buflen;
|
|
|
|
format = GETMESSAGE(14, 9, "Document: %s");
|
|
buflen = strlen(format) + strlen(pJob->documentName) + 1;
|
|
buf = (char *) malloc(buflen);
|
|
if (buf != (char *) NULL)
|
|
sprintf(buf, format, pJob->documentName);
|
|
}
|
|
break;
|
|
case PRINT_PAGE_NUMBER_STRING_TYPE_ENUM:
|
|
/*
|
|
* Allocate space for the format and the translated page number.
|
|
*/
|
|
{
|
|
format = GETMESSAGE(14, 10, "Page %d of %d");
|
|
buf = (char *) malloc(strlen(format) + 16);
|
|
if (buf != (char *) NULL)
|
|
sprintf(buf, format, pJob->npagesDone, pJob->npagesTotal);
|
|
}
|
|
break;
|
|
case PRINT_USER_NAME_STRING_TYPE_ENUM:
|
|
/*
|
|
* Allocate space for the format and the username.
|
|
*/
|
|
{
|
|
struct passwd *pw;
|
|
|
|
format = GETMESSAGE(14, 11, "Document For: %s");
|
|
pw = getpwuid(getuid());
|
|
buf = (char *) malloc(strlen(format) + strlen(pw->pw_name) + 1);
|
|
if (buf != (char *) NULL)
|
|
sprintf(buf, format, pw->pw_name);
|
|
}
|
|
break;
|
|
default:
|
|
buf = strdup("DEFAULT not impld");
|
|
break;
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Name: _pjFinishedPrintToFile
|
|
*
|
|
* Description:
|
|
*
|
|
* App-specific print data holder allocate function.
|
|
*
|
|
*/
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
static void _pjFinishedPrintToFile(
|
|
Display *display,
|
|
XPContext context,
|
|
XPGetDocStatus status,
|
|
XPointer client_data)
|
|
{
|
|
char *message = NULL;
|
|
PrintJob *pJob = (PrintJob *) client_data;
|
|
Editor *pPad = pJob->pPad;
|
|
|
|
if (status != XPGetDocFinished)
|
|
{
|
|
|
|
message = (char *) GETMESSAGE(
|
|
14, 14,
|
|
"'Print to File' was unsuccessful.");
|
|
Warning(pPad, message, XmDIALOG_WARNING);
|
|
}
|
|
else if (display != PrintJobGetErrorPrintDisplay())
|
|
{
|
|
|
|
message = (char *) GETMESSAGE(
|
|
14, 15,
|
|
"'Print to File' completed successfully.");
|
|
Warning(pPad, message, XmDIALOG_INFORMATION);
|
|
}
|
|
PrintJobDestroy(pJob);
|
|
}
|
|
#endif /* PRINTING_SUPPORTED */
|
|
|
|
|
|
/*
|
|
* Name: _pjCancelCB
|
|
* Description:
|
|
* An XtCallbackProc which can be added to the callback list of
|
|
* a widget to cancel the print job passed back as client_data.
|
|
*/
|
|
static void
|
|
_pjCancelCB (Widget widget, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
PrintJob *pJob = (PrintJob *) client_data;
|
|
|
|
PrintJobDestroy(pJob);
|
|
}
|
|
|
|
/*
|
|
* Name: _pjCloseDisplayCB
|
|
* Description:
|
|
* An XtCallbackProc which can be added to the callback list of
|
|
* a widget to cancel the print job passed back as client_data.
|
|
*/
|
|
static void
|
|
_pjCloseDisplayCB (Widget widget, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
PrintJob *pJob = (PrintJob *) client_data;
|
|
DtPrintSetupCallbackStruct *pbs = (DtPrintSetupCallbackStruct *) call_data;
|
|
|
|
if (pJob->pShell != NULL)
|
|
{
|
|
XtDestroyWidget(pJob->pShell);
|
|
pJob->pShell = NULL;
|
|
}
|
|
DtPrintFreeSetupData(pJob->printData);
|
|
}
|
|
|
|
/*
|
|
* Name: _pjPrintCB
|
|
* Description:
|
|
* An XtCallbackProc which can be added to the callback list of
|
|
* a widget to execute the print job passed back as client_data.
|
|
*/
|
|
static void
|
|
_pjPrintCB (Widget widget, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
PrintJob *pJob = (PrintJob *) client_data;
|
|
DtPrintSetupCallbackStruct *pbs = (DtPrintSetupCallbackStruct *) call_data;
|
|
|
|
DtPrintCopySetupData(pJob->printData, pbs->print_data);
|
|
_pjCreatePrintShell(pJob);
|
|
_pjDoPrint(pJob);
|
|
}
|
|
|
|
|
|
/*
|
|
* Name: _pjPdmSetupCB
|
|
* Description:
|
|
* An XtCallbackProc which can be added to the callback list of
|
|
* a widget to popup the PDM for the print job.
|
|
*/
|
|
static void
|
|
_pjPdmSetupCB(Widget print_setup, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
char *pname = "_pjPdmSetupCB";
|
|
PrintJob *pJob = (PrintJob *) client_data;
|
|
DtPrintSetupCallbackStruct
|
|
*pbs = (DtPrintSetupCallbackStruct *) call_data;
|
|
|
|
DtPrintCopySetupData(pJob->printData, pbs->print_data);
|
|
_pjCreatePrintShell(pJob);
|
|
|
|
/* Pop up the PDM */
|
|
if (pJob->pShell)
|
|
{
|
|
Widget shell = print_setup;
|
|
|
|
while (! (shell == NULL || XtIsShell(shell)) )
|
|
shell = XtParent(shell);
|
|
|
|
if (shell)
|
|
XmPrintPopupPDM(pJob->pShell, shell);
|
|
else
|
|
fprintf(stderr, "Internal Error %s: Missing XmPrintShell.", pname);
|
|
}
|
|
#endif /* PRINTING_SUPPORTED */
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* _pjPdmNotificationCB
|
|
* XmNpdmNotificationCallback for the XmPrintShell
|
|
************************************************************************/
|
|
static void
|
|
_pjPdmNotificationCB (Widget widget, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
PrintJob *pJob = (PrintJob*) client_data;
|
|
XmPrintShellCallbackStruct *pscbs = (XmPrintShellCallbackStruct*)call_data;
|
|
char *message = NULL;
|
|
|
|
switch (pscbs->reason)
|
|
{
|
|
|
|
case XmCR_PDM_NONE:
|
|
case XmCR_PDM_START_ERROR:
|
|
case XmCR_PDM_START_VXAUTH:
|
|
case XmCR_PDM_START_PXAUTH:
|
|
message = (char *) GETMESSAGE(
|
|
14, 25,
|
|
"Print Dialog Manager error - setup failed.");
|
|
break;
|
|
default:
|
|
message = NULL;
|
|
break;
|
|
}
|
|
|
|
if (message != NULL)
|
|
Warning( pJob->pPad, message, XmDIALOG_WARNING);
|
|
#endif /* PRINTING_SUPPORTED */
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
* _pjPrintOnePageCB
|
|
* XmNpageSetupCallback for the XmPrintShell
|
|
************************************************************************/
|
|
static void
|
|
_pjPrintOnePageCB(
|
|
Widget widget,
|
|
XtPointer client_data,
|
|
XtPointer call_data
|
|
)
|
|
{
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
PrintJob *pJob = (PrintJob *) client_data;
|
|
|
|
XmPrintShellCallbackStruct *pscbs = (XmPrintShellCallbackStruct*)call_data;
|
|
int top = 0;
|
|
|
|
if (pJob->pOutput == NULL)
|
|
{
|
|
XtArgVal width0, height0;
|
|
Dimension width, height;
|
|
|
|
width = 0; height=0;
|
|
XtVaGetValues(
|
|
pJob->pShell,
|
|
XmNwidth, &width0,
|
|
XmNheight, &height0,
|
|
NULL);
|
|
width = (Dimension)width0;
|
|
height = (Dimension)height0;
|
|
|
|
#if defined(PRINT_TO_VIDEO)
|
|
printf("PrintShell in _pjPrintOnePageCB: <W %d - H %d>\n",width,height);
|
|
#endif
|
|
|
|
if (width < 100 || height < 100)
|
|
{
|
|
width = 2550; height=3250;
|
|
XtVaSetValues(
|
|
pJob->pShell,
|
|
XmNwidth, width,
|
|
XmNheight, height,
|
|
NULL);
|
|
width = 0; height=0;
|
|
XtVaGetValues(
|
|
pJob->pShell,
|
|
XmNwidth, &width,
|
|
XmNheight, &height,
|
|
NULL);
|
|
#if defined(PRINT_TO_VIDEO)
|
|
printf(
|
|
"PrintShell in _pjPrintOnePageCB: <W %d - H %d>\n",width,height);
|
|
#endif
|
|
}
|
|
_pjCreateOutputWidgets(pJob);
|
|
}
|
|
|
|
#ifdef PRINT_TO_VIDEO
|
|
if (pJob->npagesDone > 0 && pJob->npagesDone == pJob->npagesTotal)
|
|
#else
|
|
if (pscbs->last_page)
|
|
#endif
|
|
{
|
|
DtPrintSetupData *psd = pJob->printData;
|
|
|
|
/*
|
|
* This spool job is done. Clean up.
|
|
* If this is a print to file job,
|
|
* clean up in the job finished callback.
|
|
*/
|
|
if (psd->destination != DtPRINT_TO_FILE)
|
|
PrintJobDestroy(pJob);
|
|
return;
|
|
}
|
|
|
|
if (pJob->npagesDone > 0 && PrintOutputPageDown(pJob->pOutput) == FALSE)
|
|
{
|
|
#ifndef PRINT_TO_VIDEO
|
|
pscbs->last_page = TRUE;
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* Update header and footer strings.
|
|
*/
|
|
pJob->npagesDone++;
|
|
_pjUpdatePageHeaders(
|
|
pJob,
|
|
PrintSetupGetHdrFtrSpec(pJob->pSetup, DTPRINT_OPTION_HEADER_LEFT),
|
|
PrintSetupGetHdrFtrSpec(pJob->pSetup, DTPRINT_OPTION_HEADER_RIGHT),
|
|
PrintSetupGetHdrFtrSpec(pJob->pSetup, DTPRINT_OPTION_FOOTER_LEFT),
|
|
PrintSetupGetHdrFtrSpec(pJob->pSetup, DTPRINT_OPTION_FOOTER_RIGHT)
|
|
);
|
|
|
|
/*
|
|
* Notify the user that we're printing
|
|
*/
|
|
if (pJob->pPad != NULL)
|
|
{
|
|
static char buf[1024];
|
|
char *format;
|
|
|
|
format = GETMESSAGE(14, 22, "Printing %s: page %d of %d ...");
|
|
sprintf(buf, format,
|
|
pJob->documentName,
|
|
pJob->npagesDone,
|
|
pJob->npagesTotal);
|
|
SetStatusMessage(pJob->pPad, buf);
|
|
}
|
|
|
|
#ifndef PRINT_TO_VIDEO
|
|
if (pJob->npagesDone >= pJob->npagesTotal)
|
|
pscbs->last_page = TRUE;
|
|
#endif
|
|
|
|
#endif /* PRINTING_SUPPORTED */
|
|
}
|