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
 | 
						||
 | 
						||
 |