1841 lines
51 KiB
C
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);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|