campo-sirio/xi/xicf.c
alex fa53273fe0 Patch level : 2.0 nopatch
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Compilazione Linux


git-svn-id: svn://10.65.10.50/trunk@11220 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-06-06 13:50:22 +00:00

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;
}