1 /* $TOG: DmxPrintOutput.C /main/6 1997/07/07 13:57:21 mgreess $ */
8 * RESTRICTED CONFIDENTIAL INFORMATION:
10 * The information in this document is subject to special
11 * restrictions in a confidential disclosure agreement between
12 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
13 * document outside HP, IBM, Sun, USL, SCO, or Univel without
14 * Sun's specific written approval. This document and all copies
15 * and derivative works thereof must be returned or destroyed at
18 * Copyright 1994 Sun Microsystems, Inc. All rights reserved.
23 * Common Desktop Environment
25 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
26 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
27 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
28 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
29 * (c) Copyright 1995 Digital Equipment Corp.
30 * (c) Copyright 1995 Fujitsu Limited
31 * (c) Copyright 1995 Hitachi, Ltd.
34 * RESTRICTED RIGHTS LEGEND
36 *Use, duplication, or disclosure by the U.S. Government is subject to
37 *restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
38 *Technical Data and Computer Software clause in DFARS 252.227-7013. Rights
39 *for non-DOD U.S. Government Departments and Agencies are as set forth in
40 *FAR 52.227-19(c)(1,2).
42 *Hewlett-Packard Company, 3000 Hanover Street, Palo Alto, CA 94304 U.S.A.
43 *International Business Machines Corp., Route 100, Somers, NY 10589 U.S.A.
44 *Sun Microsystems, Inc., 2550 Garcia Avenue, Mountain View, CA 94043 U.S.A.
45 *Novell, Inc., 190 River Road, Summit, NJ 07901 U.S.A.
46 *Digital Equipment Corp., 111 Powdermill Road, Maynard, MA 01754, U.S.A.
47 *Fujitsu Limited, 1015, Kamikodanaka Nakahara-Ku, Kawasaki 211, Japan
48 *Hitachi, Ltd., 6, Kanda Surugadai 4-Chome, Chiyoda-ku, Tokyo 101, Japan
53 #include <X11/Intrinsic.h>
55 #include <Xm/DialogS.h>
60 #include <Dt/Editor.h>
63 #include "DmxPrintOutput.h"
64 #include "RoamMenuWindow.h"
67 // Used to initialize the top, right, bottom, and left margins
68 // between the outside edge of the page (_form) and the inner
69 // page that is written on.
71 const char *const DmxPrintOutput::_default_margin = ".5in";
73 DmxPrintOutput::DmxPrintOutput (
75 ) : UIComponent( "PrintOutput" )
78 DtMailBoolean parse_error;
83 w = XtVaCreateWidget("Page",
86 XmNresizePolicy, XmRESIZE_NONE,
91 w = XtVaCreateWidget("InnerPage",
94 XmNresizePolicy, XmRESIZE_NONE,
98 w = XtVaCreateManagedWidget("HeaderLeft",
101 XmNalignment, XmALIGNMENT_BEGINNING,
102 XmNleftAttachment, XmATTACH_FORM,
103 XmNtopAttachment, XmATTACH_FORM,
107 w = XtVaCreateManagedWidget("HeaderRight",
110 XmNalignment, XmALIGNMENT_END,
111 XmNrightAttachment, XmATTACH_FORM,
112 XmNleftAttachment, XmATTACH_WIDGET,
113 XmNleftWidget, _header_left,
114 XmNtopAttachment, XmATTACH_FORM,
118 w = XtVaCreateManagedWidget("Editor",
125 DtNscrollVertical, FALSE,
126 DtNscrollHorizontal, FALSE,
127 DtNshowStatusLine, FALSE,
129 XmNeditMode, XmMULTI_LINE_EDIT,
130 XmNleftAttachment, XmATTACH_FORM,
131 XmNrightAttachment, XmATTACH_FORM,
132 XmNtopAttachment, XmATTACH_WIDGET,
133 XmNtopWidget, _header_left,
137 w = XtVaCreateManagedWidget("FooterLeft",
140 XmNalignment, XmALIGNMENT_BEGINNING,
141 XmNleftAttachment, XmATTACH_FORM,
142 XmNbottomAttachment, XmATTACH_FORM,
146 w = XtVaCreateManagedWidget("FooterRight",
149 XmNalignment, XmALIGNMENT_END,
150 XmNleftAttachment, XmATTACH_WIDGET,
151 XmNleftWidget, _footer_left,
152 XmNrightAttachment, XmATTACH_FORM,
153 XmNbottomAttachment, XmATTACH_FORM,
159 XmNbottomAttachment, XmATTACH_WIDGET,
160 XmNbottomWidget, _footer_left,
163 installDestroyHandler();
164 XtManageChild(_inner_form);
165 XtManageChild(_form);
173 assert(!parse_error);
176 DmxPrintOutput::~DmxPrintOutput (void)
179 // Don't destroy anything here.
180 // The BasicComponent class takes care of destroying
185 void DmxPrintOutput::hideFooters (void)
187 XtUnmanageChild(_footer_left);
188 XtUnmanageChild(_footer_right);
189 XtVaSetValues(_editor, XmNbottomAttachment, XmATTACH_FORM, NULL);
192 void DmxPrintOutput::showFooters (void)
194 XtManageChild(_footer_left);
195 XtManageChild(_footer_right);
198 XmNbottomAttachment, XmATTACH_WIDGET,
199 XmNbottomWidget, _footer_left,
203 void DmxPrintOutput::hideHeaders (void)
205 XtUnmanageChild(_header_left);
206 XtUnmanageChild(_header_right);
207 XtVaSetValues(_editor, XmNtopAttachment, XmATTACH_FORM, NULL);
210 void DmxPrintOutput::showHeaders (void)
212 XtManageChild(_header_left);
213 XtManageChild(_header_right);
216 XmNtopAttachment, XmATTACH_WIDGET,
217 XmNtopWidget, _header_left,
223 DmxPrintOutput::setHdrFtrString (_DtPrintHdrFtrEnum which, char *label)
228 if (label == (char *) NULL)
233 case DTPRINT_OPTION_HEADER_LEFT:
236 case DTPRINT_OPTION_HEADER_RIGHT:
239 case DTPRINT_OPTION_FOOTER_LEFT:
242 case DTPRINT_OPTION_FOOTER_RIGHT:
246 // TBD: Need to log an error.
250 xms = XmStringCreateLocalized(label);
251 XtVaSetValues(w, XmNlabelString, xms, NULL);
256 DmxPrintOutput::setHdrFtrStrings (
267 xms = XmStringCreateLocalized(hdr_left);
268 XtVaSetValues(_header_left, XmNlabelString, xms, NULL);
274 xms = XmStringCreateLocalized(hdr_right);
275 XtVaSetValues(_header_right, XmNlabelString, xms, NULL);
281 xms = XmStringCreateLocalized(ftr_left);
282 XtVaSetValues(_footer_left, XmNlabelString, xms, NULL);
288 xms = XmStringCreateLocalized(ftr_right);
289 XtVaSetValues(_footer_right, XmNlabelString, xms, NULL);
295 DmxPrintOutput::setPageMargin (
296 _DtPrintMarginEnum which,
298 DtMailBoolean *parse_error
302 XtEnum xt_parse_error = FALSE;
303 char *marginstring = strdup(margin);
306 *parse_error = DTM_FALSE;
310 case DTPRINT_OPTION_MARGIN_TOP:
311 pixels = XmConvertStringToUnits(
312 XtScreenOfObject(_pshell),
317 if (!xt_parse_error && pixels > 0)
318 _margin_top = pixels;
320 case DTPRINT_OPTION_MARGIN_RIGHT:
321 pixels = XmConvertStringToUnits(
322 XtScreenOfObject(_pshell),
327 if (!xt_parse_error && pixels > 0)
328 _margin_right = pixels;
330 case DTPRINT_OPTION_MARGIN_BOTTOM:
331 _margin_bottom = pixels;
332 pixels = XmConvertStringToUnits(
333 XtScreenOfObject(_pshell),
338 if (!xt_parse_error && pixels > 0)
339 _margin_bottom = pixels;
341 case DTPRINT_OPTION_MARGIN_LEFT:
342 pixels = XmConvertStringToUnits(
343 XtScreenOfObject(_pshell),
348 if (!xt_parse_error && pixels > 0)
349 _margin_left = pixels;
352 // TBD: Need to log an error.
357 setInnerPageDimensions(
363 *parse_error = DTM_TRUE;
369 DmxPrintOutput::setPageMargin (_DtPrintMarginEnum which, int margin)
371 Dimension pixels = (Dimension) margin;
375 case DTPRINT_OPTION_MARGIN_TOP:
376 _margin_top = pixels;
378 case DTPRINT_OPTION_MARGIN_RIGHT:
379 _margin_right = pixels;
381 case DTPRINT_OPTION_MARGIN_BOTTOM:
382 _margin_bottom = pixels;
384 case DTPRINT_OPTION_MARGIN_LEFT:
385 _margin_left = pixels;
388 // TBD: Need to log an error.
392 setInnerPageDimensions(
400 DmxPrintOutput::setPageMargins (
405 DtMailBoolean *parse_error
409 XtEnum xt_parse_error = FALSE;
412 *parse_error = DTM_FALSE;
414 margin = strdup(top);
415 pixels = XmConvertStringToUnits(
416 XtScreenOfObject(_pshell),
422 if (!xt_parse_error && pixels > 0)
424 _margin_top = pixels;
428 *parse_error = DTM_TRUE;
432 margin = strdup(right);
433 pixels = XmConvertStringToUnits(
434 XtScreenOfObject(_pshell),
440 if (!xt_parse_error && pixels > 0)
442 _margin_right = pixels;
446 *parse_error = DTM_TRUE;
450 margin = strdup(bottom);
451 pixels = XmConvertStringToUnits(
452 XtScreenOfObject(_pshell),
458 if (!xt_parse_error && pixels > 0)
460 _margin_bottom = pixels;
464 *parse_error = DTM_TRUE;
468 margin = strdup(left);
469 pixels = XmConvertStringToUnits(
470 XtScreenOfObject(_pshell),
476 if (!xt_parse_error && pixels > 0)
478 _margin_left = pixels;
482 *parse_error = DTM_TRUE;
486 setInnerPageDimensions(
494 DmxPrintOutput::setPageMargins (
501 _margin_top = (top > 0) ? (Dimension) top : _margin_top;
502 _margin_right = (right > 0) ? (Dimension) right : _margin_right;
503 _margin_bottom = (bottom > 0) ? (Dimension) bottom : _margin_bottom;
504 _margin_left = (left > 0) ? (Dimension) left : _margin_left;
506 setInnerPageDimensions(
514 DmxPrintOutput::setWrapToFit (DtMailBoolean onoff)
517 XtVaSetValues(_editor, DtNwordWrap, onoff, NULL);
519 XtVaSetValues(_editor, XmNwordWrap, onoff, NULL);
525 int DmxPrintOutput::getCharactersPerLine ()
530 XtVaGetValues(_editor, DtNcolumns, &columns, NULL);
532 XtVaGetValues(_editor, XmNcolumns, &columns, NULL);
534 return((int) columns);
539 int DmxPrintOutput::getNumLines ()
545 XtVaGetValues(_editor, XmNtotalLines, &total, NULL);
547 // Correct for off by one error.
555 int DmxPrintOutput::getLastPosition ()
560 last = DtEditorGetLastPosition(_editor);
562 last = XmTextGetLastPosition(_editor);
567 int DmxPrintOutput::getTopPosition ()
572 XtVaGetValues(_editor, DtNtopCharacter, &top, NULL);
574 top = XmTextGetTopCharacter(_editor);
579 DtMailBoolean DmxPrintOutput::pageUp ()
581 XmTextPosition top_before, top_after;
586 top_before = XmTextGetTopCharacter(_editor);
587 XmTextScroll(_editor, -1 * _lines_per_page);
588 top_after = XmTextGetTopCharacter(_editor);
590 return (top_before > top_after) ? DTM_TRUE : DTM_FALSE;
594 DtMailBoolean DmxPrintOutput::pageDown ()
596 XmTextPosition top_before, top_after;
601 top_before = XmTextGetTopCharacter(_editor);
602 XmTextScroll(_editor, _lines_per_page);
603 top_after = XmTextGetTopCharacter(_editor);
605 return (top_before < top_after) ? DTM_TRUE : DTM_FALSE;
609 void DmxPrintOutput::setTopPosition ( int pos )
611 XmTextPosition top = (XmTextPosition) pos;
614 XtVaSetValues(_editor, DtNtopCharacter, top, NULL);
616 XmTextSetTopCharacter(_editor, top);
620 void DmxPrintOutput::appendContents (void* stream, char *contents)
622 DmxPrintOutput *thisOutput = (DmxPrintOutput *) stream;
625 DtEditorContentRec rec;
627 rec.type = DtEDITOR_TEXT;
628 rec.value.string = contents;
629 DtEditorInsert(thisOutput->_editor, &rec);
633 pos = XmTextGetLastPosition(thisOutput->_editor);
634 XmTextInsert(thisOutput->_editor, pos, contents);
638 void DmxPrintOutput::appendNewLine ()
640 #ifdef PRINT_TO_VIDEO
641 char *contents = "=========== NewLine ==========\n";
643 char *contents = "\n";
645 appendContents((XtPointer) this, contents);
648 void DmxPrintOutput::appendPageBreak ()
651 char *contents = "\n";
654 nlines = getNumLines();
655 missing = ((nlines % _lines_per_page) > 0) ?
656 (_lines_per_page - (nlines % _lines_per_page)) :
662 #ifdef PRINT_TO_VIDEO
663 for (int i=0; i<missing; i++)
667 sprintf(buffer, "Page Break Line: %d\n", i);
668 appendContents((XtPointer) this, buffer);
672 "Total Lines: %d; Lines Per Page: %d; Missing Lines: %d\n",
677 buf = (char *) malloc((missing * 2) + 1);
678 for (int i=0; i<missing; i++)
679 strcat(buf, contents);
681 appendContents(this, contents);
687 void DmxPrintOutput::clearContents (void)
690 DtEditorContentRec content;
692 content.type = DtEDITOR_TEXT;
693 rec.value.string = NULL;
694 status = DtEditorSetContents(my_text, &content);
696 XmTextSetString(_editor, "");
702 * Private class methods
705 DmxPrintOutput::doGetLinesPerPage ()
709 XtVaGetValues(_editor, XmNrows, &lpp, NULL);
715 DmxPrintOutput::setInnerPageDimensions (
722 Dimension inner_height, inner_width, inner_x, inner_y,
723 outer_height, outer_width,
724 editor_height, footer_height, header_height;
727 XmNheight, &outer_height,
728 XmNwidth, &outer_width,
731 XtVaGetValues(_header_left,
732 XmNheight, &header_height,
735 XtVaGetValues(_footer_left,
736 XmNheight, &footer_height,
741 inner_height = ((int) outer_height > (top + bottom)) ?
742 (outer_height - (top + bottom)) :
744 inner_width = ((int) outer_width > (left + right)) ?
745 (outer_width - (left + right)) :
747 editor_height = ((int) inner_height > (header_height + footer_height)) ?
748 (inner_height - (header_height + footer_height)) :
751 XtVaSetValues(_editor, XmNheight, editor_height, NULL);
753 XtVaSetValues(_inner_form,
754 XmNleftAttachment, XmATTACH_NONE,
755 XmNtopAttachment, XmATTACH_NONE,
758 XmNheight, inner_height,
759 XmNwidth, inner_width,
762 _lines_per_page = doGetLinesPerPage();