1 /* $XConsortium: PrinterBox.c /main/10 1996/11/20 12:59:48 cde-hp $ */
6 * (c) Copyright 1996 Digital Equipment Corporation.
7 * (c) Copyright 1996 Hewlett-Packard Company.
8 * (c) Copyright 1996 International Business Machines Corp.
9 * (c) Copyright 1996 Sun Microsystems, Inc.
10 * (c) Copyright 1996 Novell, Inc.
11 * (c) Copyright 1996 FUJITSU LIMITED.
12 * (c) Copyright 1996 Hitachi.
15 #include <Dt/DtNlUtils.h>
17 #include "PrinterBox.h"
21 #ifndef CDE_INSTALLATION_TOP
22 #define CDE_INSTALLATION_TOP "/usr/dt"
25 #define ICON_INSTALL_DIR CDE_INSTALLATION_TOP "/appconfig/icons/C/"
28 # define MAX(a, b) ((a) > (b) ? (a) : (b))
32 * PrinterBox-specific data - PdmSetupBox.subclass_data
39 struct _OrientCtl* orient_ctl;
40 struct _PlexCtl* plex_ctl;
41 struct _TrayCtl* tray_ctl;
42 struct _SizeCtl* size_ctl;
46 const char* printer_model;
47 char* document_format;
49 PdmOidList* document_attrs_supported;
51 PdmOidList* orientations_supported;
54 PdmOidList* plexes_supported;
57 PdmOid default_input_tray;
58 PdmOid default_medium;
60 PdmOidList* input_trays;
61 PdmOidList* tray_sizes;
62 PdmOidLinkedList* sizes_supported;
67 * orientations control
69 typedef struct _OrientCtl
78 const PdmOidList* orientations_supported;
79 PdmOidList* dummy_orientations_supported;
81 struct _PdmPixmapList* pixmap_list;
82 struct _PdmPixmapList* i_pixmap_list;
84 struct _PlexCtl* plex_ctl;
91 typedef struct _PlexCtl
100 const PdmOidList* plexes_supported;
101 PdmOidList* dummy_plexes_supported;
103 struct _PdmPixmapList** pixmap_list_ptr;
104 struct _PdmPixmapList* portrait_pixmap_list;
105 struct _PdmPixmapList* landscape_pixmap_list;
107 struct _PdmPixmapList** i_pixmap_list_ptr;
108 struct _PdmPixmapList* i_portrait_pixmap_list;
109 struct _PdmPixmapList* i_landscape_pixmap_list;
114 * input trays control
116 typedef struct _TrayCtl
124 const PdmOidList* input_trays;
125 const PdmOidList* tray_sizes;
127 struct _SizeCtl* size_ctl;
134 typedef struct _SizeCtlSortRec
138 } SizeCtlSortRec, *SizeCtlSortList;
140 typedef struct _SizeCtl
147 Widget supported_radio;
149 PdmOidList* sizes_ready;
150 PdmOidList* sizes_supported;
152 PdmOid selected_size;
156 SIZECTL_SIZES_SUPPORTED } selected_list;
158 Boolean single_size_mode;
160 XmStringTable sizes_ready_xmstr;
161 XmStringTable sizes_supported_xmstr;
168 typedef struct _PdmPixmapList
174 Pixel foreground, background;
179 * PrinterBox-specific fallback resources
181 static String PdmPrinterBoxFallbackResources[] =
183 "*PrinterSetup*LoadedAllowed.button_0.labelString: Loaded in Printer",
184 "*PrinterSetup*LoadedAllowed.button_1.labelString: All Sizes",
185 "*PrinterSetup*OrientationLabel.labelString: Page Orientation",
186 "*PrinterSetup*PageSizeLabel.labelString: Page Size",
187 "*PrinterSetup*PlexLabel.labelString: Printed Sides",
188 "*PrinterSetup*DocumentFormatLabel.labelString: Format:",
189 "*PrinterSetup*PrinterModelLabel.labelString: Printer Model:",
190 "*PrinterSetup*TrayLabel.labelString: Tray",
191 "*PrinterSetup.locationId: PrinterSetup",
192 "*PrinterSetup*OrientCtlTop.PortraitIconFileName: "
193 ICON_INSTALL_DIR "portrait.pm",
194 "*PrinterSetup*OrientCtlTop.LandscapeIconFileName: "
195 ICON_INSTALL_DIR "landscap.pm",
196 "*PrinterSetup*OrientCtlTop.ReversePortraitIconFileName: "
197 ICON_INSTALL_DIR "rportrai.pm",
198 "*PrinterSetup*OrientCtlTop.ReverseLandscapeIconFileName: "
199 ICON_INSTALL_DIR "rlandsca.pm",
200 "*PrinterSetup*PlexCtlTop.SimplexPortraitIconFileName: "
201 ICON_INSTALL_DIR "psimplex.pm",
202 "*PrinterSetup*PlexCtlTop.SimplexLandscapeIconFileName: "
203 ICON_INSTALL_DIR "lsimplex.pm",
204 "*PrinterSetup*PlexCtlTop.DuplexPortraitIconFileName: "
205 ICON_INSTALL_DIR "pduplex.pm",
206 "*PrinterSetup*PlexCtlTop.DuplexLandscapeIconFileName: "
207 ICON_INSTALL_DIR "lduplex.pm",
208 "*PrinterSetup*PlexCtlTop.TumblePortraitIconFileName: "
209 ICON_INSTALL_DIR "ptumble.pm",
210 "*PrinterSetup*PlexCtlTop.TumbleLandscapeIconFileName: "
211 ICON_INSTALL_DIR "ltumble.pm",
212 "*PrinterTab.compoundString: Printer",
213 "*PrinterTab.labelString: Printer"
217 * Printer Setup Box static function declarations
219 static void PdmPrinterBoxDelete(PdmSetupBox* me);
220 static void PdmPrinterBoxCreate(PdmSetupBox* me, Widget parent);
221 static PdmStatus PdmPrinterBoxVerifyAttr(PdmSetupBox* me, PdmXp* pdm_xp);
222 static void PdmPrinterBoxGetAttr(PdmSetupBox* me, PdmXp* pdm_xp);
223 static void PdmPrinterBoxSetAttr(PdmSetupBox* me, PdmXp* pdm_xp);
224 static Widget PdmPrinterBoxCreateWindow(PdmSetupBox* me, Widget parent);
225 static void PdmPrinterBoxResizeCB(Widget w,
226 XtPointer client_data,
227 XtPointer call_data);
229 * Orientation Control methods
231 static OrientCtl* OrientCtlNew(PlexCtl* plex_ctl);
232 static void OrientCtlDelete(OrientCtl* me);
233 static void OrientCtlCreate(OrientCtl* me,
236 const PdmOidList* document_attrs_supported,
237 const PdmOidList* orientations_supported);
238 static void OrientCtlCreateWindow(OrientCtl* me, Widget parent);
239 #define OrientCtlGetWidget(me) ((me)->widget)
240 static void OrientCtlCreatePulldown(OrientCtl* me);
241 static void OrientCtlDisable(OrientCtl* me);
242 static void OrientCtlUpdateIcon(OrientCtl* me);
243 static PdmOid OrientCtlGetOrientation(OrientCtl* me);
244 static void OrientCtlResizeCB(Widget w,
245 XtPointer client_data, XtPointer call_data);
246 static void OrientCtlSetSelectedItem(OrientCtl* me, int selected_item);
247 static void OrientCtlSelectCB(Widget w, XtPointer client_d, XtPointer call_d);
248 static void OrientCtlInitPixmapList(OrientCtl* me);
251 * Plex Control methods
253 static PlexCtl* PlexCtlNew();
254 static void PlexCtlDelete(PlexCtl* me);
255 static void PlexCtlCreate(PlexCtl* me,
258 const PdmOidList* document_attrs_supported,
259 const PdmOidList* plexes_supported);
260 static void PlexCtlCreateWindow(PlexCtl* me, Widget parent);
261 static void PlexCtlDisable(PlexCtl* me);
262 #define PlexCtlGetWidget(me) ((me)->widget)
263 static void PlexCtlCreatePulldown(PlexCtl* me);
264 static void PlexCtlUpdateIcon(PlexCtl* me);
265 static PdmOid PlexCtlGetPlex(PlexCtl* me);
266 static void PlexCtlResizeCB(Widget w,
267 XtPointer client_data, XtPointer call_data);
268 static void PlexCtlSetSelectedItem(PlexCtl* me, int selected_item);
269 static void PlexCtlSelectCB(Widget w, XtPointer client_d, XtPointer call_d);
270 static void PlexCtlSetOrientation(PlexCtl* me, PdmOid orientation);
271 static void PlexCtlInitPixmapLists(PlexCtl* me);
274 * Tray Control methods
276 static TrayCtl* TrayCtlNew(SizeCtl* size_ctl);
277 static void TrayCtlDelete(TrayCtl* me);
278 static void TrayCtlCreate(TrayCtl* me,
280 PdmOid default_input_tray,
281 PdmOid default_medium,
282 const PdmOidList* document_attrs_supported,
283 const PdmOidList* input_trays,
284 const PdmOidList* tray_sizes);
285 static void TrayCtlCreateWindow(TrayCtl* me, Widget parent);
286 #define TrayCtlGetWidget(me) ((me)->widget)
287 static PdmOid TrayCtlGetTray(TrayCtl* me);
288 static void TrayCtlDisable(TrayCtl* me);
289 static void TrayCtlResizeCB(Widget w,
290 XtPointer client_data, XtPointer call_data);
291 static void TrayCtlCreatePulldown(TrayCtl* me);
292 static void TrayCtlSetSelectedItem(TrayCtl* me, int selected_item);
293 static void TrayCtlSelectCB(Widget w, XtPointer client_d, XtPointer call_d);
296 * Size Control methods
298 static SizeCtl* SizeCtlNew();
299 static void SizeCtlDelete(SizeCtl* me);
300 static int SizeCtlStrColl(void* e1, void* e2);
301 static void SizeCtlSetSizeLists(PdmOidList** oids,
302 XmStringTable* xmstrs,
303 PdmOidLinkedList* oids_ll);
304 static void SizeCtlCreate(SizeCtl* me,
306 PdmOid default_medium,
307 const PdmOidList* document_attrs_supported,
308 const PdmOidList* tray_sizes,
309 PdmOidLinkedList* sizes_supported);
310 static void SizeCtlCreateWindow(SizeCtl* me, Widget parent);
311 #define SizeCtlGetWidget(me) ((me)->widget)
312 static void SizeCtlUpdate(SizeCtl* me);
313 static PdmOid SizeCtlGetSize(SizeCtl* me);
314 static void SizeCtlResizeCB(Widget w,
315 XtPointer client_data, XtPointer call_data);
316 static void SizeCtlSetSingleSizeMode(SizeCtl* me, PdmOid size);
317 static void SizeCtlSetMultiSizeMode(SizeCtl* me);
318 static void SizeCtlReadyChangedCB(Widget w,
319 XtPointer client_data, XtPointer call_data);
320 static void SizeCtlSupportedChangedCB(Widget w,
321 XtPointer client_data,
322 XtPointer call_data);
323 static void SizeCtlSelectCB(Widget w,
324 XtPointer client_data,
325 XtPointer call_data);
327 * pixmap list functions
329 static PdmPixmapList* PdmPixmapListNew(int count, Widget w, Boolean stipple);
330 static void PdmPixmapListDelete(PdmPixmapList* me);
331 static Pixmap PdmPixmapListGetPixmap(PdmPixmapList* me, int i);
332 #define PdmPixmapListCount(me) ((me)->count)
333 static void PdmPixmapListSetImageName(PdmPixmapList* me,
338 * option menu list creation function
341 CreateOptionMenuPulldown(String pulldown_name,
343 XtCallbackProc activate_proc,
349 * XmString / oid utilities
351 static XmString* CreateXmStringsFromOidList(const PdmOidList* list);
352 static void FreeXmStringList(XmString* list, int count);
355 * utility to help determine maximum icon size
358 IconMaxDimension(Widget icon_label,
359 PdmPixmapList* pixmap_list, int i,
360 Dimension* max_width, Dimension* max_height);
363 * utility to position list box initial selection
365 static void SetListBoxSelection(Widget list_box, int position);
368 * utility to grab icon file names out of the Xrm resource database
370 static String GetIconFileName(Widget w, String resource_name);
373 * ------------------------------------------------------------------------
374 * Name: PdmPrinterBoxNew
378 * Creates a new PdmPrinterBox (PdmSetupBox) instance structure.
382 * The new PdmPrinterBox instance structure.
388 PdmSetupBox* me = (PdmSetupBox*)XtCalloc(1, sizeof(PdmSetupBox));
389 PdmPrinterBoxData* data;
391 me->delete_proc = PdmPrinterBoxDelete;
392 me->create_proc = PdmPrinterBoxCreate;
393 me->verify_attr_proc = PdmPrinterBoxVerifyAttr;
394 me->get_attr_proc = PdmPrinterBoxGetAttr;
395 me->set_attr_proc = PdmPrinterBoxSetAttr;
396 me->fallback_resources = PdmPrinterBoxFallbackResources;
397 me->fallback_resources_count = XtNumber(PdmPrinterBoxFallbackResources);
398 me->tab_name = "PrinterTab";
400 me->subclass_data = (XtPointer)XtCalloc(1, sizeof(PdmPrinterBoxData));
401 data = (PdmPrinterBoxData*)me->subclass_data;
403 data->plex_ctl = PlexCtlNew();
404 data->orient_ctl = OrientCtlNew(data->plex_ctl);
406 data->size_ctl = SizeCtlNew();
407 data->tray_ctl = TrayCtlNew(data->size_ctl);
413 * ------------------------------------------------------------------------
414 * Name: PdmPrinterBoxDelete
418 * Frees the passed PdmPrinterBox (PdmSetupBox) instance structure.
426 PdmPrinterBoxDelete(PdmSetupBox* me)
428 if(me != (PdmSetupBox*)NULL)
430 PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
432 XtFree(data->document_format);
434 PdmOidListDelete(data->document_attrs_supported);
435 PdmOidListDelete(data->orientations_supported);
436 PdmOidListDelete(data->plexes_supported);
437 PdmOidListDelete(data->input_trays);
438 PdmOidListDelete(data->tray_sizes);
439 PdmOidLinkedListDelete(data->sizes_supported);
441 OrientCtlDelete(data->orient_ctl);
442 PlexCtlDelete(data->plex_ctl);
443 SizeCtlDelete(data->size_ctl);
444 TrayCtlDelete(data->tray_ctl);
452 * ------------------------------------------------------------------------
453 * Name: PdmPrinterBoxCreate
457 * Creates the PDM Printer options setup box.
461 * The passed PdmPrinterBox (PdmSetupBox) instance structure.
465 PdmPrinterBoxCreate(PdmSetupBox* me, Widget parent)
467 me->widget = PdmPrinterBoxCreateWindow(me, parent);
468 XtManageChild(me->widget);
472 * ------------------------------------------------------------------------
473 * Name: PdmPrinterBoxVerifyAttr
481 * PDM_SUCCESS if all of the Printer options selected are OK.
483 * PDM_FAILURE if any of the Printer options are invalid.
487 PdmPrinterBoxVerifyAttr(PdmSetupBox* me, PdmXp* pdm_xp)
493 * ------------------------------------------------------------------------
494 * Name: PdmPrinterBoxGetAttr
506 PdmPrinterBoxGetAttr(PdmSetupBox* me, PdmXp* pdm_xp)
508 PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
510 PdmOidMediumSS* medium_ss_supported;
511 PdmOidTrayMediumList* input_trays_medium;
513 * printer model description
515 data->printer_model =
516 PdmXpGetStringValue(pdm_xp, XPPrinterAttr, pdmoid_att_printer_model);
520 strval = PdmXpGetStringValue(pdm_xp, XPDocAttr,
521 pdmoid_att_document_format);
522 data->document_format = PdmOidDocumentFormatParse(strval);
523 if((char*)NULL == data->document_format)
526 * document format not specified, try to obtain
527 * document-formats-supported, and obtain up the default from it
529 strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
530 pdmoid_att_document_formats_supported);
531 data->document_format = PdmOidDocumentFormatDefault(strval);
534 * document attributes supported
536 strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
537 pdmoid_att_document_attributes_supported);
538 data->document_attrs_supported = PdmOidListNew(strval);
540 * content orientation supported
542 strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
543 pdmoid_att_content_orientations_supported);
544 data->orientations_supported = PdmOidListNew(strval);
549 PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_content_orientation);
553 strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
554 pdmoid_att_plexes_supported);
555 data->plexes_supported = PdmOidListNew(strval);
559 data->plex = PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_plex);
561 * default input tray, default medium
563 data->default_input_tray =
564 PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_default_input_tray);
565 data->default_medium =
566 PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_default_medium);
568 * medium source sizes supported
570 strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
571 pdmoid_att_medium_source_sizes_supported);
572 medium_ss_supported = PdmOidMediumSSNew(strval);
576 strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
577 pdmoid_att_input_trays_medium);
578 input_trays_medium = PdmOidTrayMediumListNew(strval);
580 * build input trays and page sizes ready lists
582 PdmOidMediumSSGetTraysSizes(medium_ss_supported, input_trays_medium,
583 &data->input_trays, &data->tray_sizes);
585 * build list of supported page sizes
587 data->sizes_supported = PdmOidMediumSSGetAllSizes(medium_ss_supported);
591 PdmOidMediumSSDelete(medium_ss_supported);
592 PdmOidTrayMediumListDelete(input_trays_medium);
596 * ------------------------------------------------------------------------
597 * Name: PdmPrinterBoxSetAttr
609 PdmPrinterBoxSetAttr(PdmSetupBox* me, PdmXp* pdm_xp)
611 PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
615 PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_content_orientation,
616 OrientCtlGetOrientation(data->orient_ctl));
620 PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_plex,
621 PlexCtlGetPlex(data->plex_ctl));
625 PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_default_medium,
626 SizeCtlGetSize(data->size_ctl));
630 PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_default_input_tray,
631 TrayCtlGetTray(data->tray_ctl));
635 * ------------------------------------------------------------------------
636 * Name: PdmPrinterBoxCreateWindow
640 * Creates the PDM Printer options setup box window.
644 * Widget ID of the new Printer setup box.
648 PdmPrinterBoxCreateWindow(PdmSetupBox* me, Widget parent)
650 PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
657 * create the manager for the Printer Setup Box
659 manager = XtVaCreateManagedWidget(
661 xmRowColumnWidgetClass,
665 * create the printer model row
667 if(data->printer_model != (const char*)NULL)
672 row = XtVaCreateManagedWidget(
674 xmRowColumnWidgetClass,
676 XmNorientation, XmHORIZONTAL,
679 * create the printer model label
681 w = XtVaCreateManagedWidget("PrinterModelLabel",
686 * create the printer model using just the 1st line
688 desc = XtNewString(data->printer_model);
689 ptr = Dt_strchr(desc, '\n');
692 label = XmStringCreateLocalized(desc);
694 w = XtVaCreateManagedWidget("PrinterModel",
697 XmNlabelString, label,
702 * create the document format row
704 if((char*)NULL != data->document_format)
707 * create the document format row
709 row = XtVaCreateManagedWidget(
711 xmRowColumnWidgetClass,
713 XmNorientation, XmHORIZONTAL,
716 * create the document format label
718 w = XtVaCreateManagedWidget("DocumentFormatLabel",
723 * create the document format
725 label = XmStringCreateLocalized(data->document_format);
726 w = XtVaCreateManagedWidget("DocumentFormat",
729 XmNlabelString, label,
734 * orientation / plex / tray / sides
736 draw_area = XtVaCreateWidget("PrinterSetupControls",
737 xmDrawingAreaWidgetClass,
740 XtAddCallback(draw_area, XmNresizeCallback,
741 PdmPrinterBoxResizeCB, (XtPointer)me);
743 * orientation control
745 OrientCtlCreate(data->orient_ctl,
748 data->document_attrs_supported,
749 data->orientations_supported);
753 SizeCtlCreate(data->size_ctl,
755 data->default_medium,
756 data->document_attrs_supported,
758 data->sizes_supported);
762 PlexCtlCreate(data->plex_ctl,
765 data->document_attrs_supported,
766 data->plexes_supported);
770 TrayCtlCreate(data->tray_ctl,
772 data->default_input_tray,
773 data->default_medium,
774 data->document_attrs_supported,
778 XtManageChild(draw_area);
780 * return the new Printer Setup Box
786 * ------------------------------------------------------------------------
787 * Name: PdmPrinterBoxResizeCB
799 PdmPrinterBoxResizeCB(Widget w,
800 XtPointer client_data,
803 PdmSetupBox* me = (PdmSetupBox*)client_data;
804 PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
807 Dimension width, height;
809 PdmRect rt, rs, ro, rp, c1, c2, r1, r2;
811 * retrieve child dimensions
813 XtVaGetValues(TrayCtlGetWidget(data->tray_ctl),
817 XmNheight, &rt.height,
819 XtVaGetValues(SizeCtlGetWidget(data->size_ctl),
823 XmNheight, &rs.height,
825 XtVaGetValues(OrientCtlGetWidget(data->orient_ctl),
829 XmNheight, &ro.height,
831 XtVaGetValues(PlexCtlGetWidget(data->plex_ctl),
835 XmNheight, &rp.height,
838 * calculate rows and columns dimensions
840 r1.x = r2.x = c1.x = 0;
841 r1.y = c1.y = c2.y = 0;
842 r1.height = MAX(ro.height, rp.height);
843 r2.height = MAX(rs.height, rt.height);
844 c1.width = MAX(ro.width, rs.width);
845 c2.width = MAX(rp.width, rt.width);
846 r2.y = r1.height + 5;
848 r1.width = r2.width = c2.x + c2.width;
849 c1.height = c2.height = r2.y + r2.height;
851 * position the children
853 XtVaSetValues(OrientCtlGetWidget(data->orient_ctl),
857 XmNheight, r1.height,
859 XtVaSetValues(PlexCtlGetWidget(data->plex_ctl),
863 XmNheight, r1.height,
865 XtVaSetValues(SizeCtlGetWidget(data->size_ctl),
869 XmNheight, r2.height,
871 XtVaSetValues(TrayCtlGetWidget(data->tray_ctl),
875 XmNheight, r2.height,
878 * resize the drawing area to accomodate the new layout
882 XmNheight, c1.height,
887 * ------------------------------------------------------------------------
900 OrientCtlNew(PlexCtl* plex_ctl)
902 OrientCtl* me = (OrientCtl*)XtCalloc(1, sizeof(OrientCtl));
903 me->plex_ctl = plex_ctl;
908 * ------------------------------------------------------------------------
909 * Name: OrientCtlDelete
921 OrientCtlDelete(OrientCtl* me)
923 PdmOidListDelete(me->dummy_orientations_supported);
924 PdmPixmapListDelete(me->pixmap_list);
925 PdmPixmapListDelete(me->i_pixmap_list);
931 * ------------------------------------------------------------------------
932 * Name: OrientCtlCreate
944 OrientCtlCreate(OrientCtl* me,
947 const PdmOidList* document_attrs_supported,
948 const PdmOidList* orientations_supported)
952 * determine if setting the content orientation is supported
954 if(PdmOidListHasOid(document_attrs_supported,
955 pdmoid_att_content_orientation)
957 PdmOidListCount(orientations_supported) > 0)
960 me->orientations_supported = orientations_supported;
966 * dummy up a list to be presented (insensitive)
968 me->dummy_orientations_supported =
969 PdmOidListNew(PdmOidString(pdmoid_val_content_orientation_portrait));
970 me->orientations_supported = me->dummy_orientations_supported;
971 orientation = pdmoid_none;
974 * set the initially selected list item
976 OrientCtlSetSelectedItem(me,
977 PdmOidListGetIndex(me->orientations_supported,
980 * create the orientations control window
982 OrientCtlCreateWindow(me, parent);
984 * initialize the window components
986 OrientCtlCreatePulldown(me);
987 OrientCtlInitPixmapList(me);
988 OrientCtlUpdateIcon(me);
990 * if content-orientation is not supported, disable the control
993 OrientCtlDisable(me);
997 * ------------------------------------------------------------------------
998 * Name: OrientCtlCreateWindow
1010 OrientCtlCreateWindow(OrientCtl* me,
1013 Widget control_manager;
1018 me->widget = XtVaCreateManagedWidget("OrientCtlTop",
1021 XmNshadowType, XmSHADOW_ETCHED_IN,
1027 XtVaCreateManagedWidget("OrientationLabel",
1030 XmNframeChildType, XmFRAME_TITLE_CHILD,
1033 * orientation controls manager
1036 XtVaCreateManagedWidget("OrientationControls",
1037 xmDrawingAreaWidgetClass,
1039 XmNframeChildType, XmFRAME_WORKAREA_CHILD,
1041 XtAddCallback(control_manager, XmNresizeCallback, OrientCtlResizeCB, me);
1043 * orientations option menu
1046 XtVaCreateManagedWidget("OrientationOptionMenu",
1047 xmRowColumnWidgetClass,
1050 XmNrowColumnType, XmMENU_OPTION,
1056 XtVaCreateManagedWidget("OrientationIcon",
1059 XmNlabelType, XmPIXMAP,
1060 XmNalignment, XmALIGNMENT_CENTER,
1065 * ------------------------------------------------------------------------
1066 * Name: OrientCtlDisable
1070 * Disable the orientation controls.
1078 OrientCtlDisable(OrientCtl* me)
1080 XtSetSensitive(me->frame_label, False);
1081 XtSetSensitive(me->option_menu, False);
1082 XtSetSensitive(me->icon_label, False);
1086 * ------------------------------------------------------------------------
1087 * Name: OrientCtlResizeCB
1099 OrientCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
1101 OrientCtl* me = (OrientCtl*)client_data;
1102 Dimension height, width, margin_width, new_width;
1103 Position menu_x, menu_y, icon_x, icon_y;
1104 Dimension menu_h, menu_w, icon_h, icon_w;
1106 * get current layout info
1108 XtVaGetValues(w, XmNheight, &height, XmNwidth, &width,
1109 XmNmarginWidth, &margin_width,
1111 XtVaGetValues(me->option_menu, XmNheight, &menu_h, XmNwidth, &menu_w,
1113 XtVaGetValues(me->icon_label, XmNheight, &icon_h, XmNwidth, &icon_w,
1116 * position controls side by side
1119 icon_x = menu_x + menu_w;
1123 menu_y = (height - menu_h) / 2;
1124 icon_y = (height - icon_h) / 2;
1128 XtVaSetValues(me->option_menu, XmNx, menu_x, XmNy, menu_y, NULL);
1129 XtVaSetValues(me->icon_label, XmNx, icon_x, XmNy, icon_y, NULL);
1131 * update drawing area width
1133 new_width = menu_x + menu_w + icon_w + margin_width;
1134 if(new_width > width)
1135 XtVaSetValues(w, XmNwidth, new_width, NULL);
1139 * ------------------------------------------------------------------------
1140 * Name: OrientCtlCreatePulldown
1152 OrientCtlCreatePulldown(OrientCtl* me)
1157 * create a list of XmStrings for the content orientations
1159 list = CreateXmStringsFromOidList(me->orientations_supported);
1161 * create the option menu pulldown
1163 count = PdmOidListCount(me->orientations_supported);
1164 CreateOptionMenuPulldown("OrientationOptions",
1173 FreeXmStringList(list, count);
1177 * ------------------------------------------------------------------------
1178 * Name: OrientCtlSelectCB
1190 OrientCtlSelectCB(Widget w, XtPointer client_data, XtPointer call_data)
1193 int selected_item = (int)client_data;
1195 XtVaGetValues(w, XmNuserData, &me, NULL);
1196 OrientCtlSetSelectedItem(me, selected_item);
1197 OrientCtlUpdateIcon(me);
1201 * ------------------------------------------------------------------------
1202 * Name: OrientCtlInitPixmapList
1214 OrientCtlInitPixmapList(OrientCtl* me)
1217 const char* image_name;
1219 Dimension max_width = 0;
1220 Dimension max_height = 0;
1223 * initialize the list of pixmaps based on the supported orientations
1225 count = PdmOidListCount(me->orientations_supported);
1226 me->pixmap_list = PdmPixmapListNew(count, me->icon_label, False);
1227 me->i_pixmap_list = PdmPixmapListNew(count, me->icon_label, True);
1228 for(i = 0; i < count; i++)
1230 switch(PdmOidListGetOid(me->orientations_supported, i))
1232 case pdmoid_val_content_orientation_portrait:
1233 image_name = GetIconFileName(me->widget, "PortraitIconFileName");
1235 case pdmoid_val_content_orientation_landscape:
1236 image_name = GetIconFileName(me->widget, "LandscapeIconFileName");
1238 case pdmoid_val_content_orientation_reverse_portrait:
1240 GetIconFileName(me->widget, "ReversePortraitIconFileName");
1242 case pdmoid_val_content_orientation_reverse_landscape:
1244 GetIconFileName(me->widget, "ReverseLandscapeIconFileName");
1249 PdmPixmapListSetImageName(me->pixmap_list, image_name, i);
1250 PdmPixmapListSetImageName(me->i_pixmap_list, image_name, i);
1251 IconMaxDimension(me->icon_label,
1253 &max_width, &max_height);
1255 XtVaSetValues(me->icon_label,
1256 XmNwidth, max_width,
1257 XmNheight, max_height,
1258 XmNrecomputeSize, False,
1263 * ------------------------------------------------------------------------
1264 * Name: OrientCtlSetSelectedItem
1276 OrientCtlSetSelectedItem(OrientCtl* me, int selected_item)
1278 if(selected_item == -1)
1279 me->selected_item = 0;
1281 me->selected_item = selected_item;
1283 if(me->plex_ctl != (PlexCtl*)NULL)
1284 PlexCtlSetOrientation(me->plex_ctl, OrientCtlGetOrientation(me));
1289 * ------------------------------------------------------------------------
1290 * Name: OrientCtlUpdateIcon
1302 OrientCtlUpdateIcon(OrientCtl* me)
1304 if(me->icon_label != (Widget)NULL)
1305 XtVaSetValues(me->icon_label,
1307 PdmPixmapListGetPixmap(me->pixmap_list,
1309 XmNlabelInsensitivePixmap,
1310 PdmPixmapListGetPixmap(me->i_pixmap_list,
1316 * ------------------------------------------------------------------------
1317 * Name: OrientCtlGetOrientation
1329 OrientCtlGetOrientation(OrientCtl* me)
1331 if(me->orientations_supported == me->dummy_orientations_supported)
1334 return PdmOidListGetOid(me->orientations_supported, me->selected_item);
1339 * ------------------------------------------------------------------------
1354 PlexCtl* me = (PlexCtl*)XtCalloc(1, sizeof(PlexCtl));
1355 me->pixmap_list_ptr = &me->portrait_pixmap_list;
1356 me->i_pixmap_list_ptr = &me->i_portrait_pixmap_list;
1361 * ------------------------------------------------------------------------
1362 * Name: PlexCtlDelete
1374 PlexCtlDelete(PlexCtl* me)
1376 PdmOidListDelete(me->dummy_plexes_supported);
1377 PdmPixmapListDelete(me->portrait_pixmap_list);
1378 PdmPixmapListDelete(me->i_portrait_pixmap_list);
1379 PdmPixmapListDelete(me->landscape_pixmap_list);
1380 PdmPixmapListDelete(me->i_landscape_pixmap_list);
1386 * ------------------------------------------------------------------------
1387 * Name: PlexCtlCreate
1399 PlexCtlCreate(PlexCtl* me,
1402 const PdmOidList* document_attrs_supported,
1403 const PdmOidList* plexes_supported)
1407 * determine if setting the content orientation is supported
1409 if(PdmOidListHasOid(document_attrs_supported, pdmoid_att_plex)
1411 PdmOidListCount(plexes_supported) > 0)
1414 me->plexes_supported = plexes_supported;
1420 * dummy up a list to be presented (insensitive)
1422 me->dummy_plexes_supported =
1423 PdmOidListNew(PdmOidString(pdmoid_val_plex_simplex));
1424 me->plexes_supported = me->dummy_plexes_supported;
1429 * set the initially selected list item
1431 PlexCtlSetSelectedItem(me, PdmOidListGetIndex(me->plexes_supported, plex));
1433 * create the plexes control window
1435 PlexCtlCreateWindow(me, parent);
1437 * initialize the window components
1439 PlexCtlCreatePulldown(me);
1440 PlexCtlInitPixmapLists(me);
1441 PlexCtlUpdateIcon(me);
1443 * if plex is not supported, disable the control
1450 * ------------------------------------------------------------------------
1451 * Name: PlexCtlCreateWindow
1463 PlexCtlCreateWindow(PlexCtl* me,
1466 Widget control_manager;
1470 me->widget = XtVaCreateManagedWidget("PlexCtlTop",
1473 XmNshadowType, XmSHADOW_ETCHED_IN,
1479 XtVaCreateManagedWidget("PlexLabel",
1482 XmNframeChildType, XmFRAME_TITLE_CHILD,
1485 * plex controls manager
1488 XtVaCreateManagedWidget(
1490 xmDrawingAreaWidgetClass,
1492 XmNframeChildType, XmFRAME_WORKAREA_CHILD,
1494 XtAddCallback(control_manager, XmNresizeCallback, PlexCtlResizeCB, me);
1496 * plexes option menu
1499 XtVaCreateManagedWidget("PlexOptionMenu",
1500 xmRowColumnWidgetClass,
1502 XmNrowColumnType, XmMENU_OPTION,
1509 XtVaCreateManagedWidget("PlexIcon",
1512 XmNlabelType, XmPIXMAP,
1513 XmNalignment, XmALIGNMENT_CENTER,
1518 * ------------------------------------------------------------------------
1519 * Name: PlexCtlDisable
1523 * Disable the plex controls.
1531 PlexCtlDisable(PlexCtl* me)
1533 XtSetSensitive(me->frame_label, False);
1534 XtSetSensitive(me->option_menu, False);
1535 XtSetSensitive(me->icon_label, False);
1539 * ------------------------------------------------------------------------
1540 * Name: PlexCtlResizeCB
1552 PlexCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
1554 PlexCtl* me = (PlexCtl*)client_data;
1555 Dimension height, width, margin_width, new_width;
1556 Position menu_x, menu_y, icon_x, icon_y;
1557 Dimension menu_h, menu_w, icon_h, icon_w;
1559 * get current layout info
1561 XtVaGetValues(w, XmNheight, &height, XmNwidth, &width,
1562 XmNmarginWidth, &margin_width,
1564 XtVaGetValues(me->option_menu, XmNheight, &menu_h, XmNwidth, &menu_w,
1566 XtVaGetValues(me->icon_label, XmNheight, &icon_h, XmNwidth, &icon_w,
1569 * position controls side by side
1572 icon_x = menu_x + menu_w;
1576 menu_y = (height - menu_h) / 2;
1577 icon_y = (height - icon_h) / 2;
1581 XtVaSetValues(me->option_menu, XmNx, menu_x, XmNy, menu_y, NULL);
1582 XtVaSetValues(me->icon_label, XmNx, icon_x, XmNy, icon_y, NULL);
1584 * update drawing area width
1586 new_width = menu_x + menu_w + icon_w + margin_width;
1587 if(new_width > width)
1588 XtVaSetValues(w, XmNwidth, new_width, NULL);
1592 * ------------------------------------------------------------------------
1593 * Name: PlexCtlCreatePulldown
1605 PlexCtlCreatePulldown(PlexCtl* me)
1610 * build a list of Xm strings for the supported plexes
1612 list = CreateXmStringsFromOidList(me->plexes_supported);
1614 * create the option menu pulldown
1616 count = PdmOidListCount(me->plexes_supported);
1617 CreateOptionMenuPulldown("PlexOptions",
1626 FreeXmStringList(list, count);
1630 * ------------------------------------------------------------------------
1631 * Name: PlexCtlSelectCB
1643 PlexCtlSelectCB(Widget w, XtPointer client_data, XtPointer call_data)
1646 int selected_item = (int)client_data;
1648 XtVaGetValues(w, XmNuserData, &me, NULL);
1649 PlexCtlSetSelectedItem(me, selected_item);
1650 PlexCtlUpdateIcon(me);
1654 * ------------------------------------------------------------------------
1655 * Name: PlexCtlSetOrientation
1667 PlexCtlSetOrientation(PlexCtl* me,
1672 case pdmoid_val_content_orientation_landscape:
1673 case pdmoid_val_content_orientation_reverse_landscape:
1674 me->pixmap_list_ptr = &me->landscape_pixmap_list;
1675 me->i_pixmap_list_ptr = &me->i_landscape_pixmap_list;
1678 me->pixmap_list_ptr = &me->portrait_pixmap_list;
1679 me->i_pixmap_list_ptr = &me->i_portrait_pixmap_list;
1682 PlexCtlUpdateIcon(me);
1686 * ------------------------------------------------------------------------
1687 * Name: PlexCtlInitPixmapLists
1699 PlexCtlInitPixmapLists(PlexCtl* me)
1702 const char* portrait_image_name;
1703 const char* landscape_image_name;
1705 Dimension max_width = 0;
1706 Dimension max_height = 0;
1709 * initialize the list of pixmaps based on the list of plexes
1711 count = PdmOidListCount(me->plexes_supported);
1712 me->portrait_pixmap_list = PdmPixmapListNew(count, me->icon_label, False);
1713 me->i_portrait_pixmap_list = PdmPixmapListNew(count, me->icon_label, True);
1714 me->landscape_pixmap_list = PdmPixmapListNew(count, me->icon_label, False);
1715 me->i_landscape_pixmap_list = PdmPixmapListNew(count, me->icon_label, True);
1716 for(i = 0; i < count; i++)
1718 switch(PdmOidListGetOid(me->plexes_supported, i))
1720 case pdmoid_val_plex_simplex:
1721 portrait_image_name =
1722 GetIconFileName(me->widget, "SimplexPortraitIconFileName");
1723 landscape_image_name =
1724 GetIconFileName(me->widget, "SimplexLandscapeIconFileName");
1726 case pdmoid_val_plex_duplex:
1727 portrait_image_name =
1728 GetIconFileName(me->widget, "DuplexPortraitIconFileName");
1729 landscape_image_name =
1730 GetIconFileName(me->widget, "DuplexLandscapeIconFileName");
1732 case pdmoid_val_plex_tumble:
1733 portrait_image_name =
1734 GetIconFileName(me->widget, "TumblePortraitIconFileName");
1735 landscape_image_name =
1736 GetIconFileName(me->widget, "TumbleLandscapeIconFileName");
1741 PdmPixmapListSetImageName(me->portrait_pixmap_list,
1742 portrait_image_name, i);
1743 PdmPixmapListSetImageName(me->i_portrait_pixmap_list,
1744 portrait_image_name, i);
1745 PdmPixmapListSetImageName(me->landscape_pixmap_list,
1746 landscape_image_name, i);
1747 PdmPixmapListSetImageName(me->i_landscape_pixmap_list,
1748 landscape_image_name, i);
1749 IconMaxDimension(me->icon_label,
1750 me->portrait_pixmap_list, i,
1751 &max_width, &max_height);
1752 IconMaxDimension(me->icon_label,
1753 me->landscape_pixmap_list, i,
1754 &max_width, &max_height);
1756 XtVaSetValues(me->icon_label,
1757 XmNwidth, max_width,
1758 XmNheight, max_height,
1759 XmNrecomputeSize, False,
1764 * ------------------------------------------------------------------------
1765 * Name: PlexCtlSetSelectedItem
1777 PlexCtlSetSelectedItem(PlexCtl* me, int selected_item)
1779 if(selected_item == -1)
1780 me->selected_item = 0;
1782 me->selected_item = selected_item;
1786 * ------------------------------------------------------------------------
1787 * Name: PlexCtlUpdateIcon
1799 PlexCtlUpdateIcon(PlexCtl* me)
1801 if(me->icon_label != (Widget)NULL)
1802 XtVaSetValues(me->icon_label,
1804 PdmPixmapListGetPixmap(*me->pixmap_list_ptr,
1806 XmNlabelInsensitivePixmap,
1807 PdmPixmapListGetPixmap(*me->i_pixmap_list_ptr,
1813 * ------------------------------------------------------------------------
1814 * Name: PlexCtlGetPlex
1826 PlexCtlGetPlex(PlexCtl* me)
1828 if(me->plexes_supported == me->dummy_plexes_supported)
1831 return PdmOidListGetOid(me->plexes_supported, me->selected_item);
1835 * ------------------------------------------------------------------------
1848 TrayCtlNew(SizeCtl* size_ctl)
1850 TrayCtl* me = (TrayCtl*)XtCalloc(1, sizeof(TrayCtl));
1852 me->size_ctl = size_ctl;
1858 * ------------------------------------------------------------------------
1859 * Name: TrayCtlDelete
1871 TrayCtlDelete(TrayCtl* me)
1877 * ------------------------------------------------------------------------
1878 * Name: TrayCtlCreate
1890 TrayCtlCreate(TrayCtl* me,
1892 PdmOid default_input_tray,
1893 PdmOid default_medium,
1894 const PdmOidList* document_attrs_supported,
1895 const PdmOidList* input_trays,
1896 const PdmOidList* tray_sizes)
1900 * save the trays and sizes list pointers
1902 me->input_trays = input_trays;
1903 me->tray_sizes = tray_sizes;
1905 * determine if setting the input tray is supported
1907 if(PdmOidListHasOid(document_attrs_supported,
1908 pdmoid_att_default_input_tray)
1910 PdmOidListCount(me->input_trays) > 0)
1917 * set the initially selected list item
1919 if(default_medium != pdmoid_none)
1922 * default-medium has precedence; set "Auto-select" (index 0)
1924 TrayCtlSetSelectedItem(me, 0);
1928 int i = PdmOidListGetIndex(me->input_trays, default_input_tray);
1929 if(!supported || i == -1)
1931 * default-input-tray unsupported or not found in list; set
1932 * "Auto-select" (index 0)
1934 TrayCtlSetSelectedItem(me, 0);
1937 * Select the list item corresponding to default-input-tray -
1938 * ie. add 1 to the input trays list index since the option
1939 * menu is always built with "Auto-select" as the first
1940 * entry, followed by the input trays list entries.
1942 TrayCtlSetSelectedItem(me, i+1);
1945 * create the tray control window
1947 TrayCtlCreateWindow(me, parent);
1949 * initialize the window components
1951 TrayCtlCreatePulldown(me);
1953 * if tray selection is not supported, disable the control
1960 * ------------------------------------------------------------------------
1961 * Name: TrayCtlCreateWindow
1973 TrayCtlCreateWindow(TrayCtl* me, Widget parent)
1975 Widget control_manager;
1980 me->widget = XtVaCreateManagedWidget("TrayCtlTop",
1983 XmNshadowType, XmSHADOW_ETCHED_IN,
1989 = XtVaCreateManagedWidget("TrayLabel",
1992 XmNframeChildType, XmFRAME_TITLE_CHILD,
1995 * tray controls manager
1998 XtVaCreateManagedWidget("TrayControls",
1999 xmDrawingAreaWidgetClass,
2001 XmNframeChildType, XmFRAME_WORKAREA_CHILD,
2003 XtAddCallback(control_manager, XmNresizeCallback, TrayCtlResizeCB, me);
2008 XtVaCreateManagedWidget("TrayOptionMenu",
2009 xmRowColumnWidgetClass,
2012 XmNrowColumnType, XmMENU_OPTION,
2017 * ------------------------------------------------------------------------
2018 * Name: TrayCtlDisable
2022 * Disable the input tray controls.
2030 TrayCtlDisable(TrayCtl* me)
2032 XtSetSensitive(me->frame_label, False);
2033 XtSetSensitive(me->option_menu, False);
2037 * ------------------------------------------------------------------------
2038 * Name: TrayCtlResizeCB
2050 TrayCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
2052 TrayCtl* me = (TrayCtl*)client_data;
2053 Dimension height, menu_h;
2056 * get current layout info
2058 XtVaGetValues(w, XmNheight, &height, NULL);
2059 XtVaGetValues(me->option_menu, XmNheight, &menu_h, NULL);
2063 menu_y = (height - menu_h) / 2;
2067 XtVaSetValues(me->option_menu, XmNx, 0, XmNy, menu_y, NULL);
2071 * ------------------------------------------------------------------------
2072 * Name: TrayCtlGetTray
2084 TrayCtlGetTray(TrayCtl* me)
2086 if(me->selected_item == 0)
2089 return PdmOidListGetOid(me->input_trays, me->selected_item - 1);
2093 * ------------------------------------------------------------------------
2094 * Name: TrayCtlCreatePulldown
2106 TrayCtlCreatePulldown(TrayCtl* me)
2108 XmString* xmstr_list;
2114 * create a list of XmStrings for the Auto-select item plus the list
2117 count = 1 + PdmOidListCount(me->input_trays);
2118 xmstr_list = (XmString*)XtCalloc(count, sizeof(XmString));
2120 * set the "Auto-select" item as the first item
2123 xmstr_list[i++] = XmStringCreateLocalized((char*)PDM_MSG_TRAY_AUTO_SELECT);
2125 * add the input trays
2127 for(; i < count; i++)
2129 oid = PdmOidListGetOid(me->input_trays, i-1);
2130 str = DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
2132 PdmOidDefaultMsg(oid));
2133 xmstr_list[i] = XmStringCreateLocalized((char*)str);
2136 * create the option menu pulldown
2138 CreateOptionMenuPulldown("TrayOptions",
2147 FreeXmStringList(xmstr_list, count);
2151 * ------------------------------------------------------------------------
2152 * Name: TrayCtlSetSelectedItem
2164 TrayCtlSetSelectedItem(TrayCtl* me, int selected_item)
2166 if(selected_item == -1)
2167 me->selected_item = 0;
2169 me->selected_item = selected_item;
2171 * update the page size control accordingly
2173 if(me->selected_item == 0)
2174 SizeCtlSetMultiSizeMode(me->size_ctl);
2176 SizeCtlSetSingleSizeMode(me->size_ctl,
2177 PdmOidListGetOid(me->tray_sizes,
2178 me->selected_item - 1));
2182 * ------------------------------------------------------------------------
2183 * Name: TrayCtlSelectCB
2195 TrayCtlSelectCB(Widget w, XtPointer client_data, XtPointer call_data)
2198 int selected_item = (int)client_data;
2200 XtVaGetValues(w, XmNuserData, &me, NULL);
2201 TrayCtlSetSelectedItem(me, selected_item);
2206 * ------------------------------------------------------------------------
2221 SizeCtl* me = (SizeCtl*)XtCalloc(1, sizeof(SizeCtl));
2226 * ------------------------------------------------------------------------
2227 * Name: SizeCtlDelete
2239 SizeCtlDelete(SizeCtl* me)
2241 if(me != (SizeCtl*)NULL)
2243 if(me->sizes_ready_xmstr != (XmString*)NULL)
2244 FreeXmStringList(me->sizes_ready_xmstr,
2245 PdmOidListCount(me->sizes_ready));
2246 if(me->sizes_supported_xmstr != (XmString*)NULL)
2247 FreeXmStringList(me->sizes_supported_xmstr,
2248 PdmOidListCount(me->sizes_supported));
2249 PdmOidListDelete(me->sizes_ready);
2250 PdmOidListDelete(me->sizes_supported);
2256 * ------------------------------------------------------------------------
2257 * Name: SizeCtlStrColl
2261 * An adaptor for using strcoll on SizeCtlSortRec's with qsort.
2265 * The return value for strcoll given the strings in the passed
2270 SizeCtlStrColl(void* e1, void* e2)
2272 SizeCtlSortRec *r1 = e1, *r2 = e2;
2274 return strcoll(r1->str, r2->str);
2278 * ------------------------------------------------------------------------
2279 * Name: SizeCtlSetSizeLists
2283 * Creates a sorted XmStringTable and PdmOidList using
2284 * the oids from the passed PdmOidLinkedList. The newly created lists
2285 * are returned via the 'oids' and 'xmstrs' parms.
2293 SizeCtlSetSizeLists(PdmOidList** oid_list,
2294 XmStringTable* xmstrs,
2295 PdmOidLinkedList* oid_ll)
2299 count = PdmOidLinkedListCount(oid_ll);
2302 *oid_list = (PdmOidList*)NULL;
2303 *xmstrs = (XmStringTable)NULL;
2307 SizeCtlSortList sort_list;
2311 * sort the passed sizes
2313 sort_list = (SizeCtlSortList)XtCalloc(count, sizeof(SizeCtlSortRec));
2314 for(i = 0, oid = PdmOidLinkedListFirstOid(oid_ll);
2316 i++, oid = PdmOidLinkedListNextOid(oid_ll))
2318 sort_list[i].oid = oid;
2319 sort_list[i].str = DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
2321 PdmOidDefaultMsg(oid));
2323 qsort(sort_list, count, sizeof(SizeCtlSortRec), SizeCtlStrColl);
2325 * create the return lists of oids and XmStrings
2327 *oid_list = (PdmOidList*)XtCalloc(1, sizeof(PdmOidList));
2328 (*oid_list)->list = (PdmOid*)XtCalloc(count, sizeof(PdmOid));
2329 (*oid_list)->count = count;
2330 *xmstrs = (XmStringTable)XtCalloc(count, sizeof(XmString));
2331 for(i = 0; i < count; i++)
2333 ((*oid_list)->list)[i] = sort_list[i].oid;
2334 (*xmstrs)[i] = XmStringCreateLocalized((char*)sort_list[i].str);
2336 XtFree((char*)sort_list);
2341 * ------------------------------------------------------------------------
2342 * Name: SizeCtlCreate
2354 SizeCtlCreate(SizeCtl* me,
2356 PdmOid default_medium,
2357 const PdmOidList* document_attrs_supported,
2358 const PdmOidList* tray_sizes,
2359 PdmOidLinkedList* sizes_supported)
2364 PdmOidLinkedList* sizes_ready_ll;
2366 * initialize the selected size
2368 me->selected_size = default_medium;
2370 * build the sizes ready list using unique elements of the tray sizes
2373 sizes_ready_ll = PdmOidLinkedListNew();
2374 for(i = 0; i < PdmOidListCount(tray_sizes); i++)
2376 oid = PdmOidListGetOid(tray_sizes, i);
2377 if(!PdmOidLinkedListHasOid(sizes_ready_ll, oid))
2379 PdmOidLinkedListAddOid(sizes_ready_ll, oid);
2383 * determine if setting the medium is supported
2385 if(!PdmOidListHasOid(document_attrs_supported,
2386 pdmoid_att_default_medium)
2388 PdmOidLinkedListCount(sizes_supported) == 0)
2390 me->selected_list = SIZECTL_UNSUPPORTED;
2395 * default to the ready list
2397 me->selected_list = SIZECTL_SIZES_READY;
2400 * create the XmString versions of the sizes lists
2402 SizeCtlSetSizeLists(&me->sizes_ready, &me->sizes_ready_xmstr,
2404 PdmOidLinkedListDelete(sizes_ready_ll);
2405 SizeCtlSetSizeLists(&me->sizes_supported, &me->sizes_supported_xmstr,
2408 * create the size control window
2410 SizeCtlCreateWindow(me, parent);
2412 * update the control state
2418 * ------------------------------------------------------------------------
2419 * Name: SizeCtlCreateWindow
2431 SizeCtlCreateWindow(SizeCtl* me, Widget parent)
2435 Widget control_manager;
2437 XmString default_xmstr = (XmString)NULL;
2441 me->widget = XtVaCreateManagedWidget("PageSizeCtlTop",
2444 XmNshadowType, XmSHADOW_ETCHED_IN,
2450 = XtVaCreateManagedWidget("PageSizeLabel",
2453 XmNframeChildType, XmFRAME_TITLE_CHILD,
2457 * page size controls manager
2460 XtVaCreateManagedWidget("PageSizeControls",
2461 xmDrawingAreaWidgetClass,
2463 XmNframeChildType, XmFRAME_WORKAREA_CHILD,
2465 XtAddCallback(control_manager, XmNresizeCallback, SizeCtlResizeCB, me);
2467 * page sizes list box
2470 XtSetArg(args[n], XmNvisibleItemCount, 3); n++;
2471 XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmSTATIC); n++;
2472 XtSetArg(args[n], XmNhorizontalScrollBar, NULL); n++;
2474 * set the supported sizes list in the list box, in order to lock
2475 * down the maximum dimensions - the list box does not support
2476 * changes to the list size policy after creation
2478 if(me->selected_list == SIZECTL_UNSUPPORTED)
2481 * unsupported, use "Default"
2484 XmStringCreateLocalized((char*)PDM_MSG_SIZE_DEFAULT);
2485 XtSetArg(args[n], XmNitemCount, 1); n++;
2486 XtSetArg(args[n], XmNitems, &default_xmstr); n++;
2490 XtSetArg(args[n], XmNitems, me->sizes_supported_xmstr); n++;
2491 XtSetArg(args[n], XmNitemCount,
2492 PdmOidListCount(me->sizes_supported)); n++;
2494 XtSetArg(args[n], XmNlistSizePolicy, XmCONSTANT); n++;
2496 me->list_box = XmCreateScrolledList(control_manager, "PageSizes", args, n);
2497 if((XmString)NULL != default_xmstr) XmStringFree(default_xmstr);
2498 XtAddCallback(me->list_box, XmNbrowseSelectionCallback,
2499 SizeCtlSelectCB, (XtPointer)me);
2501 * hide the horizontal scroll bar, since the width of the list has
2502 * been set to accomodate the widest item.
2504 hscroll = XtNameToWidget(XtParent(me->list_box), "*HorScrollBar");
2505 XtVaSetValues(hscroll,
2506 XmNmappedWhenManaged, False,
2507 XmNx, 0, XmNy, 0, XmNwidth, 1, XmNheight, 1,
2510 * manage the scrolled list
2512 XtManageChild(me->list_box);
2513 XtManageChild(XtParent(me->list_box));
2515 * loaded / allowed sizes radio buttons
2517 me->radio_box = XtVaCreateWidget(
2519 xmRowColumnWidgetClass,
2521 XmNradioBehavior, True,
2523 me->ready_radio = XtVaCreateManagedWidget("button_0",
2524 xmToggleButtonWidgetClass,
2527 XtAddCallback(me->ready_radio, XmNvalueChangedCallback,
2528 SizeCtlReadyChangedCB, (XtPointer)me);
2529 me->supported_radio = XtVaCreateManagedWidget("button_1",
2530 xmToggleButtonWidgetClass,
2533 XtAddCallback(me->supported_radio, XmNvalueChangedCallback,
2534 SizeCtlSupportedChangedCB, (XtPointer)me);
2536 XtManageChild(me->radio_box);
2540 * ------------------------------------------------------------------------
2541 * Name: SizeCtlUpdate
2545 * Update the state of the size control
2553 SizeCtlUpdate(SizeCtl* me)
2555 Boolean frame_label_sensitive = False;
2556 Boolean list_box_sensitive = False;
2557 Boolean list_box_traverse = False;
2558 Boolean ready_radio_sensitive = False;
2559 Boolean supported_radio_sensitive = False;
2561 * clear the current list
2563 XmListDeleteAllItems(me->list_box);
2565 if(me->single_size_mode)
2568 PdmOid oid = me->selected_size;
2571 XmStringCreateLocalized((char*)
2572 DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
2574 PdmOidDefaultMsg(oid)));
2575 XmListAddItem(me->list_box, item, 0);
2576 XmListSelectPos(me->list_box, 0, False);
2579 if(me->selected_list != SIZECTL_UNSUPPORTED)
2581 frame_label_sensitive = True;
2582 list_box_sensitive = True;
2583 me->selected_list = SIZECTL_SIZES_READY;
2584 XmToggleButtonSetState(me->ready_radio, True, False);
2585 XmToggleButtonSetState(me->supported_radio, False, False);
2590 if(me->selected_list == SIZECTL_UNSUPPORTED)
2592 XmString default_item;
2595 XmStringCreateLocalized((char*)PDM_MSG_SIZE_DEFAULT);
2596 XmListAddItem(me->list_box, default_item, 0);
2597 XmListSelectPos(me->list_box, 0, False);
2598 XmStringFree(default_item);
2606 * set control sensitivities
2608 frame_label_sensitive = True;
2609 supported_radio_sensitive = True;
2610 list_box_sensitive = True;
2611 list_box_traverse = True;
2612 if(PdmOidListCount(me->sizes_ready) > 0)
2613 ready_radio_sensitive = True;
2615 * check to see if the selected size is supported
2617 if(!PdmOidListHasOid(me->sizes_supported, me->selected_size))
2620 * the selected size is not supported
2622 if(PdmOidListCount(me->sizes_ready) > 0)
2625 * use the 1st entry in the ready list
2628 PdmOidListGetOid(me->sizes_ready, 0);
2629 me->selected_list = SIZECTL_SIZES_READY;
2634 * the ready list is empty, use the 1st entry in the
2638 PdmOidListGetOid(me->sizes_supported, 0);
2639 me->selected_list = SIZECTL_SIZES_SUPPORTED;
2642 else if(me->selected_list == SIZECTL_SIZES_READY
2644 !PdmOidListHasOid(me->sizes_ready, me->selected_size))
2647 * the selected size is not in the ready list; use the
2648 * supported list instead
2650 me->selected_list = SIZECTL_SIZES_SUPPORTED;
2653 * set the appropriate radio button and update the list
2655 if(me->selected_list == SIZECTL_SIZES_READY)
2657 XmToggleButtonSetState(me->ready_radio, True, False);
2658 XmToggleButtonSetState(me->supported_radio, False, False);
2660 list = me->sizes_ready_xmstr;
2661 count = PdmOidListCount(me->sizes_ready);
2662 pos = 1 + PdmOidListGetIndex(me->sizes_ready,
2667 XmToggleButtonSetState(me->supported_radio, True, False);
2668 XmToggleButtonSetState(me->ready_radio, False, False);
2670 list = me->sizes_supported_xmstr;
2671 count = PdmOidListCount(me->sizes_supported);
2672 pos = 1 + PdmOidListGetIndex(me->sizes_supported,
2675 XmListAddItemsUnselected(me->list_box, list, count, 0);
2676 SetListBoxSelection(me->list_box, pos);
2680 * update control sensitivities
2682 XtSetSensitive(me->frame_label, frame_label_sensitive);
2683 XtSetSensitive(me->list_box, list_box_sensitive);
2684 XtVaSetValues(me->list_box, XmNtraversalOn, list_box_traverse, NULL);
2685 XtSetSensitive(me->ready_radio, ready_radio_sensitive);
2686 XtSetSensitive(me->supported_radio, supported_radio_sensitive);
2690 * ------------------------------------------------------------------------
2691 * Name: SizeCtlResizeCB
2703 SizeCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
2705 SizeCtl* me = (SizeCtl*)client_data;
2706 Dimension height, width, margin_width, new_width;
2707 Position list_x, list_y, radio_x, radio_y;
2708 Dimension list_h, list_w, radio_h, radio_w;
2709 Widget scrolled_list = XtParent(me->list_box);
2711 * get current layout info
2713 XtVaGetValues(w, XmNheight, &height, XmNwidth, &width,
2714 XmNmarginWidth, &margin_width,
2716 XtVaGetValues(scrolled_list, XmNheight, &list_h, XmNwidth, &list_w, NULL);
2717 XtVaGetValues(me->radio_box, XmNheight, &radio_h, XmNwidth, &radio_w,
2720 * position controls side by side
2722 list_x = margin_width;
2723 radio_x = list_x + list_w;
2727 list_y = (height - list_h) / 2;
2728 radio_y = (height - radio_h) / 2;
2732 XtVaSetValues(scrolled_list, XmNx, list_x, XmNy, list_y, NULL);
2733 XtVaSetValues(me->radio_box, XmNx, radio_x, XmNy, radio_y, NULL);
2735 * update drawing area width and height
2737 new_width = list_x + list_w + radio_w;
2738 if(new_width > width)
2739 XtVaSetValues(w, XmNwidth, new_width, NULL);
2743 * ------------------------------------------------------------------------
2744 * Name: SizeCtlSetSingleSizeMode
2756 SizeCtlSetSingleSizeMode(SizeCtl* me, PdmOid size)
2758 if(size != pdmoid_none)
2760 me->single_size_mode = True;
2761 me->selected_size = size;
2767 * ------------------------------------------------------------------------
2768 * Name: SizeCtlSetMultiSizeMode
2780 SizeCtlSetMultiSizeMode(SizeCtl* me)
2782 me->single_size_mode = False;
2789 * ------------------------------------------------------------------------
2790 * Name: SizeCtlGetSize
2802 SizeCtlGetSize(SizeCtl* me)
2804 if(me->single_size_mode || me->selected_list == SIZECTL_UNSUPPORTED)
2807 return me->selected_size;
2811 * ------------------------------------------------------------------------
2812 * Name: SizeCtlReadyChangedCB
2824 SizeCtlReadyChangedCB(Widget w,
2825 XtPointer client_data,
2826 XtPointer call_data)
2828 XmToggleButtonCallbackStruct* cbs =
2829 (XmToggleButtonCallbackStruct*)call_data;
2833 SizeCtl* me = (SizeCtl*)client_data;
2834 me->selected_list = SIZECTL_SIZES_READY;
2835 if(!PdmOidListHasOid(me->sizes_ready, me->selected_size))
2836 me->selected_size = pdmoid_none;
2842 * ------------------------------------------------------------------------
2843 * Name: SizeCtlSupportedChangedCB
2855 SizeCtlSupportedChangedCB(Widget w,
2856 XtPointer client_data,
2857 XtPointer call_data)
2859 XmToggleButtonCallbackStruct* cbs =
2860 (XmToggleButtonCallbackStruct*)call_data;
2864 SizeCtl* me = (SizeCtl*)client_data;
2865 me->selected_list = SIZECTL_SIZES_SUPPORTED;
2871 * ------------------------------------------------------------------------
2872 * Name: SizeCtlSelectCB
2884 SizeCtlSelectCB(Widget w,
2885 XtPointer client_data,
2886 XtPointer call_data)
2888 XmListCallbackStruct* cbs = (XmListCallbackStruct*)call_data;
2889 SizeCtl* me = (SizeCtl*)client_data;
2891 if(!me->single_size_mode)
2893 switch(me->selected_list)
2895 case SIZECTL_SIZES_READY:
2897 PdmOidListGetOid(me->sizes_ready, cbs->item_position - 1);
2899 case SIZECTL_SIZES_SUPPORTED:
2901 PdmOidListGetOid(me->sizes_supported, cbs->item_position - 1);
2908 * ------------------------------------------------------------------------
2909 * Name: CreateOptionMenuPulldown
2921 CreateOptionMenuPulldown(String pulldown_name,
2923 XtCallbackProc activate_proc,
2924 XtPointer user_data,
2925 XmString* item_list,
2929 Widget cascade_button;
2931 Widget initial_selected = (Widget)NULL;
2933 char button_name[48];
2937 XmCreatePulldownMenu(XtParent(option_menu), pulldown_name, NULL, 0);
2939 for(i = 0; i < item_count; i++)
2941 sprintf(button_name, "button_%d", i);
2942 button = XtVaCreateManagedWidget(button_name,
2943 xmPushButtonGadgetClass,
2945 XmNuserData, user_data,
2946 XmNlabelString, item_list[i],
2948 if(activate_proc != (XtCallbackProc)NULL)
2949 XtAddCallback(button, XmNactivateCallback,
2950 activate_proc, (XtPointer)i);
2951 if(i == initial_item)
2952 initial_selected = button;
2954 XtVaSetValues(option_menu,
2955 XmNsubMenuId, pulldown,
2956 XmNmenuHistory, initial_selected,
2963 * ------------------------------------------------------------------------
2964 * Name: CreateXmStringsFromOidList
2976 CreateXmStringsFromOidList(const PdmOidList* list)
2978 int count = PdmOidListCount(list);
2979 XmString* xmstr_list = (XmString*)NULL;
2987 * build a list of Xm strings for the passed PdmOidList
2989 xmstr_list = (XmString*)XtCalloc(count, sizeof(XmString));
2990 for(i = 0; i < count; i++)
2992 oid = PdmOidListGetOid(list, i);
2993 str = DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
2995 PdmOidDefaultMsg(oid));
2996 xmstr_list[i] = XmStringCreateLocalized((char*)str);
3003 * ------------------------------------------------------------------------
3004 * Name: FreeXmStringList
3016 FreeXmStringList(XmString* list, int count)
3020 for(i = 0; i < count; i++)
3021 XmStringFree(list[i]);
3022 XtFree((char*)list);
3026 * ------------------------------------------------------------------------
3027 * Name: IconMaxDimension
3039 IconMaxDimension(Widget icon_label,
3040 PdmPixmapList* pixmap_list, int i,
3041 Dimension* max_width, Dimension* max_height)
3043 Dimension width, height;
3045 * set the pixmap in the label
3047 XtVaSetValues(icon_label,
3048 XmNlabelPixmap, PdmPixmapListGetPixmap(pixmap_list, i),
3051 * get the label dimensions
3053 XtVaGetValues(icon_label,
3058 * update the max dimensions
3060 if(width > *max_width)
3062 if(height > *max_height)
3063 *max_height = height;
3067 * ------------------------------------------------------------------------
3068 * Name: PdmPixmapListNew
3079 static PdmPixmapList*
3080 PdmPixmapListNew(int count,
3084 PdmPixmapList* me = (PdmPixmapList*)XtCalloc(1, sizeof(PdmPixmapList));
3086 me->pixmap = (Pixmap*)XtCalloc(count, sizeof(Pixmap));
3087 me->image_name = (char**)XtCalloc(count, sizeof(char*));
3088 me->screen = XtScreen(w);
3091 Widget xmscr = XmGetXmScreen(me->screen);
3092 XtVaGetValues(xmscr, XmNinsensitiveStippleBitmap, &me->stipple, NULL);
3099 XmNforeground, &me->foreground,
3100 XmNbackground, &me->background,
3107 * ------------------------------------------------------------------------
3108 * Name: PdmPixmapListDelete
3120 PdmPixmapListDelete(PdmPixmapList* me)
3122 if(me != (PdmPixmapList*)NULL)
3125 for(i = 0; i < PdmPixmapListCount(me); i++)
3127 if(me->pixmap[i] != (Pixmap)NULL)
3129 if(me->stipple == None)
3131 if(me->pixmap[i] != None)
3132 XmDestroyPixmap(me->screen, me->pixmap[i]);
3136 if(me->pixmap[i] != None)
3137 XFreePixmap(DisplayOfScreen(me->screen),
3140 XtFree((char*)me->image_name[i]);
3143 XtFree((char*)me->pixmap);
3144 XtFree((char*)me->image_name);
3150 * ------------------------------------------------------------------------
3151 * Name: PdmPixmapSetImageName
3163 PdmPixmapListSetImageName(PdmPixmapList* me,
3164 const char* image_name,
3167 me->image_name[i] = XtNewString(image_name);
3171 * ------------------------------------------------------------------------
3172 * Name: PdmPixmapListGetPixmap
3184 PdmPixmapListGetPixmap(PdmPixmapList* me, int i)
3186 if(me->pixmap[i] == None)
3188 me->pixmap[i] = XmGetPixmap(me->screen, me->image_name[i],
3189 me->foreground, me->background);
3190 if(me->pixmap[i] == XmUNSPECIFIED_PIXMAP)
3192 me->pixmap[i] == None;
3194 else if(me->stipple != None)
3196 Pixmap xmpixmap = me->pixmap[i];
3197 Display* display = DisplayOfScreen(me->screen);
3200 unsigned int width, height, border_width, depth;
3204 * make a copy of the pixmap cached by motif
3206 XGetGeometry(display, xmpixmap, &root, &x, &y,
3207 &width, &height, &border_width, &depth);
3209 XCreatePixmap(display, xmpixmap, width, height, depth);
3210 gc = XCreateGC(display, me->pixmap[i], (unsigned long)0, &values);
3211 XCopyArea(display, xmpixmap, me->pixmap[i], gc,
3212 0, 0, width, height, 0, 0);
3216 XSetFillStyle(display, gc, FillStippled);
3217 XSetStipple(display, gc, me->stipple);
3218 XFillRectangle(display, me->pixmap[i], gc, 0, 0, width, height);
3222 XFreeGC(display, gc);
3223 XmDestroyPixmap(me->screen, xmpixmap);
3226 return me->pixmap[i];
3230 * ------------------------------------------------------------------------
3231 * Name: SetListBoxSelection
3242 SetListBoxSelection(Widget list_box, int position)
3244 int visible_item_count;
3247 int first_visible_pos;
3249 * Scroll the list, making the item at the indicated position
3250 * visible in the center of the list box, and make
3251 * it the initial selection.
3253 XtVaGetValues(list_box,
3254 XmNitemCount, &item_count,
3255 XmNvisibleItemCount, &visible_item_count,
3258 if(item_count > visible_item_count)
3260 middle_offset = (visible_item_count+1) / 2;
3261 if(position > middle_offset)
3262 if(position > item_count - middle_offset)
3263 first_visible_pos = item_count - visible_item_count +1;
3265 first_visible_pos = position - middle_offset + 1;
3267 first_visible_pos = 1;
3268 XmListSetPos(list_box, first_visible_pos);
3272 XmListSelectPos(list_box, position, False);
3274 XmListDeselectAllItems(list_box);
3278 * ------------------------------------------------------------------------
3279 * Name: GetIconFileName
3290 GetIconFileName(Widget w, String resource_name)
3292 String icon_file_name;
3293 XtResource res_struct;
3295 res_struct.resource_name = resource_name;
3296 res_struct.resource_class = resource_name;
3297 res_struct.resource_type = XmRString;
3298 res_struct.resource_size = sizeof(String);
3299 res_struct.resource_offset = 0;
3300 res_struct.default_type = XmRImmediate;
3301 res_struct.default_addr = (XtPointer)NULL;
3302 XtGetApplicationResources(w, (XtPointer)&icon_file_name,
3303 &res_struct, 1, (ArgList)NULL, 0);
3305 return icon_file_name;