/* -*- 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: */ /* Description: XfeComboBox widget source. */ /* Author: Ramiro Estrugo */ /* */ /*----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #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 : extend-start()\n\ c ~s ~m ~a : move-destination()\n\ ~c ~s ~m ~a : grab-focus()\n\ ~c ~m ~a : extend-adjust()\n\ ~c ~m ~a : extend-end()"; /* extern */ char _XfeComboBoxTextReadOnlyTranslations[] ="\ ~c ~s ~m ~a : grab-focus() Popup()\n\ ~c ~m ~a : \n\ ~c ~m ~a : Popdown()"; #if 0 /* extern */ char _XfeComboBoxArrowTranslations[] ="\ ~c ~s ~m ~a : Highlight() Arm() Popup()\n\ ~c ~m ~a : Activate() Disarm() Popdown()"; #else /* extern */ char _XfeComboBoxArrowTranslations[] ="\ ~c ~s ~m ~a : Highlight() Arm() Popup()\n\ ~c ~m ~a : Activate() Disarm() Popdown()"; #endif /* extern */ char _XfeComboBoxExtraTranslations[] ="\ ~c ~s ~m ~a : Highlight() Popup()\n\ ~c ~m ~a : 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); } /*----------------------------------------------------------------------*/