3338 lines
76 KiB
C
3338 lines
76 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these librararies and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: PrinterBox.c /main/10 1996/11/20 12:59:48 cde-hp $ */
|
|
/*
|
|
* dtpdm/PrinterBox.c
|
|
*/
|
|
/*
|
|
* (c) Copyright 1996 Digital Equipment Corporation.
|
|
* (c) Copyright 1996 Hewlett-Packard Company.
|
|
* (c) Copyright 1996 International Business Machines Corp.
|
|
* (c) Copyright 1996 Sun Microsystems, Inc.
|
|
* (c) Copyright 1996 Novell, Inc.
|
|
* (c) Copyright 1996 FUJITSU LIMITED.
|
|
* (c) Copyright 1996 Hitachi.
|
|
*/
|
|
#include <Xm/XmAll.h>
|
|
#include <Dt/DtNlUtils.h>
|
|
|
|
#include "PrinterBox.h"
|
|
|
|
#include "PdmMsgs.h"
|
|
|
|
#ifndef CDE_INSTALLATION_TOP
|
|
#define CDE_INSTALLATION_TOP "/usr/dt"
|
|
#endif
|
|
|
|
#define ICON_INSTALL_DIR CDE_INSTALLATION_TOP "/appconfig/icons/C/"
|
|
|
|
#ifndef MAX
|
|
# define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
#endif /* ! MAX */
|
|
|
|
/*
|
|
* PrinterBox-specific data - PdmSetupBox.subclass_data
|
|
*/
|
|
typedef struct
|
|
{
|
|
/*
|
|
* child controls
|
|
*/
|
|
struct _OrientCtl* orient_ctl;
|
|
struct _PlexCtl* plex_ctl;
|
|
struct _TrayCtl* tray_ctl;
|
|
struct _SizeCtl* size_ctl;
|
|
/*
|
|
* attribute values
|
|
*/
|
|
const char* printer_model;
|
|
char* document_format;
|
|
|
|
PdmOidList* document_attrs_supported;
|
|
|
|
PdmOidList* orientations_supported;
|
|
PdmOid orientation;
|
|
|
|
PdmOidList* plexes_supported;
|
|
PdmOid plex;
|
|
|
|
PdmOid default_input_tray;
|
|
PdmOid default_medium;
|
|
|
|
PdmOidList* input_trays;
|
|
PdmOidList* tray_sizes;
|
|
PdmOidLinkedList* sizes_supported;
|
|
|
|
} PdmPrinterBoxData;
|
|
|
|
/*
|
|
* orientations control
|
|
*/
|
|
typedef struct _OrientCtl
|
|
{
|
|
Widget widget;
|
|
Widget frame_label;
|
|
Widget option_menu;
|
|
Widget icon_label;
|
|
|
|
int selected_item;
|
|
|
|
const PdmOidList* orientations_supported;
|
|
PdmOidList* dummy_orientations_supported;
|
|
|
|
struct _PdmPixmapList* pixmap_list;
|
|
struct _PdmPixmapList* i_pixmap_list;
|
|
|
|
struct _PlexCtl* plex_ctl;
|
|
|
|
} OrientCtl;
|
|
|
|
/*
|
|
* plexes control
|
|
*/
|
|
typedef struct _PlexCtl
|
|
{
|
|
Widget widget;
|
|
Widget frame_label;
|
|
Widget option_menu;
|
|
Widget icon_label;
|
|
|
|
int selected_item;
|
|
|
|
const PdmOidList* plexes_supported;
|
|
PdmOidList* dummy_plexes_supported;
|
|
|
|
struct _PdmPixmapList** pixmap_list_ptr;
|
|
struct _PdmPixmapList* portrait_pixmap_list;
|
|
struct _PdmPixmapList* landscape_pixmap_list;
|
|
|
|
struct _PdmPixmapList** i_pixmap_list_ptr;
|
|
struct _PdmPixmapList* i_portrait_pixmap_list;
|
|
struct _PdmPixmapList* i_landscape_pixmap_list;
|
|
|
|
} PlexCtl;
|
|
|
|
/*
|
|
* input trays control
|
|
*/
|
|
typedef struct _TrayCtl
|
|
{
|
|
Widget widget;
|
|
Widget frame_label;
|
|
Widget option_menu;
|
|
|
|
int selected_item;
|
|
|
|
const PdmOidList* input_trays;
|
|
const PdmOidList* tray_sizes;
|
|
|
|
struct _SizeCtl* size_ctl;
|
|
|
|
} TrayCtl;
|
|
|
|
/*
|
|
* page size control
|
|
*/
|
|
typedef struct _SizeCtlSortRec
|
|
{
|
|
const char* str;
|
|
PdmOid oid;
|
|
} SizeCtlSortRec, *SizeCtlSortList;
|
|
|
|
typedef struct _SizeCtl
|
|
{
|
|
Widget widget;
|
|
Widget frame_label;
|
|
Widget list_box;
|
|
Widget radio_box;
|
|
Widget ready_radio;
|
|
Widget supported_radio;
|
|
|
|
PdmOidList* sizes_ready;
|
|
PdmOidList* sizes_supported;
|
|
|
|
PdmOid selected_size;
|
|
enum {
|
|
SIZECTL_UNSUPPORTED,
|
|
SIZECTL_SIZES_READY,
|
|
SIZECTL_SIZES_SUPPORTED } selected_list;
|
|
|
|
Boolean single_size_mode;
|
|
|
|
XmStringTable sizes_ready_xmstr;
|
|
XmStringTable sizes_supported_xmstr;
|
|
|
|
} SizeCtl;
|
|
|
|
/*
|
|
* list of pixmaps
|
|
*/
|
|
typedef struct _PdmPixmapList
|
|
{
|
|
Pixmap* pixmap;
|
|
char** image_name;
|
|
int count;
|
|
Screen* screen;
|
|
Pixel foreground, background;
|
|
Pixmap stipple;
|
|
} PdmPixmapList;
|
|
|
|
/*
|
|
* PrinterBox-specific fallback resources
|
|
*/
|
|
static String PdmPrinterBoxFallbackResources[] =
|
|
{
|
|
"*PrinterSetup*LoadedAllowed.button_0.labelString: Loaded in Printer",
|
|
"*PrinterSetup*LoadedAllowed.button_1.labelString: All Sizes",
|
|
"*PrinterSetup*OrientationLabel.labelString: Page Orientation",
|
|
"*PrinterSetup*PageSizeLabel.labelString: Page Size",
|
|
"*PrinterSetup*PlexLabel.labelString: Printed Sides",
|
|
"*PrinterSetup*DocumentFormatLabel.labelString: Format:",
|
|
"*PrinterSetup*PrinterModelLabel.labelString: Printer Model:",
|
|
"*PrinterSetup*TrayLabel.labelString: Tray",
|
|
"*PrinterSetup.locationId: PrinterSetup",
|
|
"*PrinterSetup*OrientCtlTop.PortraitIconFileName: "
|
|
ICON_INSTALL_DIR "portrait.pm",
|
|
"*PrinterSetup*OrientCtlTop.LandscapeIconFileName: "
|
|
ICON_INSTALL_DIR "landscap.pm",
|
|
"*PrinterSetup*OrientCtlTop.ReversePortraitIconFileName: "
|
|
ICON_INSTALL_DIR "rportrai.pm",
|
|
"*PrinterSetup*OrientCtlTop.ReverseLandscapeIconFileName: "
|
|
ICON_INSTALL_DIR "rlandsca.pm",
|
|
"*PrinterSetup*PlexCtlTop.SimplexPortraitIconFileName: "
|
|
ICON_INSTALL_DIR "psimplex.pm",
|
|
"*PrinterSetup*PlexCtlTop.SimplexLandscapeIconFileName: "
|
|
ICON_INSTALL_DIR "lsimplex.pm",
|
|
"*PrinterSetup*PlexCtlTop.DuplexPortraitIconFileName: "
|
|
ICON_INSTALL_DIR "pduplex.pm",
|
|
"*PrinterSetup*PlexCtlTop.DuplexLandscapeIconFileName: "
|
|
ICON_INSTALL_DIR "lduplex.pm",
|
|
"*PrinterSetup*PlexCtlTop.TumblePortraitIconFileName: "
|
|
ICON_INSTALL_DIR "ptumble.pm",
|
|
"*PrinterSetup*PlexCtlTop.TumbleLandscapeIconFileName: "
|
|
ICON_INSTALL_DIR "ltumble.pm",
|
|
"*PrinterTab.compoundString: Printer",
|
|
"*PrinterTab.labelString: Printer"
|
|
};
|
|
|
|
/*
|
|
* Printer Setup Box static function declarations
|
|
*/
|
|
static void PdmPrinterBoxDelete(PdmSetupBox* me);
|
|
static void PdmPrinterBoxCreate(PdmSetupBox* me, Widget parent);
|
|
static PdmStatus PdmPrinterBoxVerifyAttr(PdmSetupBox* me, PdmXp* pdm_xp);
|
|
static void PdmPrinterBoxGetAttr(PdmSetupBox* me, PdmXp* pdm_xp);
|
|
static void PdmPrinterBoxSetAttr(PdmSetupBox* me, PdmXp* pdm_xp);
|
|
static Widget PdmPrinterBoxCreateWindow(PdmSetupBox* me, Widget parent);
|
|
static void PdmPrinterBoxResizeCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data);
|
|
/*
|
|
* Orientation Control methods
|
|
*/
|
|
static OrientCtl* OrientCtlNew(PlexCtl* plex_ctl);
|
|
static void OrientCtlDelete(OrientCtl* me);
|
|
static void OrientCtlCreate(OrientCtl* me,
|
|
Widget parent,
|
|
PdmOid orientation,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* orientations_supported);
|
|
static void OrientCtlCreateWindow(OrientCtl* me, Widget parent);
|
|
#define OrientCtlGetWidget(me) ((me)->widget)
|
|
static void OrientCtlCreatePulldown(OrientCtl* me);
|
|
static void OrientCtlDisable(OrientCtl* me);
|
|
static void OrientCtlUpdateIcon(OrientCtl* me);
|
|
static PdmOid OrientCtlGetOrientation(OrientCtl* me);
|
|
static void OrientCtlResizeCB(Widget w,
|
|
XtPointer client_data, XtPointer call_data);
|
|
static void OrientCtlSetSelectedItem(OrientCtl* me, int selected_item);
|
|
static void OrientCtlSelectCB(Widget w, XtPointer client_d, XtPointer call_d);
|
|
static void OrientCtlInitPixmapList(OrientCtl* me);
|
|
|
|
/*
|
|
* Plex Control methods
|
|
*/
|
|
static PlexCtl* PlexCtlNew();
|
|
static void PlexCtlDelete(PlexCtl* me);
|
|
static void PlexCtlCreate(PlexCtl* me,
|
|
Widget parent,
|
|
PdmOid plex,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* plexes_supported);
|
|
static void PlexCtlCreateWindow(PlexCtl* me, Widget parent);
|
|
static void PlexCtlDisable(PlexCtl* me);
|
|
#define PlexCtlGetWidget(me) ((me)->widget)
|
|
static void PlexCtlCreatePulldown(PlexCtl* me);
|
|
static void PlexCtlUpdateIcon(PlexCtl* me);
|
|
static PdmOid PlexCtlGetPlex(PlexCtl* me);
|
|
static void PlexCtlResizeCB(Widget w,
|
|
XtPointer client_data, XtPointer call_data);
|
|
static void PlexCtlSetSelectedItem(PlexCtl* me, int selected_item);
|
|
static void PlexCtlSelectCB(Widget w, XtPointer client_d, XtPointer call_d);
|
|
static void PlexCtlSetOrientation(PlexCtl* me, PdmOid orientation);
|
|
static void PlexCtlInitPixmapLists(PlexCtl* me);
|
|
|
|
/*
|
|
* Tray Control methods
|
|
*/
|
|
static TrayCtl* TrayCtlNew(SizeCtl* size_ctl);
|
|
static void TrayCtlDelete(TrayCtl* me);
|
|
static void TrayCtlCreate(TrayCtl* me,
|
|
Widget parent,
|
|
PdmOid default_input_tray,
|
|
PdmOid default_medium,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* input_trays,
|
|
const PdmOidList* tray_sizes);
|
|
static void TrayCtlCreateWindow(TrayCtl* me, Widget parent);
|
|
#define TrayCtlGetWidget(me) ((me)->widget)
|
|
static PdmOid TrayCtlGetTray(TrayCtl* me);
|
|
static void TrayCtlDisable(TrayCtl* me);
|
|
static void TrayCtlResizeCB(Widget w,
|
|
XtPointer client_data, XtPointer call_data);
|
|
static void TrayCtlCreatePulldown(TrayCtl* me);
|
|
static void TrayCtlSetSelectedItem(TrayCtl* me, int selected_item);
|
|
static void TrayCtlSelectCB(Widget w, XtPointer client_d, XtPointer call_d);
|
|
|
|
/*
|
|
* Size Control methods
|
|
*/
|
|
static SizeCtl* SizeCtlNew();
|
|
static void SizeCtlDelete(SizeCtl* me);
|
|
static int SizeCtlStrColl(const void* e1, const void* e2);
|
|
static void SizeCtlSetSizeLists(PdmOidList** oids,
|
|
XmStringTable* xmstrs,
|
|
PdmOidLinkedList* oids_ll);
|
|
static void SizeCtlCreate(SizeCtl* me,
|
|
Widget parent,
|
|
PdmOid default_medium,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* tray_sizes,
|
|
PdmOidLinkedList* sizes_supported);
|
|
static void SizeCtlCreateWindow(SizeCtl* me, Widget parent);
|
|
#define SizeCtlGetWidget(me) ((me)->widget)
|
|
static void SizeCtlUpdate(SizeCtl* me);
|
|
static PdmOid SizeCtlGetSize(SizeCtl* me);
|
|
static void SizeCtlResizeCB(Widget w,
|
|
XtPointer client_data, XtPointer call_data);
|
|
static void SizeCtlSetSingleSizeMode(SizeCtl* me, PdmOid size);
|
|
static void SizeCtlSetMultiSizeMode(SizeCtl* me);
|
|
static void SizeCtlReadyChangedCB(Widget w,
|
|
XtPointer client_data, XtPointer call_data);
|
|
static void SizeCtlSupportedChangedCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data);
|
|
static void SizeCtlSelectCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data);
|
|
/*
|
|
* pixmap list functions
|
|
*/
|
|
static PdmPixmapList* PdmPixmapListNew(int count, Widget w, Boolean stipple);
|
|
static void PdmPixmapListDelete(PdmPixmapList* me);
|
|
static Pixmap PdmPixmapListGetPixmap(PdmPixmapList* me, int i);
|
|
#define PdmPixmapListCount(me) ((me)->count)
|
|
static void PdmPixmapListSetImageName(PdmPixmapList* me,
|
|
const char* name,
|
|
int i);
|
|
|
|
/*
|
|
* option menu list creation function
|
|
*/
|
|
static Widget
|
|
CreateOptionMenuPulldown(String pulldown_name,
|
|
Widget option_menu,
|
|
XtCallbackProc activate_proc,
|
|
XtPointer user_data,
|
|
XmString* item_list,
|
|
int item_count,
|
|
int initial_item);
|
|
/*
|
|
* XmString / oid utilities
|
|
*/
|
|
static XmString* CreateXmStringsFromOidList(const PdmOidList* list);
|
|
static void FreeXmStringList(XmString* list, int count);
|
|
|
|
/*
|
|
* utility to help determine maximum icon size
|
|
*/
|
|
static void
|
|
IconMaxDimension(Widget icon_label,
|
|
PdmPixmapList* pixmap_list, int i,
|
|
Dimension* max_width, Dimension* max_height);
|
|
|
|
/*
|
|
* utility to position list box initial selection
|
|
*/
|
|
static void SetListBoxSelection(Widget list_box, int position);
|
|
|
|
/*
|
|
* utility to grab icon file names out of the Xrm resource database
|
|
*/
|
|
static String GetIconFileName(Widget w, String resource_name);
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxNew
|
|
*
|
|
* Description:
|
|
*
|
|
* Creates a new PdmPrinterBox (PdmSetupBox) instance structure.
|
|
*
|
|
* Return value:
|
|
*
|
|
* The new PdmPrinterBox instance structure.
|
|
*
|
|
*/
|
|
PdmSetupBox*
|
|
PdmPrinterBoxNew()
|
|
{
|
|
PdmSetupBox* me = (PdmSetupBox*)XtCalloc(1, sizeof(PdmSetupBox));
|
|
PdmPrinterBoxData* data;
|
|
|
|
me->delete_proc = PdmPrinterBoxDelete;
|
|
me->create_proc = PdmPrinterBoxCreate;
|
|
me->verify_attr_proc = PdmPrinterBoxVerifyAttr;
|
|
me->get_attr_proc = PdmPrinterBoxGetAttr;
|
|
me->set_attr_proc = PdmPrinterBoxSetAttr;
|
|
me->fallback_resources = PdmPrinterBoxFallbackResources;
|
|
me->fallback_resources_count = XtNumber(PdmPrinterBoxFallbackResources);
|
|
me->tab_name = "PrinterTab";
|
|
|
|
me->subclass_data = (XtPointer)XtCalloc(1, sizeof(PdmPrinterBoxData));
|
|
data = (PdmPrinterBoxData*)me->subclass_data;
|
|
|
|
data->plex_ctl = PlexCtlNew();
|
|
data->orient_ctl = OrientCtlNew(data->plex_ctl);
|
|
|
|
data->size_ctl = SizeCtlNew();
|
|
data->tray_ctl = TrayCtlNew(data->size_ctl);
|
|
|
|
return me;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxDelete
|
|
*
|
|
* Description:
|
|
*
|
|
* Frees the passed PdmPrinterBox (PdmSetupBox) instance structure.
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
PdmPrinterBoxDelete(PdmSetupBox* me)
|
|
{
|
|
if(me != (PdmSetupBox*)NULL)
|
|
{
|
|
PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
|
|
|
|
XtFree(data->document_format);
|
|
|
|
PdmOidListDelete(data->document_attrs_supported);
|
|
PdmOidListDelete(data->orientations_supported);
|
|
PdmOidListDelete(data->plexes_supported);
|
|
PdmOidListDelete(data->input_trays);
|
|
PdmOidListDelete(data->tray_sizes);
|
|
PdmOidLinkedListDelete(data->sizes_supported);
|
|
|
|
OrientCtlDelete(data->orient_ctl);
|
|
PlexCtlDelete(data->plex_ctl);
|
|
SizeCtlDelete(data->size_ctl);
|
|
TrayCtlDelete(data->tray_ctl);
|
|
|
|
XtFree((char*)data);
|
|
XtFree((char*)me);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxCreate
|
|
*
|
|
* Description:
|
|
*
|
|
* Creates the PDM Printer options setup box.
|
|
*
|
|
* Return value:
|
|
*
|
|
* The passed PdmPrinterBox (PdmSetupBox) instance structure.
|
|
*
|
|
*/
|
|
static void
|
|
PdmPrinterBoxCreate(PdmSetupBox* me, Widget parent)
|
|
{
|
|
me->widget = PdmPrinterBoxCreateWindow(me, parent);
|
|
XtManageChild(me->widget);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxVerifyAttr
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* PDM_SUCCESS if all of the Printer options selected are OK.
|
|
*
|
|
* PDM_FAILURE if any of the Printer options are invalid.
|
|
*
|
|
*/
|
|
static PdmStatus
|
|
PdmPrinterBoxVerifyAttr(PdmSetupBox* me, PdmXp* pdm_xp)
|
|
{
|
|
return PDM_SUCCESS;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxGetAttr
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
PdmPrinterBoxGetAttr(PdmSetupBox* me, PdmXp* pdm_xp)
|
|
{
|
|
PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
|
|
const char* strval;
|
|
PdmOidMediumSS* medium_ss_supported;
|
|
PdmOidTrayMediumList* input_trays_medium;
|
|
/*
|
|
* printer model description
|
|
*/
|
|
data->printer_model =
|
|
PdmXpGetStringValue(pdm_xp, XPPrinterAttr, pdmoid_att_printer_model);
|
|
/*
|
|
* document format
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPDocAttr,
|
|
pdmoid_att_document_format);
|
|
data->document_format = PdmOidDocumentFormatParse(strval);
|
|
if((char*)NULL == data->document_format)
|
|
{
|
|
/*
|
|
* document format not specified, try to obtain
|
|
* document-formats-supported, and obtain up the default from it
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
|
|
pdmoid_att_document_formats_supported);
|
|
data->document_format = PdmOidDocumentFormatDefault(strval);
|
|
}
|
|
/*
|
|
* document attributes supported
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
|
|
pdmoid_att_document_attributes_supported);
|
|
data->document_attrs_supported = PdmOidListNew(strval);
|
|
/*
|
|
* content orientation supported
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
|
|
pdmoid_att_content_orientations_supported);
|
|
data->orientations_supported = PdmOidListNew(strval);
|
|
/*
|
|
* orientation
|
|
*/
|
|
data->orientation =
|
|
PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_content_orientation);
|
|
/*
|
|
* plexes supported
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
|
|
pdmoid_att_plexes_supported);
|
|
data->plexes_supported = PdmOidListNew(strval);
|
|
/*
|
|
* plex
|
|
*/
|
|
data->plex = PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_plex);
|
|
/*
|
|
* default input tray, default medium
|
|
*/
|
|
data->default_input_tray =
|
|
PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_default_input_tray);
|
|
data->default_medium =
|
|
PdmXpGetValue(pdm_xp, XPDocAttr, pdmoid_att_default_medium);
|
|
/*
|
|
* medium source sizes supported
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
|
|
pdmoid_att_medium_source_sizes_supported);
|
|
medium_ss_supported = PdmOidMediumSSNew(strval);
|
|
/*
|
|
* input trays medium
|
|
*/
|
|
strval = PdmXpGetStringValue(pdm_xp, XPPrinterAttr,
|
|
pdmoid_att_input_trays_medium);
|
|
input_trays_medium = PdmOidTrayMediumListNew(strval);
|
|
/*
|
|
* build input trays and page sizes ready lists
|
|
*/
|
|
PdmOidMediumSSGetTraysSizes(medium_ss_supported, input_trays_medium,
|
|
&data->input_trays, &data->tray_sizes);
|
|
/*
|
|
* build list of supported page sizes
|
|
*/
|
|
data->sizes_supported = PdmOidMediumSSGetAllSizes(medium_ss_supported);
|
|
/*
|
|
* clean up
|
|
*/
|
|
PdmOidMediumSSDelete(medium_ss_supported);
|
|
PdmOidTrayMediumListDelete(input_trays_medium);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxSetAttr
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
PdmPrinterBoxSetAttr(PdmSetupBox* me, PdmXp* pdm_xp)
|
|
{
|
|
PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
|
|
/*
|
|
* orientation
|
|
*/
|
|
PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_content_orientation,
|
|
OrientCtlGetOrientation(data->orient_ctl));
|
|
/*
|
|
* plex
|
|
*/
|
|
PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_plex,
|
|
PlexCtlGetPlex(data->plex_ctl));
|
|
/*
|
|
* page size
|
|
*/
|
|
PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_default_medium,
|
|
SizeCtlGetSize(data->size_ctl));
|
|
/*
|
|
* input tray
|
|
*/
|
|
PdmXpSetValue(pdm_xp, XPDocAttr, pdmoid_att_default_input_tray,
|
|
TrayCtlGetTray(data->tray_ctl));
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxCreateWindow
|
|
*
|
|
* Description:
|
|
*
|
|
* Creates the PDM Printer options setup box window.
|
|
*
|
|
* Return value:
|
|
*
|
|
* Widget ID of the new Printer setup box.
|
|
*
|
|
*/
|
|
static Widget
|
|
PdmPrinterBoxCreateWindow(PdmSetupBox* me, Widget parent)
|
|
{
|
|
PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
|
|
Widget manager;
|
|
Widget row;
|
|
Widget w;
|
|
Widget draw_area;
|
|
XmString label;
|
|
/*
|
|
* create the manager for the Printer Setup Box
|
|
*/
|
|
manager = XtVaCreateManagedWidget(
|
|
"PrinterSetup",
|
|
xmRowColumnWidgetClass,
|
|
parent,
|
|
NULL);
|
|
/*
|
|
* create the printer model row
|
|
*/
|
|
if(data->printer_model != (const char*)NULL)
|
|
{
|
|
char* desc;
|
|
char* ptr;
|
|
|
|
row = XtVaCreateManagedWidget(
|
|
"PrinterModelRow",
|
|
xmRowColumnWidgetClass,
|
|
manager,
|
|
XmNorientation, XmHORIZONTAL,
|
|
NULL);
|
|
/*
|
|
* create the printer model label
|
|
*/
|
|
w = XtVaCreateManagedWidget("PrinterModelLabel",
|
|
xmLabelGadgetClass,
|
|
row,
|
|
NULL);
|
|
/*
|
|
* create the printer model using just the 1st line
|
|
*/
|
|
desc = XtNewString(data->printer_model);
|
|
ptr = Dt_strchr(desc, '\n');
|
|
if(ptr != NULL)
|
|
*ptr = '\0';
|
|
label = XmStringCreateLocalized(desc);
|
|
XtFree(desc);
|
|
w = XtVaCreateManagedWidget("PrinterModel",
|
|
xmLabelGadgetClass,
|
|
row,
|
|
XmNlabelString, label,
|
|
NULL);
|
|
XmStringFree(label);
|
|
}
|
|
/*
|
|
* create the document format row
|
|
*/
|
|
if((char*)NULL != data->document_format)
|
|
{
|
|
/*
|
|
* create the document format row
|
|
*/
|
|
row = XtVaCreateManagedWidget(
|
|
"DocumentFormatRow",
|
|
xmRowColumnWidgetClass,
|
|
manager,
|
|
XmNorientation, XmHORIZONTAL,
|
|
NULL);
|
|
/*
|
|
* create the document format label
|
|
*/
|
|
w = XtVaCreateManagedWidget("DocumentFormatLabel",
|
|
xmLabelGadgetClass,
|
|
row,
|
|
NULL);
|
|
/*
|
|
* create the document format
|
|
*/
|
|
label = XmStringCreateLocalized(data->document_format);
|
|
w = XtVaCreateManagedWidget("DocumentFormat",
|
|
xmLabelGadgetClass,
|
|
row,
|
|
XmNlabelString, label,
|
|
NULL);
|
|
XmStringFree(label);
|
|
}
|
|
/*
|
|
* orientation / plex / tray / sides
|
|
*/
|
|
draw_area = XtVaCreateWidget("PrinterSetupControls",
|
|
xmDrawingAreaWidgetClass,
|
|
manager,
|
|
NULL);
|
|
XtAddCallback(draw_area, XmNresizeCallback,
|
|
PdmPrinterBoxResizeCB, (XtPointer)me);
|
|
/*
|
|
* orientation control
|
|
*/
|
|
OrientCtlCreate(data->orient_ctl,
|
|
draw_area,
|
|
data->orientation,
|
|
data->document_attrs_supported,
|
|
data->orientations_supported);
|
|
/*
|
|
* page size control
|
|
*/
|
|
SizeCtlCreate(data->size_ctl,
|
|
draw_area,
|
|
data->default_medium,
|
|
data->document_attrs_supported,
|
|
data->tray_sizes,
|
|
data->sizes_supported);
|
|
/*
|
|
* plex control
|
|
*/
|
|
PlexCtlCreate(data->plex_ctl,
|
|
draw_area,
|
|
data->plex,
|
|
data->document_attrs_supported,
|
|
data->plexes_supported);
|
|
/*
|
|
* input tray control
|
|
*/
|
|
TrayCtlCreate(data->tray_ctl,
|
|
draw_area,
|
|
data->default_input_tray,
|
|
data->default_medium,
|
|
data->document_attrs_supported,
|
|
data->input_trays,
|
|
data->tray_sizes);
|
|
|
|
XtManageChild(draw_area);
|
|
/*
|
|
* return the new Printer Setup Box
|
|
*/
|
|
return manager;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPrinterBoxResizeCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
PdmPrinterBoxResizeCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data)
|
|
{
|
|
PdmSetupBox* me = (PdmSetupBox*)client_data;
|
|
PdmPrinterBoxData* data = (PdmPrinterBoxData*)me->subclass_data;
|
|
typedef struct {
|
|
XtArgVal /* Position */ x, y;
|
|
XtArgVal /* Dimension */ width, height;
|
|
} PdmRect;
|
|
PdmRect rt, rs, ro, rp, c1, c2, r1, r2;
|
|
/*
|
|
* retrieve child dimensions
|
|
*/
|
|
XtVaGetValues(TrayCtlGetWidget(data->tray_ctl),
|
|
XmNx, &rt.x,
|
|
XmNy, &rt.y,
|
|
XmNwidth, &rt.width,
|
|
XmNheight, &rt.height,
|
|
NULL);
|
|
XtVaGetValues(SizeCtlGetWidget(data->size_ctl),
|
|
XmNx, &rs.x,
|
|
XmNy, &rs.y,
|
|
XmNwidth, &rs.width,
|
|
XmNheight, &rs.height,
|
|
NULL);
|
|
XtVaGetValues(OrientCtlGetWidget(data->orient_ctl),
|
|
XmNx, &ro.x,
|
|
XmNy, &ro.y,
|
|
XmNwidth, &ro.width,
|
|
XmNheight, &ro.height,
|
|
NULL);
|
|
XtVaGetValues(PlexCtlGetWidget(data->plex_ctl),
|
|
XmNx, &rp.x,
|
|
XmNy, &rp.y,
|
|
XmNwidth, &rp.width,
|
|
XmNheight, &rp.height,
|
|
NULL);
|
|
/*
|
|
* calculate rows and columns dimensions
|
|
*/
|
|
r1.x = r2.x = c1.x = 0;
|
|
r1.y = c1.y = c2.y = 0;
|
|
r1.height = MAX(ro.height, rp.height);
|
|
r2.height = MAX(rs.height, rt.height);
|
|
c1.width = MAX(ro.width, rs.width);
|
|
c2.width = MAX(rp.width, rt.width);
|
|
r2.y = r1.height + 5;
|
|
c2.x = c1.width + 3;
|
|
r1.width = r2.width = c2.x + c2.width;
|
|
c1.height = c2.height = r2.y + r2.height;
|
|
/*
|
|
* position the children
|
|
*/
|
|
XtVaSetValues(OrientCtlGetWidget(data->orient_ctl),
|
|
XmNx, c1.x,
|
|
XmNy, r1.y,
|
|
XmNwidth, c1.width,
|
|
XmNheight, r1.height,
|
|
NULL);
|
|
XtVaSetValues(PlexCtlGetWidget(data->plex_ctl),
|
|
XmNx, c2.x,
|
|
XmNy, r1.y,
|
|
XmNwidth, c2.width,
|
|
XmNheight, r1.height,
|
|
NULL);
|
|
XtVaSetValues(SizeCtlGetWidget(data->size_ctl),
|
|
XmNx, c1.x,
|
|
XmNy, r2.y,
|
|
XmNwidth, c1.width,
|
|
XmNheight, r2.height,
|
|
NULL);
|
|
XtVaSetValues(TrayCtlGetWidget(data->tray_ctl),
|
|
XmNx, c2.x,
|
|
XmNy, r2.y,
|
|
XmNwidth, c2.width,
|
|
XmNheight, r2.height,
|
|
NULL);
|
|
/*
|
|
* resize the drawing area to accomodate the new layout
|
|
*/
|
|
XtVaSetValues(w,
|
|
XmNwidth, r1.width,
|
|
XmNheight, c1.height,
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlNew
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static OrientCtl*
|
|
OrientCtlNew(PlexCtl* plex_ctl)
|
|
{
|
|
OrientCtl* me = (OrientCtl*)XtCalloc(1, sizeof(OrientCtl));
|
|
me->plex_ctl = plex_ctl;
|
|
return me;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlDelete
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlDelete(OrientCtl* me)
|
|
{
|
|
PdmOidListDelete(me->dummy_orientations_supported);
|
|
PdmPixmapListDelete(me->pixmap_list);
|
|
PdmPixmapListDelete(me->i_pixmap_list);
|
|
|
|
XtFree((char*)me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlCreate
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlCreate(OrientCtl* me,
|
|
Widget parent,
|
|
PdmOid orientation,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* orientations_supported)
|
|
{
|
|
Boolean supported;
|
|
/*
|
|
* determine if setting the content orientation is supported
|
|
*/
|
|
if(PdmOidListHasOid(document_attrs_supported,
|
|
pdmoid_att_content_orientation)
|
|
&&
|
|
PdmOidListCount(orientations_supported) > 0)
|
|
{
|
|
supported = True;
|
|
me->orientations_supported = orientations_supported;
|
|
}
|
|
else
|
|
{
|
|
supported = False;
|
|
/*
|
|
* dummy up a list to be presented (insensitive)
|
|
*/
|
|
me->dummy_orientations_supported =
|
|
PdmOidListNew(PdmOidString(pdmoid_val_content_orientation_portrait));
|
|
me->orientations_supported = me->dummy_orientations_supported;
|
|
orientation = pdmoid_none;
|
|
}
|
|
/*
|
|
* set the initially selected list item
|
|
*/
|
|
OrientCtlSetSelectedItem(me,
|
|
PdmOidListGetIndex(me->orientations_supported,
|
|
orientation));
|
|
/*
|
|
* create the orientations control window
|
|
*/
|
|
OrientCtlCreateWindow(me, parent);
|
|
/*
|
|
* initialize the window components
|
|
*/
|
|
OrientCtlCreatePulldown(me);
|
|
OrientCtlInitPixmapList(me);
|
|
OrientCtlUpdateIcon(me);
|
|
/*
|
|
* if content-orientation is not supported, disable the control
|
|
*/
|
|
if(!supported)
|
|
OrientCtlDisable(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlCreateWindow
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlCreateWindow(OrientCtl* me,
|
|
Widget parent)
|
|
{
|
|
Widget control_manager;
|
|
|
|
/*
|
|
* orientation frame
|
|
*/
|
|
me->widget = XtVaCreateManagedWidget("OrientCtlTop",
|
|
xmFrameWidgetClass,
|
|
parent,
|
|
XmNshadowType, XmSHADOW_ETCHED_IN,
|
|
NULL);
|
|
/*
|
|
* orientation label
|
|
*/
|
|
me->frame_label =
|
|
XtVaCreateManagedWidget("OrientationLabel",
|
|
xmLabelWidgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_TITLE_CHILD,
|
|
NULL);
|
|
/*
|
|
* orientation controls manager
|
|
*/
|
|
control_manager =
|
|
XtVaCreateManagedWidget("OrientationControls",
|
|
xmDrawingAreaWidgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_WORKAREA_CHILD,
|
|
NULL);
|
|
XtAddCallback(control_manager, XmNresizeCallback, OrientCtlResizeCB, me);
|
|
/*
|
|
* orientations option menu
|
|
*/
|
|
me->option_menu =
|
|
XtVaCreateManagedWidget("OrientationOptionMenu",
|
|
xmRowColumnWidgetClass,
|
|
control_manager,
|
|
XmNmarginHeight, 0,
|
|
XmNrowColumnType, XmMENU_OPTION,
|
|
NULL);
|
|
/*
|
|
* orientation icon
|
|
*/
|
|
me->icon_label =
|
|
XtVaCreateManagedWidget("OrientationIcon",
|
|
xmLabelWidgetClass,
|
|
control_manager,
|
|
XmNlabelType, XmPIXMAP,
|
|
XmNalignment, XmALIGNMENT_CENTER,
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlDisable
|
|
*
|
|
* Description:
|
|
*
|
|
* Disable the orientation controls.
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlDisable(OrientCtl* me)
|
|
{
|
|
XtSetSensitive(me->frame_label, False);
|
|
XtSetSensitive(me->option_menu, False);
|
|
XtSetSensitive(me->icon_label, False);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlResizeCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
OrientCtl* me = (OrientCtl*)client_data;
|
|
XtArgVal /* Dimension */ height, width, margin_width, new_width;
|
|
XtArgVal /* Position */ menu_x, menu_y, icon_x, icon_y;
|
|
XtArgVal /* Dimension */ menu_h, menu_w, icon_h, icon_w;
|
|
/*
|
|
* get current layout info
|
|
*/
|
|
XtVaGetValues(w, XmNheight, &height, XmNwidth, &width,
|
|
XmNmarginWidth, &margin_width,
|
|
NULL);
|
|
XtVaGetValues(me->option_menu, XmNheight, &menu_h, XmNwidth, &menu_w,
|
|
NULL);
|
|
XtVaGetValues(me->icon_label, XmNheight, &icon_h, XmNwidth, &icon_w,
|
|
NULL);
|
|
/*
|
|
* position controls side by side
|
|
*/
|
|
menu_x = 0;
|
|
icon_x = menu_x + menu_w;
|
|
/*
|
|
* center vertically
|
|
*/
|
|
menu_y = (height - menu_h) / 2;
|
|
icon_y = (height - icon_h) / 2;
|
|
/*
|
|
* set new positions
|
|
*/
|
|
XtVaSetValues(me->option_menu, XmNx, menu_x, XmNy, menu_y, NULL);
|
|
XtVaSetValues(me->icon_label, XmNx, icon_x, XmNy, icon_y, NULL);
|
|
/*
|
|
* update drawing area width
|
|
*/
|
|
new_width = menu_x + menu_w + icon_w + margin_width;
|
|
if(new_width > width)
|
|
XtVaSetValues(w, XmNwidth, new_width, NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlCreatePulldown
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlCreatePulldown(OrientCtl* me)
|
|
{
|
|
XmString* list;
|
|
int count;
|
|
/*
|
|
* create a list of XmStrings for the content orientations
|
|
*/
|
|
list = CreateXmStringsFromOidList(me->orientations_supported);
|
|
/*
|
|
* create the option menu pulldown
|
|
*/
|
|
count = PdmOidListCount(me->orientations_supported);
|
|
CreateOptionMenuPulldown("OrientationOptions",
|
|
me->option_menu,
|
|
OrientCtlSelectCB,
|
|
(XtPointer)me,
|
|
list, count,
|
|
me->selected_item);
|
|
/*
|
|
* clean up
|
|
*/
|
|
FreeXmStringList(list, count);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlSelectCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlSelectCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
OrientCtl* me;
|
|
XtArgVal /* int */ selected_item = (XtArgVal)client_data;
|
|
|
|
XtVaGetValues(w, XmNuserData, &me, NULL);
|
|
OrientCtlSetSelectedItem(me, selected_item);
|
|
OrientCtlUpdateIcon(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlInitPixmapList
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlInitPixmapList(OrientCtl* me)
|
|
{
|
|
int i;
|
|
const char* image_name;
|
|
int count;
|
|
Dimension max_width = 0;
|
|
Dimension max_height = 0;
|
|
|
|
/*
|
|
* initialize the list of pixmaps based on the supported orientations
|
|
*/
|
|
count = PdmOidListCount(me->orientations_supported);
|
|
me->pixmap_list = PdmPixmapListNew(count, me->icon_label, False);
|
|
me->i_pixmap_list = PdmPixmapListNew(count, me->icon_label, True);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
switch(PdmOidListGetOid(me->orientations_supported, i))
|
|
{
|
|
case pdmoid_val_content_orientation_portrait:
|
|
image_name = GetIconFileName(me->widget, "PortraitIconFileName");
|
|
break;
|
|
case pdmoid_val_content_orientation_landscape:
|
|
image_name = GetIconFileName(me->widget, "LandscapeIconFileName");
|
|
break;
|
|
case pdmoid_val_content_orientation_reverse_portrait:
|
|
image_name =
|
|
GetIconFileName(me->widget, "ReversePortraitIconFileName");
|
|
break;
|
|
case pdmoid_val_content_orientation_reverse_landscape:
|
|
image_name =
|
|
GetIconFileName(me->widget, "ReverseLandscapeIconFileName");
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
PdmPixmapListSetImageName(me->pixmap_list, image_name, i);
|
|
PdmPixmapListSetImageName(me->i_pixmap_list, image_name, i);
|
|
IconMaxDimension(me->icon_label,
|
|
me->pixmap_list, i,
|
|
&max_width, &max_height);
|
|
}
|
|
XtVaSetValues(me->icon_label,
|
|
XmNwidth, max_width,
|
|
XmNheight, max_height,
|
|
XmNrecomputeSize, False,
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlSetSelectedItem
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlSetSelectedItem(OrientCtl* me, int selected_item)
|
|
{
|
|
if(selected_item == -1)
|
|
me->selected_item = 0;
|
|
else
|
|
me->selected_item = selected_item;
|
|
|
|
if(me->plex_ctl != (PlexCtl*)NULL)
|
|
PlexCtlSetOrientation(me->plex_ctl, OrientCtlGetOrientation(me));
|
|
}
|
|
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlUpdateIcon
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
OrientCtlUpdateIcon(OrientCtl* me)
|
|
{
|
|
if(me->icon_label != (Widget)NULL)
|
|
XtVaSetValues(me->icon_label,
|
|
XmNlabelPixmap,
|
|
PdmPixmapListGetPixmap(me->pixmap_list,
|
|
me->selected_item),
|
|
XmNlabelInsensitivePixmap,
|
|
PdmPixmapListGetPixmap(me->i_pixmap_list,
|
|
me->selected_item),
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: OrientCtlGetOrientation
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static PdmOid
|
|
OrientCtlGetOrientation(OrientCtl* me)
|
|
{
|
|
if(me->orientations_supported == me->dummy_orientations_supported)
|
|
return pdmoid_none;
|
|
else
|
|
return PdmOidListGetOid(me->orientations_supported, me->selected_item);
|
|
}
|
|
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlNew
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static PlexCtl*
|
|
PlexCtlNew()
|
|
{
|
|
PlexCtl* me = (PlexCtl*)XtCalloc(1, sizeof(PlexCtl));
|
|
me->pixmap_list_ptr = &me->portrait_pixmap_list;
|
|
me->i_pixmap_list_ptr = &me->i_portrait_pixmap_list;
|
|
return me;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlDelete
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlDelete(PlexCtl* me)
|
|
{
|
|
PdmOidListDelete(me->dummy_plexes_supported);
|
|
PdmPixmapListDelete(me->portrait_pixmap_list);
|
|
PdmPixmapListDelete(me->i_portrait_pixmap_list);
|
|
PdmPixmapListDelete(me->landscape_pixmap_list);
|
|
PdmPixmapListDelete(me->i_landscape_pixmap_list);
|
|
|
|
XtFree((char*)me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlCreate
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlCreate(PlexCtl* me,
|
|
Widget parent,
|
|
PdmOid plex,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* plexes_supported)
|
|
{
|
|
Boolean supported;
|
|
/*
|
|
* determine if setting the content orientation is supported
|
|
*/
|
|
if(PdmOidListHasOid(document_attrs_supported, pdmoid_att_plex)
|
|
&&
|
|
PdmOidListCount(plexes_supported) > 0)
|
|
{
|
|
supported = True;
|
|
me->plexes_supported = plexes_supported;
|
|
}
|
|
else
|
|
{
|
|
supported = False;
|
|
/*
|
|
* dummy up a list to be presented (insensitive)
|
|
*/
|
|
me->dummy_plexes_supported =
|
|
PdmOidListNew(PdmOidString(pdmoid_val_plex_simplex));
|
|
me->plexes_supported = me->dummy_plexes_supported;
|
|
plex = pdmoid_none;
|
|
}
|
|
|
|
/*
|
|
* set the initially selected list item
|
|
*/
|
|
PlexCtlSetSelectedItem(me, PdmOidListGetIndex(me->plexes_supported, plex));
|
|
/*
|
|
* create the plexes control window
|
|
*/
|
|
PlexCtlCreateWindow(me, parent);
|
|
/*
|
|
* initialize the window components
|
|
*/
|
|
PlexCtlCreatePulldown(me);
|
|
PlexCtlInitPixmapLists(me);
|
|
PlexCtlUpdateIcon(me);
|
|
/*
|
|
* if plex is not supported, disable the control
|
|
*/
|
|
if(!supported)
|
|
PlexCtlDisable(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlCreateWindow
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlCreateWindow(PlexCtl* me,
|
|
Widget parent)
|
|
{
|
|
Widget control_manager;
|
|
/*
|
|
* plex frame
|
|
*/
|
|
me->widget = XtVaCreateManagedWidget("PlexCtlTop",
|
|
xmFrameWidgetClass,
|
|
parent,
|
|
XmNshadowType, XmSHADOW_ETCHED_IN,
|
|
NULL);
|
|
/*
|
|
* plex label
|
|
*/
|
|
me->frame_label =
|
|
XtVaCreateManagedWidget("PlexLabel",
|
|
xmLabelGadgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_TITLE_CHILD,
|
|
NULL);
|
|
/*
|
|
* plex controls manager
|
|
*/
|
|
control_manager =
|
|
XtVaCreateManagedWidget(
|
|
"PlexControls",
|
|
xmDrawingAreaWidgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_WORKAREA_CHILD,
|
|
NULL);
|
|
XtAddCallback(control_manager, XmNresizeCallback, PlexCtlResizeCB, me);
|
|
/*
|
|
* plexes option menu
|
|
*/
|
|
me->option_menu =
|
|
XtVaCreateManagedWidget("PlexOptionMenu",
|
|
xmRowColumnWidgetClass,
|
|
control_manager,
|
|
XmNrowColumnType, XmMENU_OPTION,
|
|
XmNmarginHeight, 0,
|
|
NULL);
|
|
/*
|
|
* plex icon
|
|
*/
|
|
me->icon_label =
|
|
XtVaCreateManagedWidget("PlexIcon",
|
|
xmLabelWidgetClass,
|
|
control_manager,
|
|
XmNlabelType, XmPIXMAP,
|
|
XmNalignment, XmALIGNMENT_CENTER,
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlDisable
|
|
*
|
|
* Description:
|
|
*
|
|
* Disable the plex controls.
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlDisable(PlexCtl* me)
|
|
{
|
|
XtSetSensitive(me->frame_label, False);
|
|
XtSetSensitive(me->option_menu, False);
|
|
XtSetSensitive(me->icon_label, False);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlResizeCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
PlexCtl* me = (PlexCtl*)client_data;
|
|
XtArgVal /* Dimension */ height, width, margin_width, new_width;
|
|
XtArgVal /* Position */ menu_x, menu_y, icon_x, icon_y;
|
|
XtArgVal /* Dimension */ menu_h, menu_w, icon_h, icon_w;
|
|
/*
|
|
* get current layout info
|
|
*/
|
|
XtVaGetValues(w, XmNheight, &height, XmNwidth, &width,
|
|
XmNmarginWidth, &margin_width,
|
|
NULL);
|
|
XtVaGetValues(me->option_menu, XmNheight, &menu_h, XmNwidth, &menu_w,
|
|
NULL);
|
|
XtVaGetValues(me->icon_label, XmNheight, &icon_h, XmNwidth, &icon_w,
|
|
NULL);
|
|
/*
|
|
* position controls side by side
|
|
*/
|
|
menu_x = 0;
|
|
icon_x = menu_x + menu_w;
|
|
/*
|
|
* center vertically
|
|
*/
|
|
menu_y = (height - menu_h) / 2;
|
|
icon_y = (height - icon_h) / 2;
|
|
/*
|
|
* set new positions
|
|
*/
|
|
XtVaSetValues(me->option_menu, XmNx, menu_x, XmNy, menu_y, NULL);
|
|
XtVaSetValues(me->icon_label, XmNx, icon_x, XmNy, icon_y, NULL);
|
|
/*
|
|
* update drawing area width
|
|
*/
|
|
new_width = menu_x + menu_w + icon_w + margin_width;
|
|
if(new_width > width)
|
|
XtVaSetValues(w, XmNwidth, new_width, NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlCreatePulldown
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlCreatePulldown(PlexCtl* me)
|
|
{
|
|
XmString* list;
|
|
int count;
|
|
/*
|
|
* build a list of Xm strings for the supported plexes
|
|
*/
|
|
list = CreateXmStringsFromOidList(me->plexes_supported);
|
|
/*
|
|
* create the option menu pulldown
|
|
*/
|
|
count = PdmOidListCount(me->plexes_supported);
|
|
CreateOptionMenuPulldown("PlexOptions",
|
|
me->option_menu,
|
|
PlexCtlSelectCB,
|
|
(XtPointer)me,
|
|
list, count,
|
|
me->selected_item);
|
|
/*
|
|
* clean up
|
|
*/
|
|
FreeXmStringList(list, count);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlSelectCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlSelectCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
PlexCtl* me;
|
|
XtArgVal /* int */ selected_item = (XtArgVal)client_data;
|
|
|
|
XtVaGetValues(w, XmNuserData, &me, NULL);
|
|
PlexCtlSetSelectedItem(me, selected_item);
|
|
PlexCtlUpdateIcon(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlSetOrientation
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlSetOrientation(PlexCtl* me,
|
|
PdmOid orientation)
|
|
{
|
|
switch(orientation)
|
|
{
|
|
case pdmoid_val_content_orientation_landscape:
|
|
case pdmoid_val_content_orientation_reverse_landscape:
|
|
me->pixmap_list_ptr = &me->landscape_pixmap_list;
|
|
me->i_pixmap_list_ptr = &me->i_landscape_pixmap_list;
|
|
break;
|
|
default:
|
|
me->pixmap_list_ptr = &me->portrait_pixmap_list;
|
|
me->i_pixmap_list_ptr = &me->i_portrait_pixmap_list;
|
|
break;
|
|
}
|
|
PlexCtlUpdateIcon(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlInitPixmapLists
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlInitPixmapLists(PlexCtl* me)
|
|
{
|
|
int i;
|
|
const char* portrait_image_name;
|
|
const char* landscape_image_name;
|
|
int count;
|
|
Dimension max_width = 0;
|
|
Dimension max_height = 0;
|
|
|
|
/*
|
|
* initialize the list of pixmaps based on the list of plexes
|
|
*/
|
|
count = PdmOidListCount(me->plexes_supported);
|
|
me->portrait_pixmap_list = PdmPixmapListNew(count, me->icon_label, False);
|
|
me->i_portrait_pixmap_list = PdmPixmapListNew(count, me->icon_label, True);
|
|
me->landscape_pixmap_list = PdmPixmapListNew(count, me->icon_label, False);
|
|
me->i_landscape_pixmap_list = PdmPixmapListNew(count, me->icon_label, True);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
switch(PdmOidListGetOid(me->plexes_supported, i))
|
|
{
|
|
case pdmoid_val_plex_simplex:
|
|
portrait_image_name =
|
|
GetIconFileName(me->widget, "SimplexPortraitIconFileName");
|
|
landscape_image_name =
|
|
GetIconFileName(me->widget, "SimplexLandscapeIconFileName");
|
|
break;
|
|
case pdmoid_val_plex_duplex:
|
|
portrait_image_name =
|
|
GetIconFileName(me->widget, "DuplexPortraitIconFileName");
|
|
landscape_image_name =
|
|
GetIconFileName(me->widget, "DuplexLandscapeIconFileName");
|
|
break;
|
|
case pdmoid_val_plex_tumble:
|
|
portrait_image_name =
|
|
GetIconFileName(me->widget, "TumblePortraitIconFileName");
|
|
landscape_image_name =
|
|
GetIconFileName(me->widget, "TumbleLandscapeIconFileName");
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
PdmPixmapListSetImageName(me->portrait_pixmap_list,
|
|
portrait_image_name, i);
|
|
PdmPixmapListSetImageName(me->i_portrait_pixmap_list,
|
|
portrait_image_name, i);
|
|
PdmPixmapListSetImageName(me->landscape_pixmap_list,
|
|
landscape_image_name, i);
|
|
PdmPixmapListSetImageName(me->i_landscape_pixmap_list,
|
|
landscape_image_name, i);
|
|
IconMaxDimension(me->icon_label,
|
|
me->portrait_pixmap_list, i,
|
|
&max_width, &max_height);
|
|
IconMaxDimension(me->icon_label,
|
|
me->landscape_pixmap_list, i,
|
|
&max_width, &max_height);
|
|
}
|
|
XtVaSetValues(me->icon_label,
|
|
XmNwidth, max_width,
|
|
XmNheight, max_height,
|
|
XmNrecomputeSize, False,
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlSetSelectedItem
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlSetSelectedItem(PlexCtl* me, int selected_item)
|
|
{
|
|
if(selected_item == -1)
|
|
me->selected_item = 0;
|
|
else
|
|
me->selected_item = selected_item;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlUpdateIcon
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PlexCtlUpdateIcon(PlexCtl* me)
|
|
{
|
|
if(me->icon_label != (Widget)NULL)
|
|
XtVaSetValues(me->icon_label,
|
|
XmNlabelPixmap,
|
|
PdmPixmapListGetPixmap(*me->pixmap_list_ptr,
|
|
me->selected_item),
|
|
XmNlabelInsensitivePixmap,
|
|
PdmPixmapListGetPixmap(*me->i_pixmap_list_ptr,
|
|
me->selected_item),
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PlexCtlGetPlex
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static PdmOid
|
|
PlexCtlGetPlex(PlexCtl* me)
|
|
{
|
|
if(me->plexes_supported == me->dummy_plexes_supported)
|
|
return pdmoid_none;
|
|
else
|
|
return PdmOidListGetOid(me->plexes_supported, me->selected_item);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlNew
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static TrayCtl*
|
|
TrayCtlNew(SizeCtl* size_ctl)
|
|
{
|
|
TrayCtl* me = (TrayCtl*)XtCalloc(1, sizeof(TrayCtl));
|
|
|
|
me->size_ctl = size_ctl;
|
|
|
|
return me;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlDelete
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlDelete(TrayCtl* me)
|
|
{
|
|
XtFree((char*)me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlCreate
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlCreate(TrayCtl* me,
|
|
Widget parent,
|
|
PdmOid default_input_tray,
|
|
PdmOid default_medium,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* input_trays,
|
|
const PdmOidList* tray_sizes)
|
|
{
|
|
Boolean supported;
|
|
/*
|
|
* save the trays and sizes list pointers
|
|
*/
|
|
me->input_trays = input_trays;
|
|
me->tray_sizes = tray_sizes;
|
|
/*
|
|
* determine if setting the input tray is supported
|
|
*/
|
|
if(PdmOidListHasOid(document_attrs_supported,
|
|
pdmoid_att_default_input_tray)
|
|
&&
|
|
PdmOidListCount(me->input_trays) > 0)
|
|
{
|
|
supported = True;
|
|
}
|
|
else
|
|
supported = False;
|
|
/*
|
|
* set the initially selected list item
|
|
*/
|
|
if(default_medium != pdmoid_none)
|
|
{
|
|
/*
|
|
* default-medium has precedence; set "Auto-select" (index 0)
|
|
*/
|
|
TrayCtlSetSelectedItem(me, 0);
|
|
}
|
|
else
|
|
{
|
|
int i = PdmOidListGetIndex(me->input_trays, default_input_tray);
|
|
if(!supported || i == -1)
|
|
/*
|
|
* default-input-tray unsupported or not found in list; set
|
|
* "Auto-select" (index 0)
|
|
*/
|
|
TrayCtlSetSelectedItem(me, 0);
|
|
else
|
|
/*
|
|
* Select the list item corresponding to default-input-tray -
|
|
* ie. add 1 to the input trays list index since the option
|
|
* menu is always built with "Auto-select" as the first
|
|
* entry, followed by the input trays list entries.
|
|
*/
|
|
TrayCtlSetSelectedItem(me, i+1);
|
|
}
|
|
/*
|
|
* create the tray control window
|
|
*/
|
|
TrayCtlCreateWindow(me, parent);
|
|
/*
|
|
* initialize the window components
|
|
*/
|
|
TrayCtlCreatePulldown(me);
|
|
/*
|
|
* if tray selection is not supported, disable the control
|
|
*/
|
|
if(!supported)
|
|
TrayCtlDisable(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlCreateWindow
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlCreateWindow(TrayCtl* me, Widget parent)
|
|
{
|
|
Widget control_manager;
|
|
|
|
/*
|
|
* tray frame
|
|
*/
|
|
me->widget = XtVaCreateManagedWidget("TrayCtlTop",
|
|
xmFrameWidgetClass,
|
|
parent,
|
|
XmNshadowType, XmSHADOW_ETCHED_IN,
|
|
NULL);
|
|
/*
|
|
* tray label
|
|
*/
|
|
me->frame_label
|
|
= XtVaCreateManagedWidget("TrayLabel",
|
|
xmLabelGadgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_TITLE_CHILD,
|
|
NULL);
|
|
/*
|
|
* tray controls manager
|
|
*/
|
|
control_manager =
|
|
XtVaCreateManagedWidget("TrayControls",
|
|
xmDrawingAreaWidgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_WORKAREA_CHILD,
|
|
NULL);
|
|
XtAddCallback(control_manager, XmNresizeCallback, TrayCtlResizeCB, me);
|
|
/*
|
|
* trays option menu
|
|
*/
|
|
me->option_menu =
|
|
XtVaCreateManagedWidget("TrayOptionMenu",
|
|
xmRowColumnWidgetClass,
|
|
control_manager,
|
|
XmNmarginHeight, 0,
|
|
XmNrowColumnType, XmMENU_OPTION,
|
|
NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlDisable
|
|
*
|
|
* Description:
|
|
*
|
|
* Disable the input tray controls.
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlDisable(TrayCtl* me)
|
|
{
|
|
XtSetSensitive(me->frame_label, False);
|
|
XtSetSensitive(me->option_menu, False);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlResizeCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
TrayCtl* me = (TrayCtl*)client_data;
|
|
XtArgVal /* Dimension */ height, menu_h;
|
|
XtArgVal /* Position */ menu_y;
|
|
/*
|
|
* get current layout info
|
|
*/
|
|
XtVaGetValues(w, XmNheight, &height, NULL);
|
|
XtVaGetValues(me->option_menu, XmNheight, &menu_h, NULL);
|
|
/*
|
|
* center vertically
|
|
*/
|
|
menu_y = (height - menu_h) / 2;
|
|
/*
|
|
* set new position
|
|
*/
|
|
XtVaSetValues(me->option_menu, XmNx, 0, XmNy, menu_y, NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlGetTray
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static PdmOid
|
|
TrayCtlGetTray(TrayCtl* me)
|
|
{
|
|
if(me->selected_item == 0)
|
|
return pdmoid_none;
|
|
else
|
|
return PdmOidListGetOid(me->input_trays, me->selected_item - 1);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlCreatePulldown
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlCreatePulldown(TrayCtl* me)
|
|
{
|
|
XmString* xmstr_list;
|
|
int count;
|
|
PdmOid oid;
|
|
const char* str;
|
|
int i;
|
|
/*
|
|
* create a list of XmStrings for the Auto-select item plus the list
|
|
* of specific trays
|
|
*/
|
|
count = 1 + PdmOidListCount(me->input_trays);
|
|
xmstr_list = (XmString*)XtCalloc(count, sizeof(XmString));
|
|
/*
|
|
* set the "Auto-select" item as the first item
|
|
*/
|
|
i = 0;
|
|
xmstr_list[i++] = XmStringCreateLocalized((char*)PDM_MSG_TRAY_AUTO_SELECT);
|
|
/*
|
|
* add the input trays
|
|
*/
|
|
for(; i < count; i++)
|
|
{
|
|
oid = PdmOidListGetOid(me->input_trays, i-1);
|
|
str = DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
|
|
PdmOidMsgNum(oid),
|
|
PdmOidDefaultMsg(oid));
|
|
xmstr_list[i] = XmStringCreateLocalized((char*)str);
|
|
}
|
|
/*
|
|
* create the option menu pulldown
|
|
*/
|
|
CreateOptionMenuPulldown("TrayOptions",
|
|
me->option_menu,
|
|
TrayCtlSelectCB,
|
|
(XtPointer)me,
|
|
xmstr_list, count,
|
|
me->selected_item);
|
|
/*
|
|
* clean up
|
|
*/
|
|
FreeXmStringList(xmstr_list, count);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlSetSelectedItem
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlSetSelectedItem(TrayCtl* me, int selected_item)
|
|
{
|
|
if(selected_item == -1)
|
|
me->selected_item = 0;
|
|
else
|
|
me->selected_item = selected_item;
|
|
/*
|
|
* update the page size control accordingly
|
|
*/
|
|
if(me->selected_item == 0)
|
|
SizeCtlSetMultiSizeMode(me->size_ctl);
|
|
else
|
|
SizeCtlSetSingleSizeMode(me->size_ctl,
|
|
PdmOidListGetOid(me->tray_sizes,
|
|
me->selected_item - 1));
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: TrayCtlSelectCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
TrayCtlSelectCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
TrayCtl* me;
|
|
XtArgVal /* int */ selected_item = (XtArgVal)client_data;
|
|
|
|
XtVaGetValues(w, XmNuserData, &me, NULL);
|
|
TrayCtlSetSelectedItem(me, selected_item);
|
|
}
|
|
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlNew
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static SizeCtl*
|
|
SizeCtlNew()
|
|
{
|
|
SizeCtl* me = (SizeCtl*)XtCalloc(1, sizeof(SizeCtl));
|
|
return me;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlDelete
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlDelete(SizeCtl* me)
|
|
{
|
|
if(me != (SizeCtl*)NULL)
|
|
{
|
|
if(me->sizes_ready_xmstr != (XmString*)NULL)
|
|
FreeXmStringList(me->sizes_ready_xmstr,
|
|
PdmOidListCount(me->sizes_ready));
|
|
if(me->sizes_supported_xmstr != (XmString*)NULL)
|
|
FreeXmStringList(me->sizes_supported_xmstr,
|
|
PdmOidListCount(me->sizes_supported));
|
|
PdmOidListDelete(me->sizes_ready);
|
|
PdmOidListDelete(me->sizes_supported);
|
|
XtFree((char*)me);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlStrColl
|
|
*
|
|
* Description:
|
|
*
|
|
* An adaptor for using strcoll on SizeCtlSortRec's with qsort.
|
|
*
|
|
* Return value:
|
|
*
|
|
* The return value for strcoll given the strings in the passed
|
|
* SizeCtlSortRec's.
|
|
*
|
|
*/
|
|
static int
|
|
SizeCtlStrColl(const void* e1, const void* e2)
|
|
{
|
|
const SizeCtlSortRec *r1 = e1, *r2 = e2;
|
|
|
|
return strcoll(r1->str, r2->str);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlSetSizeLists
|
|
*
|
|
* Description:
|
|
*
|
|
* Creates a sorted XmStringTable and PdmOidList using
|
|
* the oids from the passed PdmOidLinkedList. The newly created lists
|
|
* are returned via the 'oids' and 'xmstrs' parms.
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlSetSizeLists(PdmOidList** oid_list,
|
|
XmStringTable* xmstrs,
|
|
PdmOidLinkedList* oid_ll)
|
|
{
|
|
int count;
|
|
|
|
count = PdmOidLinkedListCount(oid_ll);
|
|
if(count == 0)
|
|
{
|
|
*oid_list = (PdmOidList*)NULL;
|
|
*xmstrs = (XmStringTable)NULL;
|
|
}
|
|
else
|
|
{
|
|
SizeCtlSortList sort_list;
|
|
int i;
|
|
PdmOid oid;
|
|
/*
|
|
* sort the passed sizes
|
|
*/
|
|
sort_list = (SizeCtlSortList)XtCalloc(count, sizeof(SizeCtlSortRec));
|
|
for(i = 0, oid = PdmOidLinkedListFirstOid(oid_ll);
|
|
i < count;
|
|
i++, oid = PdmOidLinkedListNextOid(oid_ll))
|
|
{
|
|
sort_list[i].oid = oid;
|
|
sort_list[i].str = DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
|
|
PdmOidMsgNum(oid),
|
|
PdmOidDefaultMsg(oid));
|
|
}
|
|
qsort(sort_list, count, sizeof(SizeCtlSortRec), SizeCtlStrColl);
|
|
/*
|
|
* create the return lists of oids and XmStrings
|
|
*/
|
|
*oid_list = (PdmOidList*)XtCalloc(1, sizeof(PdmOidList));
|
|
(*oid_list)->list = (PdmOid*)XtCalloc(count, sizeof(PdmOid));
|
|
(*oid_list)->count = count;
|
|
*xmstrs = (XmStringTable)XtCalloc(count, sizeof(XmString));
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
((*oid_list)->list)[i] = sort_list[i].oid;
|
|
(*xmstrs)[i] = XmStringCreateLocalized((char*)sort_list[i].str);
|
|
}
|
|
XtFree((char*)sort_list);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlCreate
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlCreate(SizeCtl* me,
|
|
Widget parent,
|
|
PdmOid default_medium,
|
|
const PdmOidList* document_attrs_supported,
|
|
const PdmOidList* tray_sizes,
|
|
PdmOidLinkedList* sizes_supported)
|
|
{
|
|
Boolean supported;
|
|
int i;
|
|
PdmOid oid;
|
|
PdmOidLinkedList* sizes_ready_ll;
|
|
/*
|
|
* initialize the selected size
|
|
*/
|
|
me->selected_size = default_medium;
|
|
/*
|
|
* build the sizes ready list using unique elements of the tray sizes
|
|
* list
|
|
*/
|
|
sizes_ready_ll = PdmOidLinkedListNew();
|
|
for(i = 0; i < PdmOidListCount(tray_sizes); i++)
|
|
{
|
|
oid = PdmOidListGetOid(tray_sizes, i);
|
|
if(!PdmOidLinkedListHasOid(sizes_ready_ll, oid))
|
|
{
|
|
PdmOidLinkedListAddOid(sizes_ready_ll, oid);
|
|
}
|
|
}
|
|
/*
|
|
* determine if setting the medium is supported
|
|
*/
|
|
if(!PdmOidListHasOid(document_attrs_supported,
|
|
pdmoid_att_default_medium)
|
|
||
|
|
PdmOidLinkedListCount(sizes_supported) == 0)
|
|
{
|
|
me->selected_list = SIZECTL_UNSUPPORTED;
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* default to the ready list
|
|
*/
|
|
me->selected_list = SIZECTL_SIZES_READY;
|
|
}
|
|
/*
|
|
* create the XmString versions of the sizes lists
|
|
*/
|
|
SizeCtlSetSizeLists(&me->sizes_ready, &me->sizes_ready_xmstr,
|
|
sizes_ready_ll);
|
|
PdmOidLinkedListDelete(sizes_ready_ll);
|
|
SizeCtlSetSizeLists(&me->sizes_supported, &me->sizes_supported_xmstr,
|
|
sizes_supported);
|
|
/*
|
|
* create the size control window
|
|
*/
|
|
SizeCtlCreateWindow(me, parent);
|
|
/*
|
|
* update the control state
|
|
*/
|
|
SizeCtlUpdate(me);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlCreateWindow
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlCreateWindow(SizeCtl* me, Widget parent)
|
|
{
|
|
Arg args[15];
|
|
Cardinal n;
|
|
Widget control_manager;
|
|
Widget hscroll;
|
|
XmString default_xmstr = (XmString)NULL;
|
|
/*
|
|
* page size frame
|
|
*/
|
|
me->widget = XtVaCreateManagedWidget("PageSizeCtlTop",
|
|
xmFrameWidgetClass,
|
|
parent,
|
|
XmNshadowType, XmSHADOW_ETCHED_IN,
|
|
NULL);
|
|
/*
|
|
* page size label
|
|
*/
|
|
me->frame_label
|
|
= XtVaCreateManagedWidget("PageSizeLabel",
|
|
xmLabelGadgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_TITLE_CHILD,
|
|
NULL);
|
|
|
|
/*
|
|
* page size controls manager
|
|
*/
|
|
control_manager =
|
|
XtVaCreateManagedWidget("PageSizeControls",
|
|
xmDrawingAreaWidgetClass,
|
|
me->widget,
|
|
XmNframeChildType, XmFRAME_WORKAREA_CHILD,
|
|
NULL);
|
|
XtAddCallback(control_manager, XmNresizeCallback, SizeCtlResizeCB, me);
|
|
/*
|
|
* page sizes list box
|
|
*/
|
|
n = 0;
|
|
XtSetArg(args[n], XmNvisibleItemCount, 3); n++;
|
|
XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmSTATIC); n++;
|
|
XtSetArg(args[n], XmNhorizontalScrollBar, NULL); n++;
|
|
/*
|
|
* set the supported sizes list in the list box, in order to lock
|
|
* down the maximum dimensions - the list box does not support
|
|
* changes to the list size policy after creation
|
|
*/
|
|
if(me->selected_list == SIZECTL_UNSUPPORTED)
|
|
{
|
|
/*
|
|
* unsupported, use "Default"
|
|
*/
|
|
default_xmstr =
|
|
XmStringCreateLocalized((char*)PDM_MSG_SIZE_DEFAULT);
|
|
XtSetArg(args[n], XmNitemCount, 1); n++;
|
|
XtSetArg(args[n], XmNitems, &default_xmstr); n++;
|
|
}
|
|
else
|
|
{
|
|
XtSetArg(args[n], XmNitems, me->sizes_supported_xmstr); n++;
|
|
XtSetArg(args[n], XmNitemCount,
|
|
PdmOidListCount(me->sizes_supported)); n++;
|
|
}
|
|
XtSetArg(args[n], XmNlistSizePolicy, XmCONSTANT); n++;
|
|
|
|
me->list_box = XmCreateScrolledList(control_manager, "PageSizes", args, n);
|
|
if((XmString)NULL != default_xmstr) XmStringFree(default_xmstr);
|
|
XtAddCallback(me->list_box, XmNbrowseSelectionCallback,
|
|
SizeCtlSelectCB, (XtPointer)me);
|
|
/*
|
|
* hide the horizontal scroll bar, since the width of the list has
|
|
* been set to accomodate the widest item.
|
|
*/
|
|
hscroll = XtNameToWidget(XtParent(me->list_box), "*HorScrollBar");
|
|
XtVaSetValues(hscroll,
|
|
XmNmappedWhenManaged, False,
|
|
XmNx, 0, XmNy, 0, XmNwidth, 1, XmNheight, 1,
|
|
NULL);
|
|
/*
|
|
* manage the scrolled list
|
|
*/
|
|
XtManageChild(me->list_box);
|
|
XtManageChild(XtParent(me->list_box));
|
|
/*
|
|
* loaded / allowed sizes radio buttons
|
|
*/
|
|
me->radio_box = XtVaCreateWidget(
|
|
"LoadedAllowed",
|
|
xmRowColumnWidgetClass,
|
|
control_manager,
|
|
XmNradioBehavior, True,
|
|
NULL);
|
|
me->ready_radio = XtVaCreateManagedWidget("button_0",
|
|
xmToggleButtonWidgetClass,
|
|
me->radio_box,
|
|
NULL);
|
|
XtAddCallback(me->ready_radio, XmNvalueChangedCallback,
|
|
SizeCtlReadyChangedCB, (XtPointer)me);
|
|
me->supported_radio = XtVaCreateManagedWidget("button_1",
|
|
xmToggleButtonWidgetClass,
|
|
me->radio_box,
|
|
NULL);
|
|
XtAddCallback(me->supported_radio, XmNvalueChangedCallback,
|
|
SizeCtlSupportedChangedCB, (XtPointer)me);
|
|
|
|
XtManageChild(me->radio_box);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlUpdate
|
|
*
|
|
* Description:
|
|
*
|
|
* Update the state of the size control
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlUpdate(SizeCtl* me)
|
|
{
|
|
Boolean frame_label_sensitive = False;
|
|
Boolean list_box_sensitive = False;
|
|
Boolean list_box_traverse = False;
|
|
Boolean ready_radio_sensitive = False;
|
|
Boolean supported_radio_sensitive = False;
|
|
/*
|
|
* clear the current list
|
|
*/
|
|
XmListDeleteAllItems(me->list_box);
|
|
|
|
if(me->single_size_mode)
|
|
{
|
|
XmString item;
|
|
PdmOid oid = me->selected_size;
|
|
|
|
item =
|
|
XmStringCreateLocalized((char*)
|
|
DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
|
|
PdmOidMsgNum(oid),
|
|
PdmOidDefaultMsg(oid)));
|
|
XmListAddItem(me->list_box, item, 0);
|
|
XmListSelectPos(me->list_box, 0, False);
|
|
XmStringFree(item);
|
|
|
|
if(me->selected_list != SIZECTL_UNSUPPORTED)
|
|
{
|
|
frame_label_sensitive = True;
|
|
list_box_sensitive = True;
|
|
me->selected_list = SIZECTL_SIZES_READY;
|
|
XmToggleButtonSetState(me->ready_radio, True, False);
|
|
XmToggleButtonSetState(me->supported_radio, False, False);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(me->selected_list == SIZECTL_UNSUPPORTED)
|
|
{
|
|
XmString default_item;
|
|
|
|
default_item =
|
|
XmStringCreateLocalized((char*)PDM_MSG_SIZE_DEFAULT);
|
|
XmListAddItem(me->list_box, default_item, 0);
|
|
XmListSelectPos(me->list_box, 0, False);
|
|
XmStringFree(default_item);
|
|
}
|
|
else
|
|
{
|
|
XmString* list;
|
|
int count;
|
|
int pos;
|
|
/*
|
|
* set control sensitivities
|
|
*/
|
|
frame_label_sensitive = True;
|
|
supported_radio_sensitive = True;
|
|
list_box_sensitive = True;
|
|
list_box_traverse = True;
|
|
if(PdmOidListCount(me->sizes_ready) > 0)
|
|
ready_radio_sensitive = True;
|
|
/*
|
|
* check to see if the selected size is supported
|
|
*/
|
|
if(!PdmOidListHasOid(me->sizes_supported, me->selected_size))
|
|
{
|
|
/*
|
|
* the selected size is not supported
|
|
*/
|
|
if(PdmOidListCount(me->sizes_ready) > 0)
|
|
{
|
|
/*
|
|
* use the 1st entry in the ready list
|
|
*/
|
|
me->selected_size =
|
|
PdmOidListGetOid(me->sizes_ready, 0);
|
|
me->selected_list = SIZECTL_SIZES_READY;
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* the ready list is empty, use the 1st entry in the
|
|
* supported list
|
|
*/
|
|
me->selected_size =
|
|
PdmOidListGetOid(me->sizes_supported, 0);
|
|
me->selected_list = SIZECTL_SIZES_SUPPORTED;
|
|
}
|
|
}
|
|
else if(me->selected_list == SIZECTL_SIZES_READY
|
|
&&
|
|
!PdmOidListHasOid(me->sizes_ready, me->selected_size))
|
|
{
|
|
/*
|
|
* the selected size is not in the ready list; use the
|
|
* supported list instead
|
|
*/
|
|
me->selected_list = SIZECTL_SIZES_SUPPORTED;
|
|
}
|
|
/*
|
|
* set the appropriate radio button and update the list
|
|
*/
|
|
if(me->selected_list == SIZECTL_SIZES_READY)
|
|
{
|
|
XmToggleButtonSetState(me->ready_radio, True, False);
|
|
XmToggleButtonSetState(me->supported_radio, False, False);
|
|
|
|
list = me->sizes_ready_xmstr;
|
|
count = PdmOidListCount(me->sizes_ready);
|
|
pos = 1 + PdmOidListGetIndex(me->sizes_ready,
|
|
me->selected_size);
|
|
}
|
|
else
|
|
{
|
|
XmToggleButtonSetState(me->supported_radio, True, False);
|
|
XmToggleButtonSetState(me->ready_radio, False, False);
|
|
|
|
list = me->sizes_supported_xmstr;
|
|
count = PdmOidListCount(me->sizes_supported);
|
|
pos = 1 + PdmOidListGetIndex(me->sizes_supported,
|
|
me->selected_size);
|
|
}
|
|
XmListAddItemsUnselected(me->list_box, list, count, 0);
|
|
SetListBoxSelection(me->list_box, pos);
|
|
}
|
|
}
|
|
/*
|
|
* update control sensitivities
|
|
*/
|
|
XtSetSensitive(me->frame_label, frame_label_sensitive);
|
|
XtSetSensitive(me->list_box, list_box_sensitive);
|
|
XtVaSetValues(me->list_box, XmNtraversalOn, list_box_traverse, NULL);
|
|
XtSetSensitive(me->ready_radio, ready_radio_sensitive);
|
|
XtSetSensitive(me->supported_radio, supported_radio_sensitive);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlResizeCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlResizeCB(Widget w, XtPointer client_data, XtPointer call_data)
|
|
{
|
|
SizeCtl* me = (SizeCtl*)client_data;
|
|
XtArgVal /* Dimension */ height, width, margin_width, new_width;
|
|
XtArgVal /* Position */ list_x, list_y, radio_x, radio_y;
|
|
XtArgVal /* Dimension */ list_h, list_w, radio_h, radio_w;
|
|
Widget scrolled_list = XtParent(me->list_box);
|
|
/*
|
|
* get current layout info
|
|
*/
|
|
XtVaGetValues(w, XmNheight, &height, XmNwidth, &width,
|
|
XmNmarginWidth, &margin_width,
|
|
NULL);
|
|
XtVaGetValues(scrolled_list, XmNheight, &list_h, XmNwidth, &list_w, NULL);
|
|
XtVaGetValues(me->radio_box, XmNheight, &radio_h, XmNwidth, &radio_w,
|
|
NULL);
|
|
/*
|
|
* position controls side by side
|
|
*/
|
|
list_x = margin_width;
|
|
radio_x = list_x + list_w;
|
|
/*
|
|
* center vertically
|
|
*/
|
|
list_y = (height - list_h) / 2;
|
|
radio_y = (height - radio_h) / 2;
|
|
/*
|
|
* set new positions
|
|
*/
|
|
XtVaSetValues(scrolled_list, XmNx, list_x, XmNy, list_y, NULL);
|
|
XtVaSetValues(me->radio_box, XmNx, radio_x, XmNy, radio_y, NULL);
|
|
/*
|
|
* update drawing area width and height
|
|
*/
|
|
new_width = list_x + list_w + radio_w;
|
|
if(new_width > width)
|
|
XtVaSetValues(w, XmNwidth, new_width, NULL);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlSetSingleSizeMode
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlSetSingleSizeMode(SizeCtl* me, PdmOid size)
|
|
{
|
|
if(size != pdmoid_none)
|
|
{
|
|
me->single_size_mode = True;
|
|
me->selected_size = size;
|
|
SizeCtlUpdate(me);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlSetMultiSizeMode
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlSetMultiSizeMode(SizeCtl* me)
|
|
{
|
|
me->single_size_mode = False;
|
|
SizeCtlUpdate(me);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlGetSize
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static PdmOid
|
|
SizeCtlGetSize(SizeCtl* me)
|
|
{
|
|
if(me->single_size_mode || me->selected_list == SIZECTL_UNSUPPORTED)
|
|
return pdmoid_none;
|
|
else
|
|
return me->selected_size;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlReadyChangedCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlReadyChangedCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data)
|
|
{
|
|
XmToggleButtonCallbackStruct* cbs =
|
|
(XmToggleButtonCallbackStruct*)call_data;
|
|
|
|
if(cbs->set)
|
|
{
|
|
SizeCtl* me = (SizeCtl*)client_data;
|
|
me->selected_list = SIZECTL_SIZES_READY;
|
|
if(!PdmOidListHasOid(me->sizes_ready, me->selected_size))
|
|
me->selected_size = pdmoid_none;
|
|
SizeCtlUpdate(me);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlSupportedChangedCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlSupportedChangedCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data)
|
|
{
|
|
XmToggleButtonCallbackStruct* cbs =
|
|
(XmToggleButtonCallbackStruct*)call_data;
|
|
|
|
if(cbs->set)
|
|
{
|
|
SizeCtl* me = (SizeCtl*)client_data;
|
|
me->selected_list = SIZECTL_SIZES_SUPPORTED;
|
|
SizeCtlUpdate(me);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SizeCtlSelectCB
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
SizeCtlSelectCB(Widget w,
|
|
XtPointer client_data,
|
|
XtPointer call_data)
|
|
{
|
|
XmListCallbackStruct* cbs = (XmListCallbackStruct*)call_data;
|
|
SizeCtl* me = (SizeCtl*)client_data;
|
|
|
|
if(!me->single_size_mode)
|
|
{
|
|
switch(me->selected_list)
|
|
{
|
|
case SIZECTL_SIZES_READY:
|
|
me->selected_size =
|
|
PdmOidListGetOid(me->sizes_ready, cbs->item_position - 1);
|
|
break;
|
|
case SIZECTL_SIZES_SUPPORTED:
|
|
me->selected_size =
|
|
PdmOidListGetOid(me->sizes_supported, cbs->item_position - 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: CreateOptionMenuPulldown
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static Widget
|
|
CreateOptionMenuPulldown(String pulldown_name,
|
|
Widget option_menu,
|
|
XtCallbackProc activate_proc,
|
|
XtPointer user_data,
|
|
XmString* item_list,
|
|
int item_count,
|
|
int initial_item)
|
|
{
|
|
Widget cascade_button;
|
|
Widget button;
|
|
Widget initial_selected = (Widget)NULL;
|
|
Widget pulldown;
|
|
char button_name[48];
|
|
int i;
|
|
|
|
pulldown =
|
|
XmCreatePulldownMenu(XtParent(option_menu), pulldown_name, NULL, 0);
|
|
|
|
for(i = 0; i < item_count; i++)
|
|
{
|
|
sprintf(button_name, "button_%d", i);
|
|
button = XtVaCreateManagedWidget(button_name,
|
|
xmPushButtonGadgetClass,
|
|
pulldown,
|
|
XmNuserData, user_data,
|
|
XmNlabelString, item_list[i],
|
|
NULL);
|
|
if(activate_proc != (XtCallbackProc)NULL)
|
|
XtAddCallback(button, XmNactivateCallback,
|
|
activate_proc, (XtPointer)(XtArgVal)i);
|
|
if(i == initial_item)
|
|
initial_selected = button;
|
|
}
|
|
XtVaSetValues(option_menu,
|
|
XmNsubMenuId, pulldown,
|
|
XmNmenuHistory, initial_selected,
|
|
NULL);
|
|
|
|
return pulldown;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: CreateXmStringsFromOidList
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static XmString*
|
|
CreateXmStringsFromOidList(const PdmOidList* list)
|
|
{
|
|
int count = PdmOidListCount(list);
|
|
XmString* xmstr_list = (XmString*)NULL;
|
|
|
|
if(count > 0)
|
|
{
|
|
int i;
|
|
PdmOid oid;
|
|
const char* str;
|
|
/*
|
|
* build a list of Xm strings for the passed PdmOidList
|
|
*/
|
|
xmstr_list = (XmString*)XtCalloc(count, sizeof(XmString));
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
oid = PdmOidListGetOid(list, i);
|
|
str = DTPDM_GETMESSAGE(PdmOidMsgSet(oid),
|
|
PdmOidMsgNum(oid),
|
|
PdmOidDefaultMsg(oid));
|
|
xmstr_list[i] = XmStringCreateLocalized((char*)str);
|
|
}
|
|
}
|
|
return xmstr_list;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: FreeXmStringList
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
FreeXmStringList(XmString* list, int count)
|
|
{
|
|
int i;
|
|
|
|
for(i = 0; i < count; i++)
|
|
XmStringFree(list[i]);
|
|
XtFree((char*)list);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: IconMaxDimension
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
IconMaxDimension(Widget icon_label,
|
|
PdmPixmapList* pixmap_list, int i,
|
|
Dimension* max_width, Dimension* max_height)
|
|
{
|
|
Dimension width, height;
|
|
XtArgVal width0, height0;
|
|
/*
|
|
* set the pixmap in the label
|
|
*/
|
|
XtVaSetValues(icon_label,
|
|
XmNlabelPixmap, PdmPixmapListGetPixmap(pixmap_list, i),
|
|
NULL);
|
|
/*
|
|
* get the label dimensions
|
|
*/
|
|
XtVaGetValues(icon_label,
|
|
XmNwidth, &width0,
|
|
XmNheight, &height0,
|
|
NULL);
|
|
width = (Dimension)width0;
|
|
height = (Dimension)height0;
|
|
/*
|
|
* update the max dimensions
|
|
*/
|
|
if(width > *max_width)
|
|
*max_width = width;
|
|
if(height > *max_height)
|
|
*max_height = height;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPixmapListNew
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static PdmPixmapList*
|
|
PdmPixmapListNew(int count,
|
|
Widget w,
|
|
Boolean stipple)
|
|
{
|
|
PdmPixmapList* me = (PdmPixmapList*)XtCalloc(1, sizeof(PdmPixmapList));
|
|
XtArgVal fg, bg;
|
|
|
|
me->pixmap = (Pixmap*)XtCalloc(count, sizeof(Pixmap));
|
|
me->image_name = (char**)XtCalloc(count, sizeof(char*));
|
|
me->screen = XtScreen(w);
|
|
if(stipple)
|
|
{
|
|
Widget xmscr = XmGetXmScreen(me->screen);
|
|
XtVaGetValues(xmscr, XmNinsensitiveStippleBitmap, &me->stipple, NULL);
|
|
}
|
|
else
|
|
{
|
|
me->stipple = None;
|
|
}
|
|
XtVaGetValues(w,
|
|
XmNforeground, &fg,
|
|
XmNbackground, &bg,
|
|
NULL);
|
|
me->foreground = (Pixel)fg;
|
|
me->background = (Pixel)bg;
|
|
|
|
return me;
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPixmapListDelete
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PdmPixmapListDelete(PdmPixmapList* me)
|
|
{
|
|
if(me != (PdmPixmapList*)NULL)
|
|
{
|
|
int i;
|
|
for(i = 0; i < PdmPixmapListCount(me); i++)
|
|
{
|
|
if(me->pixmap[i] != (Pixmap)NULL)
|
|
{
|
|
if(me->stipple == None)
|
|
{
|
|
if(me->pixmap[i] != None)
|
|
XmDestroyPixmap(me->screen, me->pixmap[i]);
|
|
}
|
|
else
|
|
{
|
|
if(me->pixmap[i] != None)
|
|
XFreePixmap(DisplayOfScreen(me->screen),
|
|
me->pixmap[i]);
|
|
}
|
|
XtFree((char*)me->image_name[i]);
|
|
}
|
|
}
|
|
XtFree((char*)me->pixmap);
|
|
XtFree((char*)me->image_name);
|
|
XtFree((char*)me);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPixmapSetImageName
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static void
|
|
PdmPixmapListSetImageName(PdmPixmapList* me,
|
|
const char* image_name,
|
|
int i)
|
|
{
|
|
me->image_name[i] = XtNewString(image_name);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: PdmPixmapListGetPixmap
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
static Pixmap
|
|
PdmPixmapListGetPixmap(PdmPixmapList* me, int i)
|
|
{
|
|
if(me->pixmap[i] == None)
|
|
{
|
|
me->pixmap[i] = XmGetPixmap(me->screen, me->image_name[i],
|
|
me->foreground, me->background);
|
|
if(me->pixmap[i] == XmUNSPECIFIED_PIXMAP)
|
|
{
|
|
me->pixmap[i] == None;
|
|
}
|
|
else if(me->stipple != None)
|
|
{
|
|
Pixmap xmpixmap = me->pixmap[i];
|
|
Display* display = DisplayOfScreen(me->screen);
|
|
Window root;
|
|
int x, y;
|
|
unsigned int width, height, border_width, depth;
|
|
GC gc;
|
|
XGCValues values;
|
|
/*
|
|
* make a copy of the pixmap cached by motif
|
|
*/
|
|
XGetGeometry(display, xmpixmap, &root, &x, &y,
|
|
&width, &height, &border_width, &depth);
|
|
me->pixmap[i] =
|
|
XCreatePixmap(display, xmpixmap, width, height, depth);
|
|
gc = XCreateGC(display, me->pixmap[i], (unsigned long)0, &values);
|
|
XCopyArea(display, xmpixmap, me->pixmap[i], gc,
|
|
0, 0, width, height, 0, 0);
|
|
/*
|
|
* stipple it
|
|
*/
|
|
XSetFillStyle(display, gc, FillStippled);
|
|
XSetStipple(display, gc, me->stipple);
|
|
XFillRectangle(display, me->pixmap[i], gc, 0, 0, width, height);
|
|
/*
|
|
* clean up
|
|
*/
|
|
XFreeGC(display, gc);
|
|
XmDestroyPixmap(me->screen, xmpixmap);
|
|
}
|
|
}
|
|
return me->pixmap[i];
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: SetListBoxSelection
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static void
|
|
SetListBoxSelection(Widget list_box, int position)
|
|
{
|
|
XtArgVal visible_item_count0, item_count0;
|
|
int visible_item_count;
|
|
int item_count;
|
|
int middle_offset;
|
|
int first_visible_pos;
|
|
/*
|
|
* Scroll the list, making the item at the indicated position
|
|
* visible in the center of the list box, and make
|
|
* it the initial selection.
|
|
*/
|
|
XtVaGetValues(list_box,
|
|
XmNitemCount, &item_count0,
|
|
XmNvisibleItemCount, &visible_item_count0,
|
|
NULL);
|
|
item_count = (int)item_count0;
|
|
visible_item_count = (int)visible_item_count0;
|
|
|
|
if(item_count > visible_item_count)
|
|
{
|
|
middle_offset = (visible_item_count+1) / 2;
|
|
if(position > middle_offset)
|
|
if(position > item_count - middle_offset)
|
|
first_visible_pos = item_count - visible_item_count +1;
|
|
else
|
|
first_visible_pos = position - middle_offset + 1;
|
|
else
|
|
first_visible_pos = 1;
|
|
XmListSetPos(list_box, first_visible_pos);
|
|
}
|
|
|
|
if(position > 0)
|
|
XmListSelectPos(list_box, position, False);
|
|
else
|
|
XmListDeselectAllItems(list_box);
|
|
}
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Name: GetIconFileName
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
* Return value:
|
|
*
|
|
* None.
|
|
*
|
|
*/
|
|
static String
|
|
GetIconFileName(Widget w, String resource_name)
|
|
{
|
|
String icon_file_name;
|
|
XtResource res_struct;
|
|
|
|
res_struct.resource_name = resource_name;
|
|
res_struct.resource_class = resource_name;
|
|
res_struct.resource_type = XmRString;
|
|
res_struct.resource_size = sizeof(String);
|
|
res_struct.resource_offset = 0;
|
|
res_struct.default_type = XmRImmediate;
|
|
res_struct.default_addr = (XtPointer)NULL;
|
|
XtGetApplicationResources(w, (XtPointer)&icon_file_name,
|
|
&res_struct, 1, (ArgList)NULL, 0);
|
|
|
|
return icon_file_name;
|
|
}
|