fa53273fe0
Files correlati : Ricompilazione Demo : [ ] Commento : Compilazione Linux git-svn-id: svn://10.65.10.50/trunk@11220 c028cbd2-c16b-5b4b-a496-9718f37d4682
1345 lines
41 KiB
C
Executable File
1345 lines
41 KiB
C
Executable File
/*******************************************************************************
|
|
* Copyright 1991-1996 by ORCA Software, Inc. *
|
|
* *
|
|
* All rights reserved. May not be reproduced or distributed, in printed or *
|
|
* electronic form, without permission of ORCA Software, Inc. May not be *
|
|
* distributed as object code, separately or linked with other object modules, *
|
|
* without permission. *
|
|
*******************************************************************************/
|
|
|
|
#define XI_INTERNAL
|
|
#define XI_R3_COMPAT
|
|
#include "xi.h"
|
|
#include "xiutils.h"
|
|
#include "xitext.h"
|
|
#include "xistx.h"
|
|
#include "xilm.h"
|
|
#include "xilmst.h"
|
|
|
|
/* ERROR CODES 20101-20112 */
|
|
|
|
void realloc_ptrs( void ***ptrs, int nbr_ptrs, void *parent );
|
|
|
|
#define XI_PTR_INC 10
|
|
|
|
/*
|
|
realloc_ptrs: reallocate an array of pointers by adding one to
|
|
the current number of pointers. This function will attempt to
|
|
reallocate by blocks to improve performance.
|
|
*/
|
|
void
|
|
realloc_ptrs( void ***ptrs, int nbr_ptrs, void *parent )
|
|
{
|
|
int cur_nbr_alloc;
|
|
int nbr_alloc;
|
|
|
|
cur_nbr_alloc = ( ( nbr_ptrs - 1 ) / XI_PTR_INC + 1 ) * XI_PTR_INC;
|
|
nbr_alloc = ( nbr_ptrs / XI_PTR_INC + 1 ) * XI_PTR_INC;
|
|
|
|
if ( *ptrs == NULL )
|
|
{
|
|
*ptrs = ( void ** )
|
|
xi_tree_malloc( sizeof( void * ) * nbr_alloc, parent );
|
|
}
|
|
else
|
|
{
|
|
if ( cur_nbr_alloc != nbr_alloc )
|
|
{
|
|
*ptrs = ( void ** )
|
|
xi_tree_realloc( *ptrs, sizeof( void * ) * nbr_alloc );
|
|
}
|
|
}
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_create_itf_def( int cid, XI_EVENT_HANDLER xi_eh, XinRect * rctp, char *title,
|
|
long app_data )
|
|
{
|
|
XI_OBJ_DEF *itf;
|
|
XI_ITF_DEF *xi_id;
|
|
|
|
itf = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
itf->type = XIT_ITF;
|
|
itf->cid = cid;
|
|
itf->v.itf = xi_id = ( XI_ITF_DEF * ) xi_tree_malloc( sizeof( XI_ITF_DEF ), itf );
|
|
itf->app_data = app_data;
|
|
xi_id->xi_eh = xi_eh;
|
|
itf->v.itf->use_xil_win = FALSE;
|
|
if ( rctp )
|
|
{
|
|
xi_id->rctp = ( XinRect * ) xi_tree_malloc( sizeof( XinRect ), itf->v.itf );
|
|
*( xi_id->rctp ) = *rctp;
|
|
}
|
|
else
|
|
xi_id->rctp = NULL;
|
|
xi_id->title = title;
|
|
xi_id->ctl_close = TRUE;
|
|
xi_id->ctl_iconized = FALSE;
|
|
xi_id->ctl_iconizable = FALSE;
|
|
xi_id->maximized = FALSE;
|
|
xi_id->visible = TRUE;
|
|
xi_id->enabled = TRUE;
|
|
xi_id->parent = XI_NULL_WINDOW;
|
|
xi_id->border_style_set = FALSE;
|
|
xi_id->menu = NULL;
|
|
xi_id->icon_rid = 0;
|
|
itf->nbr_children = 0;
|
|
itf->children = NULL;
|
|
return itf;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_form_def( XI_OBJ_DEF * itf, int cid, int tab_cid )
|
|
{
|
|
XI_OBJ_DEF *form;
|
|
XI_FORM_DEF *xi_fd;
|
|
|
|
form = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
form->type = XIT_FORM;
|
|
form->cid = cid;
|
|
form->parent = itf;
|
|
form->nbr_children = 0;
|
|
form->children = NULL;
|
|
form->v.form = xi_fd = ( XI_FORM_DEF * ) xi_tree_malloc( sizeof( XI_FORM_DEF ), form );
|
|
xi_fd->tab_cid = tab_cid;
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20101, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = form;
|
|
itf->nbr_children++;
|
|
}
|
|
return form;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_line_def( XI_OBJ_DEF * itf, int cid, XinPoint * pnt1,
|
|
XinPoint * pnt2, unsigned long attrib, XinColor fore_color,
|
|
XinColor back_color, BOOLEAN well )
|
|
{
|
|
XI_OBJ_DEF *line_obj;
|
|
XI_LINE_DEF *xi_ld;
|
|
|
|
line_obj = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
line_obj->type = XIT_LINE;
|
|
line_obj->cid = cid;
|
|
line_obj->parent = itf;
|
|
line_obj->v.line = xi_ld = ( XI_LINE_DEF * ) xi_tree_malloc( sizeof( XI_LINE_DEF ), line_obj );
|
|
xi_ld->pnt1 = *pnt1;
|
|
xi_ld->pnt2 = *pnt2;
|
|
xi_ld->fore_color = fore_color;
|
|
xi_ld->back_color = back_color;
|
|
xi_ld->well = well;
|
|
xi_ld->attrib = attrib;
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20108, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = line_obj;
|
|
itf->nbr_children++;
|
|
}
|
|
return line_obj;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_list_def( XI_OBJ_DEF * itf, int cid, int v, int h,
|
|
int height, unsigned long attrib, XinColor enabled_color, XinColor back_color,
|
|
XinColor disabled_color, XinColor disabled_back_color, XinColor active_color,
|
|
int tab_cid )
|
|
{
|
|
XI_OBJ_DEF *list;
|
|
XI_LIST_DEF *xi_ld;
|
|
|
|
list = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
list->type = XIT_LIST;
|
|
list->cid = cid;
|
|
list->parent = itf;
|
|
list->nbr_children = 0;
|
|
list->children = NULL;
|
|
list->v.list = xi_ld = ( XI_LIST_DEF * ) xi_tree_malloc( sizeof( XI_LIST_DEF ), list );
|
|
xi_ld->xi_pnt.v = v;
|
|
xi_ld->xi_pnt.h = h;
|
|
xi_ld->height = height;
|
|
xi_ld->attrib = attrib;
|
|
xi_ld->enabled_color = enabled_color;
|
|
xi_ld->back_color = back_color;
|
|
xi_ld->disabled_color = disabled_color;
|
|
xi_ld->disabled_back_color = disabled_back_color;
|
|
xi_ld->active_color = active_color;
|
|
xi_ld->active_back_color = back_color;
|
|
xi_ld->tab_cid = tab_cid;
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20102, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = list;
|
|
itf->nbr_children++;
|
|
}
|
|
return list;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_column_def( XI_OBJ_DEF * list, int cid,
|
|
unsigned long attrib, int sort_number, int width, int text_size,
|
|
char *heading_text )
|
|
{
|
|
XI_OBJ_DEF *column;
|
|
XI_COLUMN_DEF *xi_cd;
|
|
|
|
column = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), list );
|
|
column->type = XIT_COLUMN;
|
|
column->cid = cid;
|
|
column->parent = list;
|
|
column->v.column = xi_cd = ( XI_COLUMN_DEF * ) xi_tree_malloc( sizeof( XI_COLUMN_DEF ), column );
|
|
xi_cd->attrib = attrib;
|
|
xi_cd->sort_number = sort_number;
|
|
xi_cd->width = width;
|
|
xi_cd->text_size = text_size;
|
|
xi_cd->heading_text = ( char * ) xi_tree_malloc( strlen( heading_text ) + 1, column );
|
|
strcpy( xi_cd->heading_text, heading_text );
|
|
if ( list != NULL )
|
|
{
|
|
if ( list->type != XIT_LIST )
|
|
XinError( 20103, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &list->children, list->nbr_children, list );
|
|
list->children[list->nbr_children] = column;
|
|
list->nbr_children++;
|
|
}
|
|
return column;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_field_def( XI_OBJ_DEF * form, int cid,
|
|
int v, int h, int field_width, unsigned long attrib,
|
|
int tab_cid, int text_size, XinColor enabled_color,
|
|
XinColor back_color, XinColor disabled_color, XinColor disabled_back_color,
|
|
XinColor active_color )
|
|
{
|
|
XI_OBJ_DEF *field;
|
|
XI_FIELD_DEF *xi_fd;
|
|
|
|
if ( text_size <= 0 )
|
|
XinError( 20112, XinSeverityFatal, 0L );
|
|
field = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), form );
|
|
field->type = XIT_FIELD;
|
|
field->cid = cid;
|
|
field->parent = form;
|
|
field->v.field = xi_fd = ( XI_FIELD_DEF * ) xi_tree_malloc( sizeof( XI_FIELD_DEF ), field );
|
|
xi_fd->pnt.h = h;
|
|
xi_fd->pnt.v = v;
|
|
xi_fd->field_width = field_width;
|
|
xi_fd->attrib = attrib;
|
|
xi_fd->tab_cid = tab_cid;
|
|
xi_fd->text_size = text_size;
|
|
xi_fd->back_color = back_color;
|
|
xi_fd->enabled_color = enabled_color;
|
|
xi_fd->disabled_color = disabled_color;
|
|
xi_fd->disabled_back_color = disabled_back_color;
|
|
xi_fd->active_color = active_color;
|
|
xi_fd->active_back_color = back_color;
|
|
if ( form != NULL )
|
|
{
|
|
if ( form->type != XIT_FORM )
|
|
XinError( 20104, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &form->children,
|
|
form->nbr_children, form );
|
|
form->children[form->nbr_children] = field;
|
|
form->nbr_children++;
|
|
}
|
|
return field;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_container_def( XI_OBJ_DEF * itf, int cid,
|
|
XinRect * xi_rct, XI_CONTAINER_ORIENTATION orientation, int tab_cid )
|
|
{
|
|
XI_OBJ_DEF *container;
|
|
XI_CONTAINER_DEF *xi_cd;
|
|
|
|
container = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
container->type = XIT_CONTAINER;
|
|
container->cid = cid;
|
|
container->parent = itf;
|
|
container->nbr_children = 0;
|
|
container->children = NULL;
|
|
container->v.container = xi_cd =
|
|
( XI_CONTAINER_DEF * ) xi_tree_malloc( sizeof( XI_CONTAINER_DEF ), container );
|
|
xi_cd->xi_rct = *xi_rct;
|
|
xi_cd->orientation = orientation;
|
|
xi_cd->tab_cid = tab_cid;
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20105, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = container;
|
|
itf->nbr_children++;
|
|
}
|
|
return container;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_button_def( XI_OBJ_DEF * parent, int cid, XinRect * rct,
|
|
unsigned long attrib, char *text, int tab_cid )
|
|
{
|
|
XI_OBJ_DEF *btn;
|
|
XI_BTN_DEF *xi_bd;
|
|
|
|
btn = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), parent );
|
|
btn->type = XIT_BTN;
|
|
btn->cid = cid;
|
|
btn->parent = parent;
|
|
btn->v.btn = xi_bd = ( XI_BTN_DEF * ) xi_tree_malloc( sizeof( XI_BTN_DEF ), btn );
|
|
if ( rct != NULL )
|
|
xi_bd->xi_rct = *rct;
|
|
xi_bd->attrib = attrib;
|
|
xi_bd->text = ( char * ) xi_tree_malloc( strlen( text ) + 1, btn );
|
|
strcpy( xi_bd->text, text );
|
|
xi_bd->tab_cid = tab_cid;
|
|
if ( parent != NULL )
|
|
{
|
|
if ( !( parent->type == XIT_ITF || parent->type == XIT_CONTAINER ) )
|
|
XinError( 20106, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &parent->children, parent->nbr_children, parent );
|
|
parent->children[parent->nbr_children] = btn;
|
|
parent->nbr_children++;
|
|
}
|
|
return btn;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_text_def( XI_OBJ_DEF * itf, int cid, XinRect * rct,
|
|
unsigned long attrib, char *text )
|
|
{
|
|
XI_OBJ_DEF *text_obj;
|
|
XI_TEXT_DEF *xi_td;
|
|
|
|
text_obj = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
text_obj->type = XIT_TEXT;
|
|
text_obj->cid = cid;
|
|
text_obj->parent = itf;
|
|
text_obj->v.text = xi_td = ( XI_TEXT_DEF * ) xi_tree_malloc( sizeof( XI_TEXT_DEF ), text_obj );
|
|
xi_td->xi_rct = *rct;
|
|
xi_td->attrib = attrib;
|
|
xi_td->text = ( char * ) xi_tree_malloc( strlen( text ) + 1, text_obj );
|
|
strcpy( xi_td->text, text );
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20107, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = text_obj;
|
|
itf->nbr_children++;
|
|
}
|
|
return text_obj;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_rect_def( XI_OBJ_DEF * itf, int cid, XinRect * rct,
|
|
unsigned long attrib, XinColor fore_color, XinColor back_color )
|
|
{
|
|
XI_OBJ_DEF *rect_obj;
|
|
XI_RECT_DEF *xi_rd;
|
|
|
|
rect_obj = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
rect_obj->type = XIT_RECT;
|
|
rect_obj->cid = cid;
|
|
rect_obj->parent = itf;
|
|
rect_obj->v.rect = xi_rd = ( XI_RECT_DEF * ) xi_tree_malloc( sizeof( XI_RECT_DEF ), rect_obj );
|
|
xi_rd->xi_rct = *rct;
|
|
xi_rd->fore_color = fore_color;
|
|
xi_rd->back_color = back_color;
|
|
xi_rd->attrib = attrib;
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20111, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = rect_obj;
|
|
itf->nbr_children++;
|
|
}
|
|
return rect_obj;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_add_group_def( XI_OBJ_DEF * itf, int cid, int nbr_cids,
|
|
int *cid_list )
|
|
{
|
|
XI_OBJ_DEF *group;
|
|
XI_GROUP_DEF *xi_gd;
|
|
|
|
group = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), itf );
|
|
group->type = XIT_GROUP;
|
|
group->cid = cid;
|
|
group->parent = itf;
|
|
group->v.group = xi_gd = ( XI_GROUP_DEF * ) xi_tree_malloc( sizeof( XI_GROUP_DEF ), group );
|
|
xi_gd->nbr_cids = nbr_cids;
|
|
if ( nbr_cids <= 0 )
|
|
XinError( 20109, XinSeverityFatal, 0L );
|
|
xi_gd->cids = ( int * ) xi_tree_malloc( sizeof( int ) * nbr_cids, xi_gd );
|
|
memcpy( ( char * ) xi_gd->cids, ( char * ) cid_list,
|
|
( size_t ) ( sizeof( int ) * nbr_cids ) );
|
|
if ( itf != NULL )
|
|
{
|
|
if ( itf->type != XIT_ITF )
|
|
XinError( 20110, XinSeverityFatal, 0L );
|
|
realloc_ptrs( ( void *** ) &itf->children, itf->nbr_children, itf );
|
|
itf->children[itf->nbr_children] = group;
|
|
itf->nbr_children++;
|
|
}
|
|
return group;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_get_column_def( XI_OBJ * column_obj,
|
|
LM_COLUMN_DATA * lmcdp, int index,
|
|
void *parent )
|
|
{
|
|
XI_OBJ_DEF *column;
|
|
XI_COLUMN_DEF *xi_cd;
|
|
|
|
column = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), parent );
|
|
column->type = XIT_COLUMN;
|
|
column->cid = column_obj->cid;
|
|
column->app_data = column_obj->app_data;
|
|
column->v.column = xi_cd = ( XI_COLUMN_DEF * ) xi_tree_malloc(
|
|
sizeof( XI_COLUMN_DEF ), column );
|
|
xi_cd->attrib = lmcdp->attrib;
|
|
xi_cd->sort_number = index * 10;
|
|
if ( xi_get_xil_pref( column_obj->itf ) )
|
|
{
|
|
xi_cd->pixel_width = lmcdp->pix_width;
|
|
xi_cd->width = lmcdp->width;
|
|
}
|
|
else
|
|
{
|
|
xi_cd->pixel_width = lmcdp->pix_width;
|
|
xi_cd->width = lmcdp->width * XI_FU_MULTIPLE;
|
|
}
|
|
xi_cd->text_size = lmcdp->text_size;
|
|
xi_cd->heading_text = ( char * ) xi_tree_malloc( strlen(
|
|
lmcdp->heading_text ) + 1, column );
|
|
strcpy( xi_cd->heading_text, lmcdp->heading_text );
|
|
xi_cd->center_heading = lmcdp->center_heading;
|
|
xi_cd->heading_well = lmcdp->heading_well;
|
|
xi_cd->heading_platform = lmcdp->heading_platform;
|
|
xi_cd->column_well = lmcdp->column_well;
|
|
xi_cd->column_platform = lmcdp->column_platform;
|
|
if ( lmcdp->font )
|
|
{
|
|
/* Make a copy because lmcdp->font will be destroyed with the column */
|
|
if ( ( BOOLEAN ) xi_get_pref( XI_PREF_R4_API ) )
|
|
{
|
|
XinFontCopy( &xi_cd->font, lmcdp->font );
|
|
xi_cd->font_id = NULL;
|
|
}
|
|
#ifdef XI_USE_XVT
|
|
else
|
|
{
|
|
XinFontCopy( &xi_cd->font, lmcdp->font );
|
|
xi_cd->font_id = XinFontXvtConvertBack( xi_cd->font );
|
|
xi_cd->font = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
xi_cd->icon_rid = lmcdp->icon_rid;
|
|
xi_cd->icon_x = lmcdp->icon_x;
|
|
xi_cd->icon_y = lmcdp->icon_y;
|
|
xi_cd->bitmap = xi_bitmap_copy( lmcdp->bitmap );
|
|
xi_cd->size_rows = lmcdp->size_rows;
|
|
xi_cd->suppress_update_heading = lmcdp->suppress_update_heading;
|
|
xi_cd->suppress_update_cells = lmcdp->suppress_update_cells;
|
|
xi_cd->vertical_align_center = lmcdp->vertical_align_center;
|
|
xi_cd->vertical_align_bottom = lmcdp->vertical_align_bottom;
|
|
xi_cd->wrap_text = lmcdp->wrap_text;
|
|
xi_cd->wrap_text_scrollbar = lmcdp->wrap_text_scrollbar;
|
|
xi_cd->cr_ok = lmcdp->cr_ok;
|
|
xi_cd->var_len_text = lmcdp->var_len_text;
|
|
xi_cd->auto_tab = lmcdp->auto_tab;
|
|
xi_cd->icon_mode = lmcdp->icon_mode;
|
|
return column;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_get_list_def( XI_OBJ * list_obj )
|
|
{
|
|
XI_OBJ_DEF *list;
|
|
XI_LIST_DEF *xi_ld;
|
|
XI_LIST_DATA *list_data;
|
|
LM_DATA *lmp;
|
|
XinPoint p;
|
|
int i;
|
|
int nbr_recs;
|
|
long *recs;
|
|
|
|
list_data = list_obj->v.list;
|
|
lmp = ( LM_DATA * ) list_data->lm;
|
|
list = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
list->type = XIT_LIST;
|
|
list->cid = list_obj->cid;
|
|
list->app_data = list_obj->app_data;
|
|
list->v.list = xi_ld = ( XI_LIST_DEF * ) xi_tree_malloc( sizeof( XI_LIST_DEF ), list );
|
|
xi_ld->xi_pnt = list_data->xi_pnt;
|
|
xi_ld->height = list_data->height;
|
|
xi_ld->pixel_height = lmp->pixel_height;
|
|
xi_ld->attrib = lmp->attrib;
|
|
xi_ld->enabled_color = lmp->enabled_color;
|
|
xi_ld->back_color = lmp->back_color;
|
|
xi_ld->disabled_color = lmp->disabled_color;
|
|
xi_ld->disabled_back_color = lmp->disabled_back_color;
|
|
xi_ld->active_color = lmp->active_color;
|
|
xi_ld->active_back_color = lmp->active_back_color;
|
|
xi_ld->white_space_color = lmp->white_space_color;
|
|
xi_ld->rule_color = lmp->rule_color;
|
|
xi_ld->tab_cid = list_data->tab_cid;
|
|
xi_ld->no_heading = lmp->no_heading;
|
|
xi_ld->one_row_list = list_data->one_row_list;
|
|
xi_ld->scroll_bar = list_data->scroll_bar;
|
|
xi_ld->sizable_columns = lmp->sizable_columns;
|
|
xi_ld->movable_columns = lmp->movable_columns;
|
|
xi_ld->scroll_bar_button = list_data->scroll_bar_button;
|
|
xi_ld->fixed_columns = lmp->fixed_columns;
|
|
xi_ld->resize_with_window = lmp->resize_with_window;
|
|
xi_ld->horz_sync_list = lmp->horz_sync_list;
|
|
xi_ld->vert_sync_list = lmp->vert_sync_list;
|
|
xi_ld->row_focus_border = lmp->row_focus_border;
|
|
xi_ld->row_focus_border_color = lmp->row_focus_border_color;
|
|
xi_ld->max_lines_in_cell = lmp->max_lines_in_cell;
|
|
xi_ld->single_select = lmp->single_select;
|
|
if ( xi_get_xil_pref( list_obj->parent ) )
|
|
xi_ld->width = lmp->pixel_width;
|
|
else
|
|
{
|
|
p.h = lmp->pixel_width;
|
|
xi_pu_to_fu( list_obj->itf, &p, 1 );
|
|
xi_ld->width = p.h;
|
|
}
|
|
xi_ld->min_cell_height = lmp->min_cell_height;
|
|
xi_ld->min_heading_height = lmp->min_heading_height;
|
|
xi_ld->no_horz_lines = lmp->no_horz_lines;
|
|
xi_ld->no_vert_lines = lmp->no_vert_lines;
|
|
xi_ld->drop_and_delete = lmp->drop_and_delete;
|
|
xi_ld->select_cells = lmp->select_cells;
|
|
xi_ld->get_all_records = lmp->get_all_records;
|
|
if ( lmp->font )
|
|
{
|
|
if ( ( BOOLEAN ) xi_get_pref( XI_PREF_R4_API ) )
|
|
{
|
|
XinFontCopy( &xi_ld->font, lmp->font );
|
|
xi_ld->font_id = NULL;
|
|
}
|
|
#ifdef XI_USE_XVT
|
|
else
|
|
{
|
|
XinFontCopy( &xi_ld->font, lmp->font );
|
|
xi_ld->font_id = XinFontXvtConvertBack( xi_ld->font );
|
|
xi_ld->font = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
recs = lm_get_list_info( list_data->lm, &nbr_recs );
|
|
if ( nbr_recs > 0 )
|
|
{
|
|
XI_EVENT xiev;
|
|
XI_OBJ *itf;
|
|
|
|
itf = list_obj->itf;
|
|
MEMCLEAR( xiev );
|
|
xiev.type = XIE_GET_PERCENT;
|
|
xiev.v.get_percent.record = recs[0];
|
|
xiev.v.get_percent.list = list_obj;
|
|
( *( XI_EVENT_HANDLER ) itf->v.itf->xi_eh ) ( itf, &xiev );
|
|
xi_ld->start_percent = xiev.v.get_percent.percent;
|
|
}
|
|
xi_ld->first_vis_column = lmp->first_vis;
|
|
|
|
list->nbr_children = lmp->nbr_columns;
|
|
realloc_ptrs( ( void *** ) &list->children, list->nbr_children,
|
|
list );
|
|
for ( i = 0; i < list->nbr_children; ++i )
|
|
list->children[i] = xi_get_column_def( list_obj->children[i],
|
|
lmp->lm_column_data[i], i, list );
|
|
return list;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_get_column_def2( XI_OBJ * column_obj )
|
|
{
|
|
XI_OBJ *list_obj;
|
|
LM_DATA *lmp;
|
|
int i;
|
|
|
|
list_obj = column_obj->parent;
|
|
lmp = ( LM_DATA * ) list_obj->v.list->lm;
|
|
|
|
for ( i = 0; i < list_obj->nbr_children; ++i )
|
|
if ( list_obj->children[i] == column_obj )
|
|
return xi_get_column_def( column_obj, lmp->lm_column_data[i], i, NULL );
|
|
return 0;
|
|
}
|
|
|
|
XI_OBJ_DEF *
|
|
xi_get_def( XI_OBJ * xi_obj )
|
|
{
|
|
switch ( xi_obj->type )
|
|
{
|
|
case XIT_LIST:
|
|
return xi_get_list_def( xi_obj );
|
|
case XIT_COLUMN:
|
|
return xi_get_column_def2( xi_obj );
|
|
case XIT_FIELD:
|
|
{
|
|
XI_OBJ_DEF *field;
|
|
XI_FIELD_DEF *xi_fd;
|
|
XI_FIELD_DATA *field_data;
|
|
STX_DATA *stxp;
|
|
|
|
field_data = xi_obj->v.field;
|
|
stxp = ( STX_DATA * ) field_data->stx;
|
|
field = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
field->type = XIT_FIELD;
|
|
field->cid = xi_obj->cid;
|
|
field->app_data = xi_obj->app_data;
|
|
field->v.field = xi_fd =
|
|
( XI_FIELD_DEF * ) xi_tree_malloc( sizeof( XI_FIELD_DEF ), field );
|
|
xi_fd->xi_rct = field_data->xi_rct;
|
|
xi_fd->pnt = field_data->xi_pnt;
|
|
xi_fd->field_width = field_data->field_width;
|
|
xi_fd->var_len_text = field_data->var_len_text;
|
|
xi_fd->attrib = stxp->attrib;
|
|
xi_fd->tab_cid = field_data->tab_cid;
|
|
xi_fd->text_size = stxp->text_size;
|
|
xi_fd->back_color = stxp->back_color;
|
|
xi_fd->enabled_color = stxp->enabled_color;
|
|
xi_fd->disabled_color = stxp->disabled_color;
|
|
xi_fd->disabled_back_color = stxp->disabled_back_color;
|
|
xi_fd->active_color = stxp->active_color;
|
|
xi_fd->active_back_color = stxp->active_back_color;
|
|
xi_fd->hilight_color = stxp->hilight_color;
|
|
xi_fd->shadow_color = stxp->shadow_color;
|
|
xi_fd->button = field_data->button;
|
|
xi_fd->button_on_left = field_data->button_on_left;
|
|
xi_fd->no_button_space = field_data->no_button_space;
|
|
xi_fd->icon_rid = field_data->icon_rid;
|
|
xi_fd->button_bitmap = xi_bitmap_copy( field_data->button_bitmap );
|
|
xi_fd->well = field_data->well;
|
|
xi_fd->platform = field_data->platform;
|
|
xi_fd->mnemonic = field_data->mnemonic;
|
|
if ( field_data->font_set )
|
|
{
|
|
if ( ( BOOLEAN ) xi_get_pref( XI_PREF_R4_API ) )
|
|
{
|
|
XinFontCopy( &xi_fd->font, stxp->font );
|
|
xi_fd->font_id = NULL;
|
|
}
|
|
#ifdef XI_USE_XVT
|
|
else
|
|
{
|
|
XinFontCopy( &xi_fd->font, stxp->font );
|
|
xi_fd->font_id = XinFontXvtConvertBack( xi_fd->font );
|
|
xi_fd->font = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
return field;
|
|
}
|
|
case XIT_TEXT:
|
|
{
|
|
XI_OBJ_DEF *text;
|
|
XI_TEXT_DEF *xi_td;
|
|
XI_TEXT_DATA *text_data;
|
|
|
|
text_data = xi_obj->v.text;
|
|
text = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
text->type = XIT_TEXT;
|
|
text->cid = xi_obj->cid;
|
|
text->app_data = xi_obj->app_data;
|
|
text->v.text = xi_td =
|
|
( XI_TEXT_DEF * ) xi_tree_malloc( sizeof( XI_TEXT_DEF ), text );
|
|
xi_td->xi_rct = text_data->xi_rct;
|
|
xi_td->attrib = text_data->attrib;
|
|
if ( text_data->text )
|
|
{
|
|
xi_td->text = ( char * ) xi_tree_malloc( strlen( text_data->text ) + 1,
|
|
xi_td );
|
|
strcpy( xi_td->text, text_data->text );
|
|
}
|
|
xi_td->fore_color = text_data->fore_color;
|
|
xi_td->back_color = text_data->back_color;
|
|
xi_td->mnemonic = text_data->mnemonic;
|
|
xi_td->mnemonic_instance = text_data->mnemonic_instance;
|
|
if ( text_data->font )
|
|
{
|
|
if ( ( BOOLEAN ) xi_get_pref( XI_PREF_R4_API ) )
|
|
{
|
|
XinFontCopy( &xi_td->font, text_data->font );
|
|
xi_td->font_id = NULL;
|
|
}
|
|
#ifdef XI_USE_XVT
|
|
else
|
|
{
|
|
XinFontCopy( &xi_td->font, text_data->font );
|
|
xi_td->font_id = XinFontXvtConvertBack( xi_td->font );
|
|
xi_td->font = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
return text;
|
|
}
|
|
case XIT_BTN:
|
|
{
|
|
XI_OBJ_DEF *btn;
|
|
XI_BTN_DEF *xi_bd;
|
|
XI_BTN_DATA *btn_data;
|
|
|
|
btn_data = xi_obj->v.btn;
|
|
btn = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
btn->type = XIT_BTN;
|
|
btn->cid = xi_obj->cid;
|
|
btn->app_data = xi_obj->app_data;
|
|
btn->v.btn = xi_bd =
|
|
( XI_BTN_DEF * ) xi_tree_malloc( sizeof( XI_BTN_DEF ), btn );
|
|
xi_bd->xi_rct = btn_data->xi_rct;
|
|
xi_bd->pixel_rect = btn_data->rct;
|
|
xi_bd->attrib = btn_data->attrib;
|
|
if ( btn_data->text )
|
|
{
|
|
xi_bd->text = ( char * ) xi_tree_malloc( strlen( btn_data->text ) + 1,
|
|
xi_bd );
|
|
strcpy( xi_bd->text, btn_data->text );
|
|
}
|
|
xi_bd->tab_cid = btn_data->tab_cid;
|
|
xi_bd->dflt = btn_data->dflt;
|
|
xi_bd->cancel = btn_data->cancel;
|
|
xi_bd->down_icon_rid = btn_data->down_icon_rid;
|
|
xi_bd->up_icon_rid = btn_data->up_icon_rid;
|
|
xi_bd->disabled_icon_rid = btn_data->disabled_icon_rid;
|
|
xi_bd->icon_x = btn_data->icon_x;
|
|
xi_bd->icon_y = btn_data->icon_y;
|
|
xi_bd->up_bitmap = xi_bitmap_copy( btn_data->up_bitmap );
|
|
xi_bd->down_bitmap = xi_bitmap_copy( btn_data->down_bitmap );
|
|
xi_bd->disabled_bitmap = xi_bitmap_copy( btn_data->disabled_bitmap );
|
|
xi_bd->checked = btn_data->checked;
|
|
xi_bd->fore_color = btn_data->fore_color;
|
|
xi_bd->draw_as = btn_data->draw_as;
|
|
xi_bd->drawable = btn_data->drawable;
|
|
xi_bd->mnemonic = btn_data->mnemonic;
|
|
xi_bd->mnemonic_instance = btn_data->mnemonic_instance;
|
|
if ( btn_data->font )
|
|
{
|
|
if ( ( BOOLEAN ) xi_get_pref( XI_PREF_R4_API ) )
|
|
{
|
|
XinFontCopy( &xi_bd->font, btn_data->font );
|
|
xi_bd->font_id = NULL;
|
|
}
|
|
#ifdef XI_USE_XVT
|
|
else
|
|
{
|
|
XinFontCopy( &xi_bd->font, btn_data->font );
|
|
xi_bd->font_id = XinFontXvtConvertBack( xi_bd->font );
|
|
xi_bd->font = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
return btn;
|
|
}
|
|
case XIT_LINE:
|
|
{
|
|
XI_OBJ_DEF *line;
|
|
XI_LINE_DEF *xi_ld;
|
|
XI_LINE_DATA *line_data;
|
|
|
|
line_data = xi_obj->v.line;
|
|
line = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
line->type = XIT_LINE;
|
|
line->cid = xi_obj->cid;
|
|
line->app_data = xi_obj->app_data;
|
|
line->v.line = xi_ld =
|
|
( XI_LINE_DEF * ) xi_tree_malloc( sizeof( XI_LINE_DEF ), line );
|
|
xi_ld->pnt1 = line_data->xi_pnt1;
|
|
xi_ld->pnt2 = line_data->xi_pnt2;
|
|
xi_ld->pixel_pnt1 = line_data->pnt1;
|
|
xi_ld->pixel_pnt2 = line_data->pnt2;
|
|
xi_ld->fore_color = line_data->fore_color;
|
|
xi_ld->back_color = line_data->back_color;
|
|
xi_ld->well = line_data->well;
|
|
xi_ld->attrib = line_data->attrib;
|
|
return line;
|
|
}
|
|
case XIT_RECT:
|
|
{
|
|
XI_OBJ_DEF *rect;
|
|
XI_RECT_DEF *xi_rd;
|
|
XI_RECT_DATA *rect_data;
|
|
|
|
rect_data = xi_obj->v.rect;
|
|
rect = ( XI_OBJ_DEF * ) xi_tree_malloc( sizeof( XI_OBJ_DEF ), NULL );
|
|
rect->type = XIT_RECT;
|
|
rect->cid = xi_obj->cid;
|
|
rect->app_data = xi_obj->app_data;
|
|
rect->v.rect = xi_rd =
|
|
( XI_RECT_DEF * ) xi_tree_malloc( sizeof( XI_RECT_DEF ), rect );
|
|
xi_rd->xi_rct = rect_data->xi_rct;
|
|
xi_rd->pixel_rect = rect_data->rct;
|
|
xi_rd->fore_color = rect_data->fore_color;
|
|
xi_rd->back_color = rect_data->back_color;
|
|
xi_rd->hilight_color = rect_data->hilight_color;
|
|
xi_rd->shadow_color = rect_data->shadow_color;
|
|
xi_rd->well = rect_data->well;
|
|
xi_rd->attrib = rect_data->attrib;
|
|
xi_rd->bitmap = xi_bitmap_copy( rect_data->bitmap );
|
|
return rect;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* xi_def_free_internal */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
xi_def_free_internal( XI_OBJ_DEF* obj_def )
|
|
{
|
|
int num;
|
|
|
|
switch ( obj_def->type )
|
|
{
|
|
case XIT_ITF:
|
|
if ( obj_def->v.itf->font != NULL )
|
|
XinFontDestroy( obj_def->v.itf->font );
|
|
#ifdef XI_USE_XVT
|
|
else if ( obj_def->v.itf->font_id != NULL )
|
|
XinFontXvtDestroy( obj_def->v.itf->font_id );
|
|
#endif
|
|
xi_bitmap_destroy( obj_def->v.itf->bitmap );
|
|
break;
|
|
case XIT_LIST:
|
|
if ( obj_def->v.list->font != NULL )
|
|
XinFontDestroy( obj_def->v.list->font );
|
|
#ifdef XI_USE_XVT
|
|
else if ( obj_def->v.list->font_id != NULL )
|
|
XinFontXvtDestroy( obj_def->v.list->font_id );
|
|
#endif
|
|
break;
|
|
case XIT_COLUMN:
|
|
if ( obj_def->v.column->font != NULL )
|
|
XinFontDestroy( obj_def->v.column->font );
|
|
#ifdef XI_USE_XVT
|
|
else if ( obj_def->v.column->font_id != NULL )
|
|
XinFontXvtDestroy( obj_def->v.column->font_id );
|
|
#endif
|
|
xi_bitmap_destroy( obj_def->v.column->bitmap );
|
|
break;
|
|
case XIT_FIELD:
|
|
if ( obj_def->v.field->font != NULL )
|
|
XinFontDestroy( obj_def->v.field->font );
|
|
#ifdef XI_USE_XVT
|
|
else if ( obj_def->v.field->font_id != NULL )
|
|
XinFontXvtDestroy( obj_def->v.field->font_id );
|
|
#endif
|
|
xi_bitmap_destroy( obj_def->v.field->button_bitmap );
|
|
break;
|
|
case XIT_TEXT:
|
|
if ( obj_def->v.text->font != NULL )
|
|
XinFontDestroy( obj_def->v.text->font );
|
|
#ifdef XI_USE_XVT
|
|
else if ( obj_def->v.text->font_id != NULL )
|
|
XinFontXvtDestroy( obj_def->v.text->font_id );
|
|
#endif
|
|
break;
|
|
case XIT_BTN:
|
|
{
|
|
XI_BTN_DEF* btn_def = obj_def->v.btn;
|
|
|
|
if ( btn_def->font != NULL )
|
|
XinFontDestroy( btn_def->font );
|
|
#ifdef XI_USE_XVT
|
|
else if ( btn_def->font_id != NULL )
|
|
XinFontXvtDestroy( btn_def->font_id );
|
|
#endif
|
|
xi_bitmap_destroy( btn_def->down_bitmap );
|
|
xi_bitmap_destroy( btn_def->up_bitmap );
|
|
xi_bitmap_destroy( btn_def->disabled_bitmap );
|
|
break;
|
|
}
|
|
case XIT_RECT:
|
|
xi_bitmap_destroy( obj_def->v.rect->bitmap );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
for ( num = 0; num < obj_def->nbr_children; num++ )
|
|
xi_def_free_internal( obj_def->children[ num ] );
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* xi_def_free */
|
|
/*--------------------------------------------------------------------------*/
|
|
void
|
|
xi_def_free( XI_OBJ_DEF* obj_def )
|
|
{
|
|
xi_def_free_internal( obj_def );
|
|
xi_tree_free( obj_def );
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* get_button_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
get_button_def_rect( XinFont * font, XI_OBJ_DEF * obj_def,
|
|
XinRect * rect )
|
|
{
|
|
*rect = obj_def->v.btn->pixel_rect;
|
|
if ( rect->right == 0 && rect->left == 0 && rect->top == 0
|
|
&& rect->bottom == 0 )
|
|
{
|
|
*rect = obj_def->v.btn->xi_rct;
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) rect, 2 );
|
|
}
|
|
if ( rect->top == rect->bottom )
|
|
rect->bottom = rect->top + ( int ) xi_get_pref( XI_PREF_BUTTON_HEIGHT );
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* get_container_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
get_container_def_rect( XinFont * font, XI_OBJ_DEF * obj_def,
|
|
XinRect * rect )
|
|
{
|
|
*rect = obj_def->v.container->pixel_rect;
|
|
if ( !rect->right && !rect->left && !rect->top && !rect->bottom )
|
|
{
|
|
*rect = obj_def->v.container->xi_rct;
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) rect, 2 );
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* get_column_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
get_column_def_rect( XinFont * font, XI_OBJ_DEF * obj_def,
|
|
XinRect * rect )
|
|
{
|
|
XI_OBJ_DEF *list;
|
|
XI_OBJ_DEF *itf;
|
|
|
|
/* left and height is undefined without list context */
|
|
rect->top = rect->bottom = 0;
|
|
rect->left = 0;
|
|
if ( obj_def->v.column->pixel_width )
|
|
rect->right = obj_def->v.column->pixel_width;
|
|
else
|
|
{
|
|
rect->right = obj_def->v.column->width;
|
|
list = obj_def->parent;
|
|
if ( list == NULL )
|
|
itf = NULL;
|
|
else
|
|
itf = list->parent;
|
|
|
|
if ( xi_def_get_xil_pref( itf ) )
|
|
{
|
|
if ( font )
|
|
rect->right *= xi_get_fu_width_font( font );
|
|
else
|
|
rect->right *= xi_get_fu_width( NULL );
|
|
}
|
|
else
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) rect, 2 );
|
|
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* get_interface_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
get_interface_def_rect( XinFont * font, XI_OBJ_DEF * obj_def,
|
|
XinRect * rect )
|
|
{
|
|
BOOLEAN first_rect = TRUE;
|
|
XI_OBJ_DEF **defp;
|
|
int i,
|
|
n;
|
|
|
|
MEMCLEAR( *rect );
|
|
defp = obj_def->children;
|
|
n = obj_def->nbr_children;
|
|
for ( i = 0; i < n; defp++, i++ )
|
|
{
|
|
if ( first_rect )
|
|
{
|
|
if ( xi_get_def_rect( *defp, rect ) != NULL )
|
|
first_rect = FALSE;
|
|
}
|
|
else
|
|
{
|
|
XinRect rct;
|
|
|
|
if ( xi_get_def_rect( *defp, &rct ) != NULL )
|
|
XinRectEnclose( rect, &rct, rect );
|
|
}
|
|
}
|
|
if ( obj_def->type == XIT_ITF )
|
|
{
|
|
int fu_width,
|
|
fu_height,
|
|
ws_right,
|
|
ws_bottom;
|
|
int ws_right_pix,
|
|
ws_bottom_pix;
|
|
|
|
rect->left = 0;
|
|
rect->top = 0;
|
|
if ( !xi_def_get_xil_pref( obj_def ) )
|
|
{
|
|
if ( font )
|
|
{
|
|
fu_width = xi_get_fu_width_font( font );
|
|
fu_height = xi_get_fu_height_font( font );
|
|
}
|
|
else
|
|
{
|
|
fu_width = xi_get_fu_width( NULL );
|
|
fu_height = xi_get_fu_height( NULL );
|
|
}
|
|
ws_right = ( int ) xi_get_pref( XI_PREF_ITF_WS_RIGHT );
|
|
ws_bottom = ( int ) xi_get_pref( XI_PREF_ITF_WS_BOTTOM );
|
|
if ( obj_def->v.itf->use_whitespace )
|
|
{
|
|
ws_right = obj_def->v.itf->whitespace_right;
|
|
ws_bottom = obj_def->v.itf->whitespace_bottom;
|
|
}
|
|
ws_right_pix = fu_width * ws_right / XI_FU_MULTIPLE;
|
|
ws_bottom_pix = fu_height * ws_bottom / XI_FU_MULTIPLE;
|
|
rect->bottom += ws_bottom_pix;
|
|
rect->right += ws_right_pix;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* get_field_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
get_field_def_rect( XinFont * font, XI_OBJ_DEF * obj_def,
|
|
XinRect * rect )
|
|
{
|
|
XI_FIELD_DEF *flddef = obj_def->v.field;
|
|
XinFont *parent_font = xi_def_get_font( obj_def->parent );
|
|
|
|
|
|
if ( flddef->xi_rct.top || flddef->xi_rct.left ||
|
|
flddef->xi_rct.bottom || flddef->xi_rct.right )
|
|
{
|
|
*rect = flddef->xi_rct;
|
|
xi_fu_to_pu_font( parent_font, ( XinPoint * ) rect, 2 );
|
|
}
|
|
else
|
|
{
|
|
if ( flddef->pixel_origin.v || flddef->pixel_origin.h )
|
|
{
|
|
rect->top = flddef->pixel_origin.v;
|
|
rect->left = flddef->pixel_origin.h;
|
|
}
|
|
else
|
|
{
|
|
rect->top = flddef->pnt.v;
|
|
rect->left = flddef->pnt.h;
|
|
xi_fu_to_pu_font( parent_font, ( XinPoint * ) rect, 1 );
|
|
}
|
|
{
|
|
XinPoint pnt;
|
|
|
|
if ( flddef->pixel_width )
|
|
pnt.h = 2 * XI_FU_MULTIPLE;
|
|
else
|
|
pnt.h = flddef->field_width;
|
|
pnt.v = XI_FU_MULTIPLE;
|
|
xi_fu_to_pu_font( font, &pnt, 1 );
|
|
rect->bottom = rect->top + pnt.v;
|
|
if ( flddef->pixel_width )
|
|
rect->right = rect->left + flddef->pixel_width + pnt.h;
|
|
else
|
|
/* add 4 for the 3d rect */
|
|
rect->right = rect->left + pnt.h + 4;
|
|
}
|
|
}
|
|
XinFontDestroy( parent_font );
|
|
if ( flddef->button )
|
|
{
|
|
XinRect r;
|
|
int fu_width,
|
|
fu_height,
|
|
btn_dim_x,
|
|
btn_dim_x2,
|
|
btn_space;
|
|
|
|
r.top = 0;
|
|
r.left = 0;
|
|
r.bottom = 8;
|
|
r.right = 8;
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) & r, 2 );
|
|
fu_width = r.right;
|
|
fu_height = r.bottom;
|
|
btn_dim_x = ( fu_height * XI_FU_MULTIPLE ) / fu_width;
|
|
#if XIWS != XIWS_WM
|
|
/* make buttons 70% wide as high */
|
|
btn_dim_x = ( int ) ( ( long ) btn_dim_x * 83L / 100L );
|
|
#endif
|
|
btn_space = btn_dim_x / 6;
|
|
/* btn_dim_x2 is the button width + space, rounded up to */
|
|
/* the next even form unit */
|
|
btn_dim_x2 = btn_dim_x + btn_space;
|
|
btn_dim_x2 = ( ( btn_dim_x2 + XI_FU_MULTIPLE ) / XI_FU_MULTIPLE ) * XI_FU_MULTIPLE;
|
|
btn_dim_x = ( int ) ( ( ( long ) btn_dim_x * fu_width ) / XI_FU_MULTIPLE );
|
|
btn_dim_x2 = ( int ) ( ( ( long ) btn_dim_x2 * fu_width ) / XI_FU_MULTIPLE );
|
|
if ( flddef->button_on_left )
|
|
{
|
|
rect->right += btn_dim_x;
|
|
if ( flddef->pixel_button_distance )
|
|
rect->right += flddef->pixel_button_distance;
|
|
else
|
|
rect->right += ( btn_dim_x2 - btn_dim_x );
|
|
}
|
|
else
|
|
{
|
|
rect->right += btn_dim_x;
|
|
if ( flddef->pixel_button_distance )
|
|
rect->right += flddef->pixel_button_distance;
|
|
else
|
|
{
|
|
rect->right += ( btn_dim_x2 - btn_dim_x );
|
|
/* convert to form units */
|
|
rect->right = ( int ) ( ( ( long ) rect->right * XI_FU_MULTIPLE ) / fu_width );
|
|
/* round up to nearest FU multiple */
|
|
rect->right = ( ( rect->right + XI_FU_MULTIPLE ) / XI_FU_MULTIPLE ) * XI_FU_MULTIPLE;
|
|
/* convert to pixels */
|
|
rect->right = ( int ) ( ( ( long ) rect->right * fu_width ) / XI_FU_MULTIPLE );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* get_list_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
static void
|
|
get_list_def_rect( XinFont * font, XI_OBJ_DEF * obj_def,
|
|
XinRect * rect )
|
|
{
|
|
XI_LIST_DEF *list_def;
|
|
int list_xborder,
|
|
list_col_div,
|
|
width,
|
|
list_bottom;
|
|
int col_offset;
|
|
XinFont *parent_font = xi_def_get_font( obj_def->parent );
|
|
|
|
list_def = obj_def->v.list;
|
|
lm_get_metrics( obj_def, &list_xborder, &list_col_div, &list_bottom );
|
|
col_offset = ( int ) xi_get_pref( XI_PREF_COLUMN_OFFSET );
|
|
if ( xi_def_get_xil_pref( obj_def->parent ) )
|
|
{
|
|
rect->top = list_def->xi_pnt.v;
|
|
rect->left = list_def->xi_pnt.h;
|
|
width = list_def->width;
|
|
}
|
|
else
|
|
{
|
|
if ( list_def->pixel_origin.h || list_def->pixel_origin.v )
|
|
{
|
|
rect->top = list_def->pixel_origin.h;
|
|
rect->left = list_def->pixel_origin.v;
|
|
}
|
|
else
|
|
{
|
|
rect->top = list_def->xi_pnt.v;
|
|
rect->left = list_def->xi_pnt.h;
|
|
xi_fu_to_pu_font( parent_font, ( XinPoint * ) rect, 1 );
|
|
}
|
|
width = list_def->pixel_width;
|
|
if ( !width )
|
|
{
|
|
XinPoint p;
|
|
|
|
p.h = list_def->width;
|
|
p.v = 0;
|
|
xi_fu_to_pu_font( font, &p, 1 );
|
|
width = p.h;
|
|
}
|
|
}
|
|
XinFontDestroy( parent_font );
|
|
rect->bottom = 0;
|
|
if ( width )
|
|
rect->right = rect->left + width + 2 * BORDER_WIDTH;
|
|
else
|
|
{
|
|
XI_OBJ_DEF **defp;
|
|
int i,
|
|
n;
|
|
|
|
defp = obj_def->children;
|
|
n = obj_def->nbr_children;
|
|
rect->right = rect->left;
|
|
for ( i = 0; i < n; defp++, i++ )
|
|
{
|
|
XinRect rct;
|
|
|
|
xi_get_def_rect( *defp, &rct );
|
|
rect->right += rct.right;
|
|
if ( i )
|
|
rect->right += list_col_div;
|
|
else
|
|
rect->right += 2 * col_offset;
|
|
}
|
|
rect->right += BORDER_WIDTH * 2;
|
|
}
|
|
rect->bottom = list_bottom;
|
|
if ( list_def->scroll_bar )
|
|
rect->right = rect->right + ( int ) xi_get_pref( XI_PREF_SB_OFFSET )
|
|
+ ( int ) XinMetricGet( XinMetricVerticalScrollBarWidth ) - 1;
|
|
if ( width )
|
|
rect->bottom += ( int ) XinMetricGet( XinMetricHorizontalScrollBarHeight ) + 3;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* xi_get_def_rect */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
XinRect *
|
|
xi_get_def_rect_internal( XI_OBJ_DEF * xi_obj_def, XinRect * rect, BOOLEAN r4_api )
|
|
{
|
|
XinFont *font = NULL;
|
|
|
|
xi_init_internal( r4_api );
|
|
font = xi_def_get_font( xi_obj_def );
|
|
MEMCLEAR( *rect );
|
|
switch ( xi_obj_def->type )
|
|
{
|
|
case XIT_BTN:
|
|
get_button_def_rect( font, xi_obj_def, rect );
|
|
break;
|
|
case XIT_CONTAINER:
|
|
get_container_def_rect( font, xi_obj_def, rect );
|
|
break;
|
|
case XIT_COLUMN:
|
|
get_column_def_rect( font, xi_obj_def, rect );
|
|
break;
|
|
case XIT_ITF:
|
|
case XIT_FORM:
|
|
get_interface_def_rect( font, xi_obj_def, rect );
|
|
break;
|
|
case XIT_FIELD:
|
|
get_field_def_rect( font, xi_obj_def, rect );
|
|
break;
|
|
case XIT_LIST:
|
|
get_list_def_rect( font, xi_obj_def, rect );
|
|
break;
|
|
case XIT_TEXT:
|
|
*rect = xi_obj_def->v.text->pixel_rect;
|
|
if ( !rect->left && !rect->right && !rect->top && !rect->bottom )
|
|
{
|
|
XinFontDestroy( font );
|
|
font = xi_def_get_font( xi_obj_def->parent );
|
|
*rect = xi_obj_def->v.text->xi_rct;
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) rect, 2 );
|
|
}
|
|
break;
|
|
case XIT_GROUP:
|
|
/* no bounding rect for these guys! */
|
|
XinFontDestroy( font );
|
|
return ( NULL );
|
|
case XIT_RECT:
|
|
*rect = xi_obj_def->v.rect->xi_rct;
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) rect, 2 );
|
|
break;
|
|
case XIT_LINE:
|
|
{
|
|
XI_LINE_DEF *line;
|
|
|
|
line = xi_obj_def->v.line;
|
|
rect->top = min( line->pnt1.v, line->pnt2.v );
|
|
rect->bottom = max( line->pnt1.v, line->pnt2.v );
|
|
rect->left = min( line->pnt1.h, line->pnt2.h );
|
|
rect->right = max( line->pnt1.h, line->pnt2.h );
|
|
xi_fu_to_pu_font( font, ( XinPoint * ) rect, 2 );
|
|
break;
|
|
}
|
|
case XIT_CELL:
|
|
case XIT_ROW:
|
|
default:
|
|
XinError( 20019, XinSeverityFatal, 0L );
|
|
}
|
|
XinFontDestroy( font );
|
|
return ( rect );
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------*/
|
|
/* xi_button_set_default */
|
|
/* --------------------------------------------------------------------------*/
|
|
static void
|
|
invalidate_button_rect( XI_OBJ * xi_obj )
|
|
{
|
|
XinRect rect = xi_obj->v.btn->rct;
|
|
XinWindow win;
|
|
|
|
if ( xi_obj->v.btn->type == XIBT_TABBTN )
|
|
rect.bottom += 2;
|
|
win = xi_obj->itf->v.itf->xin_win;
|
|
xi_invalidate_rect( win, &rect );
|
|
}
|
|
|
|
BOOLEAN
|
|
xi_button_set_default( XI_OBJ * xi_obj, BOOLEAN set )
|
|
{
|
|
if ( xi_obj == NULL )
|
|
return FALSE;
|
|
if ( set ) /* clear previous default button */
|
|
{
|
|
if ( xi_obj->type != XIT_BTN )
|
|
return FALSE;
|
|
if ( !xi_obj->v.btn->dflt )
|
|
{
|
|
xi_button_set_default( xi_obj->itf, FALSE );
|
|
xi_obj->v.btn->dflt = TRUE;
|
|
invalidate_button_rect( xi_obj );
|
|
}
|
|
return TRUE;
|
|
}
|
|
switch ( xi_obj->type )
|
|
{
|
|
case XIT_BTN:
|
|
if ( xi_obj->v.btn->dflt )
|
|
{
|
|
xi_obj->v.btn->dflt = FALSE;
|
|
invalidate_button_rect( xi_obj );
|
|
}
|
|
return TRUE;
|
|
case XIT_CONTAINER:
|
|
case XIT_ITF:
|
|
{
|
|
XI_OBJ **ptr;
|
|
int i;
|
|
int n;
|
|
|
|
ptr = xi_obj->children;
|
|
n = xi_obj->nbr_children;
|
|
for ( i = 0; i < n; ptr++, i++ )
|
|
xi_button_set_default( *ptr, FALSE );
|
|
return TRUE;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|