DIALOG.C
/******************************Module*Header*******************************\ 
* Module Name: dialog.c 
* 
* Dialog box functions for the OpenGL-based 3D Text 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 "sscommon.h" 
#include "sstext3d.h" 
 
// Global screen saver settings. 
 
static int idsStyles[NUM_DEMOS] = 
    {IDS_DEMO_STRING, IDS_DEMO_CLOCK}; 
 
static int idsRotStyles[NUM_ROTSTYLES] = 
{    IDS_ROTSTYLE_NONE, 
     IDS_ROTSTYLE_SEESAW, 
     IDS_ROTSTYLE_WOBBLE, 
     IDS_ROTSTYLE_RANDOM 
}; 
 
// local funtions 
 
LONG WndProc(HWND, UINT, WPARAM, LPARAM); 
static void InitAttrContext( AttrContext *pac ); 
static void getFont( HWND hDlg); 
static void updateDialogControls(HWND hDlg); 
 
 
/******************************Public*Routine******************************\ 
* getIniSettings 
* 
* Get the screen saver configuration options from .INI file/registry. 
* 
\**************************************************************************/ 
 
void  
getIniSettings() 
{ 
    int    options; 
    int    optMask = 1; 
    TCHAR  szDefaultBitmap[MAX_PATH]; 
    int    iPos; 
 
    // Initialize the global AttrContext 
 
    InitAttrContext( &gac ); 
 
    // Load resources 
 
    LoadString(hMainInstance, IDS_GENNAME, szScreenSaver,  
               sizeof(szScreenSaver) / sizeof(TCHAR)); 
 
    // Get registry settings 
 
    if( ss_RegistrySetup( hMainInstance, IDS_SAVERNAME, IDS_INIFILE ) ) 
    { 
        // get demo type 
 
        gac.demoType = ss_GetRegistryInt( IDS_DEMOTYPE, DEMO_STRING ); 
        SS_CLAMP_TO_RANGE2( gac.demoType, 0, MAX_DEMO); 
 
        // get rotation style 
 
        gac.rotStyle = ss_GetRegistryInt( IDS_ROTSTYLE, ROTSTYLE_RANDOM ); 
        SS_CLAMP_TO_RANGE2( gac.rotStyle, 0, NUM_ROTSTYLES-1 ); 
 
        // get tesselation 
 
        iPos = ss_GetRegistryInt( IDS_TESSELATION, 10 ); 
        SS_CLAMP_TO_RANGE2( iPos, MIN_SLIDER, MAX_SLIDER ); 
        gac.fTesselFact  = (float)iPos / 100.0f; 
 
        // get size 
 
        gac.uSize = ss_GetRegistryInt( IDS_SIZE, 50 ); 
        SS_CLAMP_TO_RANGE2( gac.uSize, MIN_SLIDER, MAX_SLIDER ); 
 
        // get speed 
 
        gac.iSpeed = ss_GetRegistryInt( IDS_SPEED, 50 ); 
        SS_CLAMP_TO_RANGE2( gac.iSpeed, MIN_SLIDER, MAX_SLIDER ); 
 
        // get surface style 
 
        gac.surfStyle = ss_GetRegistryInt( IDS_SURFSTYLE, SURFSTYLE_SOLID ); 
        SS_CLAMP_TO_RANGE2(gac.surfStyle, 0, SURFSTYLE_TEX); 
 
        // get font, attributes, and charset 
 
        ss_GetRegistryString( IDS_FONT, TEXT("Arial"), gac.szFontName, LF_FACESIZE); 
 
        options = ss_GetRegistryInt( IDS_FONT_ATTRIBUTES, 0 ); 
        if( options >= 0 ) { 
            optMask = 1; 
            gac.bBold = ((options & optMask) != 0);  
            optMask <<=1; 
            gac.bItalic = ((options & optMask) != 0);  
        } 
 
        gac.charSet = ss_GetRegistryInt( IDS_CHARSET, 0 ); 
 
        // get display string 
 
        ss_GetRegistryString( IDS_TEXT, TEXT("OpenGL"), gac.szText, TEXT_LIMIT+1); 
 
        // Determine the default .bmp file 
 
        ss_GetDefaultBmpFile( szDefaultBitmap ); 
 
 
        // Is there a texture specified in the registry that overrides the 
        // default? 
 
        ss_GetRegistryString( IDS_TEXTURE, szDefaultBitmap, gac.texFile.szPathName, 
                              MAX_PATH); 
 
        gac.texFile.nOffset = ss_GetRegistryInt( IDS_TEXTURE_FILE_OFFSET, 0 ); 
    } 
} 
 
 
/**************************************************************************\ 
* ConfigInit 
* 
\**************************************************************************/ 
BOOL 
ss_ConfigInit( HWND hDlg ) 
{ 
    return TRUE; 
} 
 
/**************************************************************************\ 
* InitAttrContext 
* 
* Initialize some of the values in the attribute context 
\**************************************************************************/ 
static void 
InitAttrContext( AttrContext *pac ) 
{ 
    // set some default values 
 
    pac->demoType = DEMO_STRING; 
    pac->surfStyle = SURFSTYLE_SOLID; 
    pac->fTesselFact = 1.0f; 
    pac->uSize = 50; 
    pac->iSpeed = 50; 
    pac->texFile.szPathName[0] = '\0'; 
    pac->texFile.nOffset = 0; 
} 
 
/******************************Public*Routine******************************\ 
* saveIniSettings 
* 
* Save the screen saver configuration option to the .INI file/registry. 
\**************************************************************************/ 
 
static void  
saveIniSettings(HWND hDlg) 
{ 
    int options; 
    int optMask = 1; 
 
    GetWindowText( GetDlgItem(hDlg, DLG_TEXT_ENTER), gac.szText, TEXT_LIMIT+1); 
 
    if( ss_RegistrySetup( hMainInstance, IDS_SAVERNAME, IDS_INIFILE ) ) 
    { 
        ss_WriteRegistryInt( IDS_DEMOTYPE, gac.demoType ); 
        ss_WriteRegistryInt( IDS_ROTSTYLE, gac.rotStyle ); 
        ss_WriteRegistryInt( IDS_TESSELATION,  
                    ss_GetTrackbarPos(hDlg, DLG_SETUP_TESSEL) ); 
        ss_WriteRegistryInt( IDS_SIZE, 
                    ss_GetTrackbarPos(hDlg, DLG_SETUP_SIZE) ); 
        ss_WriteRegistryInt( IDS_SPEED,  
                    ss_GetTrackbarPos(hDlg, DLG_SETUP_SPEED) ); 
        ss_WriteRegistryInt( IDS_SURFSTYLE, gac.surfStyle ); 
        ss_WriteRegistryString( IDS_FONT, gac.szFontName ); 
 
        optMask = 1; 
        options = gac.bBold ? optMask : 0; 
        optMask <<= 1; 
        options |= gac.bItalic ? optMask : 0; 
        ss_WriteRegistryInt( IDS_FONT_ATTRIBUTES, options ); 
 
        ss_WriteRegistryInt( IDS_CHARSET, gac.charSet ); 
        ss_WriteRegistryString( IDS_TEXT, gac.szText ); 
        ss_WriteRegistryString( IDS_TEXTURE, gac.texFile.szPathName ); 
        ss_WriteRegistryInt( IDS_TEXTURE_FILE_OFFSET, gac.texFile.nOffset ); 
    } 
} 
 
/******************************Public*Routine******************************\ 
* setupDialogControls 
* 
* Do initial setup of dialog controls. 
\**************************************************************************/ 
 
static void  
setupDialogControls(HWND hDlg) 
{ 
    int pos; 
 
    InitCommonControls(); 
 
    // initialize sliders 
 
    // tesselation slider 
 
    pos = (int)(gac.fTesselFact * 100.0f); 
    ss_SetupTrackbar( hDlg, DLG_SETUP_TESSEL, MIN_SLIDER, MAX_SLIDER, 1, 9,  
                      pos ); 
 
    // size slider 
 
    ss_SetupTrackbar( hDlg, DLG_SETUP_SIZE, MIN_SLIDER, MAX_SLIDER, 1, 9,  
                      gac.uSize ); 
 
    // speed slider 
 
    ss_SetupTrackbar( hDlg, DLG_SETUP_SPEED, MIN_SLIDER, MAX_SLIDER, 1, 9,  
                      gac.iSpeed); 
 
    // set state of other controls 
 
    updateDialogControls(hDlg); 
} 
 
/******************************Public*Routine******************************\ 
* updateDialogControls 
* 
* Updates dialog controls according to current state 
\**************************************************************************/ 
 
static void  
updateDialogControls(HWND hDlg) 
{ 
    BOOL bTexSurf; 
    BOOL bText; 
 
    bTexSurf = (gac.surfStyle == SURFSTYLE_TEX ); 
 
    CheckDlgButton(hDlg, IDC_RADIO_SOLID, !bTexSurf ); 
    CheckDlgButton(hDlg, IDC_RADIO_TEX  , bTexSurf ); 
 
    // set up demo-specific configure button 
 
    bText = (gac.demoType == DEMO_STRING) ? TRUE : FALSE; 
    EnableWindow(GetDlgItem(hDlg, DLG_TEXT_ENTER), bText ); 
    CheckDlgButton(hDlg, IDC_DEMO_STRING, bText ); 
    CheckDlgButton(hDlg, IDC_DEMO_CLOCK, !bText ); 
 
    // texture: only enable if surfStyle is texture 
 
    EnableWindow(GetDlgItem(hDlg, DLG_SETUP_TEX), bTexSurf ); 
} 
 
/******************************Public*Routine******************************\ 
* getFont 
* 
* Calls ChooseFont dialog 
\**************************************************************************/ 
 
static void 
getFont( HWND hDlg) 
{ 
    CHOOSEFONT cf = {0}; 
    LOGFONT    lf = {0}; 
    HDC   hdc; 
 
    hdc = GetDC( hDlg ); 
 
    // Create and select a font. 
 
    cf.lStructSize = sizeof(CHOOSEFONT); 
    cf.hwndOwner = hDlg; 
    cf.lpLogFont = &lf; 
    cf.hInstance = hMainInstance; 
    cf.lpTemplateName = (LPTSTR) MAKEINTRESOURCE(IDD_FONT); 
    cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_TTONLY | 
               CF_ENABLETEMPLATE | CF_NOSIMULATIONS; 
 
    // setup logfont with current settings 
 
    lstrcpy(lf.lfFaceName, gac.szFontName); 
    lf.lfWeight = (gac.bBold) ? FW_BOLD : FW_NORMAL; 
    lf.lfItalic = (gac.bItalic) ? (BYTE) 1 : 0; 
    lf.lfCharSet = gac.charSet; 
    lf.lfHeight = -37;  // value ??? 
 
    if( ChooseFont(&cf) ) { 
        // retrieve settings into gac 
        lstrcpy( gac.szFontName, lf.lfFaceName ); 
        gac.bBold = (lf.lfWeight == FW_NORMAL) ? FALSE : TRUE; 
        gac.bItalic = (lf.lfItalic) ? TRUE : FALSE; 
        gac.charSet = lf.lfCharSet; 
    } 
} 
 
BOOL WINAPI RegisterDialogClasses(HANDLE hinst) 
{ 
    return TRUE; 
} 
 
/******************************Public*Routine******************************\ 
* ScreenSaverConfigureDialog 
* 
* Processes messages for the configuration dialog box. 
* 
\**************************************************************************/ 
 
BOOL ScreenSaverConfigureDialog(HWND hDlg, UINT message, 
                                WPARAM wParam, LPARAM lParam) 
{ 
    int wTmp; 
    TCHAR szStr[GEN_STRING_SIZE]; 
 
    switch (message) { 
        case WM_INITDIALOG: 
            getIniSettings(); 
            setupDialogControls(hDlg); 
 
            // setup rotStyle combo box 
            for (wTmp = 0; wTmp < NUM_ROTSTYLES; wTmp++) { 
                LoadString(hMainInstance, idsRotStyles[wTmp], szStr,  
                            GEN_STRING_SIZE); 
                SendDlgItemMessage(hDlg, DLG_SETUP_ROTSTYLE, CB_ADDSTRING, 0, 
                                   (LPARAM) szStr); 
            } 
            SendDlgItemMessage(hDlg, DLG_SETUP_ROTSTYLE, CB_SETCURSEL,  
                               gac.rotStyle, 0); 
 
            // display current string in box 
            SendDlgItemMessage( hDlg, DLG_TEXT_ENTER, EM_LIMITTEXT, TEXT_LIMIT,0); 
            SetWindowText( GetDlgItem(hDlg, DLG_TEXT_ENTER), gac.szText ); 
 
            return TRUE; 
 
        case WM_COMMAND: 
            switch (LOWORD(wParam)) { 
                case DLG_SETUP_TYPES: 
                    switch (HIWORD(wParam)) 
                    { 
                        case CBN_EDITCHANGE: 
                        case CBN_SELCHANGE: 
                            gac.demoType =  
                                SendDlgItemMessage(hDlg, DLG_SETUP_TYPES, 
                                                      CB_GETCURSEL, 0, 0); 
                            updateDialogControls(hDlg); 
                            break; 
                        default: 
                            break; 
                    } 
                    return FALSE; 
 
                case DLG_SETUP_ROTSTYLE: 
                    switch (HIWORD(wParam)) 
                    { 
                        case CBN_EDITCHANGE: 
                        case CBN_SELCHANGE: 
                            gac.rotStyle =  
                                SendDlgItemMessage(hDlg, DLG_SETUP_ROTSTYLE, 
                                                      CB_GETCURSEL, 0, 0); 
                            updateDialogControls(hDlg); 
                            break; 
                        default: 
                            break; 
                    } 
                    return FALSE; 
 
                case DLG_SETUP_TEX: 
                    // Run choose texture dialog 
                    ss_SelectTextureFile( hDlg, &gac.texFile ); 
                    break; 
 
                case DLG_SETUP_FONT: 
                    getFont(hDlg); 
                    break; 
                     
                case IDC_RADIO_SOLID: 
                case IDC_RADIO_TEX: 
                    gac.surfStyle = IDC_TO_SURFSTYLE( LOWORD(wParam) ); 
                    updateDialogControls(hDlg); 
                    break; 
 
                case IDC_DEMO_STRING: 
                case IDC_DEMO_CLOCK: 
                    gac.demoType = IDC_TO_DEMOTYPE( LOWORD(wParam) ); 
                    updateDialogControls(hDlg); 
                    if( LOWORD(wParam) == IDC_DEMO_STRING ) { 
                        // set selected text focus 
                        SetFocus( GetDlgItem(hDlg, DLG_TEXT_ENTER) ); 
                        SendDlgItemMessage( hDlg, DLG_TEXT_ENTER,  
                                            EM_SETSEL, 0, -1 ); 
                    } 
                    break; 
             
                case IDOK: 
                    saveIniSettings(hDlg); 
                    EndDialog(hDlg, TRUE); 
                    break; 
 
                case IDCANCEL: 
                    EndDialog(hDlg, FALSE); 
                    break; 
 
                default: 
                    break; 
            } 
            return TRUE; 
            break; 
 
        default: 
            return 0; 
    } 
    return 0; 
}