/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#ifndef _MCW_BBOX_HEADER_
#define _MCW_BBOX_HEADER_
#include <Xm/XmAll.h>
#undef USE_TEXT_WIDGET
#ifdef USE_TEXT_WIDGET
# define TEXT_CLASS xmTextWidgetClass
# define TEXT_GET XmTextGetString
# define TEXT_SET XmTextSetString
#else
# define TEXT_CLASS xmTextFieldWidgetClass
# define TEXT_GET XmTextFieldGetString
# define TEXT_SET XmTextFieldSetString
#endif
#define LIST_MAX 25
#define LIST_MAXMAX 29
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "display.h"
#include "xutil.h"
#include "mrilib.h"
#ifndef LABEL_ARG
#define LABEL_ARG(str) \
XtVaTypedArg , XmNlabelString , XmRString , (str) , strlen(str)+1
#endif
/*---------------------------------------------------------------------------------*/
#define MCW_BB_noframe 0
#define MCW_BB_frame 1
#define MCW_BB_check 1
#define MCW_BB_radio_one 2
#define MCW_BB_radio_zero 3
#define MCW_MAX_BB 16
typedef struct {
Widget wframe , wrowcol ; /* Frame (if any) & RowColumn holder */
Widget wtop ; /* topmost widget (=wframe or wrowcol) */
int nbut ; /* number of buttons */
Widget wbut[MCW_MAX_BB] ; /* array of ToggleButtonWidget */
int value ; /* OR-ed mask of set buttons */
XtPointer parent , aux ;
} MCW_bbox ;
/*** prototypes ***/
#ifdef __cplusplus
extern "C" {
#endif
extern MCW_bbox * new_MCW_bbox( Widget , int , char * lab[] , int , int ,
XtCallbackProc , XtPointer ) ;
extern void MCW_set_bbox( MCW_bbox * , int ) ;
extern int MCW_val_bbox( MCW_bbox * ) ;
extern void MCW_bbox_hints( MCW_bbox * , int , char ** ) ;
/*---------------------------------------------------------------------------------*/
/***--- for arrowval ---***/
#ifndef VOID_FUNC
#define VOID_FUNC
typedef void void_func() ;
#endif
typedef void gen_func() ; /* generic functions */
typedef char * str_func() ;
typedef struct {
Widget wrowcol , /* Container */
wlabel , wdown,wup , wtext ;/* left-to-right widgets */
Widget wmenu ; /* for optmenu style only! */
int block_assign_actions ;
int ival , imin,imax , decimals ; /* value, min & max, decim shift */
float fval , fmin,fmax ; /* float values (includes decim) */
char * sval ; /* current string value from TextField */
int old_ival ; /* values just before the last change */
float old_fval ;
char * old_sval ;
XtIntervalId timer_id ; /* id from XtAppAddTimeOut */
gen_func * dval_CB ; /* non-NULL=function to call when value changes */
XtPointer dval_data ; /* data for call */
str_func * text_CB ; /* if non-NULL, function to call to make text */
XtPointer text_data ;
int incr , delay , fastdelay ; /* for the timer callback */
int allow_wrap ;
XEvent xev ; /* copy of event in callback */
XtPointer parent , aux ;
float fstep ; /* 16 Feb 1999 */
} MCW_arrowval ;
/* 08 Mar 1999: this macro is defined
because I forget to free the string values (sval) */
#define FREE_AV(av) do{ if( (av) != NULL ){ \
XtFree((av)->sval) ; XtFree((av)->old_sval) ; \
XtFree((char*)(av)) ; (av) = NULL ; \
}} while(0)
#define MCW_AV_downup 1
#define MCW_AV_leftright 2
#define MCW_AV_optmenu 3
#define MCW_AV_notext 11
#define MCW_AV_editext 12
#define MCW_AV_edittext 12
#define MCW_AV_readtext 13
#define MCW_AV_noactext 14 /* Feb 1999 */
#define MCW_AV_longdelay 1000
#define MCW_AV_shortdelay 111
#define AV_NCOL 9 /* # columns visible */
#define AV_MAXLEN 120 /* Feb 1999 */
#define AVOPT_columnize(av,nc) \
do{ if( (av)!= NULL && (av)->wmenu != NULL && (nc) > 0 ) \
XtVaSetValues( (av)->wmenu, XmNpacking,XmPACK_COLUMN , \
XmNnumColumns,(nc), NULL ) ; } while(0)
extern int AV_colsize() ; /* 11 Dec 2001 */
extern MCW_arrowval * new_MCW_optmenu( Widget , char * ,
int,int,int,int,
gen_func * , XtPointer ,
str_func * , XtPointer ) ;
extern void refit_MCW_optmenu( MCW_arrowval * ,
int,int,int,int,
str_func * , XtPointer ) ;
extern void allow_MCW_optmenu_popup(int) ; /* 12 Dec 2001 */
extern MCW_arrowval * new_MCW_colormenu( Widget , char * label , MCW_DC * ,
int , int , int ,
gen_func * , XtPointer ) ;
extern MCW_arrowval * new_MCW_arrowval( Widget , char * ,
int,int,int,int,int,int ,
gen_func * , XtPointer ,
str_func * , XtPointer ) ;
extern void AV_press_CB( Widget , XtPointer , XtPointer ) ;
extern void AVOPT_press_CB( Widget , XtPointer , XtPointer ) ;
extern void AV_timer_CB( XtPointer , XtIntervalId * ) ;
extern void AV_assign_ival( MCW_arrowval * , int ) ;
extern void AV_assign_fval( MCW_arrowval * , float ) ;
extern void AV_textact_CB( Widget , XtPointer , XtPointer ) ;
extern void AV_leave_EV( Widget , XtPointer , XEvent * , Boolean * ) ;
char * AV_default_text_CB( MCW_arrowval * , XtPointer ) ;
extern void AV_fval_to_char( float , char * ) ;
extern char * AV_format_fval( float ) ; /* 12 Jul 1999 */
extern char * AV_uformat_fval( float ) ; /* 22 Jan 2003 */
extern char * MCW_av_substring_CB( MCW_arrowval * , XtPointer ) ;
/* macro to shift a value so many decimal points to the left */
#define AV_SHIFT_VAL(decim,sv) \
{ int iqqq ; \
if( (decim) > 0 ) \
for( iqqq=0 ; iqqq < (decim) ; iqqq++ ) (sv) *= 0.10 ; \
else if( (decim) < 0 ) \
for( iqqq=0 ; iqqq > (decim) ; iqqq-- ) (sv) *= 10.0 ; \
}
/* macro to set sensitivity for an arrowval
(needed because Motif 1.2 fails to draw correctly
when simply using XtSetSensitive on av->wrowcol ) */
#define AV_SENSITIZE(av,sss) \
do{ Boolean sen = (Boolean) sss ; \
if( av != NULL ) { \
int exp = (XtIsSensitive(av->wrowcol) != sen) ; \
if( av->wlabel != NULL ) XtSetSensitive(av->wlabel ,sen); \
if( av->wup != NULL ) XtSetSensitive(av->wup ,sen); \
if( av->wdown != NULL ) XtSetSensitive(av->wdown ,sen); \
if( av->wtext != NULL ) XtSetSensitive(av->wtext ,sen); \
XtSetSensitive(av->wrowcol,sen); \
if( exp ) MCW_expose_widget(av->wrowcol) ; \
} } while(0)
/* following 2 macros added 12 Mar 2002 */
#define AV_SENSITIZE_UP(av,sss) \
do{ if( av != NULL && av->wup != NULL ) \
XtSetSensitive(av->wup,sss); } while(0)
#define AV_SENSITIZE_DOWN(av,sss) \
do{ if( av != NULL && av->wdown != NULL ) \
XtSetSensitive(av->wdown,sss); } while(0)
/*---------------------------------------------------------------------------------*/
#define POPDOWN_ovcolor_chooser MCW_choose_ovcolor(NULL,NULL,0,NULL,NULL)
#define POPDOWN_string_chooser MCW_choose_string(NULL,NULL,NULL,NULL,NULL)
#define POPDOWN_strlist_chooser MCW_choose_strlist(NULL,NULL,0,0,NULL,NULL,NULL)
#define POPDOWN_integer_chooser MCW_choose_integer(NULL,NULL,0,0,0,NULL,NULL)
#define POPDOWN_timeseries_chooser MCW_choose_timeseries(NULL,NULL,NULL,0,NULL,NULL)
#define POPDOWN_vector_chooser MCW_choose_vector(NULL,NULL,0,NULL,NULL,NULL,NULL)
#define POPDOWN_editable_strlist_chooser \
MCW_choose_editable_strlist(NULL,NULL,NULL,0,NULL,NULL)
extern void MCW_list_mode_CB( MCW_arrowval * , XtPointer ) ;
extern char * MCW_DC_ovcolor_text( MCW_arrowval * , MCW_DC * ) ;
extern void MCW_choose_ovcolor( Widget , MCW_DC * , int , gen_func * , XtPointer ) ;
extern void MCW_choose_CB( Widget , XtPointer , XtPointer ) ;
extern void MCW_destroy_chooser_CB( Widget , XtPointer , XtPointer ) ;
extern void MCW_kill_chooser_CB ( Widget , XtPointer , XtPointer ) ;
extern void MCW_choose_integer( Widget , char * ,
int,int,int , gen_func *, XtPointer );
extern void MCW_choose_vector ( Widget, char *,
int, char **, int *, gen_func *, XtPointer ) ;
extern void MCW_choose_string ( Widget, char *,
char *, gen_func *, XtPointer );
extern void MCW_choose_strlist( Widget, char *, int, int,
char * strlist[], gen_func *, XtPointer );
extern void MCW_choose_multi_strlist( Widget, char *, int,
int, int *, char * strlist[],
gen_func *, XtPointer );
extern void MCW_choose_timeseries( Widget, char *, MRI_IMARR *,
int, gen_func *, XtPointer );
extern void MCW_choose_editable_strlist( Widget, char *,
THD_string_array *,
int, gen_func *, XtPointer );
extern void MCW_choose_multi_editable_strlist( Widget, char *, int,
THD_string_array *,
int *, gen_func *, XtPointer );
extern void MCW_stradd_CB( Widget , XtPointer , XtPointer ) ;
extern void MCW_set_browse_select(int) ; /* 21 Feb 2007 */
typedef struct {
int ctype ; /* choice type */
MCW_DC * dc ; /* display context */
Widget wpop ; /* popup widget */
Widget wcaller ; /* widget that made the popup */
MCW_arrowval * av ; /* arrowval making the choices */
Widget wchoice ; /* widget making the choice */
gen_func * sel_CB ; /* user callback */
XtPointer sel_cd ; /* user callback data */
MRI_IMARR * tsarr ; /* array of timeseries to choose from */
XtPointer parent , aux ;
THD_string_array * sar ; /* array of strings, for editable_strlist */
Widget wtf ; /* text field, for editable_strlist */
int nvec ; /* 19 Mar 2004: for vector chooser */
} MCW_choose_data ;
#define mcwCT_ovcolor 701
#define mcwCT_integer 702
#define mcwCT_string 703
#define mcwCT_timeseries 707
#define mcwCT_vector 708 /* 19 Mar 2004 */
#define mcwCT_single_mode 222
#define mcwCT_multi_mode 223
/* for vector callbacks:
ival = number of vector values
(float *)cval = vector array */
typedef struct {
int reason ; /* reason for callback */
XEvent * event ; /* event, most likely NULL */
int ival ; /* chosen value */
float fval ; /* chosen value */
char * cval ; /* chosen value */
int nilist ,
*ilist ; /* many chosen values */
MRI_IMAGE * imval ; /* chosen value for timeseries */
XtPointer parent , aux ;
} MCW_choose_cbs ;
#define mcwCR_ovcolor 201
#define mcwCR_integer 202
#define mcwCR_string 203
#define mcwCR_timeseries 207
#define mcwCR_vector 208 /* 19 Mar 2004 */
/*---------------------------------------------------------------------------------*/
/*---- arrowpad stuff ----*/
#define AP_DOWN 0
#define AP_UP 1
#define AP_LEFT 2
#define AP_RIGHT 3
#define AP_MID 4
#define AP_FBASE 3
typedef struct {
int atype , atop , abottom , aleft , aright ;
} AP_define ;
static AP_define AP_but_def[5] = {
{ XmARROW_DOWN , 2 , 3 , 1 , 2 } ,
{ XmARROW_UP , 0 , 1 , 1 , 2 } ,
{ XmARROW_LEFT , 1 , 2 , 0 , 1 } ,
{ XmARROW_RIGHT, 1 , 2 , 2 , 3 } ,
{ 0 , 1 , 2 , 1 , 2 }
} ;
#define AP_MAXCOUNT 5000
typedef struct {
Widget wform , /* Containing Form widget */
wbut[5] ; /* 4 arrowbuttons and a pushbutton */
XtIntervalId timer_id ; /* id from XtAppAddTimeOut */
int which_pressed ;
gen_func * action_CB ; /* non-NULL=function to call on changes */
XtPointer action_data ; /* data for call */
int delay , fastdelay ; /* for the timer callback */
int count ;
XEvent xev ; /* copy of event from callback */
XtPointer parent , aux ;
} MCW_arrowpad ;
extern MCW_arrowpad * new_MCW_arrowpad( Widget , gen_func * , XtPointer ) ;
extern void AP_press_CB( Widget , XtPointer , XtPointer ) ;
extern void AP_timer_CB( XtPointer , XtIntervalId * ) ;
/*! toggle sensitivity of an arrowpad */
#define AP_SENSITIZE(ap,sss) \
do{ Boolean sen = (Boolean) sss ; \
if( ap != NULL ) { \
int exp = (XtIsSensitive(ap->wform) != sen) ; \
XtSetSensitive(ap->wbut[0],sen); \
XtSetSensitive(ap->wbut[1],sen); \
XtSetSensitive(ap->wbut[2],sen); \
XtSetSensitive(ap->wbut[3],sen); \
XtSetSensitive(ap->wbut[4],sen); \
XtSetSensitive(ap->wform,sen); \
if( exp ) MCW_expose_widget(ap->wform) ; \
} } while(0)
#if 0
#define AP_MANGLIZE(ap) \
do{ if( ap != NULL ){ \
XtUnmanageChild( ap->wbut[4] ) ; \
XtUnmanageChild( ap->wform ) ; \
XtVaSetValues( ap->wform , \
XmNfractionBase , 6 , NULL ) ; \
XtVaSetValues( ap->wbut[0] , \
XmNtopPosition , 4 , \
XmNbottomPosition , 6 , \
XmNleftPosition , 3 , \
XmNrightPosition , 5 , NULL ) ; \
XtVaSetValues( ap->wbut[1] , \
XmNtopPosition , 0 , \
XmNbottomPosition , 2 , \
XmNleftPosition , 3 , \
XmNrightPosition , 5 , NULL ) ; \
XtVaSetValues( ap->wbut[2] , \
XmNtopPosition , 2 , \
XmNbottomPosition , 4 , \
XmNleftPosition , 2 , \
XmNrightPosition , 4 , NULL ) ; \
XtVaSetValues( ap->wbut[3] , \
XmNtopPosition , 2 , \
XmNbottomPosition , 4 , \
XmNleftPosition , 4 , \
XmNrightPosition , 6 , NULL ) ; \
XtManageChild( ap->wform ) ; \
} } while(0)
#endif
#ifdef __cplusplus
}
#endif
#endif /* _MCW_BBOX_HEADER_ */
syntax highlighted by Code2HTML, v. 0.9.1