/*
 * TstPage.c - Test program for Multi-Pages 
 *
 * Author:      Kanhom Ng
 *             Kansmen Corporation
 *
 * Date:         12/09/91
 *
 *   Compiler:   Microsoft C 6.00A
 * OS:         Windows 3.0
 *
 * Copyright (C) 1991 Kanhom Ng.  All rights reserved.
 *
 */

#define NOCOMM
#include <windows.h>
#include <memory.h>

#include "tstpage.h"

LONG FAR PASCAL TestWndProc( HWND, WORD,   WORD, LONG );
BOOL FAR PASCAL ModalDlgProc( HWND, WORD,   WORD, LONG );
BOOL FAR PASCAL ModelessDlgProc( HWND, WORD,   WORD, LONG );

/* function prototype for multiple page dialog */
BOOL  CreateDlgPage( HWND, HANDLE, LPSTR, POINT, BOOL);
BOOL  ShowDlgPage( HWND, WORD, BOOL );
BOOL  EndDlgPage( HWND );

/* local variable */
char         szTestClass[] = "Test - Mulitple Pages Dialog";
FARPROC      lpfn;
FARPROC      lpfnLess;
HWND         hwndModeless = 0;

int PASCAL WinMain(
   HANDLE         hInstance,
   HANDLE         hPrevInst,
   LPSTR          lpszCmd,
   WORD            wCmdShow )
{
   BOOL            fSuccess;         
   MSG            msg;               
   HWND            hWnd;         
   WNDCLASS         WndClass;         

   /* initialization */
   fSuccess = TRUE;
   lpfnLess = lpfn = NULL;
   _fmemset( &WndClass, 0, sizeof( WndClass ) );

   if ( fSuccess && hPrevInst == 0 )
   {
      WndClass.lpfnWndProc = TestWndProc;
      WndClass.hInstance = hInstance;
      WndClass.hIcon =LoadIcon( NULL, IDI_APPLICATION);
      WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
      WndClass.hbrBackground = COLOR_APPWORKSPACE + 1;
      WndClass.lpszMenuName = "Main";
      WndClass.lpszClassName = szTestClass;
      fSuccess = RegisterClass( &WndClass );
   }
   if ( fSuccess )
   {
      hWnd = CreateWindow( szTestClass, szTestClass,
                  WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN,
                  CW_USEDEFAULT, CW_USEDEFAULT,
                  CW_USEDEFAULT, CW_USEDEFAULT,
                  NULL, NULL, hInstance, NULL );
      fSuccess = IsWindow( hWnd );
   }
   if ( fSuccess )
   {
      fSuccess =    
         ( lpfn = MakeProcInstance( (FARPROC)ModalDlgProc, hInstance ) )
      &&   ( lpfnLess = MakeProcInstance( (FARPROC)ModelessDlgProc, hInstance ) );
   }
   if ( fSuccess )
   {
      ShowWindow( hWnd, wCmdShow );
      while ( GetMessage( &msg, NULL, 0, 0 ) )
      {
         if (    IsWindow( hwndModeless ) 
            && IsDialogMessage( hwndModeless, &msg ) )
         {
         }
         else
         {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
         }
      }
   }
   FreeProcInstance( lpfn );
   FreeProcInstance( lpfnLess );
   return ( NULL );
}

/*
 * Window function for the test application
 */

LONG FAR PASCAL TestWndProc(
   HWND           hWnd,
   WORD           wMsg,
   WORD           wParam,
   LONG           lParam 
   )
{
   
   LONG            lRet;            
   HANDLE         hInst;            

   lRet = 0L;

   switch ( wMsg )
   {
   case WM_DESTROY:
      PostQuitMessage( 0 );
      break;

   case WM_COMMAND:
      hInst = GetWindowWord( hWnd, GWW_HINSTANCE );
      switch ( wParam )
      {
      case IDM_MODAL:
         DialogBox( hInst, "test1", hWnd, lpfn );
         break;

      case IDM_MODELESS:
         CreateDialog( hInst, "base", hWnd, lpfnLess );
         break;
      }
      break;

   default:
      lRet = DefWindowProc( hWnd, wMsg, wParam, lParam );
      break;
   }
   return ( lRet );
}

/*
 *
 *      This is the modal dialogbox function.
 */

BOOL FAR PASCAL ModalDlgProc(
   HWND           hDlg,
   WORD           wMsg,
   WORD           wParam,
   LONG           lParam 
   )
{

   BOOL           fReturn;             
   POINT          pt;
   HANDLE         hInst;

   fReturn = TRUE;

   switch ( wMsg )
   {
   case WM_INITDIALOG:
      hInst = GetWindowWord( hDlg, GWW_HINSTANCE );
      pt.x = pt.y = 0;
      CreateDlgPage( hDlg, hInst, "Page1", pt, TRUE );
      CreateDlgPage( hDlg, hInst, "Page2", pt, FALSE );
      CreateDlgPage( hDlg, hInst, "Page3", pt, FALSE );
      break;

   case WM_COMMAND:
      switch ( wParam )
      {
      case IDCANCEL:   /* for ESC */
         EndDlgPage( hDlg );
         EndDialog( hDlg, IDOK );
         break;

      case IDD_PAGE1:
         ShowDlgPage( hDlg, 1, FALSE );
         ShowDlgPage( hDlg, 2, FALSE );
         ShowDlgPage( hDlg, 0, TRUE );
         break;

      case IDD_PAGE2:
         ShowDlgPage( hDlg, 0, FALSE );
         ShowDlgPage( hDlg, 2, FALSE );
         ShowDlgPage( hDlg, 1, TRUE );
         break;

      case IDD_PAGE3:
         ShowDlgPage( hDlg, 0, FALSE );
         ShowDlgPage( hDlg, 1, FALSE );
         ShowDlgPage( hDlg, 2, TRUE );
         break;

      default:
         fReturn = FALSE;
         break;
      }
      break;

   default:
      fReturn = FALSE;
      break;
   }
   return ( fReturn );
}

/*
 *      This is the modeless dialogbox function.
 */
BOOL FAR PASCAL ModelessDlgProc(
   HWND           hDlg,
   WORD           wMsg,
   WORD           wParam,
   LONG           lParam 
   )
{

   BOOL           fReturn;             
   POINT          pt;
   HANDLE         hInst;
   RECT           rc;

   fReturn = TRUE;

   switch ( wMsg )
   {
   case WM_INITDIALOG:
      hInst = GetWindowWord( hDlg, GWW_HINSTANCE );
      GetWindowRect( GetDlgItem(hDlg,IDD_LEFT), &rc );
      ScreenToClient( hDlg, (LPPOINT)&rc.left );
      pt.x = rc.left;
      pt.y = rc.top;
      CreateDlgPage( hDlg, hInst, "LEFT-1", pt,TRUE );
      CreateDlgPage( hDlg, hInst, "LEFT-2", pt,FALSE);

      GetWindowRect( GetDlgItem( hDlg,IDD_RIGHT),&rc );
      ScreenToClient( hDlg, (LPPOINT)&rc.left );
      pt.x = rc.left;
      pt.y = rc.top;
      CreateDlgPage( hDlg, hInst, "RIGHT-1", pt,TRUE );
      CreateDlgPage( hDlg, hInst, "RIGHT-2", pt,FALSE);
      break;

   case WM_COMMAND:
      switch ( wParam )
      {
      case IDCANCEL:   /* for ESC */
         DestroyWindow( hDlg );
         break;

      case IDD_LEFT1:
         ShowDlgPage( hDlg, 1, FALSE );
         ShowDlgPage( hDlg, 0, TRUE );
         break;

      case IDD_LEFT2:
         ShowDlgPage( hDlg, 0, FALSE );
         ShowDlgPage( hDlg, 1, TRUE );
         break;

      case IDD_RIGHT1:
         ShowDlgPage( hDlg, 3, FALSE );
         ShowDlgPage( hDlg, 2, TRUE );
         break;

      case IDD_RIGHT2:
         ShowDlgPage( hDlg, 2, FALSE );
         ShowDlgPage( hDlg, 3, TRUE );
         break;
      }
      break;

   case WM_ACTIVATE:
      hwndModeless = wParam ? hDlg : 0;
      break;

   case WM_DESTROY:
      EndDlgPage( hDlg );
      break;

   default:
      fReturn = FALSE;
      break;
   }
   return ( fReturn );
}

