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