903 lines
24 KiB
C
903 lines
24 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: 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>
|
|
#if 0 && defined(PRINTING_SUPPORTED)
|
|
#include <Xm/Print.h>
|
|
#endif /* PRINTING_SUPPORTED */
|
|
#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 == 0);
|
|
|
|
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)
|
|
{
|
|
XtArgVal p;
|
|
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, &p, NULL);
|
|
total = (int)p;
|
|
#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)
|
|
{
|
|
XtArgVal lpp;
|
|
|
|
XtVaGetValues(pOutput->editor, XmNrows, &lpp, NULL);
|
|
return ((int) lpp);
|
|
}
|
|
|
|
|
|
static void
|
|
_poSetInnerPageDimensions(
|
|
PrintOutput *pOutput,
|
|
Dimension top,
|
|
Dimension right,
|
|
Dimension bottom,
|
|
Dimension left
|
|
)
|
|
{
|
|
XtArgVal outer_height0, outer_width0, footer_height0, header_height0;
|
|
Dimension inner_height, inner_width, inner_x, inner_y,
|
|
outer_height, outer_width,
|
|
editor_height, footer_height, header_height;
|
|
|
|
XtVaGetValues(pOutput->page,
|
|
XmNheight, &outer_height0,
|
|
XmNwidth, &outer_width0,
|
|
NULL);
|
|
|
|
XtVaGetValues(pOutput->headerLeft,
|
|
XmNheight, &header_height0,
|
|
NULL);
|
|
|
|
XtVaGetValues(pOutput->footerLeft,
|
|
XmNheight, &footer_height0,
|
|
NULL);
|
|
|
|
outer_height = (Dimension)outer_height0;
|
|
outer_width = (Dimension)outer_width0;
|
|
header_height = (Dimension)header_height0;
|
|
footer_height = (Dimension)footer_height0;
|
|
|
|
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 == '\0') 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;
|
|
|
|
if(stat(file, &statbuf) == -1) {
|
|
fclose(fp);
|
|
return DtEDITOR_UNREADABLE_FILE;
|
|
}
|
|
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) {
|
|
fclose(fp);
|
|
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;
|
|
}
|