2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: DmxPrintOptions.C /main/8 1997/04/30 09:44:12 mgreess $ */
28 * RESTRICTED CONFIDENTIAL INFORMATION:
30 * The information in this document is subject to special
31 * restrictions in a confidential disclosure agreement between
32 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
33 * document outside HP, IBM, Sun, USL, SCO, or Univel without
34 * Sun's specific written approval. This document and all copies
35 * and derivative works thereof must be returned or destroyed at
38 * Copyright 1994 Sun Microsystems, Inc. All rights reserved.
43 * Common Desktop Environment
45 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
46 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
47 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
48 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
49 * (c) Copyright 1995 Digital Equipment Corp.
50 * (c) Copyright 1995 Fujitsu Limited
51 * (c) Copyright 1995 Hitachi, Ltd.
54 * RESTRICTED RIGHTS LEGEND
56 *Use, duplication, or disclosure by the U.S. Government is subject to
57 *restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
58 *Technical Data and Computer Software clause in DFARS 252.227-7013. Rights
59 *for non-DOD U.S. Government Departments and Agencies are as set forth in
60 *FAR 52.227-19(c)(1,2).
62 *Hewlett-Packard Company, 3000 Hanover Street, Palo Alto, CA 94304 U.S.A.
63 *International Business Machines Corp., Route 100, Somers, NY 10589 U.S.A.
64 *Sun Microsystems, Inc., 2550 Garcia Avenue, Mountain View, CA 94043 U.S.A.
65 *Novell, Inc., 190 River Road, Summit, NJ 07901 U.S.A.
66 *Digital Equipment Corp., 111 Powdermill Road, Maynard, MA 01754, U.S.A.
67 *Fujitsu Limited, 1015, Kamikodanaka Nakahara-Ku, Kawasaki 211, Japan
68 *Hitachi, Ltd., 6, Kanda Surugadai 4-Chome, Chiyoda-ku, Tokyo 101, Japan
74 #include <X11/Intrinsic.h>
76 #include <Xm/DialogS.h>
78 #include <Xm/ToggleB.h>
79 #include <Dt/PrintOptionsP.h>
82 #include "DmxPrintOptions.h"
84 #include "DtMailError.hh"
85 #include "dtmailopts.h"
86 #include "IndexedOptionMenuUiItem.hh"
89 #include "TextFieldUiItem.hh"
91 #define DMX_ARRAY_SIZE(ary) (sizeof((ary))/sizeof((ary)[0]))
93 static DmxpoPropKey hdrftr_keys[] =
95 { (int) DTPRINT_OPTION_HEADER_LEFT,
96 DMX_PROPKEY_HEADER_LEFT,
97 DMX_PROPVAL_SUBJECT_HEADER
99 { (int) DTPRINT_OPTION_HEADER_RIGHT,
100 DMX_PROPKEY_HEADER_RIGHT,
103 { (int) DTPRINT_OPTION_FOOTER_LEFT,
104 DMX_PROPKEY_FOOTER_LEFT,
105 DMX_PROPVAL_USER_NAME
107 { (int) DTPRINT_OPTION_FOOTER_RIGHT,
108 DMX_PROPKEY_FOOTER_RIGHT,
109 DMX_PROPVAL_PAGE_NUMBER
113 static DmxpoPropKey margin_keys[] =
115 { (int) DTPRINT_OPTION_MARGIN_TOP,
116 DMX_PROPKEY_MARGIN_TOP,
117 DMX_PROPVAL_DFLT_MARGIN
119 { (int) DTPRINT_OPTION_MARGIN_LEFT,
120 DMX_PROPKEY_MARGIN_LEFT,
121 DMX_PROPVAL_DFLT_MARGIN
123 { (int) DTPRINT_OPTION_MARGIN_BOTTOM,
124 DMX_PROPKEY_MARGIN_BOTTOM,
125 DMX_PROPVAL_DFLT_MARGIN
127 { (int) DTPRINT_OPTION_MARGIN_RIGHT,
128 DMX_PROPKEY_MARGIN_RIGHT,
129 DMX_PROPVAL_DFLT_MARGIN
133 static DmxpoPropValue hdrftr_values[] =
135 { (int) DMX_NONE_STRING,
139 { (int) DMX_CC_HEADER_STRING,
140 DMX_PROPVAL_CC_HEADER,
143 { (int) DMX_DATE_HEADER_STRING,
144 DMX_PROPVAL_DATE_HEADER,
147 { (int) DMX_FROM_HEADER_STRING,
148 DMX_PROPVAL_FROM_HEADER,
151 { (int) DMX_SUBJECT_HEADER_STRING,
152 DMX_PROPVAL_SUBJECT_HEADER,
153 22, 5, "Subject Header"
155 { (int) DMX_TO_HEADER_STRING,
156 DMX_PROPVAL_TO_HEADER,
159 { (int) DMX_PAGE_NUMBER_STRING,
160 DMX_PROPVAL_PAGE_NUMBER,
163 { (int) DMX_USER_NAME_STRING,
164 DMX_PROPVAL_USER_NAME,
169 static DmxpoPropValue prthdr_values[] =
171 { (int) DMX_PRINT_HEADERS_NONE,
174 { (int) DMX_PRINT_HEADERS_STANDARD,
175 DMX_PROPVAL_STANDARD,
177 { (int) DMX_PRINT_HEADERS_ABBREV,
178 DMX_PROPVAL_ABBREVIATED,
179 23, 3, "Abbreviated" },
180 { (int) DMX_PRINT_HEADERS_ALL,
185 static DmxpoPropValue msgsep_values[] =
187 { (int) DMX_SEPARATOR_NEW_LINE,
188 DMX_PROPVAL_NEW_LINE,
190 { (int) DMX_SEPARATOR_BLANK_LINE,
191 DMX_PROPVAL_BLANK_LINE,
192 24, 2, "Blank Line" },
193 { (int) DMX_SEPARATOR_CHARACTER_LINE,
194 DMX_PROPVAL_CHARACTER_LINE,
195 24, 3, "Character Line" },
196 { (int) DMX_SEPARATOR_PAGE_BREAK,
197 DMX_PROPVAL_PAGE_BREAK,
203 DmxPrintOptions::DmxPrintOptions (
205 ) : UIComponent( "PrintOptions" )
207 IndexedOptionMenu *iom = (IndexedOptionMenu *) NULL;
208 PropUiItem *pui = (PropUiItem *) NULL;
209 Widget *menu_buttons, w;
216 _iom_array = new DtVirtArray<IndexedOptionMenu *>(10);
217 _propui_array = new DtVirtArray<PropUiItem *>(10);
218 _propui_array_iterator = 0;
221 _hdrftr_frame = NULL;
222 _margin_frame = NULL;
228 // Create form to hold the printing options
230 _form = XtVaCreateWidget(
231 "PrintingOptionsPane",
234 XmNbottomAttachment, XmATTACH_FORM,
235 XmNrightAttachment, XmATTACH_FORM,
236 XmNleftAttachment, XmATTACH_FORM,
237 XmNtopAttachment, XmATTACH_FORM,
238 XmNresizePolicy, XmRESIZE_ANY,
241 if (_form == (Widget) NULL) return;
243 installDestroyHandler();
246 // Create GUI for the Header/Footer options
248 nitems = DMX_ARRAY_SIZE(hdrftr_values);;
249 strings = (char **) XtMalloc( nitems * sizeof(char*) );
250 data = (void **) XtMalloc( nitems * sizeof(void*) );
251 for (i=0; i<nitems; i++)
253 data[i] = (void*) hdrftr_values[i].prop_string;
256 hdrftr_values[i].set_id,
257 hdrftr_values[i].msg_id,
258 hdrftr_values[i].dflt_string
262 _hdrftr_frame = _DtPrintCreateHdrFtrFrame( _form, nitems, strings, data);
265 XmNtopAttachment, XmATTACH_FORM,
266 XmNleftAttachment, XmATTACH_FORM,
269 XtManageChild(_hdrftr_frame);
272 // Create PropUiItem's for the Header/Footer options
275 _DtPrintHdrFtrFrameMenuWidgets( _hdrftr_frame, NULL, NULL, &menu_buttons);
276 for (j=0, nhdrftrs=DMX_ARRAY_SIZE(hdrftr_keys); j<nhdrftrs; j++)
278 w = _DtPrintHdrFtrFrameEnumToWidget(
280 (_DtPrintHdrFtrEnum) hdrftr_keys[j].which
283 new IndexedOptionMenu(w, nitems, (char**)strings, data, menu_buttons);
285 _iom_array->append(iom);
287 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
292 _propui_array->append(pui);
294 XtFree((char*) menu_buttons);
295 XtFree((char*) data);
296 XtFree((char*) strings);
300 // Create GUI for the Margin options
302 _margin_frame = _DtPrintCreateMarginFrame(_form);
305 XmNtopAttachment, XmATTACH_WIDGET,
306 XmNtopWidget, _hdrftr_frame,
307 XmNleftAttachment, XmATTACH_FORM,
310 XtManageChild(_margin_frame);
313 // Create PropUiItem's for the Margin options
315 nitems = DMX_ARRAY_SIZE(margin_keys);
316 for (j=0; j<nitems; j++)
318 w = _DtPrintMarginFrameEnumToWidget(
320 (_DtPrintMarginEnum) margin_keys[j].which
322 pui = (PropUiItem *) new TextFieldUiItem(
326 DmxPrintOptions::isValidMarginSpec,
327 (void*) (intptr_t) margin_keys[j].which);
328 _propui_array->append(pui);
333 // Create GUI for the Printed Headers option
335 nitems = DMX_ARRAY_SIZE(prthdr_values);;
336 strings = (char **) XtMalloc( nitems * sizeof(char*) );
337 data = (void **) XtMalloc( nitems * sizeof(void*) );
338 for (i=0; i<nitems; i++)
340 data[i] = (void*) prthdr_values[i].prop_string;
343 prthdr_values[i].set_id,
344 prthdr_values[i].msg_id,
345 prthdr_values[i].dflt_string
349 iom = new IndexedOptionMenu(_form, nitems, (char**) strings, data);
350 xms = XmStringCreateLocalized(
351 GETMSG(DT_catd, 25, 1, "Printed Message Headers: ")
356 XmNtopAttachment, XmATTACH_WIDGET,
357 XmNtopWidget, _margin_frame,
358 XmNrightAttachment, XmATTACH_FORM,
359 XmNleftAttachment, XmATTACH_FORM,
364 _iom_array->append(iom);
367 XtFree((char*) strings);
368 XtFree((char*) data);
371 // Create PropUiItem for the Printed Headers option
373 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
376 DMX_PROPKEY_PRINT_HEADERS
378 _propui_array->append(pui);
382 // Create GUI for the Message Separator option
384 nitems = DMX_ARRAY_SIZE(msgsep_values);;
385 strings = (char **) XtMalloc( nitems * sizeof(char*) );
386 data = (void **) XtMalloc( nitems * sizeof(void*) );
387 for (i=0; i<nitems; i++)
389 data[i] = (void*) msgsep_values[i].prop_string;
392 msgsep_values[i].set_id,
393 msgsep_values[i].msg_id,
394 msgsep_values[i].dflt_string
398 iom = new IndexedOptionMenu(_form, nitems, (char**) strings, data);
399 xms = XmStringCreateLocalized(
400 GETMSG( DT_catd, 25, 2, "Separate Multiple Messages With: ")
405 XmNtopAttachment, XmATTACH_WIDGET,
406 XmNtopWidget, _prthdr_iom->baseWidget(),
407 XmNrightAttachment, XmATTACH_FORM,
408 XmNleftAttachment, XmATTACH_FORM,
409 XmNbottomAttachment, XmATTACH_FORM,
413 _iom_array->append(iom);
417 XtFree((char*) strings);
418 XtFree((char*) data);
421 // Create PropUiItem for the Message Separator option
423 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
426 DMX_PROPKEY_MESSAGE_SEPARATOR);
427 _propui_array->append(pui);
429 //XtRealizeWidget(_w);
434 DmxPrintOptions::~DmxPrintOptions (void)
438 IndexedOptionMenu *iom;
441 for (i=0; i<_propui_array->length(); i++)
443 pui = (*_propui_array)[i];
448 for (i=0; i<_iom_array->length(); i++)
450 iom = (*_iom_array)[i];
459 DmxPrintOptions::getFirstProp(void)
461 _propui_array_iterator = 0;
462 return getNextProp();
466 DmxPrintOptions::getNextProp(void)
468 PropUiItem *pui = (PropUiItem *) NULL;
470 if (_propui_array_iterator < _propui_array->length())
472 pui = (*_propui_array)[_propui_array_iterator];
473 _propui_array_iterator++;
479 DmxPrintOptions::getNumProps(void)
481 return _propui_array->length();
485 DmxPrintOptions::getSeparatorString(void)
487 DtMail::Session *d_session = NULL;
488 DtMail::MailRc *m_rc = NULL;
490 const char *string = NULL;
493 d_session = theRoamApp.session()->session();
494 m_rc = d_session->mailRc(error);
496 m_rc->getValue(error, DMX_PROPKEY_SEPARATOR_STRING, &string);
497 if (string == NULL || error.isSet())
504 DmxPrintOptions::getHdrFtrSpec(_DtPrintHdrFtrEnum which)
506 DtMail::Session *d_session = NULL;
507 DtMail::MailRc *m_rc = NULL;
510 const char *string = NULL;
511 DmxpoPropValue *value = NULL;
512 DmxStringTypeEnum rtn = DMX_NONE_STRING;
514 d_session = theRoamApp.session()->session();
515 m_rc = d_session->mailRc(error);
517 key = DmxPrintOptions::enumToPropKey(
519 DMX_ARRAY_SIZE(hdrftr_keys),
525 m_rc->getValue(error, key->key , &string);
526 if (string == NULL || error.isSet())
527 string = strdup(key->dflt_prop_string);
532 value = stringToPropValue(
534 DMX_ARRAY_SIZE(hdrftr_values),
537 rtn = (DmxStringTypeEnum) value->which;
540 free((void*) string);
546 DmxPrintOptions::getMarginSpec(_DtPrintMarginEnum which)
548 DtMail::Session *d_session = NULL;
549 DtMail::MailRc *m_rc = NULL;
552 const char *string = NULL;
554 d_session = theRoamApp.session()->session();
555 m_rc = d_session->mailRc(error);
557 key = DmxPrintOptions::enumToPropKey(
559 DMX_ARRAY_SIZE(margin_keys),
564 return DMX_PROPVAL_DFLT_MARGIN;
566 m_rc->getValue(error, key->key , &string);
567 if (string == NULL || error.isSet())
568 string = strdup(key->dflt_prop_string);
574 DmxPrintOptions::getMessageSeparator(void)
576 DtMail::Session *d_session = NULL;
577 DtMail::MailRc *m_rc = NULL;
579 const char *string = NULL;
580 DmxpoPropValue *value = NULL;
581 DmxMsgSeparatorEnum rtn = DMX_SEPARATOR_PAGE_BREAK;
583 d_session = theRoamApp.session()->session();
584 m_rc = d_session->mailRc(error);
586 m_rc->getValue(error, DMX_PROPKEY_MESSAGE_SEPARATOR , &string);
587 if (string == NULL || error.isSet())
590 value = stringToPropValue(
592 DMX_ARRAY_SIZE(msgsep_values),
595 rtn = (DmxMsgSeparatorEnum) value->which;
598 free((void*) string);
604 DmxPrintOptions::getPrintedHeaders(void)
606 DtMail::Session *d_session = NULL;
607 DtMail::MailRc *m_rc = NULL;
609 const char *string = NULL;
610 DmxpoPropValue *value = NULL;
611 DmxPrintHeadersEnum rtn = DMX_PRINT_HEADERS_STANDARD;
613 d_session = theRoamApp.session()->session();
614 m_rc = d_session->mailRc(error);
616 m_rc->getValue(error, DMX_PROPKEY_PRINT_HEADERS , &string);
617 if (string == NULL || error.isSet())
620 value = stringToPropValue(
622 DMX_ARRAY_SIZE(prthdr_values),
625 rtn = (DmxPrintHeadersEnum) value->which;
628 free((void*) string);
634 DmxPrintOptions::enumToPropKey(int which, int nkeys, DmxpoPropKey *keys)
636 for (int i=0; i<nkeys; i++)
637 if (keys[i].which == which)
644 DmxPrintOptions::propKeyToPropItem(char *key)
646 for (int i=0; i<_propui_array->length(); i++)
651 pui = (*_propui_array)[i];
652 puikey = pui->getKey();
653 if (strcmp(puikey, key) == 0)
661 DmxPrintOptions::stringToPropValue(
664 DmxpoPropValue *values
667 for (int i=0; i<nvalues; i++)
668 if (strcmp(values[i].prop_string, string) == 0)
675 DmxPrintOptions::isValidMarginSpec(PropUiItem* pui, void* data)
679 char *marginSpec = NULL;
683 _DtPrintMarginEnum which = (_DtPrintMarginEnum)(long)data;
685 text = pui->getWidget();
687 marginSpec = _DtPrintGetMarginSpec(text);
690 if (marginSpec == NULL || strcmp("", marginSpec) == 0)
693 (void) XmConvertStringToUnits(
694 XtScreenOfObject(text),
700 if (! parseError) return NULL;
704 case DTPRINT_OPTION_MARGIN_TOP:
706 GETMSG(DT_catd, 26, 1, "Top Margin specifier is invalid: ");
708 case DTPRINT_OPTION_MARGIN_RIGHT:
710 GETMSG(DT_catd, 26, 2, "Right Margin specifier is invalid: ");
712 case DTPRINT_OPTION_MARGIN_BOTTOM:
714 GETMSG(DT_catd, 26, 3, "Bottom Margin specifier is invalid: ");
716 case DTPRINT_OPTION_MARGIN_LEFT:
718 GETMSG(DT_catd, 26, 4, "Left Margin specifier is invalid: ");
721 errMsg = (char*) XtMalloc(strlen(i18nMsg) + strlen(marginSpec) + 1);
722 sprintf(errMsg, "%s%s", i18nMsg, marginSpec);