зеркало из https://github.com/mozilla/gecko-dev.git
909 строки
26 KiB
C
909 строки
26 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.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Name: <Xfe/FancyBox.c> */
|
|
/* Description: XfeFancyBox widget source. */
|
|
/* Author: Ramiro Estrugo <ramiro@netscape.com> */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <Xfe/FancyBoxP.h>
|
|
#include <Xfe/BypassShellP.h>
|
|
#include <Xfe/ListUtilP.h>
|
|
|
|
#include <Xm/TextF.h>
|
|
#include <Xm/List.h>
|
|
|
|
#include <Xfe/Button.h>
|
|
#include <Xfe/Arrow.h>
|
|
|
|
#define MESSAGE1 "Widget is not an XfeFancyBox."
|
|
#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 "XmNfancyBoxType is a creation-only resource."
|
|
#define MESSAGE7 "No valid XfeBypassShell found to share for XmNshell."
|
|
|
|
#define LIST_NAME "FancyList"
|
|
#define SHELL_NAME "FancyShell"
|
|
#define TITLE_NAME "FancyTitle"
|
|
#define ARROW_NAME "FancyArrow"
|
|
|
|
#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) (_XfemRectX(w) + cp->highlight_thickness)
|
|
#define CB_RECT_Y(w,cp) (_XfemRectY(w) + cp->highlight_thickness)
|
|
#define CB_RECT_WIDTH(w,cp) (_XfemRectWidth(w)-2*cp->highlight_thickness)
|
|
#define CB_RECT_HEIGHT(w,cp) (_XfemRectHeight(w)-2*cp->highlight_thickness)
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Core class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
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 AcceptChild (Widget);
|
|
static Boolean InsertChild (Widget);
|
|
static Boolean DeleteChild (Widget);
|
|
static void LayoutComponents (Widget);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeComboBox class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void LayoutTitle (Widget);
|
|
static void DrawTitleShadow (Widget,XEvent *,Region,XRectangle *);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Misc XfeFancyBox functions */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void DrawHighlight (Widget,XEvent *,Region,XRectangle *);
|
|
|
|
static Widget TitleCreate (Widget);
|
|
static void LayoutTitle (Widget);
|
|
static void TitleConfigure (Widget);
|
|
|
|
static Widget TitleTextCreate (Widget);
|
|
static Widget TitleLabelCreate (Widget);
|
|
|
|
static void IconLayout (Widget);
|
|
|
|
static Widget ShellCreate (Widget);
|
|
static void ShellLayout (Widget);
|
|
|
|
static Widget ArrowCreate (Widget);
|
|
static void ArrowLayout (Widget);
|
|
|
|
|
|
static Widget ListCreate (Widget);
|
|
static void ListLayout (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);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Arrow callbacks */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void ArrowArmCB (Widget,XtPointer,XtPointer);
|
|
static void ArrowDisarmCB (Widget,XtPointer,XtPointer);
|
|
static void ArrowActivateCB (Widget,XtPointer,XtPointer);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Synthetic resource Callprocs */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void SyntheticGetListItems (Widget,int, XtArgVal *);
|
|
static void SyntheticGetListItemCount (Widget,int, XtArgVal *);
|
|
|
|
#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 _DtFancyBoxGetArrowSize SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetLabelString SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListItemCount SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListItems SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListFontList SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListMarginHeight SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListMarginWidth SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListSpacing SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListTopItemPosition SYN_RESOURCE_AA;
|
|
extern void _DtFancyBoxGetListVisibleItemCount SYN_RESOURCE_AA;
|
|
#endif
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeFancyBox resources */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static XtResource resources[] =
|
|
{
|
|
#if 0
|
|
/* Title resources */
|
|
{
|
|
XmNtitle,
|
|
XmCReadOnly,
|
|
XmRWidget,
|
|
sizeof(Widget),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . title),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
{
|
|
XmNcomboBoxType,
|
|
XmCComboBoxType,
|
|
XmRComboBoxType,
|
|
sizeof(unsigned char),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . combo_box_type),
|
|
XmRImmediate,
|
|
(XtPointer) XmCOMBO_BOX_READ_ONLY
|
|
},
|
|
{
|
|
XmNtitleFontList,
|
|
XmCTitleFontList,
|
|
XmRFontList,
|
|
sizeof(XmFontList),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . title_font_list),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
{
|
|
XmNtitleShadowThickness,
|
|
XmCShadowThickness,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . title_shadow_thickness),
|
|
XmRCallProc,
|
|
(XtPointer) DefaultTitleShadowThickness
|
|
},
|
|
{
|
|
XmNtitleShadowType,
|
|
XmCShadowType,
|
|
XmRShadowType,
|
|
sizeof(unsigned char),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . title_shadow_type),
|
|
XmRImmediate,
|
|
(XtPointer) XmSHADOW_IN
|
|
},
|
|
#endif
|
|
|
|
/* Icon resources */
|
|
{
|
|
XmNicon,
|
|
XmCReadOnly,
|
|
XmRWidget,
|
|
sizeof(Widget),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . icon),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
|
|
|
|
#if 0
|
|
/* List resources */
|
|
{
|
|
XmNlist,
|
|
XmCReadOnly,
|
|
XmRWidget,
|
|
sizeof(Widget),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . list),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
{
|
|
XmNitems,
|
|
XmCItems,
|
|
XmRXmStringTable,
|
|
sizeof(XmStringTable),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . items),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
{
|
|
XmNitemCount,
|
|
XmCItemCount,
|
|
XmRInt,
|
|
sizeof(int),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . item_count),
|
|
XmRImmediate,
|
|
(XtPointer) 0
|
|
},
|
|
{
|
|
XmNlistFontList,
|
|
XmCListFontList,
|
|
XmRFontList,
|
|
sizeof(XmFontList),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . list_font_list),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
{
|
|
XmNlistMarginHeight,
|
|
XmCListMarginHeight,
|
|
XmRVerticalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . list_margin_height),
|
|
XmRImmediate,
|
|
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_MARGIN_HEIGHT
|
|
},
|
|
{
|
|
XmNlistMarginWidth,
|
|
XmCListMarginWidth,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . list_margin_width),
|
|
XmRImmediate,
|
|
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_MARGIN_WIDTH
|
|
},
|
|
{
|
|
XmNlistSpacing,
|
|
XmCListSpacing,
|
|
XmRVerticalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . list_spacing),
|
|
XmRImmediate,
|
|
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_SPACING
|
|
},
|
|
{
|
|
XmNtopItemPosition,
|
|
XmCTopItemPosition,
|
|
XmRInt,
|
|
sizeof(int),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . top_item_position),
|
|
XmRImmediate,
|
|
(XtPointer) 1
|
|
},
|
|
{
|
|
XmNvisibleItemCount,
|
|
XmCVisibleItemCount,
|
|
XmRInt,
|
|
sizeof(int),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . visible_item_count),
|
|
XmRImmediate,
|
|
(XtPointer) XfeDEFAULT_COMBO_BOX_LIST_VISIBLE_ITEM_COUNT
|
|
},
|
|
|
|
/* Shell resources */
|
|
{
|
|
XmNshell,
|
|
XmCReadOnly,
|
|
XmRWidget,
|
|
sizeof(Widget),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . shell),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
{
|
|
XmNshareShell,
|
|
XmCShareShell,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . share_shell),
|
|
XmRImmediate,
|
|
(XtPointer) True
|
|
},
|
|
{
|
|
XmNpoppedUp,
|
|
XmCReadOnly,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . popped_up),
|
|
XmRImmediate,
|
|
(XtPointer) False
|
|
},
|
|
|
|
|
|
/* Arrow resources */
|
|
{
|
|
XmNarrow,
|
|
XmCReadOnly,
|
|
XmRWidget,
|
|
sizeof(Widget),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . arrow),
|
|
XmRImmediate,
|
|
(XtPointer) NULL
|
|
},
|
|
|
|
/* Traversal resources */
|
|
{
|
|
XmNhighlightThickness,
|
|
XmCHighlightThickness,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . highlight_thickness),
|
|
XmRImmediate,
|
|
(XtPointer) 2
|
|
},
|
|
{
|
|
XmNtraversalOn,
|
|
XmCTraversalOn,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . traversal_on),
|
|
XmRImmediate,
|
|
(XtPointer) True
|
|
},
|
|
|
|
/* Force the XmNshadowThickness to the default */
|
|
{
|
|
XmNshadowThickness,
|
|
XmCShadowThickness,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , manager . shadow_thickness),
|
|
XmRImmediate,
|
|
(XtPointer) XfeDEFAULT_SHADOW_THICKNESS
|
|
},
|
|
|
|
/* Force XmNmarginLeft and XmNmarginRight to 4 */
|
|
{
|
|
XmNmarginLeft,
|
|
XmCMarginLeft,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_manager . margin_left),
|
|
XmRImmediate,
|
|
(XtPointer) 4
|
|
},
|
|
{
|
|
XmNmarginRight,
|
|
XmCMarginRight,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_manager . margin_right),
|
|
XmRImmediate,
|
|
(XtPointer) 4
|
|
},
|
|
#endif
|
|
|
|
};
|
|
|
|
#if 0
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeFancyBox synthetic resources */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static XmSyntheticResource synthetic_resources[] =
|
|
{
|
|
{
|
|
XmNitems,
|
|
sizeof(XmStringTable),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . items),
|
|
SyntheticGetListItems,
|
|
_XfeSyntheticSetResourceForChild
|
|
},
|
|
{
|
|
XmNitemCount,
|
|
sizeof(int),
|
|
XtOffsetOf(XfeFancyBoxRec , xfe_fancy_box . item_count),
|
|
SyntheticGetListItemCount,
|
|
_XfeSyntheticSetResourceForChild
|
|
},
|
|
};
|
|
#endif
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Widget Class Record Initialization */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
_XFE_WIDGET_CLASS_RECORD(fancybox,FancyBox) =
|
|
{
|
|
{
|
|
(WidgetClass) &xfeComboBoxClassRec, /* superclass */
|
|
"XfeFancyBox", /* class_name */
|
|
sizeof(XfeFancyBoxRec), /* widget_size */
|
|
NULL, /* class_initialize */
|
|
NULL, /* class_part_initialize*/
|
|
FALSE, /* class_inited */
|
|
Initialize, /* initialize */
|
|
NULL, /* initialize_hook */
|
|
XtInheritRealize, /* realize */
|
|
NULL, /* actions */
|
|
0, /* 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 */
|
|
#if 0
|
|
synthetic_resources, /* syn resources */
|
|
XtNumber(synthetic_resources), /* num syn_resources */
|
|
#else
|
|
NULL, /* syn resources */
|
|
0, /* num syn_resources */
|
|
#endif
|
|
NULL, /* syn_cont_resources */
|
|
0, /* num_syn_cont_resource*/
|
|
XmInheritParentProcess, /* parent_process */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* XfeManager Part */
|
|
{
|
|
XfeInheritBitGravity, /* bit_gravity */
|
|
PreferredGeometry, /* preferred_geometry */
|
|
XfeInheritMinimumGeometry, /* minimum_geometry */
|
|
XfeInheritUpdateRect, /* update_rect */
|
|
AcceptChild, /* accept_child */
|
|
InsertChild, /* insert_child */
|
|
DeleteChild, /* delete_child */
|
|
NULL, /* change_managed */
|
|
NULL, /* prepare_components */
|
|
LayoutComponents, /* layout_components */
|
|
NULL, /* layout_children */
|
|
NULL, /* draw_background */
|
|
XfeInheritDrawShadow, /* draw_shadow */
|
|
XfeInheritDrawComponents, /* draw_components */
|
|
False, /* count_layable_children*/
|
|
NULL, /* child_is_layable */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* XfeComboBox Part */
|
|
{
|
|
LayoutTitle, /* layout_title */
|
|
XfeInheritLayoutArrow, /* layout_arrow */
|
|
XfeInheritDrawHighlight, /* draw_highlight */
|
|
DrawTitleShadow, /* draw_title_shadow */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* XfeFancyBox Part */
|
|
{
|
|
NULL, /* extension */
|
|
},
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* xfeFancyBoxWidgetClass declaration. */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
_XFE_WIDGET_CLASS(fancybox,FancyBox);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* 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
|
|
Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
|
|
{
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(nw);
|
|
|
|
#if 0
|
|
/* Make sure rep types are ok */
|
|
XfeRepTypeCheck(nw,XmRShadowType,&fp->title_shadow_type,
|
|
XmSHADOW_IN);
|
|
|
|
XfeRepTypeCheck(nw,XmRComboBoxType,&fp->combo_box_type,
|
|
XmCOMBO_BOX_READ_ONLY);
|
|
|
|
/* Make sure read-only resources aren't set */
|
|
if (fp->title)
|
|
{
|
|
_XmWarning(nw,MESSAGE2);
|
|
|
|
fp->title = NULL;
|
|
}
|
|
|
|
if (fp->list)
|
|
{
|
|
_XmWarning(nw,MESSAGE3);
|
|
|
|
fp->list = NULL;
|
|
}
|
|
|
|
if (fp->shell)
|
|
{
|
|
_XmWarning(nw,MESSAGE4);
|
|
|
|
fp->shell = NULL;
|
|
}
|
|
|
|
if (fp->arrow)
|
|
{
|
|
_XmWarning(nw,MESSAGE5);
|
|
|
|
fp->arrow = NULL;
|
|
}
|
|
|
|
/* Create components */
|
|
fp->arrow = ArrowCreate(nw);
|
|
fp->title = TitleCreate(nw);
|
|
fp->shell = ShellCreate(nw);
|
|
fp->list = ListCreate(nw);
|
|
|
|
/* Configure the title */
|
|
TitleConfigure(nw);
|
|
|
|
/* Initialize private members */
|
|
fp->highlighted = False;
|
|
|
|
|
|
/* Manage the children */
|
|
XtManageChild(fp->title);
|
|
XtManageChild(fp->list);
|
|
XtManageChild(fp->arrow);
|
|
|
|
/* XfeOverrideTranslations(nw,_XfeFancyBoxExtraTranslations); */
|
|
#endif
|
|
|
|
/* Finish of initialization */
|
|
_XfeManagerChainInitialize(rw,nw,xfeFancyBoxWidgetClass);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
Destroy(Widget w)
|
|
{
|
|
/* XfeFancyBoxPart * fp = _XfeFancyBoxPart(w); */
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static Boolean
|
|
SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
|
|
{
|
|
XfeFancyBoxPart * np = _XfeFancyBoxPart(nw);
|
|
XfeFancyBoxPart * op = _XfeFancyBoxPart(ow);
|
|
|
|
|
|
return _XfeManagerChainSetValues(ow,rw,nw,xfeFancyBoxWidgetClass);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
GetValuesHook(Widget w,ArgList args,Cardinal* nargs)
|
|
{
|
|
/* XfeFancyBoxPart * fp = _XfeFancyBoxPart(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)
|
|
{
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
|
|
|
|
/* Invoke the super class' preferred_geometry method */
|
|
(*xfeComboBoxClassRec.xfe_manager_class.preferred_geometry)(w,
|
|
width,
|
|
height);
|
|
|
|
/* Add the icon widht if needed */
|
|
if (_XfeChildIsShown(fp->icon))
|
|
{
|
|
*width += (cp->spacing + _XfeWidth(fp->icon));
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static Boolean
|
|
AcceptChild(Widget child)
|
|
{
|
|
Widget w = _XfeParent(child);
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
|
|
return (!_XfeIsAlive(fp->icon) && XfeIsButton(child));
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static Boolean
|
|
InsertChild(Widget child)
|
|
{
|
|
Widget w = _XfeParent(child);
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
|
|
fp->icon = child;
|
|
|
|
return True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static Boolean
|
|
DeleteChild(Widget child)
|
|
{
|
|
Widget w = _XfeParent(child);
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
|
|
fp->icon = NULL;
|
|
|
|
return True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
LayoutComponents(Widget w)
|
|
{
|
|
/* Layout the arrow */
|
|
_XfeComboBoxLayoutArrow(w);
|
|
|
|
/* Layout the title */
|
|
_XfeComboBoxLayoutTitle(w);
|
|
|
|
/* Layout the icon if needed */
|
|
IconLayout(w);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Misc XfeFancyBox functions */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DrawTitleShadow(Widget w,XEvent * event,Region region,XRectangle * clip_rect)
|
|
{
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
|
|
|
|
/* Make sure the shadow is needed */
|
|
if (!cp->title_shadow_thickness)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_XfeIsAlive(fp->icon))
|
|
{
|
|
Dimension icon_x1 = _XfeX(fp->icon) - cp->spacing;
|
|
Dimension title_x2 = _XfeX(cp->title) + _XfeWidth(cp->title);
|
|
|
|
/* Draw the shadow around the icon and text */
|
|
_XmDrawShadows(XtDisplay(w),
|
|
_XfeWindow(w),
|
|
_XfemTopShadowGC(w),_XfemBottomShadowGC(w),
|
|
|
|
CB_OFFSET_LEFT(w,cp),
|
|
|
|
_XfeY(cp->title) -
|
|
cp->title_shadow_thickness,
|
|
|
|
(title_x2 - icon_x1) +
|
|
2 * cp->title_shadow_thickness,
|
|
|
|
_XfeHeight(cp->title) +
|
|
2 * cp->title_shadow_thickness,
|
|
|
|
cp->title_shadow_thickness,
|
|
cp->title_shadow_type);
|
|
}
|
|
else
|
|
{
|
|
/* 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 void
|
|
LayoutTitle(Widget w)
|
|
{
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
|
|
int x;
|
|
int total_icon_width = 0;
|
|
|
|
if (_XfeIsAlive(fp->icon))
|
|
{
|
|
x = _XfeX(fp->icon) + _XfeWidth(fp->icon);
|
|
|
|
total_icon_width = _XfeWidth(fp->icon) + cp->spacing;
|
|
}
|
|
else
|
|
{
|
|
x = CB_OFFSET_LEFT(w,cp) + cp->title_shadow_thickness;
|
|
}
|
|
|
|
_XfeConfigureWidget(cp->title,
|
|
|
|
x,
|
|
|
|
(_XfeHeight(w) - _XfeHeight(cp->title)) / 2,
|
|
|
|
CB_RECT_WIDTH(w,cp) -
|
|
cp->spacing -
|
|
_XfeWidth(cp->arrow) -
|
|
total_icon_width -
|
|
2 * cp->title_shadow_thickness,
|
|
|
|
CB_RECT_HEIGHT(w,cp) -
|
|
2 * cp->title_shadow_thickness);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
IconLayout(Widget w)
|
|
{
|
|
XfeFancyBoxPart * fp = _XfeFancyBoxPart(w);
|
|
XfeComboBoxPart * cp = _XfeComboBoxPart(w);
|
|
|
|
if (!_XfeIsAlive(fp->icon))
|
|
{
|
|
return;
|
|
}
|
|
|
|
_XfeConfigureWidget(fp->icon,
|
|
|
|
CB_OFFSET_LEFT(w,cp) +
|
|
cp->title_shadow_thickness +
|
|
cp->spacing,
|
|
|
|
(_XfeHeight(w) - _XfeHeight(fp->icon)) / 2,
|
|
|
|
_XfeWidth(fp->icon),
|
|
|
|
_XfeHeight(fp->icon));
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* 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);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeFancyBox Public Methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ Widget
|
|
XfeCreateFancyBox(Widget pw,char * name,Arg * av,Cardinal ac)
|
|
{
|
|
return XtCreateWidget(name,xfeFancyBoxWidgetClass,pw,av,ac);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|