1221 lines
33 KiB
C
1221 lines
33 KiB
C
|
/* 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
|
|||
|
|
|||
|
|