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
		
			
				
	
	
		
			1383 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1383 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* r4report.c   (c)Copyright Sequiter Software Inc., 1991-1994.  All rights reserved. */
 | |
| #include "d4all.h"
 | |
| #ifdef S4WINDOWS
 | |
| #include <commdlg.h>
 | |
| #endif
 | |
| 
 | |
| #define ABS(x)                ((x<0)?-1*(x):x)
 | |
| 
 | |
| void    S4FUNCTION expr4calc_reset( CODE4 S4PTR * ) ;
 | |
| 
 | |
| /* Function: report4index_type()
 | |
|    PARAMETERS: none
 | |
|    DESCRIPTION: used by the CR executable to determine the index
 | |
|    RETURNS: an integer value, defined in r4report.h, specifying the index */
 | |
| 
 | |
| int S4FUNCTION report4index_type()
 | |
| {
 | |
| #ifdef S4MDX
 | |
|   return r4mdx;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4NDX
 | |
|   return r4ndx;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CLIPPER
 | |
|   return r4cli;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4FOX
 | |
|   return r4fox;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| /* FOR A DESCRIPTION SEE THE CODEREPORTER MANUAL */
 | |
| PREPORT4 S4FUNCTION  report4init( RELATE4 *relate )
 | |
| {
 | |
|   REPORT4 *r4 ;
 | |
|   CODE4 *code_base;
 | |
| #ifdef S4WINDOWS
 | |
|   LOGFONT lfont;
 | |
| #endif
 | |
| 
 | |
|   if( !relate )
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   code_base = relate->code_base;
 | |
| 
 | |
|   /* you can only have one report open at a time */
 | |
|   if( code_base->num_reports != 0 )
 | |
|   {
 | |
|     e4describe( code_base, e4report, E4_REP_ONE, 0, 0 );
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* allocate the REPORT4 structure */
 | |
|   r4 =  (REPORT4 *) u4alloc_free( code_base, sizeof(REPORT4) ) ;
 | |
|   if ( r4 == 0 )
 | |
|   {
 | |
|     e4describe( code_base, e4report, E4_REP_REPALLOC, 0, 0 );
 | |
|     return NULL ;
 | |
|   }
 | |
| 
 | |
|   /* reset the list members */
 | |
|   memset( &r4->groups, 0, sizeof(r4->groups) );
 | |
|   memset( &r4->styles, 0, sizeof(r4->styles) );
 | |
|   memset( &r4->active_objects, 0, sizeof(r4->active_objects) );
 | |
|   memset( &r4->obj_type_info, 0, sizeof(r4->obj_type_info) );
 | |
| 
 | |
|   /* set the code_base, relate, and default_date_format members */
 | |
|   r4->code_base =  code_base ;
 | |
|   r4->relate =  relate ;
 | |
| #ifdef S4WINDOWS
 | |
|   lstrcpy( r4->default_date_format, code_base->date_format );
 | |
| #else
 | |
|   strcpy( r4->default_date_format, code_base->date_format );
 | |
| #endif
 | |
| 
 | |
|   /* turn off auto_open of index files */
 | |
|   r4->code_base->auto_open = 0;
 | |
| 
 | |
|   /* set the default margin and page size */
 | |
|   r4->margin_left = 250;
 | |
|   r4->margin_right = 250;
 | |
|   r4->report_width =  8000 ;
 | |
|   r4->report_height = 11000;
 | |
| 
 | |
|   /* set the default symbols */
 | |
|   r4->decimal_point =  '.' ;
 | |
|   r4->thousand_separator = ',' ;
 | |
|   r4->currency_symbol[0] = '$';
 | |
|   r4->currency_symbol[1] = '\0';
 | |
| 
 | |
|   /* by default output is to the screen */
 | |
|   r4->output_code = r4->output_handle = 1;
 | |
| 
 | |
|   /* default units of display are points: applys to the CR executable */
 | |
|   r4->units =  UNIT4POINTS ;
 | |
| 
 | |
|   /* no grid by default: applys to the CR executable */
 | |
|   r4->sensitivity_x = r4->sensitivity_y = 0;
 | |
| 
 | |
|   /* by default save report with pathnames */
 | |
|   r4->pathnames = 1;
 | |
| 
 | |
|   /* create the default style */
 | |
| #ifdef S4WINDOWS
 | |
|   /* if not being called by the CR executable */
 | |
|   if( !code_base->s4cr2 )
 | |
|   {
 | |
|     memset( &lfont, 0, sizeof(R4LOGFONT) );
 | |
|     strcpy(lfont.lfFaceName,"MS Serif" );
 | |
| #ifdef S4GERMAN
 | |
|     style4create( (PREPORT4)r4, (PR4LOGFONT)&lfont, (char *)"Normal", (R4COLORREF)NULL, (int)10 );
 | |
| #else
 | |
|     style4create( (PREPORT4)r4, (PR4LOGFONT)&lfont, (char *)"Plain Text", (R4COLORREF)NULL, (int)10 );
 | |
| #endif
 | |
|     r4->active_style = (PSTYLE4)l4first( &r4->styles );
 | |
|   }
 | |
| #else
 | |
| #ifdef S4GERMAN
 | |
|   style4create( r4, "Normal", 0, NULL, 0, NULL );
 | |
| #else
 | |
|   style4create( r4, "Plain Text", 0, NULL, 0, NULL );
 | |
| #endif
 | |
|   r4->active_style = (PSTYLE4)l4first( &r4->styles );
 | |
| #endif
 | |
| 
 | |
|   /* create the title/summary and page header/footer groups */
 | |
|   group4create_title_summary( r4 );
 | |
|   group4create_pgheader_pgfooter( r4 );
 | |
| 
 | |
|   if( r4 )
 | |
|     r4->code_base->num_reports = 1;
 | |
|   else
 | |
|     r4->code_base->num_reports = 0;
 | |
| 
 | |
|   return r4 ;
 | |
| }
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* frees the windows font associated with the object by releasing the
 | |
|    font from the objects windows device context.  This function is
 | |
|    only used through the report4free_styles fctn */
 | |
| void report4set_obj_font_free( OBJ4 *obj )
 | |
| {
 | |
|   OBJ4 *obj_on;
 | |
|   HDC hDC;
 | |
| 
 | |
|   obj_on = (OBJ4 *)l4first( &obj->contained );
 | |
|   while( obj_on )
 | |
|   {
 | |
|     report4set_obj_font_free( obj_on );
 | |
|     obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
 | |
|   }
 | |
| 
 | |
|   hDC = GetDC( obj->hWnd );
 | |
|   SelectObject( hDC, GetStockObject(SYSTEM_FONT) );
 | |
|   ReleaseDC( obj->hWnd, hDC );
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| void report4free_styles( REPORT4 *report )
 | |
| {
 | |
| #ifdef S4WINDOWS
 | |
|   GROUP4 *group_on;
 | |
|   AREA4 *area_on;
 | |
|   OBJ4 *obj_on;
 | |
| #endif
 | |
|   STYLE4 *style_on, *style_next;
 | |
| 
 | |
|   /* if this is a report in windows de-select the font from the device context
 | |
|      of every object */
 | |
| #ifdef S4WINDOWS
 | |
|   if( report->page_header_footer )
 | |
|   {
 | |
|     area_on = (AREA4 *)l4first( &report->page_header_footer->header_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
|         report4set_obj_font_free( obj_on );
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &report->page_header_footer->header_areas, area_on );
 | |
|     }
 | |
| 
 | |
|     area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
|         report4set_obj_font_free( obj_on );
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on );
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   group_on = (GROUP4 *)l4first( &report->groups );
 | |
|   while( group_on )
 | |
|   {
 | |
|     area_on = (AREA4 *)l4first( &group_on->header_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
|         report4set_obj_font_free( obj_on );
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &group_on->header_areas, area_on );
 | |
|     }
 | |
| 
 | |
|     area_on = (AREA4 *)l4first( &group_on->footer_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
|         report4set_obj_font_free( obj_on );
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on );
 | |
|     }
 | |
|     group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   /* free the STYLE4 structures in the style list */
 | |
|   style_on = (STYLE4 *)l4first( &report->styles );
 | |
|   while( style_on )
 | |
|   {
 | |
|     style_next = (STYLE4 *)l4next( &report->styles, style_on );
 | |
|     style4free( report, style_on );
 | |
|     style_on = style_next;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /* SEE the CODEREPORTER MANUAL FOR A DESCRIPTION */
 | |
| void S4FUNCTION   report4free( REPORT4 *r4, int free_relate, int close_files )
 | |
| {
 | |
|   GROUP4 *group_on, *group_next;
 | |
|   RELATE4 *relate;
 | |
|   POUT4OBJ o4obj;
 | |
| 
 | |
|   if ( r4 == 0 )  return ;
 | |
| 
 | |
|   if( r4->code_base->num_reports != 1 )
 | |
|   {
 | |
|     e4describe( r4->code_base, e4report, E4_REP_NONE, 0, 0 ) ;
 | |
|   }
 | |
| 
 | |
|   r4->code_base->num_reports = 0 ;
 | |
| 
 | |
|   /* free the report name and file_name */
 | |
|   if( r4->report_name )
 | |
|     u4free( r4->report_name );
 | |
| 
 | |
|   if( r4->report_file_name )
 | |
|     u4free( r4->report_file_name );
 | |
| 
 | |
|   /* free the reports styles */
 | |
|   report4free_styles( r4 );
 | |
| 
 | |
|   /* free the page header/footer group */
 | |
|   if( r4->page_header_footer )
 | |
|   {
 | |
|     group4free( r4->page_header_footer );
 | |
|     r4->page_header_footer = NULL;
 | |
|   }
 | |
| 
 | |
|   /* free all the other groups */
 | |
|   group_on = (GROUP4 *)l4first( &r4->groups );
 | |
|   while( group_on )
 | |
|   {
 | |
|     group_next = (GROUP4 *)l4next( &r4->groups, group_on );
 | |
|     group4free( group_on );
 | |
|     group_on = group_next;
 | |
|   }
 | |
| 
 | |
|   /* free the additional record buffers in the DATA4 structures in the relation
 | |
|    */
 | |
|   relate = r4->relate;
 | |
|   while( relate )
 | |
|   {
 | |
|     if( relate->old_record )
 | |
|     {
 | |
|       u4free( relate->old_record );
 | |
|       relate->old_record = NULL;
 | |
|     }
 | |
|     relate4next( &relate );
 | |
|   }
 | |
| 
 | |
|   /* if the free relate flag was set, free the relate */
 | |
|   if (free_relate)
 | |
|     relate4free(r4->relate, close_files);
 | |
| 
 | |
|   /* free the printer name */
 | |
|   if( r4->printer_name )
 | |
|     u4free( r4->printer_name );
 | |
| 
 | |
|   /* free all calculations/totals in the calc list */
 | |
|   expr4calc_reset( r4->code_base ) ;
 | |
| 
 | |
|   /* free up the memory pools for totals and calcs */
 | |
|   mem4release( r4->code_base->total_memory ) ;
 | |
|   r4->code_base->total_memory =  0 ;
 | |
|   mem4release( r4->code_base->calc_memory ) ;
 | |
|   r4->code_base->calc_memory =  0 ;
 | |
| 
 | |
|   /* free the report caption */
 | |
|   if( r4->report_caption )
 | |
|   {
 | |
|     u4free( r4->report_caption );
 | |
|   }
 | |
| 
 | |
|   /* free the output data file name */
 | |
|   if( r4->dfile_name )
 | |
|     u4free( r4->dfile_name );
 | |
| 
 | |
|   /* free any data file output OUT4OBJ structs */
 | |
|   while( (o4obj = (POUT4OBJ)l4pop(&r4->output_objs)) != NULL )
 | |
|     u4free( o4obj );
 | |
| 
 | |
|   u4free( r4 ) ;
 | |
| }
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* Get an information context for either the specified or default printer */
 | |
| HDC S4FUNCTION report4get_printerIC ( REPORT4 *report )
 | |
| {
 | |
|   char szPrinter [64] ;
 | |
|   char *szDevice, *szDriver, *szOutput ;
 | |
| 
 | |
|   if ( report->printer_name == 0 )
 | |
|   {
 | |
|     GetProfileString( "windows", "device", ",,,", szPrinter, 80 ) ;
 | |
| 
 | |
|     if ( ! (szDevice = strtok( szPrinter, ",")) )  return 0 ;
 | |
|     if ( ! (szDriver = strtok( NULL, ", ")) ) return 0 ;
 | |
|     if ( ! (szOutput = strtok( NULL, ", ")) ) return 0 ;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     GetProfileString( "devices", report->printer_name, "=,", szPrinter, 80) ;
 | |
|     szDevice = report->printer_name ;
 | |
|     if ( ! (szDriver = strtok( szPrinter, ", ")) ) return 0 ;
 | |
|     if ( ! (szOutput = strtok( NULL, ", ")) ) return 0 ;
 | |
|   }
 | |
| 
 | |
|   return CreateIC (szDriver, szDevice, szOutput, NULL) ;
 | |
| }
 | |
| 
 | |
| /* Get the device context for the default printer */
 | |
| HDC S4FUNCTION report4get_printerDC ( void )
 | |
| {
 | |
|   static char szPrinter [80] ;
 | |
|   char *szDevice, *szDriver, *szOutput ;
 | |
| 
 | |
|   GetProfileString( "windows", "device", ",,,", szPrinter, 80 ) ;
 | |
| 
 | |
|   if ( ! (szDevice = strtok( szPrinter, ",")) )  return 0 ;
 | |
|   if ( ! (szDriver = strtok( NULL, ", ")) ) return 0 ;
 | |
|   if ( ! (szOutput = strtok( NULL, ", ")) ) return 0 ;
 | |
| 
 | |
|   return CreateDC (szDriver, szDevice, szOutput, NULL) ;
 | |
| }
 | |
| 
 | |
| /* Create the output fonts for printing */
 | |
| void report4output_screen_fonts( REPORT4 *report )
 | |
| {
 | |
|   STYLE4 *style_on;
 | |
| #ifdef S4WIN32
 | |
|   LOGFONT *plf;
 | |
| #else
 | |
|   PR4LOGFONT plf;
 | |
| #endif
 | |
|   int tempval;
 | |
| 
 | |
|   style_on = (STYLE4 *)l4first( &report->styles );
 | |
|   while( style_on )
 | |
|   {
 | |
|     if( !style_on->printer_font )
 | |
|     {
 | |
| #ifdef S4WIN32
 | |
|       plf = &( style_on->ntFont ) ;
 | |
| #else
 | |
|       plf = &( style_on->lfont ) ;
 | |
| #endif
 | |
|       /* due to the different resolution of the printer and screen we have
 | |
|          to temporarily change the lfHeight member of the LOGFONT struct and
 | |
|          create a font for printing */
 | |
|       tempval = plf->lfHeight;
 | |
|       plf->lfHeight = -MulDiv(style_on->point_size,
 | |
|                               GetDeviceCaps(report->printerDC,LOGPIXELSY),72);
 | |
| 
 | |
|       style_on->printer_font = CreateFontIndirect((const LOGFONT FAR*)plf);
 | |
|       plf->lfHeight = tempval;
 | |
| 
 | |
|     }
 | |
|     style_on = (STYLE4 *)l4next( &report->styles, style_on );
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /* USED FOR CREATING A DIALOG TEMPLATE ON THE FLY, this is used to create
 | |
|    the dialog used during printing in windows to allow cancellation of the
 | |
|    printing process, the only reason this function is necessary is because
 | |
|    we do not use a resource file with the CodeBase DLL */
 | |
| GLOBALHANDLE NewDlgTemplate(DWORD Style, WORD X, WORD Y, WORD CX, WORD CY,
 | |
|                             LPSTR Menu, LPSTR Class, LPSTR Text,
 | |
|                             LPSTR TypeFace, WORD PtSize)
 | |
| {
 | |
|   DlgTemplateHeader far *lpDT;
 | |
|   LPSTR lpsztemp;
 | |
|   GLOBALHANDLE hDTemplate;
 | |
|   long needed_size;
 | |
| 
 | |
|   needed_size = sizeof( DlgTemplateHeader ) + lstrlen(Menu) + 1 +
 | |
|     lstrlen(Class) + 1 + lstrlen(Text) + 1;
 | |
| 
 | |
|   if( TypeFace[0] )
 | |
|     needed_size += lstrlen(TypeFace) + 1 + sizeof(short);
 | |
| 
 | |
|   hDTemplate = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, needed_size );
 | |
| 
 | |
|   if( hDTemplate == NULL )
 | |
|     return hDTemplate;
 | |
| 
 | |
|   lpDT = (DlgTemplateHeader far * )GlobalLock( hDTemplate );
 | |
| 
 | |
|   lpDT->dtStyle = WS_VISIBLE | Style;
 | |
|   lpDT->dtX = X;
 | |
|   lpDT->dtY = Y;
 | |
|   lpDT->dtCX = CX;
 | |
|   lpDT->dtCY = CY;
 | |
|   lpsztemp = ((LPSTR)lpDT) + sizeof( *lpDT );
 | |
|   lpsztemp = (char far *)memcpy( lpsztemp, Menu, ((lstrlen(Menu)>80)?81:lstrlen(Menu)+1) );
 | |
|   lpsztemp = (char far *)memcpy( lpsztemp, Class, ((lstrlen(Class)>80)?81:lstrlen(Class)+1)  );
 | |
|   lpsztemp = (char far *)memcpy( lpsztemp, Text, ((lstrlen(Text)>80)?81:lstrlen(Text)+1)  );
 | |
| 
 | |
|   if( TypeFace[0] )
 | |
|   {
 | |
|     *((short far *)lpsztemp) = PtSize;
 | |
|     memcpy( lpsztemp+sizeof(short), TypeFace,((lstrlen(TypeFace)>80)?81:lstrlen(TypeFace)+1)   );
 | |
|     lpDT->dtStyle |= DS_SETFONT;
 | |
|   }
 | |
| 
 | |
|   GlobalUnlock( hDTemplate );
 | |
| 
 | |
|   return hDTemplate;
 | |
| }
 | |
| 
 | |
| /* USED FOR CREATING A DIALOG TEMPLATE ON THE FLY, this is used to create
 | |
|    the dialog used during printing in windows to allow cancellation of the
 | |
|    printing process, the only reason this function is necessary is because
 | |
|    we do not use a resource file with the CodeBase DLL */
 | |
| BOOL AddDlgItem( GLOBALHANDLE DlgTmp, DWORD Style, WORD X, WORD Y, WORD CX,
 | |
|                 WORD CY, LPSTR Class, LPSTR Text, BYTE DataLen, LPSTR Data,
 | |
|                 int id )
 | |
| {
 | |
|   DlgTemplateHeader far *lpDT;
 | |
|   DlgItemTemplateHeader far *lpDIT;
 | |
|   LPSTR lpsztemp;
 | |
|   GLOBALHANDLE hDTemplate;
 | |
|   unsigned new_size, BlockSize;
 | |
| 
 | |
|   BlockSize = TemplateSize( DlgTmp );
 | |
| 
 | |
|   new_size = BlockSize + sizeof(DlgItemTemplateHeader) +
 | |
|     lstrlen(Class) + 1 + lstrlen(Text) + 1 + 1;
 | |
| 
 | |
|   hDTemplate = GlobalReAlloc( DlgTmp, new_size, GMEM_ZEROINIT | GMEM_MOVEABLE );
 | |
| 
 | |
|   if( hDTemplate == NULL )
 | |
|     return FALSE;
 | |
| 
 | |
|   lpDT = (DlgTemplateHeader far * )GlobalLock( hDTemplate );
 | |
| 
 | |
|   lpDIT = (DlgItemTemplateHeader far *)(((LPSTR)lpDT)+BlockSize);
 | |
|   lpDIT->dtilX = X;
 | |
|   lpDIT->dtilY = Y;
 | |
|   lpDIT->dtilCX = (CX < lpDT->dtCX)?CX:lpDT->dtCX;
 | |
|   lpDIT->dtilCY = (CY < lpDT->dtCY)?CY:lpDT->dtCY;
 | |
|   lpDIT->dtilID = id;
 | |
|   lpDIT->dtilStyle = WS_VISIBLE | WS_CHILD | Style;
 | |
| 
 | |
|   lpsztemp = (char far *)(lpDIT)+sizeof(*lpDIT);
 | |
|   lpsztemp = (char far *)memcpy( lpsztemp, Class, ((lstrlen(Class)>80)?81:lstrlen(Class)+1)  );
 | |
|   lpsztemp = (char far *)memcpy( lpsztemp, Text, ((lstrlen(Text)>80)?81:lstrlen(Text)+1)  );
 | |
| 
 | |
|   if( DataLen )
 | |
|     memcpy( lpsztemp, Data, DataLen );
 | |
| 
 | |
|   lpDT->dtItemCount++;
 | |
| 
 | |
|   GlobalUnlock( hDTemplate );
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| /* USED FOR CREATING A DIALOG TEMPLATE ON THE FLY, this is used to create
 | |
|    the dialog used during printing in windows to allow cancellation of the
 | |
|    printing process, the only reason this function is necessary is because
 | |
|    we do not use a resource file with the CodeBase DLL */
 | |
| int TemplateSize( GLOBALHANDLE hDlgTmp )
 | |
| {
 | |
|   DlgTemplateHeader far *lpDT;
 | |
|   LPSTR lpstr, lpbase;
 | |
|   int isize;
 | |
|   int i;
 | |
| 
 | |
|   lpDT = (DlgTemplateHeader far *)GlobalLock( hDlgTmp );
 | |
|   lpbase = (LPSTR)lpDT;
 | |
|   lpstr = (LPSTR)( lpDT + 1 );
 | |
|   isize = sizeof( *lpDT );
 | |
|   lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
 | |
|   lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
 | |
|   lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
 | |
| 
 | |
|   if((lpDT->dtStyle)&DS_SETFONT)
 | |
|   {
 | |
|     isize += sizeof(short);
 | |
|     lpstr += sizeof(short);
 | |
|     lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
 | |
|   }
 | |
| 
 | |
|   for( i = 0; i < lpDT->dtItemCount; i++ )
 | |
|   {
 | |
|     lpstr = lpbase+(isize+=sizeof(DlgItemTemplateHeader));
 | |
|     lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
 | |
|     lpstr = lpbase+(isize+=(lstrlen(lpstr)+1));
 | |
|     if( *lpstr )
 | |
|     {
 | |
|       isize += *lpstr;
 | |
|       lpstr += *lpstr;
 | |
|     }
 | |
|     isize++;
 | |
|   }
 | |
| 
 | |
|   GlobalUnlock( hDlgTmp );
 | |
|   return isize;
 | |
| }
 | |
| 
 | |
| /**************************************************************************
 | |
|  * registers window classes for the output window and the page window
 | |
|  **************************************************************************/
 | |
| int report4register_classes( PREPORT4 report )
 | |
| {
 | |
|   WNDCLASS wc;
 | |
|   HINSTANCE reginst;
 | |
| 
 | |
|   if( report->hWnd == NULL )
 | |
|   {
 | |
| #ifdef S4RDB
 | |
|     MessageBox( NULL, "No parentwindow in report structure.", "Error", MB_OK );
 | |
| #endif
 | |
|     return -1;
 | |
|   }
 | |
| #ifdef S4WIN32
 | |
|   reginst = (HINSTANCE)GetWindowLong( report->hWnd, GWL_HINSTANCE );
 | |
| #else
 | |
|   reginst = (HINSTANCE)GetWindowWord( report->hWnd, GWW_HINSTANCE );
 | |
| #endif
 | |
|   wc.cbClsExtra     = 0;
 | |
|   wc.hInstance      = reginst;
 | |
|   wc.hCursor        = LoadCursor(NULL,IDC_WAIT);
 | |
|   wc.hbrBackground  = GetStockObject(LTGRAY_BRUSH);
 | |
|   wc.lpszMenuName   = NULL;
 | |
|   wc.style = CS_DBLCLKS | CS_GLOBALCLASS;
 | |
|   wc.lpfnWndProc = PreViewProc;
 | |
|   wc.cbWndExtra = 18;
 | |
|   wc.hIcon = NULL;
 | |
|   wc.lpszClassName = "PreViewWin";
 | |
| #ifdef S4RDB
 | |
|   if( (RegisterClass( &wc )) == NULL )
 | |
|   {
 | |
|     MessageBox( NULL, "Failed to register PreViewWin class", "ERROR", MB_OK );
 | |
|     return -1;
 | |
|   }
 | |
| #else
 | |
|   RegisterClass( &wc );
 | |
| #endif
 | |
| 
 | |
|   wc.hbrBackground = GetStockObject( WHITE_BRUSH );
 | |
|   wc.lpfnWndProc   = OutputPageProc;
 | |
|   wc.lpszClassName = "OutputPageWin";
 | |
| #ifdef S4RDB
 | |
|   if( (RegisterClass( &wc )) == NULL )
 | |
|   {
 | |
|     MessageBox( NULL, "Failed to register OutputPageWin class", "ERROR", MB_OK );
 | |
|     return -1;
 | |
|   }
 | |
| #else
 | |
|   RegisterClass( &wc );
 | |
| #endif
 | |
| 
 | |
|   wc.lpszClassName = "MouseEat";
 | |
|   wc.lpfnWndProc   = MouseEatProc;
 | |
| #ifdef S4RDB
 | |
|   if( (RegisterClass( &wc )) == NULL )
 | |
|   {
 | |
|     MessageBox( NULL, "Failed to register MouseEat class", "ERROR", MB_OK );
 | |
|     return -1;
 | |
|   }
 | |
| #else
 | |
|   RegisterClass( &wc );
 | |
| #endif
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| /****************************************************************************
 | |
|  * recursively calculates the position (x,y) and size (w,h) of an object and
 | |
|  * all the contained objects in device coordinates
 | |
|  ****************************************************************************/
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| #ifdef __cplusplus
 | |
| void report4obj_to_dev(OBJ4 *obj, HDC hDC )
 | |
| #else
 | |
|   void report4obj_to_dev(obj, hDC )
 | |
|   OBJ4 *obj ;
 | |
|   HDC hDC  ;
 | |
| #endif
 | |
| #else
 | |
| #ifdef __cplusplus
 | |
|   void report4obj_to_dev(OBJ4 *obj )
 | |
| #else
 | |
|   void report4obj_to_dev(obj )
 | |
|   OBJ4 *obj  ;
 | |
| #endif
 | |
| #endif
 | |
| {
 | |
|   OBJ4 *obj_on;
 | |
| #ifdef S4WINDOWS
 | |
|   POINT pt[2];
 | |
| 
 | |
|   /* use the device context */
 | |
|   pt[0].x = (int)obj->x;
 | |
|   pt[0].y = (int)obj->y;
 | |
|   pt[1].x = (int)obj->w;
 | |
|   pt[1].y = (int)obj->h;
 | |
|   LPtoDP( hDC, pt, 2 );
 | |
|   obj->dev_x = pt[0].x;
 | |
|   obj->dev_y = ABS(pt[0].y);
 | |
|   obj->dev_w = pt[1].x;
 | |
|   obj->dev_h = ABS(pt[1].y);
 | |
| #else
 | |
|   /* in the non-windows case we simply transfer the 1000's of an inch
 | |
|      values */
 | |
|   obj->dev_x = (obj->x);
 | |
|   obj->dev_y = (obj->y);
 | |
|   obj->dev_w = (obj->w);
 | |
|   obj->dev_h = (obj->h);
 | |
| #endif
 | |
| 
 | |
|   obj_on = (OBJ4 *)l4first( &obj->contained );
 | |
|   while( obj_on )
 | |
|   {
 | |
| #ifdef S4WINDOWS
 | |
|     report4obj_to_dev( obj_on, hDC );
 | |
| #else
 | |
|     report4obj_to_dev( obj_on );
 | |
| #endif
 | |
|     obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
 | |
|   }
 | |
|   return;
 | |
| }
 | |
| 
 | |
| /**************************************************************************
 | |
|  * calculates group and object sizes in device coordinates
 | |
|  ***************************************************************************/
 | |
| #ifdef S4WINDOWS
 | |
| #ifdef __cplusplus
 | |
| void report4calc_obj_dev(REPORT4 *report, HDC hDC )
 | |
| #else
 | |
|   void report4calc_obj_dev(report, hDC )
 | |
|   REPORT4 *report ;
 | |
|   HDC hDC  ;
 | |
| #endif
 | |
| #else
 | |
| #ifdef __cplusplus
 | |
|   void report4calc_obj_dev(REPORT4 *report )
 | |
| #else
 | |
|   void report4calc_obj_dev(report )
 | |
|   REPORT4 *report  ;
 | |
| #endif
 | |
| #endif
 | |
| {
 | |
|   GROUP4 *group_on;
 | |
|   AREA4 *area_on;
 | |
|   OBJ4 *obj_on;
 | |
| #ifdef S4WINDOWS
 | |
|   POINT pt[2];
 | |
| 
 | |
|   SetMapMode( hDC, MM_HIENGLISH );
 | |
|   SetMapMode( hDC, MM_ANISOTROPIC );
 | |
| 
 | |
|   if( report->output_code == 0 )
 | |
|   {
 | |
|     pt[0].x = (int)(report->margin_left - report->hard_margin_left);
 | |
|     pt[0].y = (int)(report->margin_top - report->hard_margin_top);
 | |
|     pt[1].x = (int)(report->margin_right - report->hard_margin_right);
 | |
|     pt[1].y = (int)(report->margin_bottom - report->hard_margin_bottom);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     pt[0].x = (int)(report->margin_left);
 | |
|     pt[0].y = (int)(report->margin_top);
 | |
|     pt[1].x = (int)(report->margin_right);
 | |
|     pt[1].y = (int)(report->margin_bottom);
 | |
|   }
 | |
|   LPtoDP( hDC, pt, 2 );
 | |
|   report->dev_margin_left = pt[0].x;
 | |
|   report->dev_margin_top  = ABS(pt[0].y);
 | |
|   report->dev_margin_right = pt[1].x;
 | |
|   report->dev_margin_bottom = ABS(pt[1].y);
 | |
| #else
 | |
|   report->dev_margin_left = (report->margin_left);
 | |
|   report->dev_margin_right = (report->margin_right);
 | |
|   report->dev_margin_top = (report->margin_top);
 | |
|   report->dev_margin_bottom = (report->margin_bottom);
 | |
| #endif
 | |
| 
 | |
|   group_on = report->page_header_footer;
 | |
|   if( group_on )
 | |
|   {
 | |
|     area_on = (AREA4 *)l4first( &group_on->header_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
| #ifdef S4WINDOWS
 | |
|       pt[0].x = 0;
 | |
|       pt[0].y = (UINT)area_on->height;
 | |
|       LPtoDP( hDC, pt, 1 );
 | |
|       area_on->height_dev = ABS(pt[0].y);
 | |
| #else
 | |
|       area_on->height_dev = (area_on->height);
 | |
| #endif
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
| #ifdef S4WINDOWS
 | |
|         report4obj_to_dev( obj_on, hDC );
 | |
| #else
 | |
|         report4obj_to_dev( obj_on );
 | |
| #endif
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &group_on->header_areas, area_on );
 | |
|     }
 | |
| 
 | |
|     area_on = (AREA4 *)l4first( &group_on->footer_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
| #ifdef S4WINDOWS
 | |
|       pt[0].x = 0;
 | |
|       pt[0].y = (UINT)area_on->height;
 | |
|       LPtoDP( hDC, pt, 1 );
 | |
|       area_on->height_dev = ABS(pt[0].y);
 | |
| #else
 | |
|       area_on->height_dev = (area_on->height);
 | |
| #endif
 | |
| 
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
| #ifdef S4WINDOWS
 | |
|         report4obj_to_dev( obj_on, hDC );
 | |
| #else
 | |
|         report4obj_to_dev( obj_on );
 | |
| #endif
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on );
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   group_on = (GROUP4 *)l4first( &report->groups );
 | |
|   while( group_on )
 | |
|   {
 | |
|     area_on = (AREA4 *)l4first( &group_on->header_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
| #ifdef S4WINDOWS
 | |
|       pt[0].x = 0;
 | |
|       pt[0].y = (UINT)area_on->height;
 | |
|       LPtoDP( hDC, pt, 1 );
 | |
|       area_on->height_dev = ABS(pt[0].y);
 | |
| #else
 | |
|       area_on->height_dev = (area_on->height);
 | |
| #endif
 | |
| 
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
| #ifdef S4WINDOWS
 | |
|         report4obj_to_dev( obj_on, hDC );
 | |
| #else
 | |
|         report4obj_to_dev( obj_on );
 | |
| #endif
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &group_on->header_areas, area_on );
 | |
|     }
 | |
| 
 | |
|     area_on = (AREA4 *)l4first( &group_on->footer_areas );
 | |
|     while( area_on )
 | |
|     {
 | |
| #ifdef S4WINDOWS
 | |
|       pt[0].x = 0;
 | |
|       pt[0].y = (UINT)area_on->height;
 | |
|       LPtoDP( hDC, pt, 1 );
 | |
|       area_on->height_dev = ABS(pt[0].y);
 | |
| #else
 | |
|       area_on->height_dev = (area_on->height);
 | |
| #endif
 | |
| 
 | |
|       obj_on = (OBJ4 *)l4first( &area_on->objects );
 | |
|       while( obj_on )
 | |
|       {
 | |
| #ifdef S4WINDOWS
 | |
|         report4obj_to_dev( obj_on, hDC );
 | |
| #else
 | |
|         report4obj_to_dev( obj_on );
 | |
| #endif
 | |
|         obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | |
|       }
 | |
|       area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on );
 | |
|     }
 | |
|     group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /* make a call to the relate4query_set() function */
 | |
| int S4FUNCTION report4querySet( PREPORT4 report, char S4PTR *expr )
 | |
| {
 | |
|   return relate4query_set( report->relate, expr );
 | |
| }
 | |
| 
 | |
| /* make a call to the relate4sort_set() function */
 | |
| int S4FUNCTION report4sortSet( PREPORT4 report, char S4PTR *expr )
 | |
| {
 | |
|   return relate4sort_set( report->relate, expr );
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4caption( PREPORT4 report, char S4PTR *caption )
 | |
| {
 | |
|   if( report == NULL )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( report->report_caption )
 | |
|     u4free( report->report_caption );
 | |
| 
 | |
|   report->report_caption = NULL;
 | |
| 
 | |
|   if( !caption )
 | |
|     return 0;
 | |
| 
 | |
|   report->report_caption = (char *)u4alloc_free( report->code_base, strlen(caption)+1 );
 | |
|   if( !report->report_caption )
 | |
|   {
 | |
|     e4describe( report->code_base, e4report, E4_REP_CAPALLOC, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   strcpy( report->report_caption, caption );
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4groupHardResets( PREPORT4 report, int reset_flag )
 | |
| {
 | |
|   int temp;
 | |
| 
 | |
|   if( !report )
 | |
|     return -1;
 | |
| 
 | |
|   if( reset_flag < 0 )
 | |
|   {
 | |
|     e4describe( report->code_base, e4parm, E4_REP_BADRESET, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   temp = report->hard_resets_flag;
 | |
|   report->hard_resets_flag = reset_flag;
 | |
| 
 | |
|   return temp;
 | |
| }
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* Calls the printer setup/seletion common dialog in Windows */
 | |
| void S4FUNCTION report4printerSelect( PREPORT4 report )
 | |
| {
 | |
|   static PRINTDLG pd;
 | |
| 
 | |
|   memset( &pd, 0, sizeof(PRINTDLG) );
 | |
|   pd.lStructSize = sizeof( PRINTDLG );
 | |
|   pd.hwndOwner = report->hWnd;
 | |
|   pd.Flags = PD_RETURNDC | PD_PRINTSETUP;
 | |
|   pd.hDevMode = NULL;
 | |
|   pd.hDevNames = NULL;
 | |
| 
 | |
|   if( PrintDlg( &pd ) != 0 )
 | |
|   {
 | |
|     report->printerDC = pd.hDC;
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4output( PREPORT4 report, int output_handle, int use_styles )
 | |
| {
 | |
|   if( ! report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   report->output_handle = output_handle;
 | |
|   report->use_styles    = use_styles;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4pageSize( PREPORT4 report, long pg_height, long pg_width, int unit_type )
 | |
| {
 | |
|   long pgh = pg_height, pgw = pg_width;
 | |
| 
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( unit_type )
 | |
|   {
 | |
|     pgw = (long)( pg_width * 100 );
 | |
|     pgh = (long)(((float)pg_height * 1000.0)/6.0 + 0.5 );
 | |
|   }
 | |
| 
 | |
|   report->report_width = pgw- report->margin_left - report->margin_right;
 | |
|   report->report_height = pgh - report->margin_top - report->margin_bottom;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4margins( PREPORT4 report, long left, long right, long top, long bottom, int unit_type )
 | |
| {
 | |
|   long rm = right, lm = left, tm = top, bm = bottom;
 | |
| 
 | |
|   if( !report )
 | |
|   {
 | |
|     /*error message; */
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( unit_type )
 | |
|   {
 | |
|     rm = right * 100;
 | |
|     lm = left * 100;
 | |
|     tm = (int)(((float)top*1000.0)/6.0);
 | |
|     bm = (int)(((float)bottom*1000.0)/6.0);
 | |
|   }
 | |
| 
 | |
|   report->report_width = report->report_width + report->margin_left + report->margin_right;
 | |
|   report->report_height = report->report_height + report->margin_top + report->margin_bottom;
 | |
| 
 | |
|   report->margin_right = rm;
 | |
|   report->margin_left  = lm;
 | |
|   report->margin_top   = tm;
 | |
|   report->margin_bottom = bm;
 | |
| 
 | |
|   report->report_width = report->report_width - rm - lm;
 | |
|   report->report_height = report->report_height - tm - bm;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4currency( PREPORT4 report, char *currency )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( !currency )
 | |
|     report->currency_symbol[0] = '\0';
 | |
|   else
 | |
|     u4ncpy( report->currency_symbol, currency, sizeof(report->currency_symbol) );
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4decimal( PREPORT4 report, char decimal )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   report->decimal_point = decimal;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4separator( PREPORT4 report, char separator )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   report->thousand_separator = separator;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4titlePage( PREPORT4 report, int title_page )
 | |
| {
 | |
|   int temp;
 | |
| 
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( title_page < 0 )
 | |
|   {
 | |
|     e4describe( report->code_base, e4parm, E4_REP_BADTITLE, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   temp = report->pgbrk_title;
 | |
|   report->pgbrk_title = title_page;
 | |
| 
 | |
|   return temp;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4toScreen( PREPORT4 report, int to_screen )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( to_screen < 0 )
 | |
|   {
 | |
|     e4describe( report->code_base, e4parm, E4_REP_BADSCREEN, 0, 0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if( to_screen > 0 )
 | |
|     report->output_code = to_screen;
 | |
|   else
 | |
|     report->output_code = 0;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4parent( PREPORT4 report, HWND parent )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   report->hWnd = parent;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| HDC S4FUNCTION report4printerDC( PREPORT4 report, HDC hDC )
 | |
| {
 | |
|   HDC temp;
 | |
| 
 | |
|   if( !report )
 | |
|   {
 | |
|     return (HDC)-1;
 | |
|   }
 | |
| 
 | |
|   temp = report->printerDC;
 | |
|   report->printerDC = hDC;
 | |
| 
 | |
|   return temp;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4dateFormat( PREPORT4 report, char *date_format  )
 | |
| {
 | |
|   if( !report || !date_format )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   u4ncpy( report->default_date_format, date_format, sizeof(report->default_date_format) );
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4pageSizeGet( PREPORT4 report, long *page_width,
 | |
|                                   long *page_height )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   *page_width = report->dev_page_width;
 | |
|   *page_height = report->dev_page_height;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4pageMarginsGet( PREPORT4 report, long S4PTR *margin_left,
 | |
|                                      long S4PTR *margin_right, long S4PTR *margin_top, long S4PTR *margin_bottom )
 | |
| {
 | |
|   if( !report )
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   *margin_right = report->dev_margin_right;
 | |
|   *margin_left = report->dev_margin_left;
 | |
|   *margin_bottom = report->dev_margin_bottom;
 | |
|   *margin_top = report->dev_margin_top;
 | |
| 
 | |
|   return 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| /* SEE THE CODEREPORTER MANUAL */
 | |
| int S4FUNCTION report4dataDo( PREPORT4 report )
 | |
| {
 | |
|   char *f4info;
 | |
|   FIELD4INFO *f4infoi;
 | |
|   DATA4 *dfile;
 | |
|   POUT4OBJ oobj;
 | |
|   long bsize = 8198;
 | |
|   int  rc, i, trl;
 | |
|   PGROUP4 group;
 | |
| 
 | |
|   if( !report->output_group || !report->dfile_name || report->output_objs.n_link <= 0 )
 | |
|   {
 | |
|     e4describe( report->code_base, e4rep_data, E4_REP_NODSETUP, (char *)0, (char *)0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   /* allocate an array of FIELD4INFO structures */
 | |
|   f4info = (char *)u4alloc_er( report->code_base, (report->output_objs.n_link+1)*sizeof(FIELD4INFO) );
 | |
|   if( !f4info )
 | |
|   {
 | |
|     e4describe( report->code_base, e4rep_data, E4_REP_NODCREATE, report->dfile_name, (char *)0 );
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   /* fill the FIELD4INFO structures */
 | |
|   oobj = NULL;
 | |
|   for( i = 0; i < report->output_objs.n_link; i++ )
 | |
|   {
 | |
|     f4infoi = (FIELD4INFO *)(f4info + i * sizeof(FIELD4INFO) );
 | |
|     oobj = (POUT4OBJ)l4next( &report->output_objs, oobj );
 | |
|     f4infoi->name = (char *)u4alloc_free( report->code_base, strlen(oobj->obj->field_name)+1 );
 | |
|     strcpy( f4infoi->name, oobj->obj->field_name );
 | |
|     f4infoi->type = oobj->obj->field_type;
 | |
|     f4infoi->len = oobj->obj->field_len;
 | |
|     f4infoi->dec = oobj->obj->field_dec;
 | |
|   }
 | |
| 
 | |
|   trl = report->code_base->read_only;
 | |
|   report->code_base->read_only = 0;
 | |
| 
 | |
|   /* create the new data file */
 | |
|   dfile = d4create( report->code_base, report->dfile_name, (FIELD4INFO *)f4info, NULL );
 | |
|   if( !dfile )
 | |
|   {
 | |
|     e4describe( report->code_base, e4rep_data, E4_REP_NODCREATE, report->dfile_name, (char *)0 );
 | |
|     u4free( f4info );
 | |
|     report->code_base->read_only = trl;
 | |
|     return -1;
 | |
|   }
 | |
|   report->code_base->read_only = trl;
 | |
| 
 | |
|   /* associate the fields in the new data file with the output objects in the
 | |
|      report */
 | |
|   oobj = NULL;
 | |
|   for( i = 0; i < report->output_objs.n_link; i++ )
 | |
|   {
 | |
|     oobj = (POUT4OBJ)l4next( &report->output_objs, oobj );
 | |
|     oobj->obj->field = d4field( dfile, oobj->obj->field_name );
 | |
|   }
 | |
| 
 | |
|   /* temporarily remove all the internal group flags */
 | |
|   group = (PGROUP4) l4first( &report->groups );
 | |
|   while( group )
 | |
|   {
 | |
|     group->trepeat_header = group->repeat_header;
 | |
|     group->tswap_header = group->swap_header;
 | |
|     group->tswap_footer = group->swap_footer;
 | |
|     group->treset_page = group->reset_page;
 | |
|     group->treset_pagenum = group->reset_pagenum;
 | |
| 
 | |
|     group->repeat_header = 0;
 | |
|     group->swap_header   = 0;
 | |
|     group->swap_footer   = 0;
 | |
|     group->reset_page    = 0;
 | |
|     group->reset_pagenum = 0;
 | |
|     group = (PGROUP4)l4next( &report->groups, group );
 | |
|   }
 | |
| 
 | |
|   report->for_dbf = 1;
 | |
|   report->data_file = dfile;
 | |
|   report->rcount = 0;
 | |
|   report->dfile_buf = NULL;
 | |
| 
 | |
|   /* allocate as large a buffer as you can */
 | |
|   while( report->dfile_buf == NULL )
 | |
|   {
 | |
|     report->dfile_buf = (char *)u4alloc_free( report->code_base, bsize );
 | |
|     if( report->dfile_buf == NULL )
 | |
|       bsize -= 1000;
 | |
|     if( bsize <= 0 )
 | |
|       break;
 | |
|   }
 | |
|   if( report->dfile_buf == NULL )
 | |
| #ifndef __SC__
 | |
|     return 0;
 | |
| #else
 | |
|   return 0;
 | |
| #endif
 | |
| 
 | |
|   /* set up the new datafile for fast writing */
 | |
|   file4seq_write_init( &report->dfile_seq, &dfile->file, (long)d4record_position(dfile,1L),
 | |
|                       report->dfile_buf, (unsigned)bsize );
 | |
|   d4append_start( dfile, 0 );
 | |
|   if( f4info )
 | |
|   {
 | |
|     for( i = 0; i < report->output_objs.n_link; i++ )
 | |
|     {
 | |
|       f4infoi = (FIELD4INFO *)(f4info + i * sizeof(FIELD4INFO) );
 | |
|       u4free( f4infoi->name );
 | |
|     }
 | |
|     u4free( f4info );
 | |
|   }
 | |
| 
 | |
|   /* start the report */
 | |
|   report4pageInit( report );
 | |
| #ifdef S4WINDOWS
 | |
|   if( report->hWnd2 )
 | |
|   {
 | |
|     ReleaseCapture();
 | |
|     DestroyWindow( report->hWnd2 );
 | |
|     report->hWnd2 = NULL;
 | |
|   }
 | |
|   while( (rc = report4generatePage( report, 0 )) >= 0 )
 | |
| #else
 | |
|     while( (rc = report4generatePage( report )) >= 0 )
 | |
| #endif
 | |
|     {
 | |
|       if( rc == 2 )
 | |
|         break;
 | |
|     }
 | |
|   /* clean up after the report */
 | |
|   report4pageFree( report );
 | |
| 
 | |
|   report->for_dbf = 0;
 | |
| 
 | |
|   /* flush the buffer to the new data file */
 | |
|   file4seq_write_flush( &report->dfile_seq );
 | |
|   report->data_file->file.is_exclusive = 1;
 | |
|   report->data_file->num_recs = report->rcount;
 | |
|   d4update_header( report->data_file, 1, 1 );
 | |
|   d4close( report->data_file );
 | |
| 
 | |
|   if( report->dfile_buf )
 | |
|   {
 | |
|     u4free( report->dfile_buf );
 | |
|     report->dfile_buf = NULL;
 | |
|   }
 | |
| 
 | |
|   group = (PGROUP4) l4first( &report->groups );
 | |
|   while( group )
 | |
|   {
 | |
|     group->repeat_header = group->trepeat_header;
 | |
|     group->swap_header   = group->tswap_header;
 | |
|     group->swap_footer   = group->tswap_footer;
 | |
|     group->reset_page    = group->treset_page;
 | |
|     group->reset_pagenum = group->treset_pagenum;
 | |
| 
 | |
|     group = (PGROUP4)l4next( &report->groups, group );
 | |
|   }
 | |
| 
 | |
|   oobj = NULL;
 | |
|   for( i = 0; i < report->output_objs.n_link; i++ )
 | |
|   {
 | |
|     oobj = (POUT4OBJ)l4next( &report->output_objs, oobj );
 | |
|     oobj->obj->field = NULL;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| #ifdef S4VBASIC
 | |
| 
 | |
| int S4FUNCTION report4decimal_v( PREPORT4 report, char *decimal )
 | |
| {
 | |
|   if ( c4parm_check( report->code_base, 1, "report4decimal():" ) ) return -1 ;
 | |
| 
 | |
| #ifndef S4VB_DOS
 | |
|   return report4decimal( report, (char) decimal[0] ) ;
 | |
| #else
 | |
|   return report4decimal( report, (char) c4str(decimal)[0] ) ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| int S4FUNCTION report4separator_v( PREPORT4 report, char *separator )
 | |
| {
 | |
|   if ( c4parm_check( report->code_base, 1, "report4decimal():" ) ) return -1 ;
 | |
| 
 | |
| #ifndef S4VB_DOS
 | |
|   return report4separator( report, (char) separator[0] ) ;
 | |
| #else
 | |
|   return report4separator( report, (char) c4str(separator)[0] ) ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| #ifdef S4VB_DOS
 | |
| 
 | |
| int S4FUNCTION report4caption_v ( PREPORT4 report, char *caption )
 | |
| {
 | |
|   return report4caption( report, c4str(caption) ) ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION report4currency_v ( PREPORT4 report, char *currency )
 | |
| {
 | |
|   return report4currency( report, c4str(currency) ) ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION report4dateFormat_v( PREPORT4 report, char *format )
 | |
| {
 | |
|   return report4dateFormat( report, c4str(format) ) ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION report4querySet_v( PREPORT4 report, char *query_expr )
 | |
| {
 | |
|   return report4querySet( report, c4str(query_expr) );
 | |
| }
 | |
| 
 | |
| 
 | |
| int S4FUNCTION report4sortSet_v( PREPORT4 report, char *sort_expr )
 | |
| {
 | |
|   return report4sortSet( report, c4str(sort_expr) );
 | |
| }
 | |
| 
 | |
| #endif  /* S4VB_DOS */
 | |
| #endif  /* S4VBASIC */
 | |
| 
 | |
| 
 |