Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
865
cde/programs/dtpad/printOutput.c
Normal file
865
cde/programs/dtpad/printOutput.c
Normal file
@@ -0,0 +1,865 @@
|
||||
/* $TOG: printOutput.c /main/6 1997/07/07 15:06:25 mgreess $ */
|
||||
/**********************************<+>*************************************
|
||||
***************************************************************************
|
||||
**
|
||||
** File: printOption.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 <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <X11/Intrinsic.h>
|
||||
#include <Xm/Xm.h>
|
||||
#include <Xm/DialogS.h>
|
||||
#include <Xm/Form.h>
|
||||
#include <Xm/Label.h>
|
||||
#include <Xm/Print.h>
|
||||
#include <Xm/Text.h>
|
||||
#include <Dt/Editor.h>
|
||||
|
||||
#include "dtpad.h"
|
||||
|
||||
#define READ_ACCESS 1
|
||||
#define WRITE_ACCESS 2
|
||||
|
||||
static void _poSetInnerPageDimensions(
|
||||
PrintOutput*,
|
||||
Dimension,
|
||||
Dimension,
|
||||
Dimension,
|
||||
Dimension
|
||||
);
|
||||
static int _poDoGetLinesPerPage(PrintOutput*);
|
||||
static int _poGetTopPosition(PrintOutput *pOutput);
|
||||
static DtEditorErrorCode
|
||||
_poGetFileContents(char **contents, char *file);
|
||||
static DtEditorErrorCode
|
||||
_poStripEmbeddedNulls(char *strbuf, int *len);
|
||||
extern DtEditorErrorCode
|
||||
_poEditorValidateFileAccess(char *file, int accessType);
|
||||
|
||||
/*
|
||||
* Used to initialize the top, right, bottom, and left margins
|
||||
* between the outside edge of the page (_form) and the inner
|
||||
* page that is written on.
|
||||
*/
|
||||
const char *const _poDefaultMargin = ".5in";
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputCreate
|
||||
* Creates and initialiazes a new PrintOutput output including the
|
||||
* widget hierarchy.
|
||||
************************************************************************/
|
||||
PrintOutput*
|
||||
PrintOutputCreate(Widget shell)
|
||||
{
|
||||
Widget w;
|
||||
Boolean parseError;
|
||||
PrintOutput *pOutput;
|
||||
|
||||
pOutput = (PrintOutput *) XtMalloc(sizeof(PrintOutput));
|
||||
pOutput->pShell = shell;
|
||||
|
||||
pOutput->currentLine = 0;
|
||||
pOutput->linesPerPage = 0;
|
||||
|
||||
w = XtVaCreateWidget("Page",
|
||||
xmFormWidgetClass,
|
||||
pOutput->pShell,
|
||||
XmNresizePolicy, XmRESIZE_NONE,
|
||||
NULL);
|
||||
pOutput->page = w;
|
||||
|
||||
w = XtVaCreateWidget("InnerPage",
|
||||
xmFormWidgetClass,
|
||||
pOutput->page,
|
||||
XmNresizePolicy, XmRESIZE_NONE,
|
||||
NULL);
|
||||
pOutput->innerPage = w;
|
||||
|
||||
w = XtVaCreateManagedWidget("HeaderLeft",
|
||||
xmLabelWidgetClass,
|
||||
pOutput->innerPage,
|
||||
XmNalignment, XmALIGNMENT_BEGINNING,
|
||||
XmNleftAttachment, XmATTACH_FORM,
|
||||
XmNtopAttachment, XmATTACH_FORM,
|
||||
NULL);
|
||||
pOutput->headerLeft = w;
|
||||
|
||||
w = XtVaCreateManagedWidget("HeaderRight",
|
||||
xmLabelWidgetClass,
|
||||
pOutput->innerPage,
|
||||
XmNalignment, XmALIGNMENT_END,
|
||||
XmNrightAttachment, XmATTACH_FORM,
|
||||
XmNleftAttachment, XmATTACH_WIDGET,
|
||||
XmNleftWidget, pOutput->headerLeft,
|
||||
XmNtopAttachment, XmATTACH_FORM,
|
||||
NULL);
|
||||
pOutput->headerRight = w;
|
||||
|
||||
w = XtVaCreateManagedWidget("Editor",
|
||||
#ifdef USE_DTEDITOR
|
||||
dtEditorWidgetClass,
|
||||
#else
|
||||
xmTextWidgetClass,
|
||||
#endif
|
||||
pOutput->innerPage,
|
||||
DtNscrollVertical, FALSE,
|
||||
DtNscrollHorizontal, FALSE,
|
||||
DtNshowStatusLine, FALSE,
|
||||
DtNwordWrap, TRUE,
|
||||
XmNeditMode, XmMULTI_LINE_EDIT,
|
||||
XmNleftAttachment, XmATTACH_FORM,
|
||||
XmNrightAttachment, XmATTACH_FORM,
|
||||
XmNtopAttachment, XmATTACH_WIDGET,
|
||||
XmNtopWidget, pOutput->headerLeft,
|
||||
NULL);
|
||||
pOutput->editor = w;
|
||||
|
||||
w = XtVaCreateManagedWidget("FooterLeft",
|
||||
xmLabelWidgetClass,
|
||||
pOutput->innerPage,
|
||||
XmNalignment, XmALIGNMENT_BEGINNING,
|
||||
XmNleftAttachment, XmATTACH_FORM,
|
||||
XmNbottomAttachment, XmATTACH_FORM,
|
||||
NULL);
|
||||
pOutput->footerLeft = w;
|
||||
|
||||
w = XtVaCreateManagedWidget("FooterRight",
|
||||
xmLabelWidgetClass,
|
||||
pOutput->innerPage,
|
||||
XmNalignment, XmALIGNMENT_END,
|
||||
XmNleftAttachment, XmATTACH_WIDGET,
|
||||
XmNleftWidget, pOutput->footerLeft,
|
||||
XmNrightAttachment, XmATTACH_FORM,
|
||||
XmNbottomAttachment, XmATTACH_FORM,
|
||||
NULL);
|
||||
pOutput->footerRight = w;
|
||||
|
||||
XtVaSetValues(
|
||||
pOutput->editor,
|
||||
XmNbottomAttachment, XmATTACH_WIDGET,
|
||||
XmNbottomWidget, pOutput->footerLeft,
|
||||
NULL);
|
||||
|
||||
XtManageChild(pOutput->innerPage);
|
||||
XtManageChild(pOutput->page);
|
||||
|
||||
PrintOutputSetPageMargins(
|
||||
pOutput,
|
||||
_poDefaultMargin,
|
||||
_poDefaultMargin,
|
||||
_poDefaultMargin,
|
||||
_poDefaultMargin,
|
||||
&parseError );
|
||||
assert(parseError == NULL);
|
||||
|
||||
return pOutput;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputCreate
|
||||
* Class destructor.
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputDestroy(PrintOutput *pOutput)
|
||||
{
|
||||
if (pOutput == NULL) return;
|
||||
XtDestroyWidget(pOutput->page);
|
||||
XtFree((char*) pOutput);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputHideFooter
|
||||
* PrintOutputShowFooter
|
||||
* PrintOutputHideHeader
|
||||
* PrintOutputShowHeader
|
||||
* Unmanages/Manages the footer/header widgets
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputHideFooters(PrintOutput *pOutput)
|
||||
{
|
||||
XtUnmanageChild(pOutput->footerLeft);
|
||||
XtUnmanageChild(pOutput->footerRight);
|
||||
XtVaSetValues(pOutput->editor, XmNbottomAttachment, XmATTACH_FORM, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
PrintOutputShowFooters(PrintOutput *pOutput)
|
||||
{
|
||||
XtManageChild(pOutput->footerLeft);
|
||||
XtManageChild(pOutput->footerRight);
|
||||
XtVaSetValues(
|
||||
pOutput->editor,
|
||||
XmNbottomAttachment, XmATTACH_WIDGET,
|
||||
XmNbottomWidget, pOutput->footerLeft,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
PrintOutputHideHeaders(PrintOutput *pOutput)
|
||||
{
|
||||
XtUnmanageChild(pOutput->headerLeft);
|
||||
XtUnmanageChild(pOutput->headerRight);
|
||||
XtVaSetValues(pOutput->editor, XmNtopAttachment, XmATTACH_FORM, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
PrintOutputShowHeaders(PrintOutput *pOutput)
|
||||
{
|
||||
XtManageChild(pOutput->headerLeft);
|
||||
XtManageChild(pOutput->headerRight);
|
||||
XtVaSetValues(
|
||||
pOutput->editor,
|
||||
XmNtopAttachment, XmATTACH_WIDGET,
|
||||
XmNtopWidget, pOutput->headerLeft,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputSetHdrFtrString
|
||||
* Set the contents of the specifies header/footer
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputSetHdrFtrString(
|
||||
PrintOutput *pOutput,
|
||||
_DtPrintHdrFtrEnum which,
|
||||
char *contents
|
||||
)
|
||||
{
|
||||
Widget w;
|
||||
XmString xms;
|
||||
|
||||
if (contents == (char *) NULL)
|
||||
return;
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case DTPRINT_OPTION_HEADER_LEFT:
|
||||
w = pOutput->headerLeft;
|
||||
break;
|
||||
case DTPRINT_OPTION_HEADER_RIGHT:
|
||||
w = pOutput->headerRight;
|
||||
break;
|
||||
case DTPRINT_OPTION_FOOTER_LEFT:
|
||||
w = pOutput->footerLeft;
|
||||
break;
|
||||
case DTPRINT_OPTION_FOOTER_RIGHT:
|
||||
w = pOutput->footerRight;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
xms = XmStringCreateLocalized(contents);
|
||||
XtVaSetValues(w, XmNlabelString, xms, NULL);
|
||||
XmStringFree(xms);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputSetHdrFtrStrings
|
||||
* Set the contents of all the header/footers
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputSetHdrFtrStrings(
|
||||
PrintOutput *pOutput,
|
||||
char *hdrLeft,
|
||||
char *hdrRight,
|
||||
char *ftrLeft,
|
||||
char *ftrRight
|
||||
)
|
||||
{
|
||||
XmString xms;
|
||||
|
||||
if (hdrLeft)
|
||||
{
|
||||
xms = XmStringCreateLocalized(hdrLeft);
|
||||
XtVaSetValues(pOutput->headerLeft, XmNlabelString, xms, NULL);
|
||||
XmStringFree(xms);
|
||||
}
|
||||
|
||||
if (hdrRight)
|
||||
{
|
||||
xms = XmStringCreateLocalized(hdrRight);
|
||||
XtVaSetValues(pOutput->headerRight, XmNlabelString, xms, NULL);
|
||||
XmStringFree(xms);
|
||||
}
|
||||
|
||||
if (ftrLeft)
|
||||
{
|
||||
xms = XmStringCreateLocalized(ftrLeft);
|
||||
XtVaSetValues(pOutput->footerLeft, XmNlabelString, xms, NULL);
|
||||
XmStringFree(xms);
|
||||
}
|
||||
|
||||
if (ftrRight)
|
||||
{
|
||||
xms = XmStringCreateLocalized(ftrRight);
|
||||
XtVaSetValues(pOutput->footerRight, XmNlabelString, xms, NULL);
|
||||
XmStringFree(xms);
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputSetPageMargin
|
||||
* Set the contents of the specified page margin
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputSetPageMargin(
|
||||
PrintOutput *pOutput,
|
||||
_DtPrintMarginEnum which,
|
||||
const char *margin,
|
||||
Boolean *parseError
|
||||
)
|
||||
{
|
||||
int pixels = 0;
|
||||
XtEnum xtParseError = FALSE;
|
||||
char *marginString = XtNewString(margin);
|
||||
|
||||
if (parseError)
|
||||
*parseError = FALSE;
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case DTPRINT_OPTION_MARGIN_TOP:
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
marginString,
|
||||
XmVERTICAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
if (!xtParseError && pixels > 0)
|
||||
pOutput->marginTop = pixels;
|
||||
break;
|
||||
case DTPRINT_OPTION_MARGIN_RIGHT:
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
marginString,
|
||||
XmHORIZONTAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
if (!xtParseError && pixels > 0)
|
||||
pOutput->marginRight = pixels;
|
||||
break;
|
||||
case DTPRINT_OPTION_MARGIN_BOTTOM:
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
marginString,
|
||||
XmVERTICAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
if (!xtParseError && pixels > 0)
|
||||
pOutput->marginBottom = pixels;
|
||||
break;
|
||||
case DTPRINT_OPTION_MARGIN_LEFT:
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
marginString,
|
||||
XmHORIZONTAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
if (!xtParseError && pixels > 0)
|
||||
pOutput->marginLeft = pixels;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (!xtParseError)
|
||||
_poSetInnerPageDimensions(
|
||||
pOutput,
|
||||
pOutput->marginTop,
|
||||
pOutput->marginRight,
|
||||
pOutput->marginBottom,
|
||||
pOutput->marginLeft);
|
||||
else
|
||||
*parseError = TRUE;
|
||||
|
||||
XtFree(marginString);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputSetPageMargins
|
||||
* Set the contents of all the page margins
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputSetPageMargins(
|
||||
PrintOutput *pOutput,
|
||||
const char *top,
|
||||
const char *right,
|
||||
const char *bottom,
|
||||
const char *left,
|
||||
Boolean *parseError
|
||||
)
|
||||
{
|
||||
int pixels = 0;
|
||||
XtEnum xtParseError = FALSE;
|
||||
char *margin;
|
||||
|
||||
*parseError = FALSE;
|
||||
|
||||
margin = XtNewString(top);
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
margin,
|
||||
XmVERTICAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
XtFree(margin);
|
||||
if (!xtParseError && pixels > 0)
|
||||
{
|
||||
pOutput->marginTop = pixels;
|
||||
}
|
||||
else
|
||||
{
|
||||
*parseError = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
margin = XtNewString(right);
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
margin,
|
||||
XmHORIZONTAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
XtFree(margin);
|
||||
if (!xtParseError && pixels > 0)
|
||||
{
|
||||
pOutput->marginRight = pixels;
|
||||
}
|
||||
else
|
||||
{
|
||||
*parseError = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
margin = XtNewString(bottom);
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
margin,
|
||||
XmVERTICAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
XtFree(margin);
|
||||
if (!xtParseError && pixels > 0)
|
||||
{
|
||||
pOutput->marginBottom = pixels;
|
||||
}
|
||||
else
|
||||
{
|
||||
*parseError = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
margin = XtNewString(left);
|
||||
pixels = XmConvertStringToUnits(
|
||||
XtScreenOfObject(pOutput->pShell),
|
||||
margin,
|
||||
XmHORIZONTAL,
|
||||
XmPIXELS,
|
||||
&xtParseError);
|
||||
XtFree(margin);
|
||||
if (!xtParseError && pixels > 0)
|
||||
{
|
||||
pOutput->marginLeft = pixels;
|
||||
}
|
||||
else
|
||||
{
|
||||
*parseError = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
_poSetInnerPageDimensions(
|
||||
pOutput,
|
||||
pOutput->marginTop,
|
||||
pOutput->marginRight,
|
||||
pOutput->marginBottom,
|
||||
pOutput->marginLeft);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputSetWordWrap
|
||||
* Set the wrap to fit value in the editor
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputSetWordWrap(PrintOutput *pOutput, Boolean onoff)
|
||||
{
|
||||
#ifdef USE_DTEDITOR
|
||||
XtVaSetValues(pOutput->editor, DtNwordWrap, onoff, NULL);
|
||||
#else
|
||||
XtVaSetValues(pOutput->editor, XmNwordWrap, onoff, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputGetLinesPerPage
|
||||
* Returns the number of lines per page.
|
||||
************************************************************************/
|
||||
int
|
||||
PrintOutputGetLinesPerPage(PrintOutput *pOutput)
|
||||
{
|
||||
return ((int) pOutput->linesPerPage);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputGetNumLines
|
||||
* Returns the number of lines of test in the editor.
|
||||
************************************************************************/
|
||||
int
|
||||
PrintOutputGetNumLines(PrintOutput *pOutput)
|
||||
{
|
||||
int total = 0;
|
||||
int saveTop;
|
||||
|
||||
#ifdef USE_DTEDITOR
|
||||
saveTop = pOutput->currentLine;
|
||||
PrintOutputFirstPage(pOutput);
|
||||
while (PrintOutputPageDown(pOutput))
|
||||
total += pOutput->linesPerPage;
|
||||
|
||||
DtEditorGoToLine(pOutput->editor, saveTop);
|
||||
pOutput->currentLine = saveTop;
|
||||
#else
|
||||
XtVaGetValues(pOutput->editor, XmNtotalLines, &total, NULL);
|
||||
#endif
|
||||
return(total);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputPageUp
|
||||
************************************************************************/
|
||||
Boolean
|
||||
PrintOutputPageUp(PrintOutput *pOutput)
|
||||
{
|
||||
XmTextPosition top_before, top_after;
|
||||
Boolean retval;
|
||||
|
||||
#ifdef USE_DTEDITOR
|
||||
DtEditorGoToLine(
|
||||
pOutput->editor,
|
||||
pOutput->currentLine - pOutput->linesPerPage
|
||||
);
|
||||
pOutput->currentLine -= pOutput->linesPerPage;
|
||||
if (pOutput->currentLine < 1)
|
||||
{
|
||||
pOutput->currentLine = 1;
|
||||
retval = FALSE;
|
||||
}
|
||||
#else
|
||||
top_before = (XmTextPosition) _poGetTopPosition(pOutput);
|
||||
XmTextScroll(pOutput->editor, -1 * pOutput->linesPerPage);
|
||||
top_after = (XmTextPosition) _poGetTopPosition(pOutput);
|
||||
retval = (top_before > top_after) ? TRUE : FALSE;
|
||||
#endif
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputPageDown
|
||||
************************************************************************/
|
||||
Boolean
|
||||
PrintOutputPageDown(PrintOutput *pOutput)
|
||||
{
|
||||
XmTextPosition top_before, top_after;
|
||||
|
||||
top_before = (XmTextPosition) _poGetTopPosition(pOutput);
|
||||
|
||||
#ifdef USE_DTEDITOR
|
||||
DtEditorGoToLine(
|
||||
pOutput->editor,
|
||||
pOutput->currentLine + pOutput->linesPerPage
|
||||
);
|
||||
pOutput->currentLine += pOutput->linesPerPage;
|
||||
#else
|
||||
XmTextScroll(pOutput->editor, pOutput->linesPerPage);
|
||||
#endif
|
||||
|
||||
top_after = (XmTextPosition) _poGetTopPosition(pOutput);
|
||||
return (top_before < top_after) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputFirstPage
|
||||
************************************************************************/
|
||||
void
|
||||
PrintOutputFirstPage(PrintOutput *pOutput)
|
||||
{
|
||||
#ifdef USE_DTEDITOR
|
||||
XtVaSetValues(pOutput->editor, DtNtopCharacter, (XmTextPosition) 0, NULL);
|
||||
pOutput->currentLine = 1;
|
||||
#else
|
||||
XmTextSetTopCharacter(pOutput->editor, (XmTextPosition) 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* PrintOutputLoadFile
|
||||
************************************************************************/
|
||||
DtEditorErrorCode
|
||||
PrintOutputLoadFile( PrintOutput *pOutput, char *file)
|
||||
{
|
||||
char *contents = NULL;
|
||||
DtEditorErrorCode errorCode;
|
||||
|
||||
#ifdef USE_DTEDITOR
|
||||
errorCode = DtEditorSetContentsFromFile(pOutput->editor, file);
|
||||
#else
|
||||
errorCode = _poGetFileContents(&contents, file);
|
||||
if (contents != NULL)
|
||||
{
|
||||
XmTextSetString(pOutput->editor, contents);
|
||||
free(contents);
|
||||
}
|
||||
#endif
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
************************************************************************
|
||||
*
|
||||
* Private class methods
|
||||
*
|
||||
* _poDoGetLinesPerPage - Returns number of rows in the editor.
|
||||
* _poSetInnerPageDimensions- Sets the XmN x,y,width,height of InnerPage.
|
||||
* _poGetTopPosition - Returns the position of the 1st visible char.
|
||||
* _poGetFileContents - Returns the contents of the specified file.
|
||||
* _poStripEmbeddedNulls - Removes any embedded NULLs (\0) in a
|
||||
* string of length 'length'. The removal
|
||||
* occurs in place, with 'length' set to the
|
||||
* new, stripped length. The resulting string
|
||||
* is terminated with a trailing NULL.
|
||||
*
|
||||
************************************************************************
|
||||
************************************************************************/
|
||||
|
||||
static int
|
||||
_poDoGetLinesPerPage(PrintOutput *pOutput)
|
||||
{
|
||||
Dimension lpp;
|
||||
|
||||
XtVaGetValues(pOutput->editor, XmNrows, &lpp, NULL);
|
||||
return ((int) lpp);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
_poSetInnerPageDimensions(
|
||||
PrintOutput *pOutput,
|
||||
Dimension top,
|
||||
Dimension right,
|
||||
Dimension bottom,
|
||||
Dimension left
|
||||
)
|
||||
{
|
||||
Dimension inner_height, inner_width, inner_x, inner_y,
|
||||
outer_height, outer_width,
|
||||
editor_height, footer_height, header_height;
|
||||
|
||||
XtVaGetValues(pOutput->page,
|
||||
XmNheight, &outer_height,
|
||||
XmNwidth, &outer_width,
|
||||
NULL);
|
||||
|
||||
XtVaGetValues(pOutput->headerLeft,
|
||||
XmNheight, &header_height,
|
||||
NULL);
|
||||
|
||||
XtVaGetValues(pOutput->footerLeft,
|
||||
XmNheight, &footer_height,
|
||||
NULL);
|
||||
|
||||
inner_x = left;
|
||||
inner_y = top;
|
||||
inner_height = (outer_height > (Dimension) (top + bottom)) ?
|
||||
(outer_height - (top + bottom)) :
|
||||
outer_height;
|
||||
inner_width = (outer_width > (Dimension) (left + right)) ?
|
||||
(outer_width - (left + right)) :
|
||||
outer_width;
|
||||
editor_height =
|
||||
(inner_height > (Dimension) (header_height + footer_height)) ?
|
||||
(inner_height - (header_height + footer_height)) :
|
||||
inner_height;
|
||||
|
||||
XtVaSetValues(pOutput->editor, XmNheight, editor_height, NULL);
|
||||
|
||||
XtVaSetValues(pOutput->innerPage,
|
||||
XmNleftAttachment, XmATTACH_NONE,
|
||||
XmNtopAttachment, XmATTACH_NONE,
|
||||
XmNx, inner_x,
|
||||
XmNy, inner_y,
|
||||
XmNheight, inner_height,
|
||||
XmNwidth, inner_width,
|
||||
NULL);
|
||||
|
||||
pOutput->linesPerPage = _poDoGetLinesPerPage(pOutput);
|
||||
}
|
||||
|
||||
/*
|
||||
* _poGetTopPosition
|
||||
*/
|
||||
static int
|
||||
_poGetTopPosition(PrintOutput *pOutput)
|
||||
{
|
||||
XmTextPosition top = (XmTextPosition) 0;
|
||||
|
||||
#ifdef USE_DTEDITOR
|
||||
XtVaGetValues(pOutput->editor, DtNtopCharacter, &top, NULL);
|
||||
#else
|
||||
top = XmTextGetTopCharacter(pOutput->editor);
|
||||
#endif
|
||||
return (int) top;
|
||||
}
|
||||
|
||||
static DtEditorErrorCode
|
||||
_poGetFileContents(char **contents, char *file)
|
||||
{
|
||||
DtEditorErrorCode error = DtEDITOR_NO_ERRORS;
|
||||
struct stat statbuf;
|
||||
char *buf;
|
||||
int nbytes;
|
||||
FILE *fp = NULL;
|
||||
|
||||
if (file == NULL || *file == NULL) return
|
||||
|
||||
/*
|
||||
* Open the file for reading.
|
||||
*/
|
||||
error = _poEditorValidateFileAccess(file, READ_ACCESS);
|
||||
if (error != DtEDITOR_NO_ERRORS) return error;
|
||||
|
||||
if( (fp = fopen(file, "r")) == NULL )
|
||||
return DtEDITOR_UNREADABLE_FILE;
|
||||
|
||||
stat(file, &statbuf);
|
||||
nbytes = statbuf.st_size;
|
||||
|
||||
/*
|
||||
* Read the file contents (with room for null) & convert to a
|
||||
* string. We want to use a string because the
|
||||
* DtEditorSetContents/Append/Insert/... functions create another
|
||||
* copy of the data before actually putting it into the widget.
|
||||
*/
|
||||
buf = (char *) malloc(nbytes + 1);
|
||||
if (buf == NULL)
|
||||
return DtEDITOR_INSUFFICIENT_MEMORY;
|
||||
|
||||
nbytes = fread(buf, sizeof(char), nbytes, fp);
|
||||
buf[nbytes] = '\0';
|
||||
|
||||
/*
|
||||
* Strip out any embedded NULLs because the text widget will only
|
||||
* accept data up to the first NULL.
|
||||
*/
|
||||
error = _poStripEmbeddedNulls(buf, &nbytes);
|
||||
|
||||
/* Close the file */
|
||||
fclose(fp);
|
||||
|
||||
*contents = buf;
|
||||
return error;
|
||||
} /* end LoadFile */
|
||||
|
||||
static DtEditorErrorCode
|
||||
_poStripEmbeddedNulls(char *strbuf, int *len)
|
||||
{
|
||||
DtEditorErrorCode retval = DtEDITOR_NO_ERRORS;
|
||||
|
||||
if (strlen(strbuf) != *len)
|
||||
{
|
||||
int firstNull;
|
||||
|
||||
retval = DtEDITOR_NULLS_REMOVED;
|
||||
|
||||
/*
|
||||
* The file contains NULL characters, so we strip them out and
|
||||
* report that we have done so.
|
||||
*/
|
||||
while((firstNull = strlen(strbuf)) != *len)
|
||||
{
|
||||
int lastNull = firstNull;
|
||||
|
||||
while((lastNull+1) < *len && strbuf[lastNull+1] == (char)'\0')
|
||||
lastNull++;
|
||||
|
||||
memcpy(&strbuf[firstNull], &strbuf[lastNull+1], *len-lastNull);
|
||||
*len -= 1 + lastNull - firstNull;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern DtEditorErrorCode
|
||||
_poEditorValidateFileAccess( char *file, int accessType )
|
||||
{
|
||||
struct stat statbuf;
|
||||
unsigned short tmpMode;
|
||||
|
||||
if (file && *file ) return DtEDITOR_INVALID_FILENAME;
|
||||
|
||||
if (access(file, F_OK) != 0) return DtEDITOR_NONEXISTENT_FILE;
|
||||
|
||||
if( stat(file, &statbuf) != 0 ) return DtEDITOR_NO_FILE_ACCESS;
|
||||
|
||||
if( (statbuf.st_mode & S_IFMT) == S_IFDIR ) return DtEDITOR_DIRECTORY;
|
||||
|
||||
if( (statbuf.st_mode & S_IFMT) == S_IFCHR ) return DtEDITOR_CHAR_SPECIAL_FILE;
|
||||
|
||||
if((statbuf.st_mode & S_IFMT) == S_IFBLK) return DtEDITOR_BLOCK_MODE_FILE;
|
||||
|
||||
switch( accessType )
|
||||
{
|
||||
case READ_ACCESS:
|
||||
if (access(file, R_OK) != 0) return DtEDITOR_UNREADABLE_FILE;
|
||||
break;
|
||||
case WRITE_ACCESS:
|
||||
if (access(file, W_OK) != 0) return DtEDITOR_UNWRITABLE_FILE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} /* end stat suceeded */
|
||||
|
||||
return DtEDITOR_NO_ERRORS;
|
||||
}
|
||||
Reference in New Issue
Block a user