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 librararies 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
73 #include <X11/Intrinsic.h>
75 #include <Xm/DialogS.h>
77 #include <Xm/ToggleB.h>
78 #include <Dt/PrintOptionsP.h>
81 #include "DmxPrintOptions.h"
83 #include "DtMailError.hh"
84 #include "dtmailopts.h"
85 #include "IndexedOptionMenuUiItem.hh"
88 #include "TextFieldUiItem.hh"
90 #define DMX_ARRAY_SIZE(ary) (sizeof((ary))/sizeof((ary)[0]))
92 static DmxpoPropKey hdrftr_keys[] =
94 { (int) DTPRINT_OPTION_HEADER_LEFT,
95 DMX_PROPKEY_HEADER_LEFT,
96 DMX_PROPVAL_SUBJECT_HEADER
98 { (int) DTPRINT_OPTION_HEADER_RIGHT,
99 DMX_PROPKEY_HEADER_RIGHT,
102 { (int) DTPRINT_OPTION_FOOTER_LEFT,
103 DMX_PROPKEY_FOOTER_LEFT,
104 DMX_PROPVAL_USER_NAME
106 { (int) DTPRINT_OPTION_FOOTER_RIGHT,
107 DMX_PROPKEY_FOOTER_RIGHT,
108 DMX_PROPVAL_PAGE_NUMBER
112 static DmxpoPropKey margin_keys[] =
114 { (int) DTPRINT_OPTION_MARGIN_TOP,
115 DMX_PROPKEY_MARGIN_TOP,
116 DMX_PROPVAL_DFLT_MARGIN
118 { (int) DTPRINT_OPTION_MARGIN_LEFT,
119 DMX_PROPKEY_MARGIN_LEFT,
120 DMX_PROPVAL_DFLT_MARGIN
122 { (int) DTPRINT_OPTION_MARGIN_BOTTOM,
123 DMX_PROPKEY_MARGIN_BOTTOM,
124 DMX_PROPVAL_DFLT_MARGIN
126 { (int) DTPRINT_OPTION_MARGIN_RIGHT,
127 DMX_PROPKEY_MARGIN_RIGHT,
128 DMX_PROPVAL_DFLT_MARGIN
132 static DmxpoPropValue hdrftr_values[] =
134 { (int) DMX_NONE_STRING,
138 { (int) DMX_CC_HEADER_STRING,
139 DMX_PROPVAL_CC_HEADER,
142 { (int) DMX_DATE_HEADER_STRING,
143 DMX_PROPVAL_DATE_HEADER,
146 { (int) DMX_FROM_HEADER_STRING,
147 DMX_PROPVAL_FROM_HEADER,
150 { (int) DMX_SUBJECT_HEADER_STRING,
151 DMX_PROPVAL_SUBJECT_HEADER,
152 22, 5, "Subject Header"
154 { (int) DMX_TO_HEADER_STRING,
155 DMX_PROPVAL_TO_HEADER,
158 { (int) DMX_PAGE_NUMBER_STRING,
159 DMX_PROPVAL_PAGE_NUMBER,
162 { (int) DMX_USER_NAME_STRING,
163 DMX_PROPVAL_USER_NAME,
168 static DmxpoPropValue prthdr_values[] =
170 { (int) DMX_PRINT_HEADERS_NONE,
173 { (int) DMX_PRINT_HEADERS_STANDARD,
174 DMX_PROPVAL_STANDARD,
176 { (int) DMX_PRINT_HEADERS_ABBREV,
177 DMX_PROPVAL_ABBREVIATED,
178 23, 3, "Abbreviated" },
179 { (int) DMX_PRINT_HEADERS_ALL,
184 static DmxpoPropValue msgsep_values[] =
186 { (int) DMX_SEPARATOR_NEW_LINE,
187 DMX_PROPVAL_NEW_LINE,
189 { (int) DMX_SEPARATOR_BLANK_LINE,
190 DMX_PROPVAL_BLANK_LINE,
191 24, 2, "Blank Line" },
192 { (int) DMX_SEPARATOR_CHARACTER_LINE,
193 DMX_PROPVAL_CHARACTER_LINE,
194 24, 3, "Character Line" },
195 { (int) DMX_SEPARATOR_PAGE_BREAK,
196 DMX_PROPVAL_PAGE_BREAK,
202 DmxPrintOptions::DmxPrintOptions (
204 ) : UIComponent( "PrintOptions" )
206 IndexedOptionMenu *iom = (IndexedOptionMenu *) NULL;
207 PropUiItem *pui = (PropUiItem *) NULL;
208 Widget *menu_buttons, w;
214 _iom_array = new DtVirtArray<IndexedOptionMenu *>(10);
215 _propui_array = new DtVirtArray<PropUiItem *>(10);
216 _propui_array_iterator = 0;
220 // Create form to hold the printing options
222 _form = XtVaCreateWidget(
223 "PrintingOptionsPane",
226 XmNbottomAttachment, XmATTACH_FORM,
227 XmNrightAttachment, XmATTACH_FORM,
228 XmNleftAttachment, XmATTACH_FORM,
229 XmNtopAttachment, XmATTACH_FORM,
230 XmNresizePolicy, XmRESIZE_ANY,
233 if (_form == (Widget) NULL) return;
235 installDestroyHandler();
238 // Create GUI for the Header/Footer options
240 nitems = DMX_ARRAY_SIZE(hdrftr_values);;
241 strings = (char **) XtMalloc( nitems * sizeof(char*) );
242 data = (void **) XtMalloc( nitems * sizeof(void*) );
243 for (int i=0; i<nitems; i++)
245 data[i] = (void*) hdrftr_values[i].prop_string;
248 hdrftr_values[i].set_id,
249 hdrftr_values[i].msg_id,
250 hdrftr_values[i].dflt_string
254 _hdrftr_frame = _DtPrintCreateHdrFtrFrame( _form, nitems, strings, data);
257 XmNtopAttachment, XmATTACH_FORM,
258 XmNleftAttachment, XmATTACH_FORM,
261 XtManageChild(_hdrftr_frame);
264 // Create PropUiItem's for the Header/Footer options
267 _DtPrintHdrFtrFrameMenuWidgets( _hdrftr_frame, NULL, NULL, &menu_buttons);
268 for (int j=0, nhdrftrs=DMX_ARRAY_SIZE(hdrftr_keys); j<nhdrftrs; j++)
270 w = _DtPrintHdrFtrFrameEnumToWidget(
272 (_DtPrintHdrFtrEnum) hdrftr_keys[j].which
275 new IndexedOptionMenu(w, nitems, (char**)strings, data, menu_buttons);
277 _iom_array->append(iom);
279 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
284 _propui_array->append(pui);
286 XtFree((char*) menu_buttons);
287 XtFree((char*) data);
288 XtFree((char*) strings);
292 // Create GUI for the Margin options
294 _margin_frame = _DtPrintCreateMarginFrame(_form);
297 XmNtopAttachment, XmATTACH_WIDGET,
298 XmNtopWidget, _hdrftr_frame,
299 XmNleftAttachment, XmATTACH_FORM,
302 XtManageChild(_margin_frame);
305 // Create PropUiItem's for the Margin options
307 nitems = DMX_ARRAY_SIZE(margin_keys);
308 for (j=0; j<nitems; j++)
310 w = _DtPrintMarginFrameEnumToWidget(
312 (_DtPrintMarginEnum) margin_keys[j].which
314 pui = (PropUiItem *) new TextFieldUiItem(
318 DmxPrintOptions::isValidMarginSpec,
319 (void*) margin_keys[j].which);
320 _propui_array->append(pui);
325 // Create GUI for the Printed Headers option
327 nitems = DMX_ARRAY_SIZE(prthdr_values);;
328 strings = (char **) XtMalloc( nitems * sizeof(char*) );
329 data = (void **) XtMalloc( nitems * sizeof(void*) );
330 for (i=0; i<nitems; i++)
332 data[i] = (void*) prthdr_values[i].prop_string;
335 prthdr_values[i].set_id,
336 prthdr_values[i].msg_id,
337 prthdr_values[i].dflt_string
341 iom = new IndexedOptionMenu(_form, nitems, (char**) strings, data);
342 xms = XmStringCreateLocalized(
343 GETMSG(DT_catd, 25, 1, "Printed Message Headers: ")
348 XmNtopAttachment, XmATTACH_WIDGET,
349 XmNtopWidget, _margin_frame,
350 XmNrightAttachment, XmATTACH_FORM,
351 XmNleftAttachment, XmATTACH_FORM,
356 _iom_array->append(iom);
359 XtFree((char*) strings);
360 XtFree((char*) data);
363 // Create PropUiItem for the Printed Headers option
365 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
368 DMX_PROPKEY_PRINT_HEADERS
370 _propui_array->append(pui);
374 // Create GUI for the Message Separator option
376 nitems = DMX_ARRAY_SIZE(msgsep_values);;
377 strings = (char **) XtMalloc( nitems * sizeof(char*) );
378 data = (void **) XtMalloc( nitems * sizeof(void*) );
379 for (i=0; i<nitems; i++)
381 data[i] = (void*) msgsep_values[i].prop_string;
384 msgsep_values[i].set_id,
385 msgsep_values[i].msg_id,
386 msgsep_values[i].dflt_string
390 iom = new IndexedOptionMenu(_form, nitems, (char**) strings, data);
391 xms = XmStringCreateLocalized(
392 GETMSG( DT_catd, 25, 2, "Separate Multiple Messages With: ")
397 XmNtopAttachment, XmATTACH_WIDGET,
398 XmNtopWidget, _prthdr_iom->baseWidget(),
399 XmNrightAttachment, XmATTACH_FORM,
400 XmNleftAttachment, XmATTACH_FORM,
401 XmNbottomAttachment, XmATTACH_FORM,
405 _iom_array->append(iom);
409 XtFree((char*) strings);
410 XtFree((char*) data);
413 // Create PropUiItem for the Message Separator option
415 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
418 DMX_PROPKEY_MESSAGE_SEPARATOR);
419 _propui_array->append(pui);
421 //XtRealizeWidget(_w);
426 DmxPrintOptions::~DmxPrintOptions (void)
430 IndexedOptionMenu *iom;
433 for (i=0; i<_propui_array->length(); i++)
435 pui = (*_propui_array)[i];
440 for (i=0; i<_iom_array->length(); i++)
442 iom = (*_iom_array)[i];
451 DmxPrintOptions::getFirstProp(void)
453 _propui_array_iterator = 0;
454 return getNextProp();
458 DmxPrintOptions::getNextProp(void)
460 PropUiItem *pui = (PropUiItem *) NULL;
462 if (_propui_array_iterator < _propui_array->length())
464 pui = (*_propui_array)[_propui_array_iterator];
465 _propui_array_iterator++;
471 DmxPrintOptions::getNumProps(void)
473 return _propui_array->length();
477 DmxPrintOptions::getSeparatorString(void)
479 DtMail::Session *d_session = NULL;
480 DtMail::MailRc *m_rc = NULL;
482 const char *string = NULL;
485 d_session = theRoamApp.session()->session();
486 m_rc = d_session->mailRc(error);
488 m_rc->getValue(error, DMX_PROPKEY_SEPARATOR_STRING, &string);
489 if (string == NULL || error.isSet())
496 DmxPrintOptions::getHdrFtrSpec(_DtPrintHdrFtrEnum which)
498 DtMail::Session *d_session = NULL;
499 DtMail::MailRc *m_rc = NULL;
502 const char *string = NULL;
503 DmxpoPropValue *value = NULL;
504 DmxStringTypeEnum rtn = DMX_NONE_STRING;
506 d_session = theRoamApp.session()->session();
507 m_rc = d_session->mailRc(error);
509 key = DmxPrintOptions::enumToPropKey(
511 DMX_ARRAY_SIZE(hdrftr_keys),
517 m_rc->getValue(error, key->key , &string);
518 if (string == NULL || error.isSet())
519 string = strdup(key->dflt_prop_string);
524 value = stringToPropValue(
526 DMX_ARRAY_SIZE(hdrftr_values),
529 rtn = (DmxStringTypeEnum) value->which;
532 free((void*) string);
538 DmxPrintOptions::getMarginSpec(_DtPrintMarginEnum which)
540 DtMail::Session *d_session = NULL;
541 DtMail::MailRc *m_rc = NULL;
544 const char *string = NULL;
546 d_session = theRoamApp.session()->session();
547 m_rc = d_session->mailRc(error);
549 key = DmxPrintOptions::enumToPropKey(
551 DMX_ARRAY_SIZE(margin_keys),
556 return DMX_PROPVAL_DFLT_MARGIN;
558 m_rc->getValue(error, key->key , &string);
559 if (string == NULL || error.isSet())
560 string = strdup(key->dflt_prop_string);
566 DmxPrintOptions::getMessageSeparator(void)
568 DtMail::Session *d_session = NULL;
569 DtMail::MailRc *m_rc = NULL;
571 const char *string = NULL;
572 DmxpoPropValue *value = NULL;
573 DmxMsgSeparatorEnum rtn = DMX_SEPARATOR_PAGE_BREAK;
575 d_session = theRoamApp.session()->session();
576 m_rc = d_session->mailRc(error);
578 m_rc->getValue(error, DMX_PROPKEY_MESSAGE_SEPARATOR , &string);
579 if (string == NULL || error.isSet())
582 value = stringToPropValue(
584 DMX_ARRAY_SIZE(msgsep_values),
587 rtn = (DmxMsgSeparatorEnum) value->which;
590 free((void*) string);
596 DmxPrintOptions::getPrintedHeaders(void)
598 DtMail::Session *d_session = NULL;
599 DtMail::MailRc *m_rc = NULL;
601 const char *string = NULL;
602 DmxpoPropValue *value = NULL;
603 DmxPrintHeadersEnum rtn = DMX_PRINT_HEADERS_STANDARD;
605 d_session = theRoamApp.session()->session();
606 m_rc = d_session->mailRc(error);
608 m_rc->getValue(error, DMX_PROPKEY_PRINT_HEADERS , &string);
609 if (string == NULL || error.isSet())
612 value = stringToPropValue(
614 DMX_ARRAY_SIZE(prthdr_values),
617 rtn = (DmxPrintHeadersEnum) value->which;
620 free((void*) string);
626 DmxPrintOptions::enumToPropKey(int which, int nkeys, DmxpoPropKey *keys)
628 for (int i=0; i<nkeys; i++)
629 if (keys[i].which == which)
636 DmxPrintOptions::propKeyToPropItem(char *key)
638 for (int i=0; i<_propui_array->length(); i++)
643 pui = (*_propui_array)[i];
644 puikey = pui->getKey();
645 if (strcmp(puikey, key) == 0)
653 DmxPrintOptions::stringToPropValue(
656 DmxpoPropValue *values
659 for (int i=0; i<nvalues; i++)
660 if (strcmp(values[i].prop_string, string) == 0)
667 DmxPrintOptions::isValidMarginSpec(PropUiItem* pui, void* data)
671 char *marginSpec = NULL;
675 _DtPrintMarginEnum which = *((_DtPrintMarginEnum *) data);
677 _DtPrintMarginEnum which = (_DtPrintMarginEnum) data;
680 text = pui->getWidget();
682 marginSpec = _DtPrintGetMarginSpec(text);
685 if (marginSpec == NULL || strcmp("", marginSpec) == 0)
688 (void) XmConvertStringToUnits(
689 XtScreenOfObject(text),
695 if (! parseError) return NULL;
699 case DTPRINT_OPTION_MARGIN_TOP:
701 GETMSG(DT_catd, 26, 1, "Top Margin specifier is invalid: ");
703 case DTPRINT_OPTION_MARGIN_RIGHT:
705 GETMSG(DT_catd, 26, 2, "Right Margin specifier is invalid: ");
707 case DTPRINT_OPTION_MARGIN_BOTTOM:
709 GETMSG(DT_catd, 26, 3, "Bottom Margin specifier is invalid: ");
711 case DTPRINT_OPTION_MARGIN_LEFT:
713 GETMSG(DT_catd, 26, 4, "Left Margin specifier is invalid: ");
716 errMsg = (char*) XtMalloc(strlen(i18nMsg) + strlen(marginSpec) + 1);
717 sprintf(errMsg, "%s%s", i18nMsg, marginSpec);