Files
Mozilla/mozilla/cmd/xfe/XfeWidgets/XfeComboBox/ComboBox.c
dmose%mozilla.org 83e38c06cc updated license boilerplate to xPL v1.1
git-svn-id: svn://10.0.0.236/trunk@52594 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-02 22:43:10 +00:00

1841 lines
51 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/*----------------------------------------------------------------------*/
/* */
/* Name: <Xfe/ComboBox.c> */
/* Description: XfeComboBox widget source. */
/* Author: Ramiro Estrugo <ramiro@netscape.com> */
/* */
/*----------------------------------------------------------------------*/
#include <stdio.h>
#include <Xfe/ComboBoxP.h>
#include <Xfe/ListUtilP.h>
#include <Xfe/FrameShell.h>
#include <Xfe/BypassShell.h>
#include <Xm/TextF.h>
#include <Xm/List.h>
#include <Xfe/Button.h>
#include <Xfe/Arrow.h>
#define MESSAGE1 "Widget is not an XfeComboBox."
#define MESSAGE2 "XmNtitle is a read-only resource."
#define MESSAGE3 "XmNlist is a read-only resource."
#define MESSAGE4 "XmNshell is a read-only resource."
#define MESSAGE5 "XmNarrow is a read-only resource."
#define MESSAGE6 "XmNcomboBoxType is a creation-only resource."
#define MESSAGE7 "No valid XfeBypassShell found to share for XmNshell."
#define LIST_NAME "ComboList"
#define SHELL_NAME "ComboShell"
#define TITLE_NAME "ComboTitle"
#define ARROW_NAME "ComboArrow"
#define CB_OFFSET_BOTTOM(w,cp) (cp->highlight_thickness+_XfemOffsetBottom(w))
#define CB_OFFSET_LEFT(w,cp) (cp->highlight_thickness+_XfemOffsetLeft(w))
#define CB_OFFSET_RIGHT(w,cp) (cp->highlight_thickness+_XfemOffsetRight(w))
#define CB_OFFSET_TOP(w,cp) (cp->highlight_thickness+_XfemOffsetTop(w))
#define CB_RECT_X(w,cp) (_XfemBoundaryX(w) + cp->highlight_thickness)
#define CB_RECT_Y(w,cp) (_XfemBoundaryY(w) + cp->highlight_thickness)
#define CB_RECT_WIDTH(w,cp) (_XfemBoundaryWidth(w)-2*cp->highlight_thickness)
#define CB_RECT_HEIGHT(w,cp) (_XfemBoundaryHeight(w)-2*cp->highlight_thickness)
#define STICK_DELAY 200
/*----------------------------------------------------------------------*/
/* */
/* Core class methods */
/* */
/*----------------------------------------------------------------------*/
static void ClassInitialize (void);
static void ClassPartInit (WidgetClass);
static void Initialize (Widget,Widget,ArgList,Cardinal *);
static void Destroy (Widget);
static Boolean SetValues (Widget,Widget,Widget,ArgList,Cardinal *);
static void GetValuesHook (Widget,ArgList,Cardinal *);
/*----------------------------------------------------------------------*/
/* */
/* XfeManager class methods */
/* */
/*----------------------------------------------------------------------*/
static void PreferredGeometry (Widget,Dimension *,Dimension *);
static Boolean AcceptStaticChild (Widget);
static void LayoutComponents (Widget);
static void DrawShadow (Widget,XEvent *,Region,XRectangle *);
static void DrawComponents (Widget,XEvent *,Region,XRectangle *);
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox class methods */
/* */
/*----------------------------------------------------------------------*/
static void LayoutTitle (Widget);
static void LayoutArrow (Widget);
static void DrawHighlight (Widget,XEvent *,Region,XRectangle *);
static void DrawTitleShadow (Widget,XEvent *,Region,XRectangle *);
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox action procedures */
/* */
/*----------------------------------------------------------------------*/
static void ActionPopdown (Widget,XEvent *,char **,Cardinal *);
static void ActionPopup (Widget,XEvent *,char **,Cardinal *);
static void ActionHighlight (Widget,XEvent *,char **,Cardinal *);
/*----------------------------------------------------------------------*/
/* */
/* Misc XfeComboBox functions */
/* */
/*----------------------------------------------------------------------*/
static Widget TitleCreate (Widget);
static void TitleConfigure (Widget);
static Widget TitleTextCreate (Widget);
static Widget TitleLabelCreate (Widget);
static Widget ArrowCreate (Widget);
/*----------------------------------------------------------------------*/
/* */
/* List functions */
/* */
/*----------------------------------------------------------------------*/
static Widget ListCreate (Widget);
static void ListLayout (Widget);
static void ListManage (Widget);
static void ListUnmanage (Widget);
/*----------------------------------------------------------------------*/
/* */
/* Stick functions */
/* */
/*----------------------------------------------------------------------*/
static void StickTimeout (XtPointer,XtIntervalId *);
static void StickAddTimeout (Widget);
static void StickRemoveTimeout (Widget);
/*----------------------------------------------------------------------*/
/* */
/* Shell functions */
/* */
/*----------------------------------------------------------------------*/
static Widget ShellCreate (Widget);
static void ShellLayout (Widget);
static void ShellPopup (Widget);
static void ShellPopdown (Widget);
/*----------------------------------------------------------------------*/
/* */
/* Screen functions functions */
/* */
/*----------------------------------------------------------------------*/
static int ScreenGetSpaceBelow (Widget);
static int ScreenGetSpaceAbove (Widget);
/*----------------------------------------------------------------------*/
/* */
/* Text callbacks */
/* */
/*----------------------------------------------------------------------*/
static void TextFocusCB (Widget,XtPointer,XtPointer);
static void TextLosingFocusCB (Widget,XtPointer,XtPointer);
static void TextActivateCB (Widget,XtPointer,XtPointer);
/*----------------------------------------------------------------------*/
/* */
/* Arrow callbacks */
/* */
/*----------------------------------------------------------------------*/
static void ArrowActivateCB (Widget,XtPointer,XtPointer);
/*----------------------------------------------------------------------*/
/* */
/* Resource Callprocs */
/* */
/*----------------------------------------------------------------------*/
static void DefaultTitleShadowThickness (Widget,int,XrmValue *);
/*----------------------------------------------------------------------*/
/* */
/* Synthetic resource Callprocs */
/* */
/*----------------------------------------------------------------------*/
static void SyntheticGetListItems (Widget,int, XtArgVal *);
static void SyntheticGetListItemCount (Widget,int, XtArgVal *);
/*----------------------------------------------------------------------*/
/* */
/* Rep type registration functions */
/* */
/*----------------------------------------------------------------------*/
static void ComboBoxRegisterRepTypes (void);
/*----------------------------------------------------------------------*/
/* */
/* XmTextField manipulation functions */
/* */
/*----------------------------------------------------------------------*/
static void InvokeSetTextProc (Widget,char *);
static char * InvokeGetTextFunc (Widget);
/*----------------------------------------------------------------------*/
/* */
/* Text functions */
/* */
/*----------------------------------------------------------------------*/
static void InvokeTextActivateCallback (Widget);
#if 0
/*
* External definitions of syn_resources for our list widget.
*/
#define SYN_RESOURCE_AA AA((Widget w, int resource_offset, XtArgVal *value))
extern void _DtComboBoxGetArrowSize SYN_RESOURCE_AA;
extern void _DtComboBoxGetLabelString SYN_RESOURCE_AA;
extern void _DtComboBoxGetListItemCount SYN_RESOURCE_AA;
extern void _DtComboBoxGetListItems SYN_RESOURCE_AA;
extern void _DtComboBoxGetListFontList SYN_RESOURCE_AA;
extern void _DtComboBoxGetListMarginHeight SYN_RESOURCE_AA;
extern void _DtComboBoxGetListMarginWidth SYN_RESOURCE_AA;
extern void _DtComboBoxGetListSpacing SYN_RESOURCE_AA;
extern void _DtComboBoxGetListTopItemPosition SYN_RESOURCE_AA;
extern void _DtComboBoxGetListVisibleItemCount SYN_RESOURCE_AA;
#endif
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox resources */
/* */
/*----------------------------------------------------------------------*/
static XtResource resources[] =
{
/* Callback resources */
{
XmNtextActivateCallback,
XmCCallback,
XmRCallback,
sizeof(XtCallbackList),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . text_activate_callback),
XmRImmediate,
(XtPointer) NULL,
},
/* XmTextField manipulation resources */
{
XmNgetTextFunc,
XmCGetTextFunc,
XmRFunction,
sizeof(XfeComboBoxGetTextFunc),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . get_text_func),
XmRImmediate,
(XtPointer) NULL
},
{
XmNsetTextProc,
XmCSetTextProc,
XmRFunction,
sizeof(XfeComboBoxSetTextProc),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . set_text_proc),
XmRImmediate,
(XtPointer) NULL
},
/* Title resources */
{
XmNtitle,
XmCReadOnly,
XmRWidget,
sizeof(Widget),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . title),
XmRImmediate,
(XtPointer) NULL
},
{
XmNcomboBoxType,
XmCComboBoxType,
XmRComboBoxType,
sizeof(unsigned char),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . combo_box_type),
XmRImmediate,
(XtPointer) XmCOMBO_BOX_READ_ONLY
},
{
XmNspacing,
XmCSpacing,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . spacing),
XmRImmediate,
(XtPointer) 4
},
{
XmNtitleFontList,
XmCTitleFontList,
XmRFontList,
sizeof(XmFontList),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . title_font_list),
XmRImmediate,
(XtPointer) NULL
},
{
XmNtitleShadowThickness,
XmCShadowThickness,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . title_shadow_thickness),
XmRCallProc,
(XtPointer) DefaultTitleShadowThickness
},
{
XmNtitleShadowType,
XmCShadowType,
XmRShadowType,
sizeof(unsigned char),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . title_shadow_type),
XmRImmediate,
(XtPointer) XmSHADOW_IN
},
/* List resources */
{
XmNlist,
XmCReadOnly,
XmRWidget,
sizeof(Widget),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . list),
XmRImmediate,
(XtPointer) NULL
},
{
XmNitems,
XmCItems,
XmRXmStringTable,
sizeof(XmStringTable),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . items),
XmRImmediate,
(XtPointer) NULL
},
{
XmNitemCount,
XmCItemCount,
XmRInt,
sizeof(int),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . item_count),
XmRImmediate,
(XtPointer) 0
},
{
XmNlistFontList,
XmCListFontList,
XmRFontList,
sizeof(XmFontList),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . list_font_list),
XmRImmediate,
(XtPointer) NULL
},
{
XmNlistMarginHeight,
XmCListMarginHeight,
XmRVerticalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . list_margin_height),
XmRImmediate,
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_MARGIN_HEIGHT
},
{
XmNlistMarginWidth,
XmCListMarginWidth,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . list_margin_width),
XmRImmediate,
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_MARGIN_WIDTH
},
{
XmNlistSpacing,
XmCListSpacing,
XmRVerticalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . list_spacing),
XmRImmediate,
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_SPACING
},
{
XmNtopItemPosition,
XmCTopItemPosition,
XmRInt,
sizeof(int),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . top_item_position),
XmRImmediate,
(XtPointer) 1
},
{
XmNvisibleItemCount,
XmCVisibleItemCount,
XmRInt,
sizeof(int),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . visible_item_count),
XmRImmediate,
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_VISIBLE_ITEM_COUNT
},
/* Shell resources */
{
XmNshell,
XmCReadOnly,
XmRWidget,
sizeof(Widget),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . shell),
XmRImmediate,
(XtPointer) NULL
},
{
XmNshareShell,
XmCShareShell,
XmRBoolean,
sizeof(Boolean),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . share_shell),
XmRImmediate,
(XtPointer) True
},
{
XmNpoppedUp,
XmCReadOnly,
XmRBoolean,
sizeof(Boolean),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . popped_up),
XmRImmediate,
(XtPointer) False
},
/* Arrow resources */
{
XmNarrow,
XmCReadOnly,
XmRWidget,
sizeof(Widget),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . arrow),
XmRImmediate,
(XtPointer) NULL
},
/* Traversal resources */
{
XmNhighlightThickness,
XmCHighlightThickness,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . highlight_thickness),
XmRImmediate,
(XtPointer) 2
},
{
XmNtraversalOn,
XmCTraversalOn,
XmRBoolean,
sizeof(Boolean),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . traversal_on),
XmRImmediate,
(XtPointer) True
},
/* Force the XmNshadowThickness to the default */
{
XmNshadowThickness,
XmCShadowThickness,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , manager . shadow_thickness),
XmRImmediate,
(XtPointer) 1
},
/* Force XmNmarginLeft and XmNmarginRight to 4 */
{
XmNmarginLeft,
XmCMarginLeft,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_manager . margin_left),
XmRImmediate,
(XtPointer) 4
},
{
XmNmarginRight,
XmCMarginRight,
XmRHorizontalDimension,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_manager . margin_right),
XmRImmediate,
(XtPointer) 4
},
};
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox synthetic resources */
/* */
/*----------------------------------------------------------------------*/
static XmSyntheticResource synthetic_resources[] =
{
{
XmNspacing,
sizeof(Dimension),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . spacing),
_XmFromHorizontalPixels,
_XmToHorizontalPixels
},
{
XmNitems,
sizeof(XmStringTable),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . items),
SyntheticGetListItems,
_XfeSyntheticSetResourceForChild
},
{
XmNitemCount,
sizeof(int),
XtOffsetOf(XfeComboBoxRec , xfe_combo_box . item_count),
SyntheticGetListItemCount,
_XfeSyntheticSetResourceForChild
},
};
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox translations. */
/* */
/*----------------------------------------------------------------------*/
/* extern */ char _XfeComboBoxTextEditableTranslations[] ="\
~c s ~m ~a <Btn1Down>: extend-start()\n\
c ~s ~m ~a <Btn1Down>: move-destination()\n\
~c ~s ~m ~a <Btn1Down>: grab-focus()\n\
~c ~m ~a <Btn1Motion>: extend-adjust()\n\
~c ~m ~a <Btn1Up>: extend-end()";
/* extern */ char _XfeComboBoxTextReadOnlyTranslations[] ="\
~c ~s ~m ~a <Btn1Down>: grab-focus() Popup()\n\
~c ~m ~a <Btn1Motion>: \n\
~c ~m ~a <Btn1Up>: Popdown()";
#if 0
/* extern */ char _XfeComboBoxArrowTranslations[] ="\
~c ~s ~m ~a <Btn1Down>: Highlight() Arm() Popup()\n\
~c ~m ~a <Btn1Up>: Activate() Disarm() Popdown()";
#else
/* extern */ char _XfeComboBoxArrowTranslations[] ="\
~c ~s ~m ~a <Btn1Down>: Highlight() Arm() Popup()\n\
~c ~m ~a <Btn1Up>: Activate() Disarm() Popdown()";
#endif
/* extern */ char _XfeComboBoxExtraTranslations[] ="\
~c ~s ~m ~a <Btn1Down>: Highlight() Popup()\n\
~c ~m ~a <Btn1Up>: Popdown()";
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox actions */
/* */
/*----------------------------------------------------------------------*/
static XtActionsRec actions[] =
{
{ "Popup", ActionPopup },
{ "Popdown", ActionPopdown },
{ "Highlight", ActionHighlight },
};
/*----------------------------------------------------------------------*/
/* */
/* Widget Class Record Initialization */
/* */
/*----------------------------------------------------------------------*/
_XFE_WIDGET_CLASS_RECORD(combobox,ComboBox) =
{
{
(WidgetClass) &xfeManagerClassRec, /* superclass */
"XfeComboBox", /* class_name */
sizeof(XfeComboBoxRec), /* widget_size */
ClassInitialize, /* class_initialize */
ClassPartInit, /* class_part_initialize*/
FALSE, /* class_inited */
Initialize, /* initialize */
NULL, /* initialize_hook */
XtInheritRealize, /* realize */
actions, /* actions */
XtNumber(actions), /* num_actions */
resources, /* resources */
XtNumber(resources), /* num_resources */
NULLQUARK, /* xrm_class */
TRUE, /* compress_motion */
XtExposeCompressMaximal, /* compress_exposure */
TRUE, /* compress_enterleave */
FALSE, /* visible_interest */
Destroy, /* destroy */
XtInheritResize, /* resize */
XtInheritExpose, /* expose */
SetValues, /* set_values */
NULL, /* set_values_hook */
XtInheritSetValuesAlmost, /* set_values_almost */
GetValuesHook, /* get_values_hook */
NULL, /* access_focus */
XtVersion, /* version */
NULL, /* callback_private */
XtInheritTranslations, /* tm_table */
XtInheritQueryGeometry, /* query_geometry */
XtInheritDisplayAccelerator, /* display accelerator */
NULL, /* extension */
},
/* Composite Part */
{
XtInheritGeometryManager, /* geometry_manager */
XtInheritChangeManaged, /* change_managed */
XtInheritInsertChild, /* insert_child */
XtInheritDeleteChild, /* delete_child */
NULL /* extension */
},
/* Constraint Part */
{
NULL, /* syn resources */
0, /* num syn_resources */
sizeof(XfeManagerConstraintRec), /* constraint size */
NULL, /* init proc */
NULL, /* destroy proc */
NULL, /* set values proc */
NULL, /* extension */
},
/* XmManager Part */
{
XtInheritTranslations, /* tm_table */
synthetic_resources, /* syn resources */
XtNumber(synthetic_resources), /* num syn_resources */
NULL, /* syn_cont_resources */
0, /* num_syn_cont_resource*/
XmInheritParentProcess, /* parent_process */
NULL, /* extension */
},
/* XfeManager Part */
{
XfeInheritBitGravity, /* bit_gravity */
PreferredGeometry, /* preferred_geometry */
XfeInheritUpdateBoundary, /* update_boundary */
XfeInheritUpdateChildrenInfo, /* update_children_info */
XfeInheritLayoutWidget, /* layout_widget */
AcceptStaticChild, /* accept_static_child */
NULL, /* insert_static_child */
NULL, /* delete_static_child */
NULL, /* layout_static_children */
NULL, /* change_managed */
NULL, /* prepare_components */
LayoutComponents, /* layout_components */
NULL, /* draw_background */
DrawShadow, /* draw_shadow */
DrawComponents, /* draw_components */
XfeInheritDrawAccentBorder, /* draw_accent_border */
NULL, /* extension */
},
/* XfeComboBox Part */
{
LayoutTitle, /* layout_title */
LayoutArrow, /* layout_arrow */
DrawHighlight, /* draw_highlight */
DrawTitleShadow, /* draw_title_shadow */
NULL, /* extension */
},
};
/*----------------------------------------------------------------------*/
/* */
/* xfeComboBoxWidgetClass declaration. */
/* */
/*----------------------------------------------------------------------*/
_XFE_WIDGET_CLASS(combobox,ComboBox);
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox resource call procedures */
/* */
/*----------------------------------------------------------------------*/
static void
DefaultTitleShadowThickness(Widget w,int offset,XrmValue * value)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
static Dimension shadow_thickness;
if (cp->combo_box_type == XmCOMBO_BOX_EDITABLE)
{
shadow_thickness = _XfemShadowThickness(w);
}
else
{
shadow_thickness = 0;
}
value->addr = (XPointer) &shadow_thickness;
value->size = sizeof(shadow_thickness);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Synthetic resource Callprocs */
/* */
/*----------------------------------------------------------------------*/
static void
SyntheticGetListItems(Widget w,int offset, XtArgVal * value)
{
}
/*----------------------------------------------------------------------*/
static void
SyntheticGetListItemCount(Widget w,int offset, XtArgVal * value)
{
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Core Class methods */
/* */
/*----------------------------------------------------------------------*/
static void
ClassInitialize()
{
/* Register XfeComboBox Representation Types */
ComboBoxRegisterRepTypes();
}
/*----------------------------------------------------------------------*/
static void
ClassPartInit(WidgetClass wc)
{
XfeComboBoxWidgetClass cc = (XfeComboBoxWidgetClass) wc;
XfeComboBoxWidgetClass sc = (XfeComboBoxWidgetClass) wc->core_class.superclass;
_XfeResolve(cc,sc,xfe_combo_box_class,layout_title,
XfeInheritLayoutTitle);
_XfeResolve(cc,sc,xfe_combo_box_class,layout_arrow,
XfeInheritLayoutArrow);
_XfeResolve(cc,sc,xfe_combo_box_class,draw_highlight,
XfeInheritDrawHighlight);
_XfeResolve(cc,sc,xfe_combo_box_class,draw_title_shadow,
XfeInheritDrawTitleShadow);
}
/*----------------------------------------------------------------------*/
static void
Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(nw);
/* Make sure rep types are ok */
XfeRepTypeCheck(nw,XmRShadowType,&cp->title_shadow_type,
XmSHADOW_IN);
XfeRepTypeCheck(nw,XmRComboBoxType,&cp->combo_box_type,
XmCOMBO_BOX_READ_ONLY);
/* Make sure read-only resources aren't set */
if (cp->title)
{
_XmWarning(nw,MESSAGE2);
cp->title = NULL;
}
if (cp->list)
{
_XmWarning(nw,MESSAGE3);
cp->list = NULL;
}
if (cp->shell)
{
_XmWarning(nw,MESSAGE4);
cp->shell = NULL;
}
if (cp->arrow)
{
_XmWarning(nw,MESSAGE5);
cp->arrow = NULL;
}
/* Create components */
cp->arrow = ArrowCreate(nw);
cp->title = TitleCreate(nw);
cp->shell = ShellCreate(nw);
cp->list = ListCreate(nw);
/* Configure the title */
TitleConfigure(nw);
/* Initialize private members */
cp->highlighted = False;
cp->delay_timer_id = 0;
/* Manage the children */
XtManageChild(cp->title);
XtManageChild(cp->list);
XtManageChild(cp->arrow);
XfeOverrideTranslations(nw,_XfeComboBoxExtraTranslations);
/* Finish of initialization */
_XfeManagerChainInitialize(rw,nw,xfeComboBoxWidgetClass);
}
/*----------------------------------------------------------------------*/
static void
Destroy(Widget w)
{
/* XfeComboBoxPart * cp = _XfeComboBoxPart(w); */
}
/*----------------------------------------------------------------------*/
static Boolean
SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
{
XfeComboBoxPart * np = _XfeComboBoxPart(nw);
XfeComboBoxPart * op = _XfeComboBoxPart(ow);
/* title */
if (np->title != op->title)
{
_XmWarning(nw,MESSAGE2);
np->title = op->title;
}
/* list */
if (np->list != op->list)
{
_XmWarning(nw,MESSAGE3);
np->list = op->list;
}
/* shell */
if (np->shell != op->shell)
{
_XmWarning(nw,MESSAGE4);
np->shell = op->shell;
}
/* combo_box_type */
if (np->combo_box_type != op->combo_box_type)
{
TitleConfigure(nw);
_XfemConfigFlags(nw) |= XfeConfigExpose;
#if 0
_XmWarning(nw,MESSAGE6);
np->combo_box_type = op->combo_box_type;
#endif
}
/* title_shadow_thickness */
if (np->title_shadow_thickness != op->title_shadow_thickness)
{
_XfemConfigFlags(nw) |= XfeConfigGLE;
}
/* title_shadow_type */
if (np->title_shadow_type != op->title_shadow_type)
{
/* Make sure the new shadow type is ok */
XfeRepTypeCheck(nw,XmRShadowType,&np->title_shadow_type,XmSHADOW_IN);
_XfemConfigFlags(nw) |= XfeConfigExpose;
}
return _XfeManagerChainSetValues(ow,rw,nw,xfeComboBoxWidgetClass);
}
/*----------------------------------------------------------------------*/
static void
GetValuesHook(Widget w,ArgList args,Cardinal* nargs)
{
/* XfeComboBoxPart * cp = _XfeComboBoxPart(w); */
Cardinal i;
for (i = 0; i < *nargs; i++)
{
#if 0
/* label_string */
if (strcmp(args[i].name,XmNlabelString) == 0)
{
*((XtArgVal *) args[i].value) =
(XtArgVal) XmStringCopy(lp->label_string);
}
/* font_list */
else if (strcmp(args[i].name,XmNfontList) == 0)
{
*((XtArgVal *) args[i].value) =
(XtArgVal) XmFontListCopy(lp->font_list);
}
#endif
}
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* XfeManager class methods */
/* */
/*----------------------------------------------------------------------*/
static void
PreferredGeometry(Widget w,Dimension * width,Dimension * height)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
*height =
CB_OFFSET_TOP(w,cp) + CB_OFFSET_BOTTOM(w,cp) +
XfeMax(_XfeHeight(cp->title),_XfeHeight(cp->arrow)) +
2 * cp->title_shadow_thickness;
*width =
CB_OFFSET_LEFT(w,cp) + CB_OFFSET_RIGHT(w,cp) +
_XfeWidth(cp->title) +
cp->spacing +
_XfeWidth(cp->arrow) +
2 * cp->title_shadow_thickness;
}
/*----------------------------------------------------------------------*/
static Boolean
AcceptStaticChild(Widget child)
{
return False;
}
/*----------------------------------------------------------------------*/
static void
LayoutComponents(Widget w)
{
_XfeComboBoxLayoutArrow(w);
_XfeComboBoxLayoutTitle(w);
}
/*----------------------------------------------------------------------*/
static void
DrawShadow(Widget w,XEvent * event,Region region,XRectangle * clip_rect)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
if (!_XfemShadowThickness(w))
{
return;
}
/* Draw the shadow */
_XmDrawShadows(XtDisplay(w),
_XfeWindow(w),
_XfemTopShadowGC(w),_XfemBottomShadowGC(w),
cp->highlight_thickness,
cp->highlight_thickness,
_XfeWidth(w) - 2 * cp->highlight_thickness,
_XfeHeight(w) - 2 * cp->highlight_thickness,
_XfemShadowThickness(w),
_XfemShadowType(w));
}
/*----------------------------------------------------------------------*/
static void
DrawComponents(Widget w,XEvent * event,Region region,XRectangle * clip_rect)
{
/* Draw the highlight */
_XfeComboBoxDrawHighlight(w,event,region,clip_rect);
/* Draw the title shadow */
_XfeComboBoxDrawTitleShadow(w,event,region,clip_rect);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox action procedures */
/* */
/*----------------------------------------------------------------------*/
static void
ActionPopup(Widget item,XEvent * event,char ** params,Cardinal * nparams)
{
Widget w = XfeIsComboBox(item) ? item : _XfeParent(item);
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
int space_below = ScreenGetSpaceBelow(w);
int space_above = ScreenGetSpaceAbove(w);
#if 1
printf("ActionPopup(%s,above = %d,below = %d)\n",
XtName(w),
space_above,
space_below);
#endif
/* Check if we are already popped up */
if (cp->popped_up)
{
printf("already popped up\n");
StickRemoveTimeout(w);
ListUnmanage(w);
XtVaSetValues(cp->arrow,XmNarmed,False,NULL);
return;
}
space_below = 200;
_XfeConfigureWidget(cp->shell,
XfeRootX(w),
XfeRootY(w) + _XfeHeight(w),
_XfeWidth(w),
space_below);
/* XtVaSetValues(cp->list, */
/* XmNlistMarginWidth, 100, */
/* NULL); */
/* XtVaSetValues(cp->arrow,XmCArmed,True,NULL); */
/* XtPopup(cp->shell,XtGrabNone); */
/* XMapRaised(XtDisplay(w),_XfeWindow(cp->shell)); */
/* XMapRaised(XtDisplay(w),_XfeWindow(cp->shell)); */
cp->remain_popped_up = False;
#if 1
StickAddTimeout(w);
#endif
XtVaSetValues(cp->arrow,XmNarmed,True,NULL);
ListManage(w);
}
/*----------------------------------------------------------------------*/
static void
ActionPopdown(Widget item,XEvent * event,char ** params,Cardinal * nparams)
{
Widget w = XfeIsComboBox(item) ? item : _XfeParent(item);
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
#if 1
printf("ActionPopdown(%s)\n",XtName(w));
#endif
if (cp->delay_timer_id)
{
StickRemoveTimeout(w);
}
else
{
ListUnmanage(w);
}
XtVaSetValues(cp->arrow,XmNarmed,False,NULL);
/* if (!cp->remain_popped_up) */
/* { */
/* XtPopdown(cp->shell); */
/* } */
/* cp->remain_popped_up = False; */
/* ListUnmanage(w); */
/* XUnmapWindow(XtDisplay(w),_XfeWindow(cp->shell)); */
}
/*----------------------------------------------------------------------*/
static void
ActionHighlight(Widget item,XEvent * event,char ** params,Cardinal * nparams)
{
Widget w = XfeIsComboBox(item) ? item : _XfeParent(item);
XmProcessTraversal(w,XmTRAVERSE_CURRENT);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Misc XfeComboBox functions */
/* */
/*----------------------------------------------------------------------*/
static void
DrawHighlight(Widget w,XEvent * event,Region region,XRectangle * clip_rect)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
/* Make sure the highlight is needed */
if (!cp->highlight_thickness || !_XfeIsRealized(w))
{
return;
}
if (cp->highlighted)
{
_XmDrawSimpleHighlight(XtDisplay(w),
_XfeWindow(w),
_XfemHighlightGC(w),
0,0,
_XfeWidth(w),_XfeHeight(w),
cp->highlight_thickness);
}
else
{
assert( XmIsManager(_XfeParent(w)) );
_XmDrawSimpleHighlight(XtDisplay(w),
_XfeWindow(w),
_XfemBackgroundGC(_XfeParent(w)),
0,0,
_XfeWidth(w),_XfeHeight(w),
cp->highlight_thickness);
}
}
/*----------------------------------------------------------------------*/
static void
DrawTitleShadow(Widget w,XEvent * event,Region region,XRectangle * clip_rect)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
/* Make sure the shadow is needed */
if (!cp->title_shadow_thickness)
{
return;
}
/* Draw the shadow around the text only */
XfeDrawShadowsAroundWidget(w,
cp->title,
_XfemTopShadowGC(w),
_XfemBottomShadowGC(w),
0,
cp->title_shadow_thickness,
cp->title_shadow_type);
}
/*----------------------------------------------------------------------*/
static Widget
TitleCreate(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
Widget title = NULL;
if (cp->combo_box_type == XmCOMBO_BOX_EDITABLE)
{
title = TitleTextCreate(w);
}
else
{
title = TitleLabelCreate(w);
}
return title;
}
/*----------------------------------------------------------------------*/
static void
TitleConfigure(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
Arg av[10];
Cardinal ac = 0;
assert( _XfeIsAlive(cp->title) );
if (cp->combo_box_type == XmCOMBO_BOX_EDITABLE)
{
XfeOverrideTranslations(cp->title,
_XfeComboBoxTextEditableTranslations);
XtSetArg(av[ac],XmNeditable,True); ac++;
XtSetArg(av[ac],XmNcursorPositionVisible,True); ac++;
}
else
{
XfeOverrideTranslations(cp->title,
_XfeComboBoxTextReadOnlyTranslations);
XtSetArg(av[ac],XmNeditable,False); ac++;
XtSetArg(av[ac],XmNcursorPositionVisible,False); ac++;
}
XtSetValues(cp->title,av,ac);
}
/*----------------------------------------------------------------------*/
static Widget
TitleTextCreate(Widget w)
{
/* XfeComboBoxPart * cp = _XfeComboBoxPart(w); */
Widget text = NULL;
text = XtVaCreateWidget(TITLE_NAME,
xmTextFieldWidgetClass,
w,
XmNbackground, _XfeBackgroundPixel(w),
XmNbackgroundPixmap, _XfeBackgroundPixmap(w),
XmNhighlightThickness, 0,
XmNshadowThickness, 0,
/* XmNtraversalOn, False, */
/* XmNhighlightThickness, 0, */
NULL);
XtAddCallback(text,XmNfocusCallback,TextFocusCB,w);
XtAddCallback(text,XmNlosingFocusCallback,TextLosingFocusCB,w);
XtAddCallback(text,XmNactivateCallback,TextActivateCB,w);
return text;
}
/*----------------------------------------------------------------------*/
static Widget
TitleLabelCreate(Widget w)
{
/* XfeComboBoxPart * cp = _XfeComboBoxPart(w); */
Widget label = NULL;
label = XtVaCreateWidget(TITLE_NAME,
xfeLabelWidgetClass,
w,
XmNbackground, _XfeBackgroundPixel(w),
XmNbackgroundPixmap, _XfeBackgroundPixmap(w),
XmNshadowThickness, 0,
XmNlabelAlignment, XmALIGNMENT_BEGINNING,
NULL);
/* Add the extra combo box translations to the label */
/* XfeOverrideTranslations(label,_XfeComboBoxExtraTranslations); */
return label;
}
/*----------------------------------------------------------------------*/
static void
LayoutTitle(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
_XfeConfigureWidget(cp->title,
CB_OFFSET_LEFT(w,cp) + cp->title_shadow_thickness,
(_XfeHeight(w) - _XfeHeight(cp->title)) / 2,
CB_RECT_WIDTH(w,cp) -
cp->spacing -
_XfeWidth(cp->arrow) -
2 * cp->title_shadow_thickness,
CB_RECT_HEIGHT(w,cp) -
2 * cp->title_shadow_thickness);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Rep type registration functions */
/* */
/*----------------------------------------------------------------------*/
static void
ComboBoxRegisterRepTypes(void)
{
static String box_names[] =
{
"combo_box_editable",
"combo_box_read_only",
NULL
};
XfeRepTypeRegister(XmRComboBoxType,box_names);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* List functions */
/* */
/*----------------------------------------------------------------------*/
static Widget
ListCreate(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
Widget list = NULL;
Arg av[10];
Cardinal ac = 0;
assert( _XfeIsAlive(cp->shell) );
XtSetArg(av[ac],XmNbackground, _XfeBackgroundPixel(w)); ac++;
XtSetArg(av[ac],XmNforeground, _XfemForeground(w)); ac++;
XtSetArg(av[ac],XmNshadowThickness, _XfemShadowThickness(w)); ac++;
list = XmCreateScrolledList(cp->shell,LIST_NAME,av,ac);
XtManageChild(list);
XtUnmanageChild(_XfeParent(list));
/* _XfeResizeWidget(list,400,500); */
/* _XfeResizeWidget(cp->shell,400,500); */
return list;
}
/*----------------------------------------------------------------------*/
static void
ListManage(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( _XfeIsAlive(cp->shell) );
assert( _XfeIsAlive(cp->list) );
printf("ListManage(%s)\n",XtName(w));
/* cp->remain_popped_up = True; */
/* popped up */
cp->popped_up = True;
/* Manage the scrolled window */
XtManageChild(_XfeParent(cp->list));
ShellPopup(w);
#if 0
XmUpdateDisplay(w);
XFlush(XtDisplay(w));
#endif
/* _XmPopupSpringLoaded(w); */
}
/*----------------------------------------------------------------------*/
static void
ListUnmanage(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( _XfeIsAlive(cp->shell) );
assert( _XfeIsAlive(cp->list) );
/* not popped up */
cp->popped_up = False;
/* Unmanage the scrolled window */
XtUnmanageChild(_XfeParent(cp->list));
ShellPopdown(w);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Shell functions */
/* */
/*----------------------------------------------------------------------*/
static Widget
ShellCreate(Widget w)
{
Widget shell = NULL;
Widget frame_shell;
/* Look for a XfeFrameShell ancestor */
frame_shell = XfeAncestorFindByClass(w,
xfeFrameShellWidgetClass,
XfeFIND_ANY);
/* If found, use it */
if (_XfeIsAlive(frame_shell))
{
shell = XfeFrameShellGetBypassShell(frame_shell);
}
else
{
shell = XfeCreateBypassShell(w,SHELL_NAME,NULL,0);
XtRealizeWidget(shell);
}
assert( _XfeIsAlive(shell) );
if (!_XfeIsRealized(shell))
{
XtRealizeWidget(shell);
}
return shell;
}
/*----------------------------------------------------------------------*/
static void
ShellPopup(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( _XfeIsAlive(cp->shell) );
/* _XmPopupSpringLoaded(cp->shell); */
_XmPopup(cp->shell,XtGrabNone);
}
/*----------------------------------------------------------------------*/
static void
ShellPopdown(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( _XfeIsAlive(cp->shell) );
_XmPopdown(cp->shell);
}
/*----------------------------------------------------------------------*/
static Widget
ArrowCreate(Widget w)
{
/* XfeComboBoxPart * cp = _XfeComboBoxPart(w); */
Widget arrow = NULL;
arrow = XtVaCreateWidget(ARROW_NAME,
xfeArrowWidgetClass,
w,
XmNbackground, _XfeBackgroundPixel(w),
XmNbackgroundPixmap, _XfeBackgroundPixmap(w),
XmNshadowThickness, 1,
/* XmNemulateMotif, False, */
XmNaccentBorderThickness, 0,
XmNraiseOnEnter, False,
XmNfillOnEnter, False,
XmNshadowThickness, 0,
XmNbuttonType, XmBUTTON_TOGGLE,
NULL);
XfeOverrideTranslations(arrow,_XfeComboBoxArrowTranslations);
#if 0
XtAddCallback(arrow,XmNarmCallback,ArrowArmCB,w);
XtAddCallback(arrow,XmNdisarmCallback,ArrowDisarmCB,w);
XtAddCallback(arrow,XmNactivateCallback,ArrowActivateCB,w);
#endif
/* XtAddCallback(arrow,XmNactivateCallback,ArrowActivateCB,w); */
return arrow;
}
/*----------------------------------------------------------------------*/
static void
LayoutArrow(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
_XfeConfigureWidget(cp->arrow,
_XfeWidth(w) -
CB_OFFSET_RIGHT(w,cp) -
_XfeWidth(cp->arrow),
(_XfeHeight(w) - _XfeHeight(cp->arrow)) / 2,
_XfeWidth(cp->arrow),
_XfeHeight(cp->arrow));
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Text callbacks */
/* */
/*----------------------------------------------------------------------*/
static void
TextFocusCB(Widget text,XtPointer client_data,XtPointer call_data)
{
Widget w = (Widget) client_data;
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
cp->highlighted = True;
DrawHighlight(w,NULL,NULL,&_XfemBoundary(w));
}
/*----------------------------------------------------------------------*/
static void
TextLosingFocusCB(Widget text,XtPointer client_data,XtPointer call_data)
{
Widget w = (Widget) client_data;
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
cp->highlighted = False;
DrawHighlight(w,NULL,NULL,&_XfemBoundary(w));
}
/*----------------------------------------------------------------------*/
static void
TextActivateCB(Widget text,XtPointer client_data,XtPointer call_data)
{
Widget w = (Widget) client_data;
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
InvokeTextActivateCallback(w);
/* printf("TextActivateCB(%s)\n",XtName(w)); */
}
/*----------------------------------------------------------------------*/
static void
InvokeTextActivateCallback(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
if (cp->text_activate_callback != NULL)
{
XmAnyCallbackStruct cbs;
cbs.reason = XmCR_COMBO_BOX_TEXT_ACTIVATE;
cbs.event = NULL;
XtCallCallbackList(w,cp->text_activate_callback,(XtPointer) &cbs);
}
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Arrow callbacks */
/* */
/*----------------------------------------------------------------------*/
static void
ArrowActivateCB(Widget text,XtPointer client_data,XtPointer call_data)
{
Widget w = (Widget) client_data;
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
#if 0
printf("ArrowActivate(%s)\n",XtName(w));
#endif
/* cp->remain_popped_up = True; */
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Misc Arrow functions */
/* */
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Screen functions functions */
/* */
/*----------------------------------------------------------------------*/
static int
ScreenGetSpaceBelow(Widget w)
{
return (int) XfeScreenHeight(w) - (int) (XfeRootY(w) + _XfeHeight(w));
}
/*----------------------------------------------------------------------*/
static int
ScreenGetSpaceAbove(Widget w)
{
return (int) XfeRootY(w);
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* Stick functions */
/* */
/*----------------------------------------------------------------------*/
static void
StickTimeout(XtPointer client_data,XtIntervalId * id)
{
Widget w = (Widget) client_data;
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
cp->delay_timer_id = 0;
cp->remain_popped_up = True;
#if 1
printf("StickTimeout(%s)\n",XtName(w));
#endif
}
/*----------------------------------------------------------------------*/
static void
StickAddTimeout(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
cp->delay_timer_id = XtAppAddTimeOut(XtWidgetToApplicationContext(w),
STICK_DELAY,
StickTimeout,
(XtPointer) w);
}
/*----------------------------------------------------------------------*/
static void
StickRemoveTimeout(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
/* Remove the timer if its still has not triggered */
if (cp->delay_timer_id)
{
XtRemoveTimeOut(cp->delay_timer_id);
}
/* Reset the timer */
cp->delay_timer_id = 0;
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* XmTextField manipulation functions */
/* */
/*----------------------------------------------------------------------*/
static void
InvokeSetTextProc(Widget text_field,char * text)
{
Widget w = _XfeParent(text_field);
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( XmIsTextField(text_field) );
assert( _XfeIsAlive(w) );
assert( text != NULL );
/* Invoke the set_text_proc if available */
if (cp->set_text_proc != NULL)
{
(*cp->set_text_proc)(text_field,text);
}
else
{
XmTextFieldSetString(text_field,text);
}
}
/*----------------------------------------------------------------------*/
static char *
InvokeGetTextFunc(Widget text_field)
{
Widget w = _XfeParent(text_field);
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
char * result;
assert( XmIsTextField(text_field) );
assert( _XfeIsAlive(w) );
/* Invoke the get_text_func if available */
if (cp->get_text_func != NULL)
{
result = (*cp->get_text_func)(text_field);
}
else
{
result = XmTextFieldGetString(text_field);
}
return result;
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox method invocation functions */
/* */
/*----------------------------------------------------------------------*/
/* extern */ void
_XfeComboBoxLayoutTitle(Widget w)
{
XfeComboBoxWidgetClass cc = (XfeComboBoxWidgetClass) XtClass(w);
if (cc->xfe_combo_box_class.layout_title)
{
(*cc->xfe_combo_box_class.layout_title)(w);
}
}
/*----------------------------------------------------------------------*/
/* extern */ void
_XfeComboBoxLayoutArrow(Widget w)
{
XfeComboBoxWidgetClass cc = (XfeComboBoxWidgetClass) XtClass(w);
if (cc->xfe_combo_box_class.layout_arrow)
{
(*cc->xfe_combo_box_class.layout_arrow)(w);
}
}
/*----------------------------------------------------------------------*/
/* extern */ void
_XfeComboBoxDrawHighlight(Widget w,
XEvent * event,
Region region,
XRectangle * rect)
{
XfeComboBoxWidgetClass cc = (XfeComboBoxWidgetClass) XtClass(w);
if (cc->xfe_combo_box_class.draw_highlight)
{
(*cc->xfe_combo_box_class.draw_highlight)(w,event,region,rect);
}
}
/*----------------------------------------------------------------------*/
/* extern */ void
_XfeComboBoxDrawTitleShadow(Widget w,
XEvent * event,
Region region,
XRectangle * rect)
{
XfeComboBoxWidgetClass cc = (XfeComboBoxWidgetClass) XtClass(w);
if (cc->xfe_combo_box_class.draw_title_shadow)
{
(*cc->xfe_combo_box_class.draw_title_shadow)(w,event,region,rect);
}
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox Public Methods */
/* */
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfeCreateComboBox(Widget pw,char * name,Arg * av,Cardinal ac)
{
return XtCreateWidget(name,xfeComboBoxWidgetClass,pw,av,ac);
}
/*----------------------------------------------------------------------*/
/* extern */ void
XfeComboBoxAddItem(Widget w,XmString item,int position)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
/* XmListPart * lp = _XfeXmListPart(w); */
assert( _XfeIsAlive(w) );
assert( XfeIsComboBox(w) );
XmListAddItem(cp->list,item,position);
#if 0
DtComboBoxWidget combo = (DtComboBoxWidget)combo_w;
DtComboBoxPart *combo_p = (DtComboBoxPart*)&(combo->combo_box);
XmStringTable list_items = ((XmListWidget)combo_p->list)->list.items;
int i;
if (item && ((XmListWidget)combo_p->list)->list.itemCount) {
for (i = 0; i < combo_p->item_count; i++)
if (XmStringCompare(item, list_items[i]))
break;
if ((i < combo_p->item_count) && unique)
return;
}
XmListAddItem(combo_p->list, item, pos);
SyncWithList(combo_p);
if (combo_p->label) {
SetMaximumLabelSize(combo_p);
if (combo_p->type == XmDROP_DOWN_LIST_BOX) {
ClearShadow(combo, TRUE);
if (combo_p->recompute_size)
SetComboBoxSize(combo);
LayoutChildren(combo);
DrawShadow(combo);
}
}
if (combo_p->type == XmDROP_DOWN_COMBO_BOX)
SetTextFieldData(combo_p, NULL);
else
SetLabelData(combo_p, NULL, FALSE);
#endif
}
/*----------------------------------------------------------------------*/
/* extern */ void
XfeComboBoxAddItemUnique(Widget w,XmString item,int position)
{
/* XfeComboBoxPart * cp = _XfeComboBoxPart(w); */
assert( _XfeIsAlive(w) );
assert( XfeIsComboBox(w) );
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* */
/* XfeComboBox - XmCOMBO_BOX_EDITABLE methods */
/* */
/*----------------------------------------------------------------------*/
/* extern */ String
XfeComboBoxGetTextString(Widget w)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( XfeIsComboBox(w) );
assert( cp->combo_box_type == XmCOMBO_BOX_EDITABLE );
if (cp->combo_box_type != XmCOMBO_BOX_EDITABLE)
{
return NULL;
}
return InvokeGetTextFunc(cp->title);
}
/*----------------------------------------------------------------------*/
/* extern */ void
XfeComboBoxSetTextString(Widget w,String string)
{
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
assert( XfeIsComboBox(w) );
assert( cp->combo_box_type == XmCOMBO_BOX_EDITABLE );
assert( string != NULL );
if (cp->combo_box_type != XmCOMBO_BOX_EDITABLE)
{
return;
}
InvokeSetTextProc(cp->title,string);
}
/*----------------------------------------------------------------------*/