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
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;
223 // Create form to hold the printing options
225 _form = XtVaCreateWidget(
226 "PrintingOptionsPane",
229 XmNbottomAttachment, XmATTACH_FORM,
230 XmNrightAttachment, XmATTACH_FORM,
231 XmNleftAttachment, XmATTACH_FORM,
232 XmNtopAttachment, XmATTACH_FORM,
233 XmNresizePolicy, XmRESIZE_ANY,
236 if (_form == (Widget) NULL) return;
238 installDestroyHandler();
241 // Create GUI for the Header/Footer options
243 nitems = DMX_ARRAY_SIZE(hdrftr_values);;
244 strings = (char **) XtMalloc( nitems * sizeof(char*) );
245 data = (void **) XtMalloc( nitems * sizeof(void*) );
246 for (i=0; i<nitems; i++)
248 data[i] = (void*) hdrftr_values[i].prop_string;
251 hdrftr_values[i].set_id,
252 hdrftr_values[i].msg_id,
253 hdrftr_values[i].dflt_string
257 _hdrftr_frame = _DtPrintCreateHdrFtrFrame( _form, nitems, strings, data);
260 XmNtopAttachment, XmATTACH_FORM,
261 XmNleftAttachment, XmATTACH_FORM,
264 XtManageChild(_hdrftr_frame);
267 // Create PropUiItem's for the Header/Footer options
270 _DtPrintHdrFtrFrameMenuWidgets( _hdrftr_frame, NULL, NULL, &menu_buttons);
271 for (j=0, nhdrftrs=DMX_ARRAY_SIZE(hdrftr_keys); j<nhdrftrs; j++)
273 w = _DtPrintHdrFtrFrameEnumToWidget(
275 (_DtPrintHdrFtrEnum) hdrftr_keys[j].which
278 new IndexedOptionMenu(w, nitems, (char**)strings, data, menu_buttons);
280 _iom_array->append(iom);
282 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
287 _propui_array->append(pui);
289 XtFree((char*) menu_buttons);
290 XtFree((char*) data);
291 XtFree((char*) strings);
295 // Create GUI for the Margin options
297 _margin_frame = _DtPrintCreateMarginFrame(_form);
300 XmNtopAttachment, XmATTACH_WIDGET,
301 XmNtopWidget, _hdrftr_frame,
302 XmNleftAttachment, XmATTACH_FORM,
305 XtManageChild(_margin_frame);
308 // Create PropUiItem's for the Margin options
310 nitems = DMX_ARRAY_SIZE(margin_keys);
311 for (j=0; j<nitems; j++)
313 w = _DtPrintMarginFrameEnumToWidget(
315 (_DtPrintMarginEnum) margin_keys[j].which
317 pui = (PropUiItem *) new TextFieldUiItem(
321 DmxPrintOptions::isValidMarginSpec,
322 (void*) (intptr_t) margin_keys[j].which);
323 _propui_array->append(pui);
328 // Create GUI for the Printed Headers option
330 nitems = DMX_ARRAY_SIZE(prthdr_values);;
331 strings = (char **) XtMalloc( nitems * sizeof(char*) );
332 data = (void **) XtMalloc( nitems * sizeof(void*) );
333 for (i=0; i<nitems; i++)
335 data[i] = (void*) prthdr_values[i].prop_string;
338 prthdr_values[i].set_id,
339 prthdr_values[i].msg_id,
340 prthdr_values[i].dflt_string
344 iom = new IndexedOptionMenu(_form, nitems, (char**) strings, data);
345 xms = XmStringCreateLocalized(
346 GETMSG(DT_catd, 25, 1, "Printed Message Headers: ")
351 XmNtopAttachment, XmATTACH_WIDGET,
352 XmNtopWidget, _margin_frame,
353 XmNrightAttachment, XmATTACH_FORM,
354 XmNleftAttachment, XmATTACH_FORM,
359 _iom_array->append(iom);
362 XtFree((char*) strings);
363 XtFree((char*) data);
366 // Create PropUiItem for the Printed Headers option
368 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
371 DMX_PROPKEY_PRINT_HEADERS
373 _propui_array->append(pui);
377 // Create GUI for the Message Separator option
379 nitems = DMX_ARRAY_SIZE(msgsep_values);;
380 strings = (char **) XtMalloc( nitems * sizeof(char*) );
381 data = (void **) XtMalloc( nitems * sizeof(void*) );
382 for (i=0; i<nitems; i++)
384 data[i] = (void*) msgsep_values[i].prop_string;
387 msgsep_values[i].set_id,
388 msgsep_values[i].msg_id,
389 msgsep_values[i].dflt_string
393 iom = new IndexedOptionMenu(_form, nitems, (char**) strings, data);
394 xms = XmStringCreateLocalized(
395 GETMSG( DT_catd, 25, 2, "Separate Multiple Messages With: ")
400 XmNtopAttachment, XmATTACH_WIDGET,
401 XmNtopWidget, _prthdr_iom->baseWidget(),
402 XmNrightAttachment, XmATTACH_FORM,
403 XmNleftAttachment, XmATTACH_FORM,
404 XmNbottomAttachment, XmATTACH_FORM,
408 _iom_array->append(iom);
412 XtFree((char*) strings);
413 XtFree((char*) data);
416 // Create PropUiItem for the Message Separator option
418 pui = (PropUiItem *) new IndexedOptionMenuUiItem(
421 DMX_PROPKEY_MESSAGE_SEPARATOR);
422 _propui_array->append(pui);
424 //XtRealizeWidget(_w);
429 DmxPrintOptions::~DmxPrintOptions (void)
433 IndexedOptionMenu *iom;
436 for (i=0; i<_propui_array->length(); i++)
438 pui = (*_propui_array)[i];
443 for (i=0; i<_iom_array->length(); i++)
445 iom = (*_iom_array)[i];
454 DmxPrintOptions::getFirstProp(void)
456 _propui_array_iterator = 0;
457 return getNextProp();
461 DmxPrintOptions::getNextProp(void)
463 PropUiItem *pui = (PropUiItem *) NULL;
465 if (_propui_array_iterator < _propui_array->length())
467 pui = (*_propui_array)[_propui_array_iterator];
468 _propui_array_iterator++;
474 DmxPrintOptions::getNumProps(void)
476 return _propui_array->length();
480 DmxPrintOptions::getSeparatorString(void)
482 DtMail::Session *d_session = NULL;
483 DtMail::MailRc *m_rc = NULL;
485 const char *string = NULL;
488 d_session = theRoamApp.session()->session();
489 m_rc = d_session->mailRc(error);
491 m_rc->getValue(error, DMX_PROPKEY_SEPARATOR_STRING, &string);
492 if (string == NULL || error.isSet())
499 DmxPrintOptions::getHdrFtrSpec(_DtPrintHdrFtrEnum which)
501 DtMail::Session *d_session = NULL;
502 DtMail::MailRc *m_rc = NULL;
505 const char *string = NULL;
506 DmxpoPropValue *value = NULL;
507 DmxStringTypeEnum rtn = DMX_NONE_STRING;
509 d_session = theRoamApp.session()->session();
510 m_rc = d_session->mailRc(error);
512 key = DmxPrintOptions::enumToPropKey(
514 DMX_ARRAY_SIZE(hdrftr_keys),
520 m_rc->getValue(error, key->key , &string);
521 if (string == NULL || error.isSet())
522 string = strdup(key->dflt_prop_string);
527 value = stringToPropValue(
529 DMX_ARRAY_SIZE(hdrftr_values),
532 rtn = (DmxStringTypeEnum) value->which;
535 free((void*) string);
541 DmxPrintOptions::getMarginSpec(_DtPrintMarginEnum which)
543 DtMail::Session *d_session = NULL;
544 DtMail::MailRc *m_rc = NULL;
547 const char *string = NULL;
549 d_session = theRoamApp.session()->session();
550 m_rc = d_session->mailRc(error);
552 key = DmxPrintOptions::enumToPropKey(
554 DMX_ARRAY_SIZE(margin_keys),
559 return DMX_PROPVAL_DFLT_MARGIN;
561 m_rc->getValue(error, key->key , &string);
562 if (string == NULL || error.isSet())
563 string = strdup(key->dflt_prop_string);
569 DmxPrintOptions::getMessageSeparator(void)
571 DtMail::Session *d_session = NULL;
572 DtMail::MailRc *m_rc = NULL;
574 const char *string = NULL;
575 DmxpoPropValue *value = NULL;
576 DmxMsgSeparatorEnum rtn = DMX_SEPARATOR_PAGE_BREAK;
578 d_session = theRoamApp.session()->session();
579 m_rc = d_session->mailRc(error);
581 m_rc->getValue(error, DMX_PROPKEY_MESSAGE_SEPARATOR , &string);
582 if (string == NULL || error.isSet())
585 value = stringToPropValue(
587 DMX_ARRAY_SIZE(msgsep_values),
590 rtn = (DmxMsgSeparatorEnum) value->which;
593 free((void*) string);
599 DmxPrintOptions::getPrintedHeaders(void)
601 DtMail::Session *d_session = NULL;
602 DtMail::MailRc *m_rc = NULL;
604 const char *string = NULL;
605 DmxpoPropValue *value = NULL;
606 DmxPrintHeadersEnum rtn = DMX_PRINT_HEADERS_STANDARD;
608 d_session = theRoamApp.session()->session();
609 m_rc = d_session->mailRc(error);
611 m_rc->getValue(error, DMX_PROPKEY_PRINT_HEADERS , &string);
612 if (string == NULL || error.isSet())
615 value = stringToPropValue(
617 DMX_ARRAY_SIZE(prthdr_values),
620 rtn = (DmxPrintHeadersEnum) value->which;
623 free((void*) string);
629 DmxPrintOptions::enumToPropKey(int which, int nkeys, DmxpoPropKey *keys)
631 for (int i=0; i<nkeys; i++)
632 if (keys[i].which == which)
639 DmxPrintOptions::propKeyToPropItem(char *key)
641 for (int i=0; i<_propui_array->length(); i++)
646 pui = (*_propui_array)[i];
647 puikey = pui->getKey();
648 if (strcmp(puikey, key) == 0)
656 DmxPrintOptions::stringToPropValue(
659 DmxpoPropValue *values
662 for (int i=0; i<nvalues; i++)
663 if (strcmp(values[i].prop_string, string) == 0)
670 DmxPrintOptions::isValidMarginSpec(PropUiItem* pui, void* data)
674 char *marginSpec = NULL;
678 _DtPrintMarginEnum which = (_DtPrintMarginEnum)(long)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);