which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1478 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1478 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* r4obj.c   (c)Copyright Sequiter Software Inc., 1991-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| 
 | |
| 
 | |
| /************************************************************
 | |
|  *
 | |
|  * Function: obj4create()
 | |
|  *
 | |
|  *  PARAMETERS: AREA4* area - area to own the object
 | |
|  *   long x - x coordinate in 1000's of an inch, relative to the upper left
 | |
|  *            corner of the area, positive x to the right
 | |
|  *   long y - y coordinate in 1000's of an inch, relative to the upper left
 | |
|  *            corner of the area, positive y is down
 | |
|  *   long w - width of the object in 1000's of an inch
 | |
|  *   long h - height of the object in 1000's of an inch
 | |
|  *
 | |
|  *  DESCRIPTION: low level object creation function
 | |
|  *
 | |
|  *  RETURNS: pointer to an OBJ4 struct on success, NULL on failure
 | |
|  *
 | |
|  *  By: Raymond Cypher
 | |
|  *
 | |
|  *  HISTORY:
 | |
|  *
 | |
|  */
 | |
| OBJ4 * S4FUNCTION   obj4create( AREA4 *area, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( x > area->report->report_width || y > area->height ||
 | |
|      x < 0 || y < 0 || w < 0 || h < 0 )
 | |
|     return NULL;
 | |
| 
 | |
|   if( !area )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* allocate the OBJ4 structure */
 | |
|   obj = (POBJ4)u4alloc_er( area->report->code_base, sizeof( OBJ4 ) );
 | |
|   if( !obj )
 | |
|   {
 | |
|     e4describe( area->report->code_base, e4obj_create, E4_REP_OBJMEM, 0, 0 );
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* set the internal members */
 | |
|   obj->area = area;
 | |
|   obj->style = area->report->active_style;
 | |
|   if( obj->style == NULL )
 | |
|     obj->style = (PSTYLE4)l4first( &area->report->styles );
 | |
|   obj->alignment = justify4left;
 | |
|   obj->x = x;
 | |
|   obj->y = y;
 | |
|   obj->w = w;
 | |
|   obj->h = h;
 | |
|   obj->numeric_type = obj4numNumber;
 | |
|   obj->display_zero = 1;
 | |
| 
 | |
|   /* add the object to the areas object list */
 | |
|   area4add_object( area, obj );
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /************************************************************
 | |
|  *
 | |
|  * Function: obj4free()
 | |
|  *
 | |
|  *  PARAMETERS: OBJ4* obj - object to be freed
 | |
|  *
 | |
|  *  DESCRIPTION: releases all the memory associated with the object
 | |
|  *
 | |
|  *  RETURNS: none
 | |
|  *
 | |
|  *  By: Raymond Cypher
 | |
|  *
 | |
|  *  HISTORY:
 | |
|  *
 | |
|  */
 | |
| void S4FUNCTION   obj4free( OBJ4 *obj )
 | |
| {
 | |
|   AREA4 *area;
 | |
|   OBJ4 *obj_on;
 | |
|   LINK4 *link;
 | |
| 
 | |
|   area = obj->area;
 | |
| 
 | |
|   /* if necessary remove the object from the selected object list */
 | |
|   link = (LINK4 *)obj;
 | |
|   if( obj->is_active || obj->is_first )
 | |
|   {
 | |
|     l4remove( &area->report->active_objects, (link+1) );
 | |
|     obj->is_active = obj->is_first = 0;
 | |
|   }
 | |
| 
 | |
|   /* if the object is in a list of objects remove it, it will either be in
 | |
|      the object list of an area, or the object list of a containing object */
 | |
|   if( !(!link->n && !link->p) )
 | |
|     if( obj->container )
 | |
|     {
 | |
|       l4remove( &obj->container->contained, obj );
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       l4remove( &area->objects, obj );
 | |
|     }
 | |
| 
 | |
|   /* if the object being freed contains any objects don't delete them, return
 | |
|      them to the parent area */
 | |
|   while( (obj_on = (OBJ4 *)l4pop( &obj->contained )) != NULL )
 | |
|     area4add_object( area, obj_on );
 | |
| 
 | |
|   /* free the associated memory */
 | |
|   if( obj->wintext )
 | |
|     u4free( obj->wintext );
 | |
| 
 | |
|   if( obj->date_format )
 | |
|     u4free( obj->date_format );
 | |
| 
 | |
|   if( obj->eval_text )
 | |
|     u4free( obj->eval_text );
 | |
| 
 | |
|   if( obj->display_once_expr )
 | |
|     expr4free( obj->display_once_expr );
 | |
| 
 | |
|   if( obj->last_display_val )
 | |
|     u4free( obj->last_display_val );
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
|   if( obj->hWnd )
 | |
|     DestroyWindow( obj->hWnd );
 | |
| #endif
 | |
| 
 | |
|   u4free( obj );
 | |
| }
 | |
| 
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION   obj4fieldFree( OBJ4 *obj )
 | |
| {
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION   obj4fieldCreate( AREA4 *area, FIELD4 *field_ptr, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* set the data member to the field */
 | |
|   obj->data = (void *)field_ptr;
 | |
| 
 | |
|   /* set the object type */
 | |
|   obj->obj_type_num = obj4type_field;
 | |
| 
 | |
|   /* set the default size and alignment */
 | |
|   switch( f4type(field_ptr) )
 | |
|   {
 | |
|   case 'N':
 | |
|     obj->alignment = justify4right;
 | |
|   case 'D':
 | |
|     obj->num_chars = 10;
 | |
|     obj->dec = f4decimals( field_ptr );
 | |
|     break;
 | |
| 
 | |
|   case 'M':
 | |
|     obj->num_chars = 42;
 | |
|     break;
 | |
| 
 | |
|   case 'L':
 | |
|     obj->num_chars = 2;
 | |
|     break;
 | |
| 
 | |
|   case 'C':
 | |
|     obj->num_chars = f4len( field_ptr )+2;
 | |
|     break;
 | |
| 
 | |
|   default:
 | |
|     obj->num_chars = 12;
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION   obj4totalFree( OBJ4 *obj )
 | |
| {
 | |
|   if( obj->data )
 | |
|   {
 | |
|     /* a total is always created in conjunction with an object, therefore
 | |
|        when we delete the object we delete the total as well */
 | |
|     report4deleteCalc( obj->area->report, ((PTOTAL4)obj->data)->calc_ptr );
 | |
|     return;
 | |
|   }
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION   obj4totalCreate( AREA4 *area, TOTAL4 *total_ptr, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* set the data ptr to the total */
 | |
|   obj->data = (void *)total_ptr;
 | |
| 
 | |
|   /* set the object type */
 | |
|   obj->obj_type_num = obj4type_total;
 | |
| 
 | |
|   /* set the internal object members */
 | |
|   obj->num_chars = 12;
 | |
|   obj->alignment = justify4right;
 | |
| 
 | |
|   /* set the totals object pointer */
 | |
|   total_ptr->obj = obj;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION   obj4calcFree( OBJ4 *obj )
 | |
| {
 | |
|   /* calculations are created independant of objects, therefore we don't
 | |
|      delete the associated calculation when the object is deleted. Calc
 | |
|      deletion is handled when the report is freed */
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION   obj4calcCreate( AREA4 *area, EXPR4CALC *calc_ptr, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
|   int type;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   if( !calc_ptr )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* set the data pointer and the object type */
 | |
|   obj->data = (void *)calc_ptr;
 | |
|   obj->obj_type_num = obj4type_calc;
 | |
| 
 | |
|   /* set the default size and alignment */
 | |
|   type = expr4type( calc_ptr->expr );
 | |
|   switch( type )
 | |
|   {
 | |
|   case r4num:
 | |
|   case r4num_doub:
 | |
|     obj->num_chars = 10;
 | |
|     obj->alignment = justify4right;
 | |
|     break;
 | |
| 
 | |
|   case r4date:
 | |
|   case r4date_doub:
 | |
|     obj->num_chars = strlen( area->report->default_date_format )+2;
 | |
|     break;
 | |
| 
 | |
|   case r4log:
 | |
|     obj->num_chars = 2;
 | |
|     break;
 | |
| 
 | |
|   default:
 | |
|     obj->num_chars = expr4len( calc_ptr->expr )+2;
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4exprFree( OBJ4 *obj )
 | |
| {
 | |
|   /* free the expression */
 | |
|   expr4free( (EXPR4 *)obj->data );
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION obj4exprCreate( AREA4 *area, EXPR4 *expr_ptr, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* set the data pointer and the object type */
 | |
|   obj->data = (void *)expr_ptr;
 | |
|   obj->obj_type_num = obj4type_expr;
 | |
| 
 | |
|   /* set the default length and alignment */
 | |
|   obj->num_chars = expr4len( expr_ptr )+2;
 | |
|   if( expr4type( expr_ptr ) == r4num || expr4type( expr_ptr ) == r4num_doub )
 | |
|     obj->alignment = justify4right;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4textFree( OBJ4 *obj )
 | |
| {
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION obj4textCreate( AREA4 *area, char *str_ptr, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   if( str_ptr )
 | |
|   {
 | |
|     /* allocate space to hold the string */
 | |
| #ifdef S4WINDOWS
 | |
|     obj->wintext = (char *)u4alloc_free( area->report->code_base, lstrlen(str_ptr)+1 );
 | |
| #else
 | |
|     obj->wintext = (char *)u4alloc_free( area->report->code_base, strlen(str_ptr)+1 );
 | |
| #endif
 | |
|     if( !obj->wintext )
 | |
|     {
 | |
|       obj4free( obj );
 | |
|       return NULL;
 | |
|     }
 | |
|   }
 | |
|   else
 | |
|     obj->wintext = NULL;
 | |
| 
 | |
|   /* set the object type */
 | |
|   obj->obj_type_num = obj4type_text;
 | |
| 
 | |
|   obj->num_chars = 0;
 | |
| 
 | |
|   if( str_ptr )
 | |
|   {
 | |
| #ifdef S4WINDOWS
 | |
|     lstrcpy( (char *)obj->wintext, str_ptr );
 | |
| #else
 | |
|     strcpy( (char *)obj->wintext, str_ptr );
 | |
| #endif
 | |
|   }
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4lineFree( OBJ4 *obj )
 | |
| {
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION obj4lineCreate( AREA4 *area, int vertical, long x, long y, long length )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   if( vertical )
 | |
|     obj = obj4create( area, x, y, 1, length );
 | |
|   else
 | |
|     obj = obj4create( area, x, y, length, 1 );
 | |
| 
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* set the line orientation */
 | |
|   obj->alignment = vertical;
 | |
|   if( vertical )
 | |
|     obj->obj_type_num = obj4type_vline;
 | |
|   else
 | |
|     obj->obj_type_num = obj4type_hline;
 | |
| 
 | |
|   obj->num_chars = 0;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4lineWidth( POBJ4 obj, long width )
 | |
| {
 | |
|   if( !obj || width < 1 )
 | |
|     return -1;
 | |
| 
 | |
|   if( obj->obj_type_num == obj4type_vline )
 | |
|     obj->w = width;
 | |
| 
 | |
|   if( obj->obj_type_num == obj4type_hline )
 | |
|     obj->h = width;
 | |
| 
 | |
|   /* for frames the line width is stored in the num_chars member of OBJ4 */
 | |
|   if( obj->obj_type_num == obj4type_frame )
 | |
|     obj->num_chars = (int)width+2;
 | |
| 
 | |
|   obj->dec = (int)width;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4frameFree( OBJ4 *obj )
 | |
| {
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION obj4frameCreate( AREA4 *area, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   obj->obj_type_num = obj4type_frame;
 | |
| 
 | |
|   obj->num_chars = 0;
 | |
|   obj->alignment = 0;
 | |
|   obj->display_zero = 0;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4bitmapStaticFree( POBJ4 obj )
 | |
| {
 | |
|   if( obj->data )
 | |
|   {
 | |
| #ifdef S4WINDOWS
 | |
|     GlobalFree( (HANDLE)obj->data );
 | |
| #endif
 | |
|     obj->data = NULL;
 | |
|   }
 | |
| 
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION obj4bitmapStaticCreate( AREA4 *area, HANDLE hDIB, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   obj->obj_type_num = obj4type_bitmap1;
 | |
|   obj->data = (void far *)hDIB;
 | |
| 
 | |
|   obj->num_chars = 0;
 | |
|   obj->alignment = 0;
 | |
|   obj->display_zero = 0;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4bitmapFileFree( POBJ4 obj )
 | |
| {
 | |
|   if( obj->data )
 | |
|   {
 | |
| #ifdef S4WINDOWS
 | |
|     GlobalFree( (HANDLE)obj->data );
 | |
| #endif
 | |
|     obj->data = NULL;
 | |
|   }
 | |
| 
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| POBJ4 S4FUNCTION obj4bitmapFileCreate( AREA4 *area, char *filename, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
|   HANDLE hDIB;
 | |
| 
 | |
|   if( !area )
 | |
|     return NULL;
 | |
| 
 | |
|   if( !filename )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   hDIB = GetDIB( filename, area->report->code_base );
 | |
|   if( !hDIB )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   obj->obj_type_num = obj4type_bitmap2;
 | |
| #ifdef S4WINDOWS
 | |
|   obj->data = (void far *)hDIB;
 | |
| #else
 | |
|   obj->data = NULL;
 | |
| #endif
 | |
|   obj->wintext = (char *)u4alloc( strlen(filename)+1 );
 | |
|   if( !obj->wintext )
 | |
|   {
 | |
|     obj4bitmapFileFree( obj );
 | |
|     return NULL;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     strcpy( obj->wintext, filename );
 | |
|   }
 | |
| 
 | |
|   obj->num_chars = 0;
 | |
|   obj->alignment = 0;
 | |
|   obj->display_zero = 0;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4bitmapFieldFree( POBJ4 obj )
 | |
| {
 | |
|   obj4free( obj );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| /* a bitmap field object is almost identical to a field object, the main
 | |
|    difference how it is displayed */
 | |
| POBJ4 S4FUNCTION obj4bitmapFieldCreate( AREA4 *area, FIELD4 *field, long x, long y, long w, long h )
 | |
| {
 | |
|   OBJ4 *obj;
 | |
| 
 | |
|   obj = obj4create( area, x, y, w, h );
 | |
|   if( !obj )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   obj->obj_type_num = obj4type_bitmap3;
 | |
|   obj->data = field;
 | |
| 
 | |
|   obj->wintext = (char *)u4alloc( strlen(f4name(field))+3+strlen(d4alias(field->data)) );
 | |
|   if( !obj->wintext )
 | |
|   {
 | |
|     obj4bitmapFileFree( obj );
 | |
|     return NULL;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     sprintf( obj->wintext, "%s->%s", d4alias(field->data), f4name(field) );
 | |
|   }
 | |
| 
 | |
|   obj->num_chars = 0;
 | |
|   obj->alignment = 0;
 | |
|   obj->display_zero = 0;
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* this is a function for internal use only:  it simply uses a switch
 | |
|    statement to pass the object to the appropriate free function */
 | |
| void S4FUNCTION obj4delete( OBJ4 *obj )
 | |
| {
 | |
| #ifdef S4WINDOWS
 | |
|   if( obj->hWnd )
 | |
|     DestroyWindow( obj->hWnd );
 | |
|   obj->hWnd = NULL;
 | |
| #endif
 | |
| 
 | |
|   switch( obj->obj_type_num )
 | |
|   {
 | |
|   case obj4type_field:
 | |
|     obj4fieldFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_expr:
 | |
|     obj4exprFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_total:
 | |
|     obj4totalFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_calc:
 | |
|     obj4calcFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_text:
 | |
|     obj4textFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_hline:
 | |
|   case obj4type_vline:
 | |
|     obj4lineFree( obj );
 | |
|     break;
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
|   case obj4type_frame:
 | |
|     obj4frameFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_bitmap1:
 | |
|     obj4bitmapStaticFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_bitmap2:
 | |
|     obj4bitmapFileFree( obj );
 | |
|     break;
 | |
| 
 | |
|   case obj4type_bitmap3:
 | |
|     obj4bitmapFieldFree( obj );
 | |
|     break;
 | |
| #endif
 | |
| 
 | |
|   default:
 | |
|     obj4free( obj );
 | |
| 
 | |
|   }
 | |
| }
 | |
| 
 | |
| /****************************************************************************
 | |
|  *  evaluates objects with dynamic values, stores the result in the eval_text
 | |
|  *  member of the object structure
 | |
|  ****************************************************************************/
 | |
| void obj4evaluate( OBJ4 *obj )
 | |
| {
 | |
|   int len;
 | |
|   double d, *d_ptr;
 | |
|   char buf[1024], *output_ptr, *result_ptr, *date_format;
 | |
|   char date_buf[8] ;
 | |
|   REPORT4 *report;
 | |
|   EXPR4 *expr;
 | |
| #ifdef S4UNIX
 | |
|   int temp_int ;
 | |
| #endif
 | |
| 
 | |
|   if( !obj )
 | |
|     return;
 | |
| 
 | |
|   report = obj->area->report;
 | |
| 
 | |
|   output_ptr = buf;
 | |
| 
 | |
|   switch( obj->obj_type_num )
 | |
|   {
 | |
|     /******************/
 | |
|     /* the value is already calculated in the TOTAL4 structures members we
 | |
|        simply move this value into the appropriate member of the OBJ4 */
 | |
|   case obj4type_total:
 | |
|     switch( ((TOTAL4 *)obj->data)->total_type )
 | |
|     {
 | |
|     case total4lowest:
 | |
|       d =  ((TOTAL4 *)obj->data)->low;
 | |
|       break;
 | |
| 
 | |
|     case total4highest:
 | |
|       d = ((TOTAL4 *)obj->data)->high;
 | |
|       break;
 | |
| 
 | |
|     case total4sum:
 | |
|       d = ((TOTAL4 *)obj->data)->total;
 | |
|       break;
 | |
| 
 | |
|     case total4average:
 | |
|       d = ((TOTAL4 *)obj->data)->total/((TOTAL4 *)obj->data)->count;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     obj->dval = d;
 | |
| 
 | |
|     /* if the value comes out to zero and zero display is off set the text
 | |
|        to NULL and return */
 | |
|     if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | |
|     {
 | |
|       if( obj->eval_text )
 | |
|       {
 | |
|         u4free( obj->eval_text );
 | |
|         obj->eval_text = NULL;
 | |
|         obj->eval_len = 0;
 | |
|       }
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     /* convert the double value into text */
 | |
|     len = report4conv_double( obj, d, buf );
 | |
|     output_ptr = buf;
 | |
| 
 | |
|     /* if necessary re-alloc the eval_text member of the OBJ4 */
 | |
|     if( obj->eval_text && obj->eval_len < len+1 )
 | |
|     {
 | |
|       u4free( obj->eval_text );
 | |
|       obj->eval_text = NULL;
 | |
|       obj->eval_len = 0;
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
|     }
 | |
| 
 | |
|     if( obj->eval_text == NULL )
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
| 
 | |
|     /* copy the text into the eval_text member and set the length */
 | |
|     if( obj->eval_text )
 | |
|     {
 | |
|       obj->eval_len = len+1;
 | |
|       memcpy( obj->eval_text, output_ptr, len+1 );
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|     /******************/
 | |
|   case obj4type_expr:
 | |
|     len = expr4len( (EXPR4 *)obj->data );
 | |
|     if( len > sizeof( buf ) )
 | |
|     {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     /* evaluate the expression */
 | |
|     len = expr4vary( (EXPR4 *)obj->data, &output_ptr );
 | |
| 
 | |
|     switch( expr4type( (EXPR4 *)obj->data ) )
 | |
|     {
 | |
| 
 | |
|     case r4str:
 | |
|       /* simply determine the length of the string */
 | |
| #ifdef S4WINDOWS
 | |
|       if( lstrlen( output_ptr ) < len )
 | |
|         len = lstrlen( output_ptr );
 | |
| #else
 | |
|       if( strlen( output_ptr ) < (unsigned)len )
 | |
|         len = strlen( output_ptr );
 | |
| #endif
 | |
|       break;
 | |
| 
 | |
|     case r4num:
 | |
|       /* convert the ascii string to a double */
 | |
|       d = c4atod( output_ptr, expr4len((EXPR4 *)obj->data) );
 | |
| 
 | |
|       /* if zero and zero display is off break */
 | |
|       if( (d == 0 || ( d < 1 && obj->dec == 0 )) && !obj->display_zero )
 | |
|       {
 | |
|         if( obj->eval_text )
 | |
|         {
 | |
|           u4free( obj->eval_text );
 | |
|           obj->eval_text = NULL;
 | |
|           obj->eval_len = 0;
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       /* convert the double to formatted text */
 | |
|       obj->dval = d;
 | |
|       len = report4conv_double( obj, d, buf );
 | |
|       /* set the output pointer to the buffer with the formatted text */
 | |
|       output_ptr = buf;
 | |
|       break;
 | |
| 
 | |
|     case r4num_doub:
 | |
|       d_ptr = (double *)output_ptr;
 | |
| 
 | |
|       /* if zero and zero display is off break */
 | |
|       if( (*d_ptr == 0 || (*d_ptr < 1 && obj->dec == 0)) && !obj->display_zero )
 | |
|       {
 | |
|         if( obj->eval_text )
 | |
|         {
 | |
|           u4free( obj->eval_text );
 | |
|           obj->eval_text = NULL;
 | |
|           obj->eval_len = 0;
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       /* set the dval member of the object */
 | |
|       obj->dval = *d_ptr;
 | |
| 
 | |
|       /* convert to formatted text and set the output pointer */
 | |
|       len = report4conv_double( obj, *d_ptr, buf );
 | |
|       output_ptr = buf;
 | |
|       break;
 | |
| 
 | |
|     case r4date_doub:
 | |
|       d_ptr = (double *)output_ptr;
 | |
| 
 | |
|       /* convert the double to a date and set the output ptr to the
 | |
|          buffer holding the date */
 | |
|       if( *d_ptr >= 1.0E99 )
 | |
|         len = 0;
 | |
|       else
 | |
|       {
 | |
|         date4assign( date_buf, (long)*d_ptr );
 | |
|         date4format( date_buf, buf,
 | |
|                     (obj->date_format)?obj->date_format:report->default_date_format );
 | |
|         len = strlen( buf );
 | |
|         output_ptr = buf;
 | |
|       }
 | |
| 
 | |
|       /* set the objects dval member */
 | |
|       obj->dval = *d_ptr;
 | |
|       break;
 | |
| 
 | |
|     case r4date:
 | |
|       if( *output_ptr == ' ' )
 | |
|         len = 0 ;
 | |
|       else
 | |
|       {
 | |
|         if( report->for_dbf )
 | |
|         {
 | |
|           strcpy( buf, output_ptr );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           /* format the date and set the output pointer */
 | |
|           date_format =  obj->date_format ?
 | |
|             obj->date_format : report->default_date_format ;
 | |
|           date4format( output_ptr, buf, date_format ) ;
 | |
|         }
 | |
|         len =  strlen(buf) ;
 | |
|         output_ptr = buf;
 | |
|       }
 | |
|       break ;
 | |
| 
 | |
|       /* ********************************************* */
 | |
|     case r4log:
 | |
|       len = 1;
 | |
| #ifdef S4UNIX
 | |
|       memcpy( &temp_int, output_ptr, sizeof(temp_int) ) ;
 | |
|       if( temp_int == 1)
 | |
| #else
 | |
|         if( *(int *)output_ptr == 1)
 | |
| #endif
 | |
|         {
 | |
|           obj->dval = 1;
 | |
|           sprintf( buf, "T" );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           obj->dval = 0;
 | |
|           sprintf( buf, "F" );
 | |
|         }
 | |
|       output_ptr = buf;
 | |
|       break ;
 | |
|     } /* end of switch statement for expression type */
 | |
| 
 | |
| 
 | |
|     /* if there is already space allocated for the eval text but it is
 | |
|        too small re-alloc */
 | |
|     if( (obj->eval_text && obj->eval_len < len+1) )
 | |
|     {
 | |
|       u4free( obj->eval_text );
 | |
|       obj->eval_text = NULL;
 | |
|       obj->eval_len = 0;
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
|     }
 | |
| 
 | |
|     /* if no memory allocated for eval text */
 | |
|     if( obj->eval_text == NULL )
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
| 
 | |
|     /* place the tet into the eval_text member */
 | |
|     if( obj->eval_text )
 | |
|     {
 | |
|       obj->eval_len = len+1;
 | |
|       u4ncpy( obj->eval_text, output_ptr, len+1 );
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|     /*********************************************************/
 | |
|     /* the calc type of OBJECT is dealt with almost identically to
 | |
|        the expression type immediately above */
 | |
|   case obj4type_calc:
 | |
|     expr = ((EXPR4CALC *)obj->data)->expr;
 | |
| 
 | |
|     len = expr4len( expr );
 | |
|     if( len > sizeof( buf ) )
 | |
|     {
 | |
| 
 | |
|     }
 | |
|     len = expr4vary( expr, &output_ptr );
 | |
|     switch( expr4type( expr ) )
 | |
|     {
 | |
| 
 | |
|     case r4str:
 | |
| #ifdef S4WINDOWS
 | |
|       if( lstrlen( output_ptr ) < len )
 | |
|         len = lstrlen( output_ptr );
 | |
| #else
 | |
|       if( strlen( output_ptr ) < (unsigned)len )
 | |
|         len = strlen( output_ptr );
 | |
| #endif
 | |
|       break;
 | |
| 
 | |
|     case r4num:
 | |
|       d = c4atod( output_ptr, expr4len((EXPR4 *)obj->data) );
 | |
|       if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | |
|       {
 | |
|         if( obj->eval_text )
 | |
|         {
 | |
|           u4free( obj->eval_text );
 | |
|           obj->eval_text = NULL;
 | |
|           obj->eval_len = 0;
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       obj->dval = d;
 | |
|       len = report4conv_double( obj, d, buf );
 | |
|       output_ptr = buf;
 | |
|       break;
 | |
| 
 | |
|     case r4num_doub:
 | |
|       d_ptr = (double *)output_ptr;
 | |
|       if( (*d_ptr == 0 || (*d_ptr < 1 && obj->dec == 0)) && !obj->display_zero )
 | |
|       {
 | |
|         if( obj->eval_text )
 | |
|         {
 | |
|           u4free( obj->eval_text );
 | |
|           obj->eval_text = NULL;
 | |
|           obj->eval_len = 0;
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       obj->dval = *d_ptr;
 | |
|       len = report4conv_double( obj, *d_ptr, buf );
 | |
|       output_ptr = buf;
 | |
|       break;
 | |
| 
 | |
|     case r4date:
 | |
|       if( *output_ptr == ' ' )
 | |
|         len = 0 ;
 | |
|       else
 | |
|       {
 | |
|         if( report->for_dbf )
 | |
|         {
 | |
|           strcpy( buf, output_ptr );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           date_format =  obj->date_format ?
 | |
|             obj->date_format : report->default_date_format ;
 | |
|           date4format( output_ptr, buf, date_format ) ;
 | |
|         }
 | |
|         len =  strlen(buf) ;
 | |
|         output_ptr = buf;
 | |
|       }
 | |
|       break ;
 | |
| 
 | |
|     case r4date_doub:
 | |
|       d_ptr = (double *)output_ptr;
 | |
|       if( *d_ptr >= 1.0E99 )
 | |
|         len = 0;
 | |
|       else
 | |
|       {
 | |
|         date4assign( date_buf, (long)*d_ptr );
 | |
|         date4format( date_buf, buf,
 | |
|                     (obj->date_format)?obj->date_format:report->default_date_format );
 | |
|         len = strlen( buf );
 | |
|         output_ptr = buf;
 | |
|       }
 | |
|       obj->dval = *d_ptr;
 | |
|       break;
 | |
| 
 | |
|     case r4log:
 | |
|       len = 1;
 | |
| #ifdef S4UNIX
 | |
|       memcpy( &temp_int, output_ptr, sizeof(temp_int) ) ;
 | |
|       if( temp_int == 1)
 | |
| #else
 | |
|         if( *(int *)output_ptr == 1)
 | |
| #endif
 | |
|         {
 | |
|           obj->dval = 1;
 | |
|           sprintf( buf, "T" );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           obj->dval = 0;
 | |
|           sprintf( buf, "F" );
 | |
|         }
 | |
|       output_ptr = buf;
 | |
|       break ;
 | |
|     }
 | |
| 
 | |
|     if( obj->eval_text && obj->eval_len < len+1 )
 | |
|     {
 | |
|       u4free( obj->eval_text );
 | |
|       obj->eval_text = NULL;
 | |
|       obj->eval_len = 0;
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
|     }
 | |
| 
 | |
|     if( obj->eval_text == NULL )
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
| 
 | |
|     if( obj->eval_text )
 | |
|     {
 | |
|       obj->eval_len = len+1;
 | |
|       u4ncpy( obj->eval_text, output_ptr, len+1 );
 | |
|     }
 | |
|     break;
 | |
| 
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
|     /*******************************/
 | |
|     /* bitmap referenced by a file name in a data file field */
 | |
|   case obj4type_bitmap3:
 | |
|     /* get the file name from the field and place it in the
 | |
|        eval_text member */
 | |
|     result_ptr =  f4memo_ptr((FIELD4 *)obj->data ) ;
 | |
|     len =  f4memo_len((FIELD4 *)obj->data ) ;
 | |
|     output_ptr = result_ptr;
 | |
| 
 | |
|     if( obj->eval_text && obj->eval_len < len+1 )
 | |
|     {
 | |
|       u4free( obj->eval_text );
 | |
|       obj->eval_text = NULL;
 | |
|       obj->eval_len = 0;
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
|     }
 | |
| 
 | |
|     if( obj->eval_text == NULL )
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
| 
 | |
|     if( obj->eval_text )
 | |
|     {
 | |
|       obj->eval_len = len+1;
 | |
|       u4ncpy( obj->eval_text, output_ptr, len+1 );
 | |
|       c4trim_n( obj->eval_text, len+1 );
 | |
|       obj->eval_len = strlen( obj->eval_text ) + 1;
 | |
|     }
 | |
|     break;
 | |
| #endif
 | |
| 
 | |
|     /********************************************************/
 | |
|   case obj4type_field:
 | |
|     /* get the field contents */
 | |
|     result_ptr =  f4memo_ptr((FIELD4 *)obj->data ) ;
 | |
|     len =  f4memo_len((FIELD4 *)obj->data ) ;
 | |
| 
 | |
|     /* convert the field contents to text if necessary, based on the field
 | |
|        type */
 | |
|     switch(f4type((FIELD4 *)obj->data) )
 | |
|     {
 | |
| 
 | |
|     case r4str:
 | |
|       output_ptr = result_ptr;
 | |
|       break;
 | |
| 
 | |
|     case r4num_doub:
 | |
|       d = f4double((FIELD4 *)obj->data );
 | |
|       if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | |
|       {
 | |
|         if( obj->eval_text )
 | |
|         {
 | |
|           u4free( obj->eval_text );
 | |
|           obj->eval_text = NULL;
 | |
|           obj->eval_len = 0;
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       obj->dval = d;
 | |
|       len = report4conv_double( obj, d, buf ) ;
 | |
|       output_ptr = buf;
 | |
|       break;
 | |
| 
 | |
|     case r4num:
 | |
|       d = f4double((FIELD4 *)obj->data );
 | |
|       if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | |
|       {
 | |
|         if( obj->eval_text )
 | |
|         {
 | |
|           u4free( obj->eval_text );
 | |
|           obj->eval_text = NULL;
 | |
|           obj->eval_len = 0;
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       obj->dval = d;
 | |
|       len = report4conv_double( obj, d, buf ) ;
 | |
|       output_ptr = buf;
 | |
|       break ;
 | |
| 
 | |
|     case r4date:
 | |
|       if( *result_ptr == ' ' )
 | |
|       {
 | |
|         len = 0 ;
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         if( report->for_dbf )
 | |
|         {
 | |
|           strcpy( buf, result_ptr );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           date4format( result_ptr, buf,
 | |
|                       ((obj->date_format)?obj->date_format:obj->area->report->default_date_format) ) ;
 | |
|         }
 | |
|         len =  strlen(buf) ;
 | |
|         output_ptr = buf;
 | |
|       }
 | |
|       break ;
 | |
| 
 | |
|     case r4log:
 | |
|       len =  1 ;
 | |
|       output_ptr = result_ptr;
 | |
|       break ;
 | |
| 
 | |
|     default:
 | |
|       output_ptr =  result_ptr ;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     if( obj->eval_text && obj->eval_len < len+1 )
 | |
|     {
 | |
|       u4free( obj->eval_text );
 | |
|       obj->eval_text = NULL;
 | |
|       obj->eval_len = 0;
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
|     }
 | |
| 
 | |
|     if( obj->eval_text == NULL )
 | |
|       obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | |
| 
 | |
|     if( obj->eval_text )
 | |
|     {
 | |
|       obj->eval_len = len+1;
 | |
|       u4ncpy( obj->eval_text, output_ptr, len+1 );
 | |
|       c4trim_n( obj->eval_text, len+1 );
 | |
|       obj->eval_len = strlen( obj->eval_text ) + 1;
 | |
|     }
 | |
|     break ;
 | |
|   }
 | |
| 
 | |
|   return;
 | |
| 
 | |
| }
 | |
| 
 | |
| /****************************************************************************
 | |
|  * Sets the alignment of an object to justify4left, justify4right, or justify4center
 | |
|  ****************************************************************************/
 | |
| int S4FUNCTION obj4justify( POBJ4 obj, int alignment )
 | |
| {
 | |
|   int temp;
 | |
| 
 | |
|   if( obj == NULL )
 | |
|     return -1;
 | |
| 
 | |
| 
 | |
|   if( !( alignment == justify4left || alignment == justify4right ||
 | |
|         alignment == justify4center ) )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_OBJAL, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   temp = obj->alignment;
 | |
|   obj->alignment = alignment;
 | |
| 
 | |
|   return temp;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4dateFormat( POBJ4 obj, char S4PTR *date_format )
 | |
| {
 | |
|   char *temp;
 | |
| 
 | |
|   if( obj == NULL )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( date_format != NULL )
 | |
|   {
 | |
|     temp = (char *)u4alloc( strlen(date_format) + 1 );
 | |
|     if( !temp )
 | |
|       return -1;
 | |
| 
 | |
|     strcpy( temp, date_format );
 | |
|     if( obj->date_format != NULL )
 | |
|       u4free( obj->date_format );
 | |
|     obj->date_format = temp;
 | |
|     return 0;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     if( obj->date_format != NULL )
 | |
|       u4free( obj->date_format );
 | |
|     obj->date_format = NULL;
 | |
|     return 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4decimals( POBJ4 obj, int decimals )
 | |
| {
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   obj->dec = decimals;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4displayOnce( POBJ4 obj, char S4PTR *expr_string )
 | |
| {
 | |
|   EXPR4 S4PTR *expr;
 | |
| 
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( !expr_string )
 | |
|   {
 | |
|     obj->display_once = 0;
 | |
|     if( obj->display_once_expr )
 | |
|       expr4free( obj->display_once_expr );
 | |
|     obj->display_once_expr = NULL;
 | |
|     return 0;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     expr = NULL;
 | |
|     expr = expr4parse( obj->area->report->relate->data, expr_string );
 | |
|     if( !expr )
 | |
|     {
 | |
|       e4describe( obj->area->report->code_base, e4report, E4_REP_DOEXPR, 0,  0 );
 | |
|       return -1;
 | |
|     }
 | |
|     if( obj->display_once_expr )
 | |
|       expr4free( obj->display_once_expr );
 | |
|     obj->display_once_expr = expr;
 | |
|     return 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4displayZero( POBJ4 obj, int display_zero )
 | |
| {
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( display_zero < 0 )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_ZERO, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   obj->display_zero = display_zero;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4numericType( POBJ4 obj, int numeric_type )
 | |
| {
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( !(numeric_type==obj4numNumber || numeric_type==obj4numExponent
 | |
|         || numeric_type==obj4numCurrency || numeric_type==obj4numPercent ) )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_NTYPE, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   obj->numeric_type = numeric_type;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4leadingZero( POBJ4 obj, int leading_zero )
 | |
| {
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( leading_zero < 0 )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_LZERO, 0, 0 );
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   obj->leading_zero = leading_zero;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4brackets( POBJ4 obj, int use_brackets )
 | |
| {
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( use_brackets < 0 )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_BRACK, 0, 0 );
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   obj->use_brackets = use_brackets;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4style( POBJ4 obj, PSTYLE4 style )
 | |
| {
 | |
|   int flag = 0;
 | |
|   PSTYLE4 style_on;
 | |
| 
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   style_on = (PSTYLE4)l4first( &obj->area->report->styles );
 | |
|   while( style_on )
 | |
|   {
 | |
|     if( style == style_on )
 | |
|       flag = 1;
 | |
| 
 | |
|     style_on = (PSTYLE4)l4next( &obj->area->report->styles, style_on );
 | |
|   }
 | |
| 
 | |
|   if( !flag && style != NULL )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_OSTYLE, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   obj->style = style;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4frameCorners( POBJ4 obj, int rounded )
 | |
| {
 | |
|   int temp;
 | |
| 
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( rounded < 0 )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_FCRN, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   temp = (obj->alignment);
 | |
|   obj->alignment = (rounded);
 | |
| 
 | |
|   return temp;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4frameFill( POBJ4 obj, int fill )
 | |
| {
 | |
|   int temp;
 | |
| 
 | |
|   if( !obj )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( fill < 0 )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_FFILL, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   temp = obj->display_zero;
 | |
|   obj->display_zero = fill;
 | |
| 
 | |
|   return temp;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION obj4lookAhead( POBJ4 obj, int lookahead )
 | |
| {
 | |
|   if( !obj )
 | |
|     return -1;
 | |
| 
 | |
|   if( lookahead < 0 )
 | |
|   {
 | |
|     e4describe( obj->area->report->code_base, e4parm, E4_REP_OLOOK, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( obj->obj_type_num == obj4type_total )
 | |
|   {
 | |
|     ((PTOTAL4)obj->data)->lookahead = lookahead;
 | |
|   }
 | |
|   else
 | |
|     obj->lookahead = lookahead;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| void S4FUNCTION obj4remove( POBJ4 obj )
 | |
| {
 | |
|   if( obj->container )
 | |
|   {
 | |
|     l4remove( &obj->container->contained, obj );
 | |
|     obj->container = NULL;
 | |
|   }
 | |
|   else
 | |
|     l4remove( &obj->area->objects, obj );
 | |
| }
 | |
| 
 |