DIALOG.C

/******************************Module*Header*******************************\ 
* Module Name: sspipes.c
*
* Message loop and dialog box for the OpenGL-based 3D Pipes screen saver.
*
* Copyright (c) 1994 Microsoft Corporation
*
\**************************************************************************/

#include <windows.h>
#include <commdlg.h>
#include <scrnsave.h>
#include <GL\gl.h>
#include <math.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <sys\timeb.h>
#include <time.h>
#include <commctrl.h>
#include "sscommon.h"
#include "sspipes.h"
#include "dlgs.h"
#include "dialog.h"

BOOL bFlexMode;
BOOL bMultiPipes;

// ulJointType controls the style of the elbows.

ULONG ulJointType = JOINT_ELBOW;

// ulSurfStyle determines whether the pipe surfaces are textured.

ULONG ulSurfStyle = SURFSTYLE_SOLID;

// ulTexQuality control the texture quality.

ULONG ulTexQuality = TEXQUAL_DEFAULT;

// fTesselFact controls the how finely the surface is tesselated. It
// varies from very course (0.0) to very fine (2.0).

float fTesselFact = 1.0f;

// If ulSurfStyle indicates a textured surface, szTexPathname specifies
// the bitmap chosen as the texture.

// Texture file(s)
TEXFILE gTexFile[MAX_TEXTURES] = {0};
int gnTextures = 0;

static void updateDialogControls(HWND hDlg);

/******************************Public*Routine******************************\
* getIniSettings
*
* Get the screen saver configuration options from .INI file/registry.
*
\**************************************************************************/

void
getIniSettings()
{
int tessel;

// Load resources

LoadString(hMainInstance, IDS_GENNAME, szScreenSaver,
sizeof(szScreenSaver) / sizeof(TCHAR));

// Load resource strings for texture processing

ss_LoadTextureResourceStrings();

// Get registry settings

if( ss_RegistrySetup( hMainInstance, IDS_SAVERNAME, IDS_INIFILE ) )
{
ulJointType = ss_GetRegistryInt( IDS_JOINTTYPE, JOINT_ELBOW );

ulSurfStyle = ss_GetRegistryInt( IDS_SURFSTYLE, SURFSTYLE_SOLID );

ulTexQuality = ss_GetRegistryInt( IDS_TEXQUAL, TEXQUAL_DEFAULT );

tessel = ss_GetRegistryInt( IDS_TESSELATION, 0 );
SS_CLAMP_TO_RANGE2( tessel, 0, 200 );
fTesselFact = (float)tessel / 100.0f;

bFlexMode = ss_GetRegistryInt( IDS_FLEX, 0 );

bMultiPipes = ss_GetRegistryInt( IDS_MULTIPIPES, 0 );

// Get any textures

#ifndef NEW_TEXTURE
// Just get one texture with old registry names
ss_GetRegistryString( IDS_TEXTURE, 0, gTexFile[0].szPathName, MAX_PATH);
gTexFile[0].nOffset = ss_GetRegistryInt( IDS_TEXTURE_FILE_OFFSET, 0 );
gnTextures = 1;
#else
gnTextures = ss_GetRegistryInt( IDS_TEXTURE_COUNT, 0 );
SS_CLAMP_TO_RANGE2( gnTextures, 0, MAX_TEXTURES );

idsTexture = IDS_TEXTURE0;
idsTexOffset = IDS_TEXOFFSET0;
for( i = 0; i < gnTextures; i++, idsTexture++, idsTexOffset++ ) {
ss_GetRegistryString( idsTexture, 0, gTexFile[i].szPathName,
MAX_PATH);
gTexFile[i].nOffset = ss_GetRegistryInt( idsTexOffset, 0 );
}
#endif
}
}

/**************************************************************************\
* ConfigInit
*
\**************************************************************************/
BOOL
ss_ConfigInit( HWND hDlg )
{
return TRUE;
}

/******************************Public*Routine******************************\
* saveIniSettings
*
* Save the screen saver configuration option to the .INI file/registry.
*
\**************************************************************************/

static void saveIniSettings(HWND hDlg)
{
if( ss_RegistrySetup( hMainInstance, IDS_SAVERNAME, IDS_INIFILE ) )
{
ss_WriteRegistryInt( IDS_JOINTTYPE, ulJointType );
ss_WriteRegistryInt( IDS_SURFSTYLE, ulSurfStyle );
ss_WriteRegistryInt( IDS_TEXQUAL, ulTexQuality );
ss_WriteRegistryInt( IDS_TESSELATION,
ss_GetTrackbarPos(hDlg, DLG_SETUP_TESSEL) );
ss_WriteRegistryInt( IDS_FLEX, bFlexMode );
ss_WriteRegistryInt( IDS_MULTIPIPES, bMultiPipes );
#ifndef NEW_TEXTURE
ss_WriteRegistryString( IDS_TEXTURE, gTexFile[0].szPathName );
ss_WriteRegistryInt( IDS_TEXTURE_FILE_OFFSET, gTexFile[0].nOffset );
#else
idsTexture = IDS_TEXTURE0;
idsTexOffset = IDS_TEXOFFSET0;
for( i = 0; i < gnTextures; i++, idsTexture++, idsTexOffset++ ) {
ss_WriteRegistryString( idsTexture, gTexFile[i].szPathName );
ss_WriteRegistryInt( idsTexOffset, gTexFile[i].nOffset );
}
#endif
}
}

/******************************Public*Routine******************************\
* setupDialogControls
*
* Do initial setup of dialog controls.
\**************************************************************************/

static void
setupDialogControls(HWND hDlg)
{
int pos;
int wTmp;
TCHAR szStr[GEN_STRING_SIZE];
int idsJointType;

InitCommonControls();

pos = (int)(fTesselFact * 100.0f);
ss_SetupTrackbar( hDlg, DLG_SETUP_TESSEL, 0, 200, 1, 10, pos );

// setup jointType combo box
idsJointType = IDS_JOINT_ELBOW;
for (wTmp = 0; wTmp < NUM_JOINTTYPES; wTmp++, idsJointType++) {
LoadString(hMainInstance, idsJointType, szStr,
GEN_STRING_SIZE);
SendDlgItemMessage(hDlg, DLG_COMBO_JOINTTYPE, CB_ADDSTRING, 0,
(LPARAM) szStr);
}
SendDlgItemMessage(hDlg, DLG_COMBO_JOINTTYPE, CB_SETCURSEL,
ulJointType, 0);

updateDialogControls( hDlg );
}

/******************************Public*Routine******************************\
* updateDialogControls
*
* Setup the dialog controls based on the current global state.
*
\**************************************************************************/

static void updateDialogControls(HWND hDlg)
{
BOOL bTexture = (ulSurfStyle == SURFSTYLE_TEX);

CheckDlgButton( hDlg, IDC_RADIO_SOLID, ulSurfStyle == SURFSTYLE_SOLID );
CheckDlgButton( hDlg, IDC_RADIO_TEX , bTexture );
#ifdef NEED_THESE_LATER
CheckDlgButton( hDlg, IDC_RADIO_WIREFRAME, ulSurfStyle == SURFSTYLE_WIREFRAME );

CheckDlgButton( hDlg, IDC_RADIO_TEXQUAL_DEFAULT ,
bTexture && ulTexQuality == TEXQUAL_DEFAULT);
CheckDlgButton( hDlg, IDC_RADIO_TEXQUAL_HIGH,
bTexture && ulTexQuality == TEXQUAL_HIGH);
#endif

CheckDlgButton( hDlg, IDC_RADIO_NORMAL, !bFlexMode);
CheckDlgButton( hDlg, IDC_RADIO_FLEX, bFlexMode);

CheckDlgButton( hDlg, IDC_RADIO_SINGLE_PIPE, !bMultiPipes);
CheckDlgButton( hDlg, IDC_RADIO_MULTIPLE_PIPES, bMultiPipes);

EnableWindow( GetDlgItem(hDlg, DLG_COMBO_JOINTTYPE), !bFlexMode);
EnableWindow( GetDlgItem(hDlg, IDC_STATIC_JOINTTYPE), !bFlexMode);

EnableWindow( GetDlgItem(hDlg, DLG_SETUP_TEXTURE), bTexture );
EnableWindow( GetDlgItem(hDlg, IDC_RADIO_TEXQUAL_DEFAULT), bTexture );
EnableWindow( GetDlgItem(hDlg, IDC_RADIO_TEXQUAL_HIGH), bTexture );
EnableWindow( GetDlgItem(hDlg, IDC_STATIC_TEXQUAL_GRP), bTexture );

EnableWindow(GetDlgItem(hDlg, DLG_SETUP_TESSEL), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_TESS_MIN), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_TESS_MAX), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_TESS_GRP), TRUE);
}

BOOL WINAPI RegisterDialogClasses(HANDLE hinst)
{
return TRUE;
}


/******************************Public*Routine******************************\
* ScreenSaverConfigureDialog
*
* Screen saver setup dialog box procedure.
\**************************************************************************/

BOOL ScreenSaverConfigureDialog(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
int optMask = 1;

switch (message)
{
case WM_INITDIALOG:
getIniSettings();
setupDialogControls(hDlg);
return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_RADIO_SOLID:
case IDC_RADIO_TEX:
case IDC_RADIO_WIREFRAME:
ulSurfStyle = IDC_TO_SURFSTYLE(LOWORD(wParam));
break;

case IDC_RADIO_TEXQUAL_DEFAULT:
case IDC_RADIO_TEXQUAL_HIGH:
ulTexQuality = IDC_TO_TEXQUAL(LOWORD(wParam));
break;

case IDC_RADIO_NORMAL:
bFlexMode = FALSE;
break;
case IDC_RADIO_FLEX:
bFlexMode = TRUE;
break;

case IDC_RADIO_SINGLE_PIPE:
bMultiPipes = FALSE;
break;
case IDC_RADIO_MULTIPLE_PIPES:
bMultiPipes = TRUE;
break;

case DLG_SETUP_TEXTURE:
// Run choose texture dialog
ss_SelectTextureFile( hDlg, &gTexFile[0] );
break;

case DLG_COMBO_JOINTTYPE:
switch (HIWORD(wParam))
{
case CBN_EDITCHANGE:
case CBN_SELCHANGE:
ulJointType =
SendDlgItemMessage(hDlg, DLG_COMBO_JOINTTYPE,
CB_GETCURSEL, 0, 0);
break;
default:
return FALSE;
}
break;

case IDOK:
saveIniSettings(hDlg);
EndDialog(hDlg, TRUE);
break;

case IDCANCEL:
EndDialog(hDlg, FALSE);
break;

default:
break;
}
updateDialogControls(hDlg);
return TRUE;

default:
return 0;
}
return 0;
}