campo-sirio/cb5/r4drive2.c
alex a0f5e0898b This commit was generated by cvs2svn to compensate for changes in r975,
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
1995-02-06 15:33:45 +00:00

1221 lines
33 KiB
C
Executable File
Raw Blame History

/* r4drive2.c (c)Copyright Sequiter Software Inc., 1991-1994. All rights reserved. */
#include "d4all.h"
#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;
BOOL bUserAbort;
HWND hDlgPrint;
#endif
#ifdef S4WINDOWS
/**************************************************************************
* Print Abort Proc
**************************************************************************/
#pragma argsused
#ifndef S4WIN32
BOOL CALLBACK _export MPrintAbortProc( HDC hDC, short nCode )
#else
BOOL CALLBACK MPrintAbortProc( HDC hDC, short nCode )
#endif
{
MSG msg;
while( !bUserAbort && PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
if( !hDlgPrint || !IsDialogMessage( hDlgPrint, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return !bUserAbort;
}
/***************************************************************************
* dialog proc for the dialog that comes up during printing and allows the
* user to cancel the print job
***************************************************************************/
#ifndef S4WIN32
BOOL CALLBACK _export PrintDialogProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#else
BOOL CALLBACK PrintDialogProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#endif
{
REPORT4 *report;
WORD cmd;
switch (message)
{
case WM_INITDIALOG:
/* store the report pointer in the windows extra bytes */
SetWindowLong( hWnd, DWL_USER, lParam );
report = (REPORT4 *)GetWindowLong( hWnd, DWL_USER );
if( !report )
break;
/* set the window caption to the report name */
if( report->report_caption )
{
SetWindowText( hWnd, (LPCSTR)report->report_caption );
}
else
{
if( report->report_name )
SetWindowText( hWnd, (LPCSTR)report->report_name );
else
SetWindowText( hWnd, (LPCSTR)"CodeReporter 2.0" );
}
EnableMenuItem( GetSystemMenu(hWnd,FALSE), SC_CLOSE, MF_GRAYED );
return TRUE;
case WM_COMMAND:
cmd = GET_WM_COMMAND_ID( wParam, lParam );
switch( cmd )
{
/* cancel the print job */
case 101:
bUserAbort = TRUE;
EnableWindow( GetParent(hWnd), TRUE );
DestroyWindow( hWnd );
hDlgPrint = 0;
return TRUE;
}
break;
}
return FALSE;
}
/**************************************************************************
* This is a winproc for the transparent window which is created while
* processing the relation, it's only purpose is to absorb mouse clicks that
* an impatient user might make
**************************************************************************/
#ifndef S4WIN32
long CALLBACK _export MouseEatProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#else
long CALLBACK MouseEatProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#endif
{
switch( message )
{
case WM_CREATE:
BringWindowToTop( hWnd );
break;
}
return(DefWindowProc( hWnd, message, wParam, lParam ) );
}
/**************************************************************************
* WinProc for the page window. Responsible for painting the appropriate
* portion of the page bitmap into the page window
**************************************************************************/
#ifndef S4WIN32
long CALLBACK _export OutputPageProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#else
long CALLBACK OutputPageProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#endif
{
HDC hDC, bDC;
PAINTSTRUCT ps;
RECT rect;
int xoffset, yoffset;
HBITMAP hBit;
BITMAP bm;
switch( message )
{
case WM_PAINT:
hDC = BeginPaint( hWnd, &ps );
bDC = (HDC)MGetWinP( hWnd, PGWIN_OFF_BDC );
hBit = (HBITMAP)MGetWinP( hWnd, PGWIN_OFF_HBIT );
GetObject( (HBITMAP)hBit, sizeof(BITMAP), &bm ) ;
GetClientRect( hWnd, &rect ) ;
xoffset = GetScrollPos( GetParent(hWnd), SB_HORZ );
yoffset = MGetWinP( hWnd, PGWIN_OFF_YOFF );
BitBlt( hDC, ps.rcPaint.left, ps.rcPaint.top, (ps.rcPaint.right-ps.rcPaint.left),
(ps.rcPaint.bottom-ps.rcPaint.top), bDC, xoffset+ps.rcPaint.left, yoffset+ps.rcPaint.top, SRCCOPY );
ValidateRect( hWnd, 0 ) ;
EndPaint( hWnd, &ps );
return 0;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
/***************************************************************************
* WinProc for the output window: this window contains the page window and
* handles the scroll functionality, also the next page and close functionality
***************************************************************************/
#ifndef S4WIN32
long CALLBACK _export PreViewProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#else
long CALLBACK PreViewProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
#endif
{
HWND pagewin;
REPORT4 *report;
RECT rect;
int min, max, pos;
HDC bDC;
int xpos, width, height;
HBITMAP hBit;
BITMAP bm;
int scrollinc, temp;
WORD cmd;
switch( message )
{
case WM_CREATE:
SetWindowLong( hWnd, PWIN_OFF_REPORT, (LONG)((CREATESTRUCT *)lParam)->lpCreateParams );
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
/* destroy the transparent window */
if( report->hWnd2 )
{
ReleaseCapture();
DestroyWindow( report->hWnd2 );
report->hWnd2 = NULL;
}
break;
case WM_CLOSE:
/* enable the output windows parent and shift the focus */
EnableWindow( GetParent(hWnd), TRUE );
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
if( report && report->hWnd )
{
SetFocus( report->hWnd );
}
/* destroy the memory device context, bitmap and the window */
bDC = (HDC)MGetWinP( hWnd, PWIN_OFF_BDC );
hBit = SelectObject( bDC, (HBITMAP)MGetWinP( hWnd, PWIN_OFF_OLDOBJ ) );
DeleteDC( bDC );
DeleteObject( hBit );
DestroyWindow( hWnd );
/* post a message to the parent window indicating it is safe to free
the report */
PostMessage( report->hWnd, CRM_REPORTCLOSED, 0, 0L );
break;
case WM_SIZE:
/* adjust the scroll ranges and the position of the page window */
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
if( !report )
break;
GetClientRect( hWnd, &rect );
if( report->dev_page_width <= rect.right )
{
xpos =(int)(rect.right - (int)report->dev_page_width)/2;
width = (int)report->dev_page_width;
SetScrollRange( hWnd, SB_HORZ, 0, 0, TRUE );
}
else
{
width = rect.right;
xpos = 0;
SetScrollRange( hWnd, SB_HORZ, 0, (int)(report->dev_page_width-rect.right), TRUE );
}
if( report->dev_page_height <= rect.bottom )
{
height = (int)report->dev_page_height;
SetScrollRange( hWnd, SB_VERT, 0, 0, TRUE );
}
else
{
height = rect.bottom;
SetScrollRange( hWnd, SB_VERT, 0, (int)(report->dev_page_height-rect.bottom), TRUE );
}
GetClientRect( hWnd, &rect );
if( report->dev_page_width <= rect.right )
{
xpos =(int)(rect.right - (int)report->dev_page_width)/2;
width = (int)report->dev_page_width;
SetScrollRange( hWnd, SB_HORZ, 0, 0, TRUE );
}
else
{
width = rect.right;
xpos = 0;
SetScrollRange( hWnd, SB_HORZ, 0, (int)(report->dev_page_width-rect.right), TRUE );
}
if( report->dev_page_height <= rect.bottom )
{
height = (int)report->dev_page_height;
SetScrollRange( hWnd, SB_VERT, 0, 0, TRUE );
}
else
{
height = rect.bottom;
SetScrollRange( hWnd, SB_VERT, 0, (int)(report->dev_page_height-rect.bottom), TRUE );
}
pagewin = (HWND)MGetWinP( hWnd, PWIN_OFF_PGWIN );
if( pagewin )
SetWindowPos( pagewin, HWND_TOP, xpos, 0, width, height, SWP_NOZORDER );
break;
case WM_VSCROLL:
/* adjust the scroll position and inform the page window*/
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
if( !report )
break;
cmd = GET_WM_COMMAND_ID( wParam, lParam );
GetScrollRange( hWnd, SB_VERT, &min, &max );
pos = GetScrollPos( hWnd, SB_VERT );
pagewin = (HWND)MGetWinP( hWnd, PWIN_OFF_PGWIN );
GetClientRect( pagewin, &rect );
switch( cmd )
{
case SB_PAGEDOWN:
scrollinc = rect.bottom;
break;
case SB_PAGEUP:
scrollinc = -1 * rect.bottom;
break;
case SB_LINEDOWN:
scrollinc = 8;
break;
case SB_LINEUP:
scrollinc = -8;
break;
case SB_THUMBPOSITION:
scrollinc = LOWORD(lParam) - pos;
break;
default:
scrollinc = 0;
break;
}
temp = MIN( scrollinc, max - pos );
scrollinc = MAX( -1*pos, temp );
if( scrollinc != 0 )
{
pos += scrollinc;
MSetWinP( pagewin, PGWIN_OFF_YOFF, pos );
ScrollWindow( pagewin, 0, -1*scrollinc, NULL, NULL );
SetScrollPos( hWnd, SB_VERT, pos, TRUE );
}
return 0;
case WM_HSCROLL:
/* adjust the scroll position and inform the page window*/
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
if( !report )
break;
cmd = GET_WM_COMMAND_ID( wParam, lParam );
GetScrollRange( hWnd, SB_HORZ, &min, &max );
pos = GetScrollPos( hWnd, SB_HORZ );
pagewin = (HWND)MGetWinP( hWnd, PWIN_OFF_PGWIN );
GetClientRect( pagewin, &rect );
switch( wParam )
{
case SB_PAGEDOWN:
scrollinc = rect.bottom;
break;
case SB_PAGEUP:
scrollinc = -1 * rect.bottom;
break;
case SB_LINEDOWN:
scrollinc = 8;
break;
case SB_LINEUP:
scrollinc = -8;
break;
case SB_THUMBPOSITION:
scrollinc = LOWORD(lParam) - pos;
break;
default:
scrollinc = 0;
break;
}
temp = MIN( scrollinc, max - pos );
scrollinc = MAX( -1*pos, temp );
if( scrollinc != 0 )
{
pos += scrollinc;
ScrollWindow( pagewin, -1*scrollinc, 0, NULL, NULL );
SetScrollPos( hWnd, SB_HORZ, pos, TRUE );
}
return 0;
case WM_COMMAND:
cmd = GET_WM_COMMAND_ID( wParam, lParam );
switch( cmd )
{
case 111: /* next page */
/* generate the next page of the report into the bitmap, and
update the page window */
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
if( !report )
break;
pagewin = (HWND)MGetWinP( hWnd, PWIN_OFF_PGWIN );
GetClientRect( pagewin, &rect );
hBit = (HBITMAP)MGetWinP( hWnd, PWIN_OFF_HBIT );
bDC = (HDC)MGetWinP( hWnd, PWIN_OFF_BDC );
GetObject( (HBITMAP)hBit, sizeof(BITMAP), &bm ) ;
PatBlt( bDC, 0, 0, bm.bmWidth, bm.bmHeight, WHITENESS ) ;
GetClientRect( hWnd, &rect );
MSetWinP( pagewin, PGWIN_OFF_YOFF, 0 );
SetScrollPos( hWnd, SB_VERT, 0, TRUE );
SetScrollPos( hWnd, SB_HORZ, 0, TRUE );
report4generatePage( report, bDC );
if( report->end_report == 2 )
{
EnableMenuItem( GetMenu(hWnd), 111, MF_BYCOMMAND | MF_GRAYED );
}
InvalidateRect( hWnd, NULL, TRUE );
break;
case 444: /* close */
/* reset the report members and destroy the output window */
report = (REPORT4 *)GetWindowLong( hWnd, PWIN_OFF_REPORT );
report->group_on = report->group_first = NULL;
report->area_on = NULL;
report->break_height = 0L;
report->in_header = report->end_report = report->broken = 0;
report->output_code = 1;
report->dev_page_height = report->dev_page_width = 0;
report->disp_bottom = report->ypos = 0;
EnableWindow( GetParent(hWnd), TRUE );
SetFocus( GetParent(hWnd) );
bDC = (HDC)MGetWinP( hWnd, PWIN_OFF_BDC );
hBit = SelectObject( bDC, (HBITMAP)MGetWinP( hWnd, PWIN_OFF_OLDOBJ ) );
DeleteDC( bDC );
DeleteObject( hBit );
DestroyWindow( hWnd );
PostMessage( report->hWnd, CRM_REPORTCLOSED, 0, 0L );
return 0;
}
break;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
/***************************************************************************
* creates the output and page windows, sets appropriate scroll ranges and
* generates the first page of the report
***************************************************************************/
int report4output_window( REPORT4 *report )
{
HWND outputwindow, pagewin, hWnd;
HMENU hMenu;
int width, height, xpos;
RECT rect;
HDC hDC, pDC, bDC;
POINT pt, pt2;
int num_bits, planes;
HBITMAP hBit, hOld;
BITMAP bm;
char title[50], *tptr;
width = GetSystemMetrics( SM_CXFULLSCREEN ) ;
height = GetSystemMetrics( SM_CYFULLSCREEN ) ;
hMenu = CreateMenu();
#ifdef S4GERMAN
AppendMenu( hMenu, MF_ENABLED | MF_STRING, 111, "&N<>chste");
AppendMenu( hMenu, MF_ENABLED | MF_STRING, 444, "&Schlie<69>en");
#else
AppendMenu( hMenu, MF_ENABLED | MF_STRING, 111, "&Next");
AppendMenu( hMenu, MF_ENABLED | MF_STRING, 444, "&Close");
#endif
if( report->report_caption && strlen(report->report_caption) > 0 )
tptr = report->report_caption;
else
{
if( report->report_name && strlen(report->report_name) != 0 )
tptr = report->report_name;
else
{
sprintf( title, "CodeReporter 2.0" );
tptr = title;
}
}
#ifdef S4WIN32
outputwindow = CreateWindow( "PreViewWin",
tptr,
WS_POPUP | WS_CAPTION | WS_MAXIMIZE | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU ,
0, 0, width, height,
report->hWnd, hMenu, (HINSTANCE)GetWindowLong( report->hWnd, GWL_HINSTANCE), (LPVOID)report );
#else
outputwindow = CreateWindow( "PreViewWin",
tptr,
WS_POPUP | WS_CAPTION | WS_MAXIMIZE | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU ,
0, 0, width, height,
report->hWnd, hMenu, (HINSTANCE)GetWindowWord( (HWND)report->hWnd, GWW_HINSTANCE), (void FAR*)(DWORD)report );
#endif
if( !outputwindow )
{
e4describe( report->code_base, e4rep_win, E4_REP_OUTWIN, 0, 0 );
return -1;
}
#ifdef S4WIN32
SetClassLong( outputwindow, GCL_HCURSOR, (LONG)((HCURSOR)LoadCursor(NULL, IDC_ARROW)) );
#else
SetClassWord( (HWND)outputwindow, (int)GCW_HCURSOR, (WORD)(HCURSOR)LoadCursor(NULL, IDC_ARROW) );
#endif
SetCursor( LoadCursor( NULL, IDC_ARROW ) );
SetScrollRange( outputwindow, SB_HORZ, 0, 0, TRUE );
SetScrollRange( outputwindow, SB_VERT, 0, 0, TRUE );
hWnd = outputwindow;
hDC = GetDC( hWnd );
SetMapMode( hDC, MM_HIENGLISH );
SetMapMode( hDC, MM_ANISOTROPIC );
report4calc_obj_dev( report, hDC );
pt.x = (int)(report->report_width +
report->margin_left +
report->margin_right);
LPtoDP( hDC, &pt, 1 );
if( report->screen_breaks )
{
if( !report->printerDC )
{
pDC = report4get_printerIC( report );
pt.y = GetDeviceCaps( pDC, VERTSIZE );
DeleteDC( pDC );
}
else
pt.y = GetDeviceCaps( report->printerDC, VERTSIZE );
pt2.y = (int)(((float)pt.y/25.4)*1000.0);
pt2.x = 0;
LPtoDP( hDC, &pt2, 1 );
pt.y = (pt2.y < 0)?-1*pt2.y:pt2.y;
}
else
{
GetClientRect( hWnd, &rect );
pt.y = rect.bottom;
}
bDC = CreateCompatibleDC( hDC );
num_bits = GetDeviceCaps( hDC, BITSPIXEL );
planes = GetDeviceCaps( hDC, PLANES );
hBit = CreateBitmap( pt.x, pt.y, planes, num_bits, 0 );
MSetWinP( hWnd, PWIN_OFF_BDC, bDC );
MSetWinP( hWnd, PWIN_OFF_HBIT, hBit );
hOld = SelectObject( bDC, hBit );
MSetWinP( hWnd, PWIN_OFF_OLDOBJ, hOld );
report->dev_page_height = pt.y;
report->dev_page_width = pt.x;
GetClientRect( hWnd, &rect );
if( pt.x <= rect.right )
{
xpos = (rect.right - pt.x)/2;
width = pt.x;
SetScrollRange( hWnd, SB_HORZ, 0, 0, TRUE );
}
else
{
width = rect.right;
xpos = 0;
SetScrollRange( hWnd, SB_HORZ, 0, (pt.x-rect.right), TRUE );
}
if( pt.y <= rect.bottom )
{
height = pt.y;
SetScrollRange( hWnd, SB_VERT, 0, 0, TRUE );
}
else
{
height = rect.bottom;
SetScrollRange( hWnd, SB_VERT, 0, pt.y-rect.bottom, TRUE );
}
#ifdef S4WIN32
pagewin = CreateWindow( "OutputPageWin","",WS_CHILD|WS_VISIBLE,
xpos, 0, width, height,
hWnd, NULL, (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE), (LPVOID)report );
#else
pagewin = CreateWindow( "OutputPageWin","",WS_CHILD|WS_VISIBLE,
xpos, 0, width, height,
hWnd, NULL, (HINSTANCE)GetWindowWord( hWnd, GWW_HINSTANCE), (void FAR *)report );
#endif
ReleaseDC( hWnd, hDC );
if( !pagewin )
{
e4describe( report->code_base, e4rep_win, E4_REP_PAGEWIN, 0, 0 );
return -1;
}
MSetWinP( pagewin, PGWIN_OFF_BDC, bDC );
MSetWinP( pagewin, PGWIN_OFF_HBIT, hBit );
MSetWinP( hWnd, PWIN_OFF_PGWIN, pagewin );
#ifdef S4WIN32
SetClassLong( pagewin, GCL_HCURSOR, (LONG)((HCURSOR)LoadCursor(NULL,IDC_ARROW)) );
#else
SetClassWord( (HWND)pagewin, (int)GCW_HCURSOR, (WORD)((HCURSOR)LoadCursor(NULL,IDC_ARROW)) );
#endif
SetCursor( LoadCursor(NULL,IDC_ARROW) );
GetObject( (HBITMAP)hBit, sizeof( BITMAP ), &bm );
PatBlt( bDC, 0, 0, bm.bmWidth, bm.bmHeight, WHITENESS );
report4generatePage( report, bDC );
InvalidateRect( pagewin, NULL, TRUE );
if( MGetWinP(outputwindow,PWIN_OFF_BDC) == 0 || MGetWinP(outputwindow,PWIN_OFF_HBIT) == 0 )
{
DestroyWindow( outputwindow );
return -1;
}
EnableWindow( report->hWnd, FALSE );
return 0;
}
#endif /* #ifdef S4WINDOWS */
/************************************************************************
* convert a double val into the appropriate text string based on the
* formatting info in the object structure
*************************************************************************/
int report4conv_double( OBJ4 *obj, double doub_val, char *ptr )
{
int sig_digs = 0, sign_val, n_dec, pos, left, first_few, i, tdec;
REPORT4 *report;
char *result, tbuf[11];
#ifdef S4DEBUG
if( !obj || !ptr )
{
return -1;
}
#endif
report = obj->area->report;
if( !obj->display_zero )
if( doub_val == 0.0 )
return 0 ;
pos = 0 ;
n_dec = tdec = obj->dec ;
if( obj->numeric_type == obj4numPercent )
n_dec += 2 ;
if( obj->area->report->decimal_point == '\0' )
obj->dec = 0;
#ifdef S4NO_FCVT
result = f4fcvt( doub_val, n_dec, (int *)&sig_digs, (int *)&sign_val) ;
#else
result = fcvt( doub_val, n_dec, (int *)&sig_digs, (int *)&sign_val) ;
#endif
if( result[0] == '0' )
sig_digs = 0 ;
if( obj->numeric_type == obj4numExponent )
{
if( sign_val )
{
if( obj->use_brackets )
ptr[pos++] = '(' ;
else
ptr[pos++] = '-' ;
}
ptr[pos++] = *result++ ;
ptr[pos++] = report->decimal_point ;
if(obj->dec)
{
if( obj->dec <= (int)strlen(result)-1 )
left = u4ncpy( ptr+pos, result, obj->dec+1 );
else
left = u4ncpy( ptr+pos, result, strlen(result) );
}
else
left = 0;
pos += left ;
ptr[pos++] = 'e';
memset( tbuf, 0, sizeof(tbuf) );
c4ltoa45( sig_digs-1, tbuf, 10 ) ;
while( tbuf[0] == ' ' )
for( i = 0; i < (int)strlen(tbuf); i++ )
tbuf[i] = tbuf[i+1];
strcpy( ptr+pos, tbuf );
pos += strlen( tbuf );
obj->dec = tdec;
return pos ;
}
if( obj->numeric_type == obj4numPercent )
{
if( doub_val < 0.01 && obj->dec == 0 )
sig_digs = 1;
else
sig_digs += 2 ;
n_dec -= 2 ;
}
if( n_dec <= -sig_digs )
sign_val = 0 ;
if( sign_val )
{
if( obj->use_brackets )
ptr[pos++] = '(' ;
else
ptr[pos++] = '-' ;
}
if( obj->numeric_type == obj4numCurrency )
{
for( i = 0; i < (int)strlen( report->currency_symbol ); i++ )
ptr[pos++] = report->currency_symbol[i] ;
}
if( sig_digs > 0 )
{
first_few = sig_digs % 3 ;
if( first_few == 0 && sig_digs > 0 )
first_few = 3 ;
memcpy( ptr+pos, result, first_few ) ;
pos+= first_few ;
result += first_few ;
sig_digs -= first_few ;
for(; sig_digs > 0; sig_digs -= 3 )
{
if( report->thousand_separator )
ptr[pos++] = report->thousand_separator ;
memcpy( ptr+pos, result, 3 ) ;
pos+= 3 ;
result += 3 ;
}
if( obj->dec > 0 )
ptr[pos++] = report->decimal_point ;
memcpy( ptr+pos, result, obj->dec ) ;
pos += obj->dec ;
}
else
{
if( obj->leading_zero )
ptr[pos++] = '0' ;
if( obj->dec > 0 )
{
ptr[pos++] = report->decimal_point ;
memset( ptr+pos, '0', -sig_digs ) ;
if( obj->dec > -sig_digs )
memcpy( ptr+pos+ (-sig_digs), result, obj->dec - (-sig_digs) ) ;
pos += obj->dec ;
}
if( pos == 0 )
ptr[pos++] = '0' ; /* Ensure at least a single zero */
}
if( sign_val && obj->use_brackets )
ptr[pos++] = ')' ;
if( obj->numeric_type == obj4numPercent )
ptr[pos++] = '%' ;
obj->dec = tdec;
return pos ;
}
/***************************************************************************
*
***************************************************************************/
int report4check_lookahead_object( OBJ4 *obj )
{
OBJ4 *obj_on;
if( obj->lookahead && obj->obj_type_num != obj4type_total )
return 1;
obj_on = (OBJ4 *)l4first( &obj->contained );
while( obj_on )
{
if( report4check_lookahead_object( obj_on ) == 1 )
return 1;
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
}
return 0;
}
/*************************************************************************
*
*************************************************************************/
void report4check_lookahead( REPORT4 *report )
{
GROUP4 *group_on;
AREA4 *area_on;
OBJ4 *obj_on;
group_on = (GROUP4 *)l4first( &report->groups );
while( group_on )
{
group_on->lookahead = 0;
area_on = (AREA4 *)l4first( &group_on->header_areas );
while( area_on )
{
obj_on = (OBJ4 *)l4first( &area_on->objects );
while( obj_on )
{
if( report4check_lookahead_object( obj_on ) == 1 )
group_on->lookahead = 1;
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 )
{
if( report4check_lookahead_object( obj_on ) == 1 )
group_on->lookahead = 1;
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 );
}
}
/***************************************************************************
*
***************************************************************************/
void obj4evaluate_lookahead( OBJ4 *obj )
{
OBJ4 *obj_on;
if( obj->lookahead )
{
if( obj->obj_type_num == obj4type_total )
total4value_update( (TOTAL4 *)obj->data );
obj4evaluate( obj );
}
obj_on = (OBJ4 *)l4first( &obj->contained );
while( obj_on )
{
obj4evaluate_lookahead( obj_on );
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
}
}
/***************************************************************************
*
***************************************************************************/
void group4evaluate_lookahead( GROUP4 *group )
{
OBJ4 *obj_on;
AREA4 *area_on;
area_on = (AREA4 *)l4first( &group->header_areas );
while( area_on )
{
obj_on = (OBJ4 *)l4first( &area_on->objects );
while( obj_on )
{
obj4evaluate_lookahead( obj_on );
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
}
area_on = (AREA4 *)l4next( &group->header_areas, area_on );
}
area_on = (AREA4 *)l4first( &group->footer_areas );
while( area_on )
{
obj_on = (OBJ4 *)l4first( &area_on->objects );
while( obj_on )
{
obj4evaluate_lookahead( obj_on );
obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
}
area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
}
}
/***************************************************************************
*
***************************************************************************/
void report4evaluate_lookahead( GROUP4 *group )
{
long reccount = 0;
char *ptr;
int len, flag;
PGROUP4 group_on;
PREPORT4 report;
if( !group )
return;
report = group->report;
group_on = NULL;
do
{
group_on = (PGROUP4)l4next( &report->groups, group_on );
if( group_on->last_reset_value )
{
#ifdef S4WINDOWS
group_on->held_reset_value = (char *)u4alloc( lstrlen( group->last_reset_value ) + 1 );
#else
group_on->held_reset_value = (char *)u4alloc( strlen( group->last_reset_value ) + 1 );
#endif
if( !group_on->held_reset_value )
return;
if( group_on->held_reset_value )
{
#ifdef S4WINDOWS
lstrcpy( group_on->held_reset_value, group_on->last_reset_value );
#else
strcpy( group_on->held_reset_value, group_on->last_reset_value );
#endif
}
}
} while( group_on != group );
group4evaluate_lookahead( group );
flag = 1;
while( flag )
{
if( relate4skip( group->report->relate, 1L ) != 0 )
{
reccount++;
break;
}
reccount++;
group_on = NULL;
do
{
group_on = (PGROUP4)l4next( &report->groups, group_on );
if( group_on->reset_expression )
{
len = expr4vary( group->reset_expression, &ptr );
if( memcmp( group->last_reset_value, ptr, len ) != 0 )
flag = 0;
u4ncpy( group->last_reset_value, ptr, len+1 );
}
} while( group_on != group );
if( flag )
group4evaluate_lookahead( group );
}
group_on = NULL;
do
{
group_on = (PGROUP4)l4next( &report->groups, group_on );
if( group_on->held_reset_value )
{
#ifdef S4WINDOWS
lstrcpy( group_on->last_reset_value, group_on->held_reset_value );
#else
strcpy( group_on->last_reset_value, group_on->held_reset_value );
#endif
u4free( group_on->held_reset_value );
group_on->held_reset_value = NULL;
}
} while( group_on != group );
relate4skip( group->report->relate, (long)(-1 * reccount) );
}
/***************************************************************************
*
***************************************************************************/
int report4check_display_once_object( OBJ4 *obj )
{
OBJ4 *obj_on;
if( obj->display_once )
{
if( obj->last_display_val )
{
u4free( obj->last_display_val );
obj->last_display_val = NULL;
}
if( obj->display_once_expr )
{
obj->last_display_val = (char *)
u4alloc_free(obj->area->report->code_base, expr4len(obj->display_once_expr)+1);
}
else
{
obj->display_once = 0;
}
if( !obj->last_display_val )
obj->display_once = 0;
}
obj_on = (OBJ4 *)l4first( &obj->contained );
while( obj_on )
{
report4check_display_once_object( obj_on );
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
}
return 0;
}
/***************************************************************************
*
***************************************************************************/
void report4check_display_once( REPORT4 *report )
{
GROUP4 *group_on;
AREA4 *area_on;
OBJ4 *obj_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 )
{
if( report4check_display_once_object( obj_on ) == 1 )
group_on->lookahead = 1;
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 )
{
if( report4check_display_once_object( obj_on ) == 1 )
group_on->lookahead = 1;
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 );
}
}
#ifdef S4WINDOWS
/***************************************************************************
* this is the high level report output function. it initialises the various
* report members and then creates the appropriate output windows
***************************************************************************/
int S4FUNCTION report4do( REPORT4 *report )
{
char *tptr, title[250];
ABORTPROC lpfnAbortProc;
DLGPROC lpfnMPrintDlgProc;
LPSTR dialogtemplate;
GLOBALHANDLE dialoghandle;
POINT pt;
if( (report4register_classes( report )) < 0 )
{
return -1;
}
if( report4pageInit( report ) < 0 )
return -1;
if( report->output_code == 1 )
{
if( (report4output_window( report )) < 0 )
return -1;
}
else
{
EnableWindow( report->hWnd, FALSE );
bUserAbort = FALSE;
if( !report->printerDC )
report->printerDC = report4get_printerDC( );
SaveDC( report->printerDC );
SetMapMode( report->printerDC, MM_HIENGLISH );
SetMapMode( report->printerDC, MM_ANISOTROPIC );
pt.x =(int)( report->report_width +
(report->margin_left - report->hard_margin_left) +
(report->margin_right - report->hard_margin_right));
LPtoDP( report->printerDC, &pt, 1 );
report->dev_page_width = pt.x;
report->dev_page_height = GetDeviceCaps( report->printerDC, VERTRES );
report4output_screen_fonts( report );
report4calc_obj_dev( report, report->printerDC );
RestoreDC( report->printerDC, -1 );
#ifndef S4WIN32
lpfnMPrintDlgProc = (DLGPROC)MakeProcInstance( (FARPROC)PrintDialogProc, (HINSTANCE)GetWindowWord( report->hWnd, GWW_HINSTANCE) );
#else
lpfnMPrintDlgProc = (DLGPROC)MakeProcInstance( (FARPROC)PrintDialogProc, (HINSTANCE)GetWindowLong( report->hWnd, GWL_HINSTANCE) );
#endif
dialoghandle = NewDlgTemplate( DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU,
89, 42, 130, 62, "", "", "CodeReporter 2.0", "", 0 );
if( dialoghandle == NULL )
{
return -1;
}
if( AddDlgItem( dialoghandle, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP,
9, 11, 54, 9, "STATIC", "Cancel Printing", 0, "", -1 ) == FALSE )
{
GlobalFree( dialoghandle );
return -1;
}
if( AddDlgItem( dialoghandle, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
12, 33, 51, 14, "BUTTON", "&Cancel", 0, "", 101 ) == FALSE )
{
GlobalFree( dialoghandle );
return -1;
}
dialogtemplate = GlobalLock( dialoghandle );
#ifdef S4WIN32
hDlgPrint = CreateDialogIndirectParam( (HINSTANCE)GetWindowLong( report->hWnd,GWL_HINSTANCE ),
(const struct DLGTEMPLATE *)dialogtemplate, report->hWnd, lpfnMPrintDlgProc, (LPARAM)report );
lpfnAbortProc = MakeProcInstance((FARPROC)MPrintAbortProc, GetWindowLong( report->hWnd, GWL_HINSTANCE) );
#else
hDlgPrint = CreateDialogIndirectParam( (HINSTANCE)GetWindowWord( report->hWnd,GWW_HINSTANCE ),
(const void FAR*)dialogtemplate, report->hWnd, lpfnMPrintDlgProc, (LPARAM)report );
lpfnAbortProc = (ABORTPROC)MakeProcInstance((FARPROC)MPrintAbortProc, (HINSTANCE)GetWindowWord( report->hWnd, GWW_HINSTANCE) );
#endif
Escape( report->printerDC, SETABORTPROC, 0, (LPSTR)lpfnAbortProc, NULL );
SetAbortProc( report->printerDC, lpfnAbortProc );
if( report->report_caption && strlen(report->report_caption) > 0 )
tptr = report->report_caption;
else
{
if( report->report_name && strlen(report->report_name) != 0 )
tptr = report->report_name;
else
{
sprintf( title, "CodeReporter 2.0" );
tptr = title;
}
}
if( Escape( report->printerDC, STARTDOC, 10, tptr, NULL ) > 0 )
{
while( report->end_report != 2 && !bUserAbort )
{
report4generatePage( report, report->printerDC );
if( !report->page_nums )
{
Escape( report->printerDC, NEWFRAME, 0, NULL, NULL );
}
else
if ( report->page_count >= report->start_page && report->page_count <= report->end_page )
{
Escape( report->printerDC, NEWFRAME, 0, NULL, NULL );
}
}
Escape( report->printerDC, ENDDOC, 0, NULL, NULL );
}
if( !bUserAbort )
{
DestroyWindow( hDlgPrint );
}
FreeProcInstance( (FARPROC)lpfnMPrintDlgProc );
FreeProcInstance( (FARPROC)lpfnAbortProc );
PostMessage( report->hWnd, CRM_REPORTCLOSED, 0, 0L );
ReleaseCapture();
if( report->hWnd2 )
{
DestroyWindow( report->hWnd2 );
report->hWnd2 = 0;
}
EnableWindow( report->hWnd, TRUE );
SetFocus( report->hWnd );
}
report4pageFree( report );
return 0;
}
#endif