a0f5e0898b
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
2035 lines
48 KiB
C
Executable File
2035 lines
48 KiB
C
Executable File
/* r4driver.c (c)Copyright Sequiter Software Inc., 1991-1994. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#ifndef S4WINDOWS
|
|
#include <conio.h>
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4TEMP
|
|
#include "t4test.h"
|
|
#endif
|
|
|
|
#include <time.h>
|
|
|
|
|
|
#ifndef S4UNIX
|
|
#ifndef S4IBMOS2
|
|
#ifndef __TURBOC__
|
|
#include <sys\locking.h>
|
|
#define S4LOCKING
|
|
#endif
|
|
#ifdef __ZTC__
|
|
extern int errno ;
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
#include <sys\types.h>
|
|
#include <sys\locking.h>
|
|
#endif
|
|
#ifdef __TURBOC__
|
|
/* extern int cdecl errno ; */
|
|
#endif
|
|
#endif
|
|
|
|
#include <sys\stat.h>
|
|
#include <share.h>
|
|
#endif
|
|
|
|
#ifdef S4MACINTOSH
|
|
#include <unix.h>
|
|
#endif
|
|
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
|
|
#ifdef S4DO_ERRNO
|
|
extern int errno ;
|
|
#endif
|
|
|
|
|
|
#define ABS(x) ((x<0)?-1*(x):x)
|
|
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
|
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
|
|
|
#ifdef S4WINDOWS
|
|
extern HINSTANCE hInst;
|
|
#endif
|
|
|
|
int report4calc_page_height( REPORT4 *report )
|
|
{
|
|
int retval;
|
|
AREA4 *area_on;
|
|
|
|
if( report->for_dbf )
|
|
return 31000;
|
|
|
|
retval = (int)(report->dev_page_height - report->dev_margin_bottom);
|
|
area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas );
|
|
while( area_on )
|
|
{
|
|
if( area_on->suppression_condition )
|
|
{
|
|
if( !expr4true( area_on->suppression_condition ) )
|
|
retval -= area_on->height_dev;
|
|
}
|
|
else
|
|
retval -= area_on->height_dev;
|
|
area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on );
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
int report4output_group_headers( GROUP4 *group, HDC hDC, GROUP4 *group_first, int use_break )
|
|
#else
|
|
int report4output_group_headers(group, hDC, group_first, use_break )
|
|
GROUP4 *group ;
|
|
HDC hDC ;
|
|
GROUP4 *group_first ;
|
|
int use_break ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
int report4output_group_headers( GROUP4 *group, PAGE4 *hDC, GROUP4 *group_first, int use_break )
|
|
#else
|
|
int report4output_group_headers(group, hDC, group_first, use_break )
|
|
GROUP4 *group ;
|
|
PAGE4 *hDC ;
|
|
GROUP4 *group_first ;
|
|
int use_break ;
|
|
#endif
|
|
#endif
|
|
{
|
|
REPORT4 *report = group->report;
|
|
AREA4 *area_on = report->area_on, *garea_on;
|
|
int aflag, area_height;
|
|
|
|
if( group->title_summary )
|
|
group->tsdone = 1;
|
|
|
|
aflag = 0;
|
|
garea_on = (PAREA4)l4first( &group->header_areas );
|
|
while( garea_on )
|
|
{
|
|
if( garea_on == area_on )
|
|
aflag = 1;
|
|
|
|
garea_on = (PAREA4)l4next( &group->header_areas, garea_on );
|
|
}
|
|
|
|
if( !aflag )
|
|
area_on = NULL;
|
|
|
|
if( (group->reset_page || group->reset_pagenum || group->swap_header) &&
|
|
(group == group_first || report->hard_resets_flag) &&
|
|
report->first )
|
|
{
|
|
if( !group->reset_flag )
|
|
{
|
|
group->reset_flag = 1;
|
|
report4output_pgfooter( report, hDC );
|
|
report->group_on = group;
|
|
report->group_first = group_first;
|
|
report->area_on = NULL;
|
|
report->in_header = 1;
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
group->reset_flag = 0;
|
|
}
|
|
}
|
|
|
|
if( !area_on )
|
|
area_on = (AREA4 *)l4first( &group->header_areas );
|
|
|
|
while( area_on )
|
|
{
|
|
if( !report->broken )
|
|
area_height = area_on->height_dev + report->ypos;
|
|
else
|
|
if( report->broken == 2 )
|
|
area_height = (area_on->height_dev - report->break_height) + report->ypos;
|
|
else
|
|
if( report->broken == 1 )
|
|
area_height = report->break_height + report->ypos;
|
|
|
|
if( area_height > report->disp_bottom )
|
|
{
|
|
if( area_on->allow_pagebreaks )
|
|
{
|
|
report->break_height = report4output_area_break( area_on );
|
|
if( report->break_height )
|
|
{
|
|
report->broken = 1;
|
|
report4output_area( area_on, hDC, 1 );
|
|
}
|
|
}
|
|
report4output_pgfooter( report, hDC );
|
|
report->group_on = group;
|
|
report->group_first = group_first;
|
|
report->area_on = area_on;
|
|
report->in_header = 1;
|
|
return 0;
|
|
}
|
|
|
|
report4output_area( area_on, hDC, use_break );
|
|
|
|
area_on = (AREA4 *)l4next( &group->header_areas, area_on );
|
|
}
|
|
|
|
if( group->title_summary && group->report->pgbrk_title &&
|
|
group->header_areas.n_link > 0 )
|
|
{
|
|
report->group_on = (PGROUP4)l4next( &group->report->groups, group );
|
|
report->group_first = group_first;
|
|
report->area_on = NULL;
|
|
report->in_header = 1;
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
int report4output_group_footers(GROUP4 *group, HDC hDC, GROUP4 *group_first )
|
|
#else
|
|
int report4output_group_footers(group, hDC, group_first )
|
|
GROUP4 *group ;
|
|
HDC hDC ;
|
|
GROUP4 *group_first ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
int report4output_group_footers(GROUP4 *group, PAGE4 *hDC, GROUP4 *group_first )
|
|
#else
|
|
int report4output_group_footers(group, hDC, group_first )
|
|
GROUP4 *group ;
|
|
PAGE4 *hDC ;
|
|
GROUP4 *group_first ;
|
|
#endif
|
|
#endif
|
|
{
|
|
long theight;
|
|
REPORT4 *report = group->report;
|
|
AREA4 *area_on = report->area_on, *harea;
|
|
int area_height;
|
|
|
|
|
|
if( !area_on )
|
|
area_on = (AREA4 *)l4first( &group->footer_areas );
|
|
|
|
harea = area_on;
|
|
theight = 0;
|
|
while( harea )
|
|
{
|
|
if( !harea->suppression_condition || expr4true(harea->suppression_condition) )
|
|
theight += harea->height_dev;
|
|
harea = (PAREA4)l4next( &group->footer_areas, harea );
|
|
}
|
|
|
|
if( group->swap_footer )
|
|
if( (report->page_header_footer &&
|
|
report->page_header_footer->footer_areas.n_link > 0) || report->ypos < report->disp_bottom - theight )
|
|
if( group == group_first || report->hard_resets_flag ||
|
|
( group_first == report->title_summary && group == (PGROUP4)l4next( &report->groups, report->title_summary)) )
|
|
{
|
|
report4output_swapped_footer( group, hDC );
|
|
|
|
report->group_on = (GROUP4 *)l4prev( &report->groups, group );
|
|
if( report->group_on == report->title_summary )
|
|
{
|
|
if( !report->end_report )
|
|
{
|
|
report->group_on = (PGROUP4)l4next( &report->groups, report->group_on );
|
|
report->in_header = 1;
|
|
report4swap_old_rec( report );
|
|
report->group_first = NULL;
|
|
}
|
|
else
|
|
{
|
|
if( report->group_on->footer_areas.n_link <= 0 )
|
|
report->end_report = 2;
|
|
report->in_header = 0;
|
|
report->group_first = group_first;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
report->in_header = 0;
|
|
report->group_first = group_first;
|
|
}
|
|
report->area_on = NULL;
|
|
return 0;
|
|
}
|
|
|
|
while( area_on )
|
|
{
|
|
if( !report->broken )
|
|
area_height = area_on->height_dev + report->ypos;
|
|
else
|
|
if( report->broken == 2 )
|
|
area_height = (area_on->height_dev - report->break_height) + report->ypos;
|
|
else
|
|
if( report->broken == 1 )
|
|
area_height = report->break_height + report->ypos;
|
|
|
|
|
|
if( area_height > report->disp_bottom )
|
|
{
|
|
report->break_height = report4output_area_break( area_on );
|
|
if( report->break_height )
|
|
{
|
|
report->broken = 1;
|
|
report4output_area( area_on, hDC, 1 );
|
|
}
|
|
|
|
report4output_pgfooter( report, hDC );
|
|
|
|
report->group_on = group;
|
|
report->group_first = group_first;
|
|
report->area_on = area_on;
|
|
report->in_header = 0;
|
|
return 0;
|
|
}
|
|
report4output_area( area_on, hDC, 1 );
|
|
area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
int S4FUNCTION report4generatePage(PREPORT4 report, HDC hDC )
|
|
#else
|
|
int S4FUNCTION report4generatePage(report, hDC )
|
|
PREPORT4 report ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
int S4FUNCTION report4generatePage( PREPORT4 report )
|
|
#else
|
|
int S4FUNCTION report4generatePage(report )
|
|
PREPORT4 report ;
|
|
#endif
|
|
#endif
|
|
{
|
|
GROUP4 *group_first, *group_on;
|
|
TOTAL4 *total_on;
|
|
int rc, flag;
|
|
|
|
#ifndef S4WINDOWS
|
|
PAGE4 *hDC;
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if( !report )
|
|
return -1;
|
|
#ifdef S4WINDOWS
|
|
if( !hDC && !report->for_dbf )
|
|
return -1;
|
|
#endif
|
|
if( report->code_base->error_code < 0 )
|
|
return -1;
|
|
#endif
|
|
|
|
#ifndef S4WINDOWS
|
|
hDC = &report->page_buf;
|
|
#ifdef S4NO_CHSIZE
|
|
file4change_size( &report->page_buf.file_buf, 0L );
|
|
#else
|
|
chsize( report->page_buf.file_buf.hand, 0L );
|
|
#endif
|
|
file4seq_write_init( &hDC->seq_wr, &hDC->file_buf, 0L, hDC->fmem_buf, sizeof(hDC->fmem_buf) );
|
|
#endif
|
|
|
|
if( report->end_report == 2 )
|
|
return 2;
|
|
|
|
report->code_base->pageno++;
|
|
report->page_count++;
|
|
|
|
report->ypos = report->dev_margin_top;
|
|
|
|
report->disp_bottom = report4calc_page_height( report );
|
|
|
|
group_first = report->group_first;
|
|
group_on = report->group_on;
|
|
flag = report->in_header;
|
|
|
|
if( group_on && group_on->reset_pagenum )
|
|
report->code_base->pageno = 1;
|
|
|
|
if( report->tdone == 0 )
|
|
{
|
|
report->tdone = 1;
|
|
total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
|
|
while( total_on )
|
|
{
|
|
if( !total_on->obj || !total_on->obj->lookahead )
|
|
total4value_update( total_on );
|
|
total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
|
|
}
|
|
}
|
|
|
|
if( group_first == NULL && group_on == report->title_summary )
|
|
{
|
|
if( group_on->lookahead )
|
|
report4evaluate_lookahead( group_on );
|
|
|
|
if( (report4output_group_headers( group_on, hDC, group_first, 1 )) == 0 )
|
|
goto GOODRET;
|
|
report->first = group_on->position;
|
|
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
|
|
if( !group_on || (group_on && !group_on->swap_header) )
|
|
report4output_pgheader( report, hDC );
|
|
else
|
|
{
|
|
if( flag )
|
|
{
|
|
report4output_group_headers( group_on, hDC, group_first, 1 );
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
}
|
|
|
|
if( report->code_base->pageno > 1 )
|
|
report4output_repeat_headers( report, hDC, group_first );
|
|
|
|
while( 1 )
|
|
{
|
|
report->disp_bottom = report4calc_page_height( report );
|
|
|
|
if( flag )
|
|
{
|
|
if( report->tdone == 0 )
|
|
{
|
|
report->tdone = 1;
|
|
total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
|
|
while( total_on )
|
|
{
|
|
if( !total_on->obj || !total_on->obj->lookahead )
|
|
total4value_update( total_on );
|
|
total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
|
|
}
|
|
}
|
|
|
|
if( !group_on )
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
if( group_on->title_summary && group_on->tsdone > 0 )
|
|
group_on = (PGROUP4)l4next( &report->groups, group_on );
|
|
while( group_on )
|
|
{
|
|
if( group_on->lookahead )
|
|
report4evaluate_lookahead( group_on );
|
|
|
|
if( (report4output_group_headers( group_on, hDC, group_first, 1 )) == 0 )
|
|
goto GOODRET;
|
|
report->first = group_on->position;
|
|
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
|
|
report4make_old_rec( report );
|
|
|
|
while( (rc = relate4skip( report->relate, 1L )) == 0 )
|
|
{
|
|
report->tdone = 0;
|
|
group_first = report4calc_first_change_group( report );
|
|
|
|
if( group_first )
|
|
break;
|
|
else
|
|
{
|
|
report4make_old_rec( report );
|
|
|
|
if( report->tdone == 0 )
|
|
{
|
|
report->tdone = 1;
|
|
total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
|
|
while( total_on )
|
|
{
|
|
if( !total_on->obj || !total_on->obj->lookahead )
|
|
total4value_update( total_on );
|
|
total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( rc == r4eof )
|
|
{
|
|
group_first = (GROUP4 *)l4first( &report->groups );
|
|
report->end_report = 1;
|
|
}
|
|
|
|
if( group_first == NULL )
|
|
group_first = (GROUP4 *)l4first( &report->groups );
|
|
|
|
if( group_first->position == 0 && group_first->footer_areas.n_link == 0 )
|
|
group_first = (GROUP4 *)l4next( &report->groups, group_first );
|
|
|
|
report4swap_old_rec( report );
|
|
}
|
|
|
|
report->tdone = 1;
|
|
|
|
flag = 1;
|
|
|
|
report->area_on = NULL;
|
|
|
|
if( !group_on )
|
|
group_on = (GROUP4 *)l4last( &report->groups );
|
|
|
|
while( group_on )
|
|
{
|
|
if( (report4output_group_footers( group_on, hDC, group_first )) == 0 )
|
|
{
|
|
if( group_on == group_first && report->end_report == 1 && report->broken != 2)
|
|
{
|
|
report->end_report = 2;
|
|
report->tdone = 0;
|
|
}
|
|
|
|
if( report->for_dbf && report->output_group == group_on )
|
|
{
|
|
file4seq_write( &report->dfile_seq, d4record(report->data_file),
|
|
(unsigned)(d4record_width(report->data_file)) );
|
|
report->rcount++;
|
|
}
|
|
goto GOODRET;
|
|
}
|
|
|
|
if( report->for_dbf && report->output_group == group_on )
|
|
{
|
|
file4seq_write( &report->dfile_seq, d4record(report->data_file),
|
|
(unsigned)(d4record_width(report->data_file)) );
|
|
report->rcount++;
|
|
}
|
|
|
|
if( group_on == group_first )
|
|
break;
|
|
group_on = (GROUP4 *)l4prev( &report->groups, group_on );
|
|
}
|
|
|
|
if( report->end_report == 1)
|
|
{
|
|
report->end_report = 2;
|
|
report4output_pgfooter( report, hDC );
|
|
break;
|
|
}
|
|
|
|
report->tdone = 0;
|
|
report4swap_old_rec( report );
|
|
}
|
|
GOODRET:
|
|
#ifndef S4WINDOWS
|
|
file4seq_write_flush( &report->page_buf.seq_wr );
|
|
report->page_buf.first_read = 0;
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
int report4output_area(PAREA4 area, HDC hDC, int use_break )
|
|
#else
|
|
int report4output_area(area, hDC, use_break )
|
|
PAREA4 area ;
|
|
HDC hDC ;
|
|
int use_break ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
int report4output_area(PAREA4 area, PAGE4 *hDC, int use_break )
|
|
#else
|
|
int report4output_area(area, hDC, use_break )
|
|
PAREA4 area ;
|
|
PAGE4 *hDC ;
|
|
int use_break ;
|
|
#endif
|
|
#endif
|
|
{
|
|
OBJ4 *obj_on;
|
|
int suppress = 0;
|
|
|
|
if( area->suppression_condition )
|
|
{
|
|
suppress = expr4true( area->suppression_condition );
|
|
}
|
|
|
|
if( suppress )
|
|
{
|
|
if ( area->height_dev > area->report->break_height )
|
|
{
|
|
area->report->broken = 0;
|
|
area->report->break_height = 0L;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
obj_on = (OBJ4 *)l4first( &area->objects );
|
|
while( obj_on )
|
|
{
|
|
if( area->report->broken == 0 || use_break == 0 )
|
|
{
|
|
report4output_object( obj_on, hDC );
|
|
}
|
|
else
|
|
if( area->report->broken == 1 )
|
|
{
|
|
if( obj_on->dev_y <= area->report->break_height )
|
|
{
|
|
report4output_object( obj_on, hDC );
|
|
}
|
|
}
|
|
else
|
|
if( area->report->broken == 2 )
|
|
{
|
|
if( obj_on->dev_y >= area->report->break_height )
|
|
{
|
|
report4output_object( obj_on, hDC );
|
|
}
|
|
}
|
|
obj_on = (OBJ4 *)l4next( &area->objects, obj_on );
|
|
}
|
|
|
|
if( area->report->broken == 1 )
|
|
{
|
|
area->report->broken = 2;
|
|
return 0;
|
|
}
|
|
|
|
if( area->report->broken == 2 )
|
|
{
|
|
if( area->report->for_dbf )
|
|
{
|
|
area->report->ypos = 0;
|
|
}
|
|
else
|
|
{
|
|
area->report->ypos += (area->height_dev - area->report->break_height );
|
|
}
|
|
area->report->broken = 0; area->report->break_height = 0L;
|
|
return 0;
|
|
}
|
|
|
|
if( area->report->for_dbf )
|
|
area->report->ypos = 0;
|
|
else
|
|
area->report->ypos += area->height_dev;
|
|
return 0;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
int report4output_object(POBJ4 obj, HDC hDC )
|
|
#else
|
|
int report4output_object(obj, hDC )
|
|
POBJ4 obj ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
int report4output_object(POBJ4 obj, PAGE4 *hDC )
|
|
#else
|
|
int report4output_object(obj, hDC )
|
|
POBJ4 obj ;
|
|
PAGE4 *hDC ;
|
|
#endif
|
|
#endif
|
|
{
|
|
REPORT4 *report;
|
|
char *output_ptr, *cptr;
|
|
long len;
|
|
int offset_break;
|
|
OBJ4 *obj_on;
|
|
#ifdef S4WINDOWS
|
|
PBITMAPINFO pbmi;
|
|
HANDLE hDIB;
|
|
HPEN hpen;
|
|
HBRUSH hbrush;
|
|
LOGBRUSH lbrush;
|
|
RECT rect;
|
|
UINT alignment;
|
|
POINT pt;
|
|
int lwidth, sdc;
|
|
#else
|
|
long lval, obj_len, data_len;
|
|
int i;
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if( !obj || (!hDC && !obj->area->report->for_dbf) )
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
report = obj->area->report;
|
|
if( report->output_code != 1 )
|
|
if( !(report->start_page == 0 && report->end_page == 0) )
|
|
if( report->page_count < report->start_page || report->page_count > report->end_page )
|
|
return(0);
|
|
|
|
#ifdef S4WINDOWS
|
|
SetBkMode( hDC, TRANSPARENT );
|
|
#endif
|
|
|
|
if( report->code_base->error_code < 0 )
|
|
return -1;
|
|
|
|
output_ptr = NULL;
|
|
|
|
if( report->broken == 2 )
|
|
offset_break = (int)report->break_height;
|
|
else
|
|
offset_break = 0;
|
|
|
|
if( obj->display_once && obj->display_once_expr && obj->last_display_val )
|
|
{
|
|
len = expr4vary( obj->display_once_expr, &cptr );
|
|
if( memcmp(obj->last_display_val, cptr, (int)len ) == 0 )
|
|
return 0;
|
|
|
|
memcpy( obj->last_display_val, cptr, (int)len );
|
|
|
|
}
|
|
|
|
switch( obj->obj_type_num )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
case obj4type_bitmap3:
|
|
if( report->for_dbf )
|
|
break;
|
|
if( !obj->lookahead )
|
|
obj4evaluate( obj );
|
|
if( obj->eval_text )
|
|
{
|
|
hDIB = GetDIB( obj->eval_text, obj->area->report->code_base );
|
|
if( !hDIB )
|
|
break;
|
|
|
|
pbmi = (PBITMAPINFO)GlobalLock(hDIB);
|
|
StretchDIBits( hDC, (int)(obj->dev_x + report->dev_margin_left),
|
|
(int)(obj->dev_y + report->ypos - offset_break),
|
|
(int)(obj->dev_w), (int)(obj->dev_h),
|
|
0, 0, (int)pbmi->bmiHeader.biWidth, (int)pbmi->bmiHeader.biHeight,
|
|
(LPSTR)FindDIBBits((LPSTR)pbmi), pbmi, DIB_RGB_COLORS, SRCCOPY );
|
|
GlobalUnlock( hDIB );
|
|
GlobalFree( hDIB );
|
|
|
|
}
|
|
break;
|
|
|
|
case obj4type_bitmap1:
|
|
case obj4type_bitmap2:
|
|
if( report->for_dbf )
|
|
break;
|
|
pbmi = (PBITMAPINFO)GlobalLock((HANDLE)obj->data);
|
|
StretchDIBits( hDC, (int)(obj->dev_x + report->dev_margin_left),
|
|
(int)(obj->dev_y + report->ypos - offset_break),
|
|
(int)obj->dev_w, (int)obj->dev_h,
|
|
0, 0, (int)pbmi->bmiHeader.biWidth, (int)pbmi->bmiHeader.biHeight,
|
|
(LPSTR)FindDIBBits((LPSTR)pbmi), pbmi, DIB_RGB_COLORS, SRCCOPY );
|
|
GlobalUnlock((HANDLE)obj->data);
|
|
break;
|
|
|
|
case obj4type_hline:
|
|
case obj4type_vline:
|
|
case obj4type_frame:
|
|
if( report->for_dbf )
|
|
break;
|
|
sdc = SaveDC( hDC );
|
|
SetMapMode( hDC, MM_HIENGLISH );
|
|
SetMapMode( hDC, MM_ANISOTROPIC );
|
|
pt.x = obj->dec;
|
|
LPtoDP( hDC, &pt, 1 );
|
|
lwidth = pt.x;
|
|
RestoreDC( hDC, sdc );
|
|
|
|
hbrush = NULL;
|
|
hpen = NULL;
|
|
if( obj->style )
|
|
{
|
|
lbrush.lbColor = obj->style->color;
|
|
lbrush.lbStyle = BS_SOLID;
|
|
lbrush.lbHatch = 0L;
|
|
hbrush = CreateBrushIndirect( &lbrush );
|
|
hpen = CreatePen( PS_SOLID, lwidth, obj->style->color );
|
|
}
|
|
if( hbrush && hpen )
|
|
{
|
|
SelectObject( hDC, hbrush );
|
|
SelectObject( hDC, hpen );
|
|
}
|
|
else
|
|
{
|
|
SelectObject( hDC, GetStockObject(BLACK_PEN) );
|
|
SelectObject( hDC, GetStockObject(BLACK_BRUSH) );
|
|
}
|
|
|
|
if( obj->obj_type_num == obj4type_hline )
|
|
{
|
|
MoveToEx( hDC, (int)(obj->dev_x + report->dev_margin_left), (int)(obj->dev_y + obj->dev_h/2 + report->ypos - offset_break), NULL );
|
|
LineTo( hDC, (int)(obj->dev_x + obj->dev_w + report->dev_margin_left), (int)(obj->dev_y + obj->dev_h/2 + report->ypos - offset_break) );
|
|
}
|
|
if( obj->obj_type_num == obj4type_vline )
|
|
{
|
|
MoveToEx( hDC, (int)(obj->dev_x + obj->dev_w/2 + report->dev_margin_left), (int)(obj->dev_y + report->ypos - offset_break), NULL );
|
|
LineTo( hDC, (int)(obj->dev_x + obj->dev_w/2 + report->dev_margin_left), (int)(obj->dev_y + obj->dev_h + report->ypos - offset_break) );
|
|
}
|
|
|
|
if( obj->obj_type_num == obj4type_frame )
|
|
{
|
|
|
|
if( !obj->display_zero )
|
|
SelectObject( hDC, GetStockObject( WHITE_BRUSH ) );
|
|
|
|
if( obj->alignment == 0 )
|
|
{
|
|
Rectangle( hDC, (int)(obj->dev_x + report->dev_margin_left + 1 + (lwidth/2)),
|
|
(int)(obj->dev_y + report->ypos - offset_break + 1 + (lwidth/2)),
|
|
(int)(obj->dev_x + obj->dev_w + report->dev_margin_left - (lwidth/2)),
|
|
(int)(obj->dev_y + obj->dev_h + report->ypos - offset_break - (lwidth/2)) );
|
|
}
|
|
else
|
|
{
|
|
RoundRect( hDC, (int)(obj->dev_x + report->dev_margin_left + 1 + (lwidth/2)),
|
|
(int)(obj->dev_y + report->ypos - offset_break + 1 + (lwidth/2)),
|
|
(int)(obj->dev_x + obj->dev_w + report->dev_margin_left - (lwidth/2)),
|
|
(int)(obj->dev_y + obj->dev_h + report->ypos - offset_break - (lwidth/2)),
|
|
20, 20 );
|
|
}
|
|
}
|
|
|
|
SelectObject( hDC, GetStockObject(BLACK_PEN) );
|
|
SelectObject( hDC, GetStockObject(BLACK_BRUSH) );
|
|
if( hbrush )
|
|
DeleteObject( hbrush );
|
|
if( hpen )
|
|
DeleteObject( hpen );
|
|
len = 0;
|
|
break;
|
|
|
|
case obj4type_text:
|
|
if( report->for_dbf )
|
|
{
|
|
if( obj->field )
|
|
f4assign( obj->field, obj->wintext );
|
|
break;
|
|
}
|
|
|
|
output_ptr = obj->wintext;
|
|
len = lstrlen( obj->wintext );
|
|
if( len > 0 )
|
|
{
|
|
if( obj->style )
|
|
{
|
|
if( report->output_code == 1 )
|
|
SelectObject( hDC, obj->style->screen_font );
|
|
else
|
|
SelectObject( hDC, obj->style->printer_font );
|
|
SetTextColor( hDC, obj->style->color );
|
|
}
|
|
|
|
rect.left = (int)(obj->dev_x + report->dev_margin_left);
|
|
rect.top = (int)(obj->dev_y + report->ypos - offset_break);
|
|
rect.right = rect.left + (int)obj->dev_w;
|
|
rect.bottom = rect.top + (int)obj->dev_h;
|
|
|
|
switch( obj->alignment )
|
|
{
|
|
case justify4left:
|
|
alignment = DT_LEFT;
|
|
break;
|
|
case justify4right:
|
|
alignment = DT_RIGHT;
|
|
break;
|
|
case justify4center:
|
|
alignment = DT_CENTER;
|
|
break;
|
|
}
|
|
|
|
DrawText( hDC, output_ptr, (int)len, &rect, DT_WORDBREAK | alignment | DT_NOPREFIX );
|
|
}
|
|
|
|
break;
|
|
|
|
case obj4type_total:
|
|
if( report->for_dbf )
|
|
{
|
|
if( obj->field )
|
|
switch( ((PTOTAL4)obj->data)->total_type )
|
|
{
|
|
case total4lowest:
|
|
f4assign_double( obj->field, ((PTOTAL4)obj->data)->low );
|
|
break;
|
|
|
|
case total4highest:
|
|
f4assign_double( obj->field, ((PTOTAL4)obj->data)->high );
|
|
break;
|
|
|
|
case total4count:
|
|
f4assign_long( obj->field, ((PTOTAL4)obj->data)->count );
|
|
break;
|
|
|
|
case total4sum:
|
|
f4assign_double( obj->field, ((PTOTAL4)obj->data)->total );
|
|
break;
|
|
|
|
case total4average:
|
|
f4assign_double( obj->field, (((PTOTAL4)obj->data)->total/((PTOTAL4)obj->data)->count) );
|
|
break;
|
|
|
|
}
|
|
break;
|
|
}
|
|
case obj4type_expr:
|
|
case obj4type_field:
|
|
case obj4type_calc:
|
|
if( report->for_dbf )
|
|
{
|
|
if( !obj->lookahead )
|
|
obj4evaluate( obj );
|
|
|
|
if( obj->field )
|
|
switch( f4type(obj->field) )
|
|
{
|
|
case r4str:
|
|
case r4date:
|
|
f4assign( obj->field, obj->eval_text );
|
|
break;
|
|
|
|
case r4log:
|
|
f4assign_char( obj->field, *(obj->eval_text) );
|
|
break;
|
|
|
|
case r4num:
|
|
f4assign_double( obj->field, obj->dval );
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
if( !obj->lookahead )
|
|
obj4evaluate( obj );
|
|
|
|
if( obj->eval_text )
|
|
{
|
|
if( obj->style )
|
|
{
|
|
if( report->output_code == 1 )
|
|
SelectObject( hDC, obj->style->screen_font );
|
|
else
|
|
SelectObject( hDC, obj->style->printer_font );
|
|
SetTextColor( hDC, obj->style->color );
|
|
}
|
|
|
|
rect.left = (int)(obj->dev_x + report->dev_margin_left);
|
|
rect.top = (int)(obj->dev_y + report->ypos - offset_break);
|
|
rect.right = rect.left + (int)obj->dev_w;
|
|
rect.bottom = rect.top + (int)obj->dev_h;
|
|
|
|
switch( obj->alignment )
|
|
{
|
|
case justify4left:
|
|
alignment = DT_LEFT;
|
|
break;
|
|
case justify4right:
|
|
alignment = DT_RIGHT;
|
|
break;
|
|
case justify4center:
|
|
alignment = DT_CENTER;
|
|
break;
|
|
}
|
|
|
|
DrawText( hDC, obj->eval_text, obj->eval_len-1, &rect, DT_WORDBREAK | alignment | DT_NOPREFIX );
|
|
|
|
}
|
|
break;
|
|
|
|
#else
|
|
|
|
case obj4type_text:
|
|
if( report->for_dbf )
|
|
{
|
|
if( obj->field )
|
|
f4assign( obj->field, obj->wintext );
|
|
break;
|
|
}
|
|
output_ptr = obj->wintext;
|
|
break;
|
|
|
|
case obj4type_total:
|
|
if( obj->field && report->for_dbf )
|
|
{
|
|
switch( ((PTOTAL4)obj->data)->total_type )
|
|
{
|
|
case total4lowest:
|
|
f4assign_double( obj->field, ((PTOTAL4)obj->data)->low );
|
|
break;
|
|
|
|
case total4highest:
|
|
f4assign_double( obj->field, ((PTOTAL4)obj->data)->high );
|
|
break;
|
|
|
|
case total4count:
|
|
f4assign_long( obj->field, ((PTOTAL4)obj->data)->count );
|
|
break;
|
|
|
|
case total4sum:
|
|
f4assign_double( obj->field, ((PTOTAL4)obj->data)->total );
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
case obj4type_expr:
|
|
case obj4type_field:
|
|
case obj4type_calc:
|
|
if( report->for_dbf )
|
|
{
|
|
if( !obj->lookahead )
|
|
obj4evaluate( obj );
|
|
if( obj->field )
|
|
switch( f4type(obj->field) )
|
|
{
|
|
case r4str:
|
|
case r4date:
|
|
f4assign( obj->field, obj->eval_text );
|
|
break;
|
|
|
|
case r4log:
|
|
f4assign_char( obj->field, *(obj->eval_text) );
|
|
break;
|
|
|
|
case r4num:
|
|
f4assign_double( obj->field, obj->dval );
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if( !obj->lookahead )
|
|
obj4evaluate( obj );
|
|
|
|
if( obj->eval_text )
|
|
output_ptr = obj->eval_text;
|
|
else
|
|
output_ptr = NULL;
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
#ifndef S4WINDOWS
|
|
|
|
file4seq_write( &hDC->seq_wr, &obj->obj_type_num, sizeof(short) );
|
|
|
|
obj_len = 5*sizeof(long) + 2*sizeof(short);
|
|
switch( obj->obj_type_num )
|
|
{
|
|
case obj4type_text:
|
|
obj_len += strlen(obj->wintext);
|
|
break;
|
|
|
|
case obj4type_frame:
|
|
obj_len += 2;
|
|
break;
|
|
|
|
case obj4type_hline:
|
|
case obj4type_vline:
|
|
break;
|
|
|
|
default:
|
|
obj_len += (obj->eval_len - 1);
|
|
break;
|
|
}
|
|
file4seq_write( &hDC->seq_wr, &obj_len, sizeof(obj_len) );
|
|
|
|
lval = obj->dev_x + report->dev_margin_left;
|
|
file4seq_write( &hDC->seq_wr, &lval, sizeof(lval) );
|
|
lval = obj->dev_y + report->ypos - offset_break;
|
|
file4seq_write( &hDC->seq_wr, &lval, sizeof(lval) );
|
|
file4seq_write( &hDC->seq_wr, &obj->dev_w, sizeof(obj->dev_w) );
|
|
file4seq_write( &hDC->seq_wr, &obj->dev_h, sizeof(obj->dev_h) );
|
|
file4seq_write( &hDC->seq_wr, &obj->alignment, sizeof(obj->alignment) );
|
|
|
|
if( obj->style )
|
|
{
|
|
file4seq_write( &hDC->seq_wr, &obj->style->position, sizeof(obj->style->position) );
|
|
}
|
|
else
|
|
{
|
|
i = 0;
|
|
file4seq_write( &hDC->seq_wr, &i, sizeof(short) );
|
|
}
|
|
|
|
switch( obj->obj_type_num )
|
|
{
|
|
case obj4type_text:
|
|
data_len = strlen(obj->wintext);
|
|
file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
|
|
file4seq_write( &hDC->seq_wr, obj->wintext, (unsigned)data_len );
|
|
break;
|
|
|
|
case obj4type_frame:
|
|
data_len = 2;
|
|
file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
|
|
file4seq_write( &hDC->seq_wr, &obj->display_zero, 1 );
|
|
file4seq_write( &hDC->seq_wr, &obj->alignment, 1 );
|
|
break;
|
|
|
|
case obj4type_hline:
|
|
case obj4type_vline:
|
|
data_len = 0;
|
|
file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
|
|
break;
|
|
|
|
default:
|
|
data_len = obj->eval_len - 1;
|
|
file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
|
|
file4seq_write( &hDC->seq_wr, obj->eval_text, (unsigned)data_len );
|
|
break;
|
|
}
|
|
|
|
#endif
|
|
|
|
obj_on = (OBJ4 *)l4first( &obj->contained );
|
|
while( obj_on )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
report4output_object( obj_on, hDC );
|
|
#else
|
|
report4output_object( obj_on, hDC );
|
|
#endif
|
|
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
GROUP4 * S4FUNCTION report4calc_first_change_group( REPORT4 *report )
|
|
{
|
|
GROUP4 *group_on, *change_group = NULL;
|
|
char *ptr ;
|
|
int len ;
|
|
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
if( group_on->title_summary )
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
while( group_on )
|
|
{
|
|
if( !group_on->reset_expression && !change_group )
|
|
change_group = group_on;
|
|
|
|
if( group_on->reset_expression )
|
|
{
|
|
len = expr4vary( group_on->reset_expression, &ptr );
|
|
if( memcmp(group_on->last_reset_value, ptr, len) != 0 && !change_group )
|
|
change_group = group_on;
|
|
|
|
memcpy( group_on->last_reset_value, ptr, len );
|
|
}
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
|
|
return change_group;
|
|
}
|
|
|
|
int report4alloc_records( REPORT4 *report )
|
|
{
|
|
RELATE4 *relate_on;
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( report->code_base->error_code < 0 )
|
|
return -1;
|
|
|
|
relate_on = &report->relate->relation->relate;
|
|
|
|
while(relate_on)
|
|
{
|
|
if( !relate_on->old_record )
|
|
relate_on->old_record =
|
|
(char *)u4alloc_free( report->code_base, relate_on->data->record_width + 1 );
|
|
|
|
if( relate_on->old_record == NULL )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
relate4next(&relate_on);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int report4make_old_rec( REPORT4 *report )
|
|
{
|
|
RELATE4 *relate;
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( report->code_base->error_code < 0 )
|
|
return -1;
|
|
|
|
relate = &report->relate->relation->relate;
|
|
|
|
while(relate)
|
|
{
|
|
memcpy(relate->old_record,relate->data->record,relate->data->record_width);
|
|
|
|
relate4next(&relate);
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int report4swap_old_rec( REPORT4 *report )
|
|
{
|
|
RELATE4 *relate_on;
|
|
char *tempptr;
|
|
int i;
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( report->code_base->error_code < 0 )
|
|
return -1;
|
|
|
|
relate_on = &report->relate->relation->relate;
|
|
|
|
while (relate_on )
|
|
{
|
|
tempptr = relate_on->data->record;
|
|
|
|
relate_on->data->record = relate_on->old_record;
|
|
relate_on->old_record = tempptr;
|
|
|
|
if ( relate_on->data->fields_memo != 0 )
|
|
{
|
|
for ( i = 0; i < relate_on->data->n_fields_memo ; i++ )
|
|
relate_on->data->fields_memo[i].status = 1;
|
|
}
|
|
relate4next(&relate_on);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int report4output_area_break( AREA4 *area )
|
|
{
|
|
int test, flag;
|
|
OBJ4 *obj_on;
|
|
|
|
if( !area->allow_pagebreaks )
|
|
return 0;
|
|
|
|
test = (int)(area->report->disp_bottom - area->report->ypos + 1);
|
|
flag = 0;
|
|
|
|
if( area->report->break_height )
|
|
test += area->report->break_height;
|
|
|
|
while( !flag && test > 0 )
|
|
{
|
|
flag = 1;
|
|
test--;
|
|
obj_on = (OBJ4 *)l4first( &area->objects );
|
|
while( obj_on )
|
|
{
|
|
if( test >= obj_on->dev_y && test <= obj_on->dev_y+obj_on->dev_h )
|
|
{
|
|
flag = 0;
|
|
test = (int)obj_on->dev_y;
|
|
obj_on = NULL;
|
|
}
|
|
else
|
|
obj_on = (OBJ4 *)l4next( &area->objects, obj_on );
|
|
}
|
|
}
|
|
|
|
return test;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
void report4output_pgheader(REPORT4 *report, HDC hDC )
|
|
#else
|
|
void report4output_pgheader(report, hDC )
|
|
REPORT4 *report ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
void report4output_pgheader(REPORT4 *report, PAGE4 *hDC )
|
|
#else
|
|
void report4output_pgheader(report, hDC )
|
|
REPORT4 *report ;
|
|
PAGE4 *hDC ;
|
|
#endif
|
|
#endif
|
|
{
|
|
AREA4 *area_on;
|
|
short broken;
|
|
|
|
broken = report->broken;
|
|
report->broken = 0;
|
|
|
|
area_on = (AREA4 *)l4first( &report->page_header_footer->header_areas );
|
|
while( area_on )
|
|
{
|
|
report4output_area( area_on, hDC, 1 );
|
|
area_on = (AREA4 *)l4next( &report->page_header_footer->header_areas, area_on );
|
|
|
|
}
|
|
report->broken = broken;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
void report4output_pgfooter(REPORT4 *report, HDC hDC )
|
|
#else
|
|
void report4output_pgfooter(report, hDC )
|
|
REPORT4 *report ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
void report4output_pgfooter(REPORT4 *report, PAGE4 *hDC )
|
|
#else
|
|
void report4output_pgfooter(report, hDC )
|
|
REPORT4 *report ;
|
|
PAGE4 *hDC ;
|
|
#endif
|
|
#endif
|
|
{
|
|
AREA4 *area_on;
|
|
short broken;
|
|
|
|
broken = report->broken;
|
|
report->broken = 0;
|
|
|
|
report->ypos = report->disp_bottom;
|
|
area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas );
|
|
while( area_on )
|
|
{
|
|
report4output_area( area_on, hDC, 1 );
|
|
area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on );
|
|
}
|
|
report->broken = broken;
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
void report4output_repeat_headers(REPORT4 *report, HDC hDC, GROUP4 *group_first )
|
|
#else
|
|
void report4output_repeat_headers(report, hDC, group_first )
|
|
REPORT4 *report ;
|
|
HDC hDC ;
|
|
GROUP4 *group_first ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
void report4output_repeat_headers(REPORT4 *report, PAGE4 *hDC, GROUP4 *group_first )
|
|
#else
|
|
void report4output_repeat_headers(report, hDC, group_first )
|
|
REPORT4 *report ;
|
|
PAGE4 *hDC ;
|
|
GROUP4 *group_first ;
|
|
#endif
|
|
#endif
|
|
{
|
|
GROUP4 *group_on;
|
|
|
|
if( !report->first )
|
|
return;
|
|
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
while( group_on != group_first )
|
|
{
|
|
if( group_on->repeat_header )
|
|
report4output_group_headers( group_on, hDC, group_first, 0 );
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
}
|
|
|
|
#ifdef S4WINDOWS
|
|
#ifdef __cplusplus
|
|
void report4output_swapped_footer( GROUP4 *group, HDC hDC )
|
|
#else
|
|
void report4output_swapped_footer(group, hDC )
|
|
GROUP4 *group ;
|
|
HDC hDC ;
|
|
#endif
|
|
#else
|
|
#ifdef __cplusplus
|
|
void report4output_swapped_footer( GROUP4 *group, PAGE4 *hDC )
|
|
#else
|
|
void report4output_swapped_footer(group, hDC )
|
|
GROUP4 *group ;
|
|
PAGE4 *hDC ;
|
|
#endif
|
|
#endif
|
|
{
|
|
REPORT4 *report = group->report;
|
|
AREA4 *area_on;
|
|
OBJ4 *obj_on;
|
|
int suppress;
|
|
long theight;
|
|
|
|
if( report->page_header_footer->footer_areas.n_link > 0 )
|
|
report->ypos = report->disp_bottom;
|
|
else
|
|
{
|
|
theight = 0;
|
|
area_on = (AREA4 *)l4first( &group->footer_areas );
|
|
while( area_on )
|
|
{
|
|
if( !area_on->suppression_condition || expr4true(area_on->suppression_condition) )
|
|
theight += area_on->height_dev;
|
|
area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
|
|
}
|
|
report->ypos = report->disp_bottom - theight;
|
|
}
|
|
|
|
area_on = (AREA4 *)l4first( &group->footer_areas );
|
|
while( area_on )
|
|
{
|
|
suppress = 0;
|
|
if( area_on->suppression_condition )
|
|
{
|
|
suppress = expr4true( area_on->suppression_condition );
|
|
}
|
|
|
|
if( suppress )
|
|
{
|
|
area_on = (PAREA4)l4next( &group->footer_areas, area_on );
|
|
continue;
|
|
}
|
|
|
|
obj_on = (OBJ4 *)l4first( &area_on->objects );
|
|
while( obj_on )
|
|
{
|
|
if( report->ypos + obj_on->dev_y + obj_on->dev_h <
|
|
report->dev_page_height - report->dev_margin_bottom )
|
|
{
|
|
report4output_object( obj_on, hDC );
|
|
}
|
|
|
|
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
|
|
}
|
|
report->ypos += area_on->height_dev;
|
|
area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
|
|
}
|
|
}
|
|
|
|
int S4FUNCTION report4pageInit( PREPORT4 report )
|
|
{
|
|
int rc, i;
|
|
int len;
|
|
TOTAL4 *total_on;
|
|
GROUP4 *group_on;
|
|
char *ptr;
|
|
PSTYLE4 style;
|
|
#ifndef S4WINDOWS
|
|
char name_buf[13];
|
|
int tsafety;
|
|
#endif
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
relate4skip_enable( report->relate, 1 );
|
|
|
|
#ifdef S4WINDOWS
|
|
report->hWnd2 = 0;
|
|
#ifdef S4WIN32
|
|
report->hWnd2 = CreateWindowEx( WS_EX_TRANSPARENT, "MouseEat", "EatInput",
|
|
WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE,
|
|
0, 0, 5, 5, report->hWnd, NULL,
|
|
(HINSTANCE)GetWindowLong(report->hWnd, GWL_HINSTANCE), NULL );
|
|
#else
|
|
report->hWnd2 = CreateWindowEx( WS_EX_TRANSPARENT, "MouseEat", "EatInput",
|
|
WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE,
|
|
0, 0, 5, 5, report->hWnd, NULL,
|
|
(HINSTANCE)GetWindowWord(report->hWnd, GWW_HINSTANCE), NULL );
|
|
#endif
|
|
|
|
if( report->hWnd2 )
|
|
{
|
|
#ifdef S4WIN32
|
|
SetClassLong( report->hWnd2, GCL_HCURSOR, 0L );
|
|
#else
|
|
SetClassWord( report->hWnd2, GCW_HCURSOR, 0 );
|
|
#endif
|
|
SetCursor( LoadCursor(NULL,IDC_WAIT) );
|
|
SetCapture( report->hWnd2 );
|
|
}
|
|
#endif
|
|
|
|
rc = relate4top( report->relate );
|
|
switch( rc )
|
|
{
|
|
case r4terminate:
|
|
case r4locked:
|
|
case r4eof:
|
|
break;
|
|
}
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
report->tdone = 0;
|
|
report->page_no = report->page_count = 0;
|
|
|
|
if( (report4alloc_records( report )) < 0 )
|
|
return -1;
|
|
|
|
i = 0;
|
|
style = (PSTYLE4)l4first( &report->styles );
|
|
while( style )
|
|
{
|
|
style->position = i;
|
|
i++;
|
|
style = (PSTYLE4)l4next( &report->styles, style );
|
|
}
|
|
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
while( group_on )
|
|
{
|
|
if( group_on->title_summary )
|
|
group_on->tsdone = 0;
|
|
|
|
group_on->reset_flag = 0;
|
|
if( group_on->last_reset_value )
|
|
{
|
|
u4free( group_on->last_reset_value );
|
|
group_on->last_reset_value = NULL;
|
|
}
|
|
if( group_on->reset_expression )
|
|
{
|
|
len = expr4vary( group_on->reset_expression, &ptr );
|
|
group_on->last_reset_value = (char *)u4alloc_free( report->code_base, len + 1 );
|
|
if( group_on->last_reset_value )
|
|
memcpy( group_on->last_reset_value, ptr, len );
|
|
}
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
|
|
total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
|
|
while( total_on )
|
|
{
|
|
if( total_on->last_add_value )
|
|
{
|
|
u4free( total_on->last_add_value );
|
|
total_on->last_add_value = NULL;
|
|
}
|
|
|
|
if( total_on->add_condition )
|
|
{
|
|
total_on->last_add_value =
|
|
(char *)u4alloc_free( report->code_base, expr4len(total_on->add_condition)+1 );
|
|
}
|
|
|
|
total_on->donce = 0;
|
|
|
|
if( total_on->last_reset_value )
|
|
{
|
|
u4free( total_on->last_reset_value );
|
|
total_on->last_reset_value = NULL;
|
|
}
|
|
|
|
if( total_on->reset_expression )
|
|
{
|
|
total_on->last_reset_value = (char *)u4alloc_free( report->code_base, expr4len(total_on->reset_expression)+1 );
|
|
}
|
|
|
|
total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
|
|
}
|
|
|
|
report4check_lookahead( report );
|
|
|
|
report4check_display_once( report );
|
|
|
|
report->group_on = (GROUP4 *)l4first( &report->groups );
|
|
report->group_first = NULL;
|
|
report->area_on = NULL;
|
|
report->in_header = 1;
|
|
report->end_report = 0;
|
|
report->code_base->pageno = 0;
|
|
report->first = 0;
|
|
|
|
total_on = (TOTAL4 *) l4first( &report->code_base->total_list );
|
|
while( total_on )
|
|
{
|
|
total4value_reset( total_on );
|
|
total_on = (TOTAL4 *) l4next( &report->code_base->total_list, total_on );
|
|
}
|
|
|
|
#ifndef S4WINDOWS
|
|
report4calc_obj_dev( report );
|
|
report->dev_page_width = report->report_width + report->margin_right + report->margin_left;
|
|
report->dev_page_height = report->report_height + report->margin_top + report->margin_bottom;
|
|
|
|
if( report->output_handle > 0 )
|
|
{
|
|
tsafety = report->code_base->safety;
|
|
report->code_base->safety = 0;
|
|
if( !report->report_file_name || *report->report_file_name =='\0' )
|
|
strcpy( name_buf, "crep2.buf" );
|
|
else
|
|
{
|
|
u4name_piece( name_buf, sizeof(name_buf), report->report_file_name, 0, 1 );
|
|
u4name_ext( name_buf, sizeof(name_buf), "buf", 1 );
|
|
}
|
|
if( file4create( &report->page_buf.file_buf, report->code_base, name_buf, 1 ) < 0 )
|
|
{
|
|
e4describe( report->code_base, e4rep_out, E4_REP_PFILE, 0, 0 );
|
|
return -1;
|
|
}
|
|
report->code_base->safety = tsafety;
|
|
file4seq_write_init( &report->page_buf.seq_wr, &report->page_buf.file_buf, 0L,
|
|
report->page_buf.fmem_buf, sizeof(report->page_buf.fmem_buf) );
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4pageFree( PREPORT4 report )
|
|
{
|
|
char name_buf[512];
|
|
|
|
if( !report )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( report->page_buf.object.info != NULL )
|
|
{
|
|
u4free( report->page_buf.object.info );
|
|
report->page_buf.object.info = NULL;
|
|
report->page_buf.object.info_len = 0;
|
|
}
|
|
|
|
if( report->page_buf.mem_buf != NULL )
|
|
{
|
|
u4free( report->page_buf.mem_buf );
|
|
report->page_buf.mem_buf = NULL;
|
|
}
|
|
|
|
if( report->page_buf.file_buf.name != NULL )
|
|
{
|
|
strcpy( name_buf, report->page_buf.file_buf.name );
|
|
file4close( &report->page_buf.file_buf );
|
|
u4remove( name_buf );
|
|
}
|
|
|
|
report->page_buf.info_buf_len = 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
POBJECT4 S4FUNCTION report4pageObjNext( PREPORT4 report )
|
|
{
|
|
long obj_size;
|
|
POBJECT4 object;
|
|
FILE4SEQ_READ *file_buf;
|
|
|
|
if( !report )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if( report->page_buf.file_buf.name == NULL )
|
|
{
|
|
e4describe( report->code_base, e4rep_out, E4_REP_NOBUFPAGE, (char *)0, (char *)0 );
|
|
return NULL;
|
|
}
|
|
|
|
if( !report->page_buf.first_read )
|
|
file4seq_read_init( &report->page_buf.seq_rd, &report->page_buf.file_buf,
|
|
0L, report->page_buf.rmem_buf,
|
|
sizeof(report->page_buf.rmem_buf) );
|
|
|
|
file_buf = &report->page_buf.seq_rd;
|
|
|
|
object = &report->page_buf.object;
|
|
|
|
if( (file4seq_read( file_buf, &object->objtype, sizeof( object->objtype) )) == 0 )
|
|
return NULL;
|
|
|
|
file4seq_read( file_buf, &obj_size, sizeof(obj_size) );
|
|
file4seq_read( file_buf, &object->x, sizeof(object->x) );
|
|
file4seq_read( file_buf, &object->y, sizeof(object->y) );
|
|
file4seq_read( file_buf, &object->w, sizeof(object->w) );
|
|
file4seq_read( file_buf, &object->h, sizeof(object->h) );
|
|
|
|
file4seq_read( file_buf, &object->alignment, sizeof(object->alignment) );
|
|
|
|
file4seq_read( file_buf, &object->style_index, sizeof(object->style_index) );
|
|
|
|
file4seq_read( file_buf, &object->info_len, sizeof(object->info_len) );
|
|
|
|
if( report->page_buf.info_buf_len < object->info_len )
|
|
{
|
|
if( object->info != NULL )
|
|
{
|
|
u4free( object->info );
|
|
object->info = NULL;
|
|
}
|
|
|
|
object->info = (char *)u4alloc_free( report->code_base, object->info_len+1 );
|
|
if( !object->info )
|
|
{
|
|
e4describe( report->code_base, e4rep_out, E4_REP_OBJDATAAL, (char *)0, (char *)0 );
|
|
return NULL;
|
|
}
|
|
|
|
memset( object->info, 0, (int)report->page_buf.info_buf_len );
|
|
report->page_buf.info_buf_len = object->info_len + 1;
|
|
if( object->info_len > 0 )
|
|
file4seq_read( file_buf, object->info, (unsigned)object->info_len );
|
|
}
|
|
else
|
|
{
|
|
memset( object->info, 0, (int)report->page_buf.info_buf_len );
|
|
if( object->info_len > 0 )
|
|
file4seq_read( file_buf, object->info, (unsigned)object->info_len );
|
|
}
|
|
|
|
return object;
|
|
}
|
|
|
|
POBJECT4 S4FUNCTION report4pageObjFirst( PREPORT4 report )
|
|
{
|
|
if( !report )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if( report->page_buf.file_buf.name == NULL )
|
|
{
|
|
e4describe( report->code_base, e4rep_out, E4_REP_NOBUFPAGE, (char *)0, (char *)0 );
|
|
return NULL;
|
|
}
|
|
|
|
file4seq_read_init( &report->page_buf.seq_rd, &report->page_buf.file_buf,
|
|
0L, report->page_buf.rmem_buf,
|
|
sizeof(report->page_buf.rmem_buf) );
|
|
|
|
report->page_buf.first_read = 1;
|
|
return report4pageObjNext( report );
|
|
|
|
}
|
|
|
|
#ifndef S4WINDOWS
|
|
void r4place_text( OBJECT4 *object, char *buffer, int lw, char *sbuffer )
|
|
{
|
|
int ox, oy, oh, ow, lc;
|
|
int offset, length;
|
|
char *pbuf, *line, *sbuf, *bpt;
|
|
|
|
ox = (int)(((float)object->x/100.0)+0.5);
|
|
oy = (int)(((float)object->y/1000.0)*6.0+0.5);
|
|
oh = (int)(((float)object->h/1000.0)*6.0+0.5);
|
|
ow = (int)(((float)object->w/100.0)+0.5);
|
|
|
|
pbuf = (buffer + ox + oy * lw );
|
|
if( sbuffer )
|
|
sbuf = (sbuffer + ox + oy * lw );
|
|
|
|
if( oh == 1 )
|
|
{
|
|
if( ow >= object->info_len && ox + ow <= lw )
|
|
{
|
|
offset = 0;
|
|
if( object->alignment == justify4right )
|
|
offset = ow - (int)object->info_len;
|
|
|
|
if( object->alignment == justify4center )
|
|
offset = (ow - (int)object->info_len)/2;
|
|
|
|
|
|
memcpy( pbuf + offset, object->info, (int)object->info_len );
|
|
if( sbuffer )
|
|
memset( sbuf + offset, object->style_index, (int)object->info_len );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if( ox + ow <= lw )
|
|
length = ow;
|
|
else
|
|
length = lw - ox;
|
|
memcpy( pbuf, object->info, length );
|
|
if( sbuffer )
|
|
memset( sbuf, object->style_index, length );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lc = length = 0;
|
|
if( ox + ow <= lw )
|
|
length = ow;
|
|
else
|
|
length = lw - ox;
|
|
|
|
line = strtok( (char *)object->info, "\r\n" );
|
|
while( line && lc < oh )
|
|
{
|
|
if( strlen(line) > (unsigned)length )
|
|
{
|
|
while( strlen(line) > (unsigned)length && lc < oh )
|
|
{
|
|
bpt = line + length;
|
|
while( bpt != line && *bpt != ' ' )
|
|
bpt--;
|
|
|
|
if( bpt == line )
|
|
bpt = line + length;
|
|
|
|
memcpy( pbuf, line, (bpt-line) );
|
|
if( sbuffer )
|
|
{
|
|
memset( sbuf, object->style_index, (bpt-line) );
|
|
sbuf += lw;
|
|
}
|
|
lc++;
|
|
line += (bpt-line);
|
|
if( *line == ' ' )
|
|
line++;
|
|
pbuf += lw;
|
|
}
|
|
memcpy( pbuf, line, strlen(line) );
|
|
if( sbuffer )
|
|
{
|
|
memset( sbuf, object->style_index, strlen(line) );
|
|
sbuf += lw;
|
|
}
|
|
pbuf += lw;
|
|
lc++;
|
|
|
|
}
|
|
else
|
|
{
|
|
offset = 0;
|
|
if( object->alignment == justify4right )
|
|
offset = length - strlen(line);
|
|
if( object->alignment == justify4center )
|
|
offset = (length - strlen(line))/2;
|
|
|
|
memcpy( pbuf + offset, line, strlen(line) );
|
|
if( sbuffer )
|
|
{
|
|
memset( sbuf + offset, object->style_index, strlen(line) );
|
|
sbuf += lw;
|
|
}
|
|
lc++;
|
|
pbuf += lw;
|
|
}
|
|
line = strtok( NULL, "\r\n" );
|
|
}
|
|
}
|
|
}
|
|
|
|
int report4output_general_dos( PREPORT4 report )
|
|
{
|
|
OBJECT4 *object;
|
|
char *page_buf=NULL, *style_buf=NULL;
|
|
int ph, pw, old_style, new_style, offset;
|
|
long lpw, lph, i, j;
|
|
PSTYLE4 style;
|
|
|
|
report4pageSizeGet( report, &lpw, &lph );
|
|
pw = (int)(((float)lpw/100.0)+0.5);
|
|
ph = (int)(((float)lph/1000.0)*6.0+0.5);
|
|
|
|
page_buf = (char *)u4alloc_free( report->code_base, (pw*ph) );
|
|
if( !page_buf )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if( report->use_styles )
|
|
{
|
|
style_buf = (char *)u4alloc_free( report->code_base, (pw*ph) );
|
|
if( !style_buf )
|
|
return -1;
|
|
memset( style_buf, 0, (pw*ph) );
|
|
}
|
|
memset( page_buf, ' ', (pw*ph) );
|
|
|
|
object = report4pageObjFirst( report );
|
|
|
|
while( object )
|
|
{
|
|
switch( object->objtype )
|
|
{
|
|
case obj4type_field:
|
|
case obj4type_expr:
|
|
case obj4type_total:
|
|
case obj4type_calc:
|
|
case obj4type_text:
|
|
if( report->use_styles )
|
|
r4place_text( object, page_buf, pw, style_buf );
|
|
else
|
|
r4place_text( object, page_buf, pw, NULL );
|
|
break;
|
|
}
|
|
|
|
|
|
object = report4pageObjNext( report );
|
|
}
|
|
|
|
style = NULL;
|
|
old_style = 0;
|
|
for( i = 0; i < ph; i++ )
|
|
{
|
|
for( j = 0; j < pw; j++ )
|
|
{
|
|
if( report->use_styles )
|
|
{
|
|
offset = (int)(i*pw + j);
|
|
#ifdef S4UNIX
|
|
memcpy( &new_style, style_buf+offset, sizeof(new_style) ) ;
|
|
#else
|
|
new_style = (int)(*(style_buf+offset));
|
|
#endif
|
|
if( new_style != old_style )
|
|
{
|
|
if( style )
|
|
write( report->output_handle, style->codes_after, style->codes_after_len );
|
|
style = style4index( report, new_style );
|
|
if( style )
|
|
write( report->output_handle, style->codes_before, style->codes_before_len );
|
|
old_style = new_style;
|
|
}
|
|
}
|
|
write( report->output_handle, page_buf + (i*pw) + j, 1 );
|
|
}
|
|
if( i < ph - 1 )
|
|
write( report->output_handle, "\r\n", 2 );
|
|
}
|
|
if( style )
|
|
write( report->output_handle, style->codes_after, style->codes_after_len );
|
|
write( report->output_handle, "\f", 1 );
|
|
|
|
if( page_buf ) u4free( page_buf );
|
|
if( style_buf ) u4free( style_buf );
|
|
return 0;
|
|
}
|
|
|
|
int report4output_screen_dos( PREPORT4 report )
|
|
{
|
|
OBJECT4 *object;
|
|
char *page_buf=NULL;
|
|
int i, ph, pw;
|
|
|
|
|
|
pw = (int)(((float)report->dev_page_width/100.0)+0.5);
|
|
ph = (int)(((float)report->dev_page_height/1000.0)*6.0+0.5);
|
|
|
|
page_buf = (char *)u4alloc_free( report->code_base, (pw*ph) );
|
|
if( !page_buf )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
memset( page_buf, ' ', (pw*ph) );
|
|
|
|
object = report4pageObjFirst( report );
|
|
|
|
while( object )
|
|
{
|
|
switch( object->objtype )
|
|
{
|
|
case obj4type_field:
|
|
case obj4type_expr:
|
|
case obj4type_total:
|
|
case obj4type_calc:
|
|
case obj4type_text:
|
|
r4place_text( object, page_buf, pw, NULL );
|
|
break;
|
|
}
|
|
|
|
|
|
object = report4pageObjNext( report );
|
|
}
|
|
for( i = 0; i < ph; i++ )
|
|
{
|
|
write( 1, page_buf+(i*pw), pw-1 );
|
|
if( i < ph-1 )
|
|
write( 1, "\r\n", 2 );
|
|
}
|
|
|
|
#ifdef S4UNIX
|
|
if( getchar() == 0x1b )
|
|
#else
|
|
#ifndef S4PASCAL_DOS
|
|
if( getch() == 0x1b )
|
|
#endif
|
|
#endif
|
|
return -1;
|
|
|
|
write( 1, "\r\n", 2 );
|
|
if( page_buf ) u4free( page_buf );
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4do( REPORT4 *report )
|
|
{
|
|
int rc;
|
|
|
|
if( report4pageInit( report ) < 0 )
|
|
return -1;
|
|
|
|
while( (rc = report4generatePage( report )) >= 0 )
|
|
{
|
|
if( rc == 2 )
|
|
break;
|
|
|
|
if( report->output_handle == 1 )
|
|
{
|
|
if( report4output_screen_dos( report ) < 0 )
|
|
break;
|
|
}
|
|
else
|
|
if( report->output_handle > 1 )
|
|
{
|
|
if( report4output_general_dos( report ) < 0 )
|
|
break;
|
|
}
|
|
}
|
|
|
|
report4pageFree( report );
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
|
|
|