1884 lines
66 KiB
C
1884 lines
66 KiB
C
/* FROST.C
|
|
|
|
Resident Code Segment
|
|
WinMain()
|
|
Main Window(Dlg) Proc
|
|
FrostCommand()
|
|
Small Resident UtilityRoutines
|
|
|
|
Frosting: Master Theme Selector for Windows '95
|
|
Copyright (c) 1994-1999 Microsoft Corporation. All rights reserved.
|
|
*/
|
|
|
|
// ---------------------------------------------
|
|
// Brief file history:
|
|
// Alpha:
|
|
// Beta:
|
|
// Bug fixes
|
|
// ---------
|
|
//
|
|
// ---------------------------------------------
|
|
|
|
|
|
#define ROOTFILE 1
|
|
#include "windows.h"
|
|
#include "windowsx.h"
|
|
#include <mbctype.h>
|
|
#include "frost.h"
|
|
#include "global.h"
|
|
#include "..\inc\addon.h"
|
|
#include "schedule.h"
|
|
#include "htmlprev.h"
|
|
#include "objbase.h"
|
|
#include "cderr.h"
|
|
#include "commdlg.h"
|
|
|
|
/* Local Routines */
|
|
BOOL FrostCommand(HWND, WPARAM, LPARAM);
|
|
BOOL ResetTheThemeWorld(LPTSTR);
|
|
BOOL InitThemeDDL(HWND);
|
|
void NewSampleTitle(void);
|
|
void EnableScreenSaverButton();
|
|
BOOL FileSpecExists(LPTSTR szFilename);
|
|
INT_PTR FAR PASCAL BPP_ChoiceDlg(HWND, UINT, WPARAM, LPARAM);
|
|
|
|
|
|
// globals
|
|
BOOL bNewSelection = TRUE;
|
|
BOOL bAppliedOnce = FALSE; // have you applied any theme yet?
|
|
BOOL gfCoInitDone = FALSE; // track state of OLE CoInitialize()
|
|
BOOL bCB_SchedChange = FALSE; // User has toggled status of Schedule check
|
|
BOOL bInGrphFilter = FALSE; // Currently in a Graphics filter?
|
|
|
|
// virtual boolean: null theme name means Cur Win Settings, not from theme file
|
|
#define bThemed (*szCurThemeFile)
|
|
#define FROSTUNIQUEREPLY 1332 // twice 666
|
|
|
|
POPUP_HELP_ARRAY phaMainWin[] = {
|
|
{ (DWORD)DDL_THEME, (DWORD)IDH_THEME_LIST },
|
|
{ (DWORD)PB_SAVE, (DWORD)IDH_THEME_SAVEAS },
|
|
{ (DWORD)PB_DELETE, (DWORD)IDH_THEME_DELETE },
|
|
{ (DWORD)PB_SCRSVR, (DWORD)IDH_THEME_PREVSCRN },
|
|
{ (DWORD)PB_POINTERS, (DWORD)IDH_THEME_PREVETC },
|
|
{ (DWORD)CB_SCRSVR, (DWORD)IDH_THEME_SCRNSAVER },
|
|
{ (DWORD)CB_SOUND, (DWORD)IDH_THEMES_SOUNDS },
|
|
{ (DWORD)CB_PTRS, (DWORD)IDH_THEME_POINTERS },
|
|
{ (DWORD)CB_WALL, (DWORD)IDH_THEME_WALLPAPER },
|
|
{ (DWORD)CB_ICONS, (DWORD)IDH_THEME_ICONS },
|
|
{ (DWORD)CB_COLORS, (DWORD)IDH_THEME_COLORS },
|
|
{ (DWORD)CB_FONTS, (DWORD)IDH_THEME_FONTS },
|
|
{ (DWORD)CB_BORDERS, (DWORD)IDH_THEME_BORDER },
|
|
// { (DWORD)CB_ICONSIZE, (DWORD)IDH_THEME_ICON_SIZESPACE },
|
|
{ (DWORD)CB_SCHEDULE, (DWORD)IDH_THEME_ROTATE },
|
|
{ (DWORD)0, (DWORD)0 }, // double-null terminator
|
|
};
|
|
|
|
int WINAPI WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
|
|
HINSTANCE hInstance; /* current instance */
|
|
HINSTANCE hPrevInstance; /* previous instance */
|
|
LPSTR lpCmdLine; /* command line */
|
|
int nCmdShow; /* show-window type (open/icon) */
|
|
{
|
|
MSG msg;
|
|
HWND hWndPrev, hPopupWnd;
|
|
TCHAR szMsg[MAX_MSGLEN+1];
|
|
TCHAR szAppName[MAX_STRLEN+1];
|
|
#ifdef UNICODE
|
|
CHAR szMsgA[MAX_MSGLEN+1];
|
|
CHAR szAppNameA[MAX_STRLEN+1];
|
|
#endif
|
|
OSVERSIONINFO osVerInfo;
|
|
|
|
//
|
|
// just checking on the debug facilities
|
|
Assert(FALSE, TEXT("On_entry: WinMain\n"));
|
|
|
|
#ifdef UNICODE
|
|
// UNICODE Check -- if we're a UNICODE binary trying to run on Win9x
|
|
// show error and bail out.
|
|
if (!IsPlatformNT())
|
|
{
|
|
LoadStringA(hInstance, STR_APPNAME, szAppNameA, MAX_STRLEN); // title string
|
|
LoadStringA(hInstance, STR_ERRNOUNICODE, szMsgA, MAX_STRLEN); // error string
|
|
MessageBoxA(NULL, szMsgA, szAppNameA, MB_OK | MB_APPLMODAL | MB_ICONERROR);
|
|
|
|
return FALSE;
|
|
}
|
|
#endif // UNICODE
|
|
|
|
// Verify the OS version
|
|
ZeroMemory(&osVerInfo, sizeof(osVerInfo));
|
|
osVerInfo.dwOSVersionInfoSize = sizeof(osVerInfo);
|
|
if (GetVersionEx(&osVerInfo))
|
|
{
|
|
// If NT, we need to be version 5.0 or later.
|
|
if ((osVerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
|
|
(osVerInfo.dwMajorVersion < 5))
|
|
{
|
|
LoadString(hInstance, STR_APPNAME, szAppName, MAX_STRLEN); // title string
|
|
LoadString(hInstance, STR_ERRNOUNICODE, szMsg, MAX_STRLEN); // error string
|
|
MessageBox(NULL, szMsg, szAppName, MB_OK | MB_APPLMODAL | MB_ICONERROR);
|
|
return FALSE;
|
|
}
|
|
|
|
// If Win9x, we need to be version 4.1 or later (Win98).
|
|
if ((osVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
|
|
((osVerInfo.dwMajorVersion < 4) ||
|
|
(osVerInfo.dwMajorVersion == 4) && (osVerInfo.dwMinorVersion < 10)))
|
|
{
|
|
LoadString(hInstance, STR_APPNAME, szAppName, MAX_STRLEN); // title string
|
|
LoadString(hInstance, STR_ERRBAD9XVER, szMsg, MAX_STRLEN); // error string
|
|
MessageBox(NULL, szMsg, szAppName, MB_OK | MB_APPLMODAL | MB_ICONERROR);
|
|
return FALSE;
|
|
}
|
|
|
|
// If the Platform ID is not NT or WIN32 we will run and hope for the
|
|
// best.
|
|
}
|
|
|
|
|
|
//
|
|
// Prev instance check
|
|
//
|
|
|
|
// go see if there is already a window of this type
|
|
LoadString(hInstance, STR_APPNAME, (LPTSTR)szMsg, MAX_STRLEN); // title string
|
|
hWndPrev = FindWindow((LPTSTR)szClassName, NULL);
|
|
|
|
// if you are not the first instance
|
|
if (hWndPrev) {
|
|
if (IsIconic(hWndPrev))
|
|
ShowWindow(hWndPrev, SW_RESTORE);
|
|
else {
|
|
BringWindowToTop(hWndPrev);
|
|
if ((hPopupWnd = GetLastActivePopup(hWndPrev)) != hWndPrev) {
|
|
BringWindowToTop(hPopupWnd);
|
|
hWndPrev = hPopupWnd;
|
|
}
|
|
SetForegroundWindow(hWndPrev);
|
|
}
|
|
// leave this barren place
|
|
return FALSE; // ONLY ONE INSTANCE CAN RUN!
|
|
}
|
|
|
|
//
|
|
// Initializations
|
|
//
|
|
|
|
// run this app!
|
|
if (!InitFrost(hPrevInstance,
|
|
hInstance,
|
|
#ifdef UNICODE
|
|
GetCommandLine(),
|
|
#else
|
|
lpCmdLine,
|
|
#endif
|
|
nCmdShow))
|
|
{
|
|
// Problems...
|
|
NoMemMsg(STR_TO_RUN); // not enuf mem to run
|
|
CleanUp(); // Release IThumbnail interface
|
|
return (FALSE);
|
|
}
|
|
|
|
// InitFrost may return TRUE if we did something with the commandline, but
|
|
// didn't put up any UI.
|
|
if (hWndApp == NULL) {
|
|
CleanUp(); // Release IThumbnail interface
|
|
return (TRUE);
|
|
}
|
|
|
|
//
|
|
// Main message loop
|
|
//
|
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
|
if (hWndApp)
|
|
if (IsDialogMessage(hWndApp, &msg))
|
|
continue; // spend most of our time skipping out here
|
|
TranslateMessage(&msg); /* Translates virtual key codes */
|
|
DispatchMessage(&msg); /* Dispatches message to window */
|
|
}
|
|
|
|
//
|
|
// final exit cleanup
|
|
//
|
|
CleanUp(); // Release our IThumbnail interface for HTML wallpaper
|
|
return (int)(msg.wParam); /* Returns the value from PostQuitMessage */
|
|
}
|
|
|
|
|
|
// PreviewDlgProc
|
|
//
|
|
// The main window (dialog) proc for the Frosting application.
|
|
//
|
|
|
|
INT_PTR FAR PASCAL PreviewDlgProc(hDlg, message, wParam, lParam)
|
|
HWND hDlg;
|
|
UINT message;
|
|
WPARAM wParam;
|
|
LPARAM lParam;
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC hdc;
|
|
LPHELPINFO lphi;
|
|
|
|
switch (message) {
|
|
|
|
case WM_INITDIALOG:
|
|
hWndApp = hDlg;
|
|
|
|
// init case nomem flag
|
|
bNoMem = FALSE;
|
|
|
|
//
|
|
// theme drop-down listbox inits
|
|
|
|
bNoMem |= !InitThemeDDL(hDlg); // init contents, selection
|
|
SendDlgItemMessage(hDlg, DDL_THEME, CB_SETEXTENDEDUI, TRUE, 0L);
|
|
|
|
// update preview and checkboxes for cur theme selection
|
|
|
|
//
|
|
// other inits
|
|
|
|
// rect for preview, adjusted to dlg-relative coords
|
|
GetWindowRect(GetDlgItem(hDlg, RECT_PREVIEW), (LPRECT)&rView);
|
|
MapWindowPoints(NULL, hDlg, (LPPOINT)&rView, 2);
|
|
// kill it now that you've had your way with it
|
|
DestroyWindow(GetDlgItem(hDlg, RECT_PREVIEW));
|
|
|
|
// and rect within that rect for sample window
|
|
GetWindowRect(GetDlgItem(hDlg, RECT_FAKEWIN), (LPRECT)&rFakeWin);
|
|
MapWindowPoints(NULL, hDlg, (LPPOINT)&rFakeWin, 2);
|
|
// actually, FakeWin painting is going to be relative to Preview area, so
|
|
OffsetRect((LPRECT)&rFakeWin, -rView.left, -rView.top);
|
|
|
|
// kill it now that you've had your way with it
|
|
DestroyWindow(GetDlgItem(hDlg, RECT_FAKEWIN));
|
|
|
|
// and another rect within Preview rect, for icons
|
|
GetWindowRect(GetDlgItem(hDlg, RECT_ICONS), (LPRECT)&rPreviewIcons);
|
|
MapWindowPoints(NULL, hDlg, (LPPOINT)&rPreviewIcons, 2);
|
|
// actually, icons are going to be relative to Preview area too, so
|
|
OffsetRect((LPRECT)&rPreviewIcons, -rView.left, -rView.top);
|
|
|
|
// kill it now that you've had your way with it
|
|
DestroyWindow(GetDlgItem(hDlg, RECT_ICONS));
|
|
|
|
|
|
//
|
|
// add What's This? to system menu: for some reason, can't have ? in title bar
|
|
{
|
|
HMENU hSysMenu;
|
|
|
|
hSysMenu = GetSystemMenu(hDlg, FALSE);
|
|
LoadString(hInstApp, STR_WHATSTHIS, szMsg, ARRAYSIZE(szMsg));
|
|
InsertMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_STRING,
|
|
SC_CONTEXTHELP, (LPTSTR)szMsg);
|
|
InsertMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_SEPARATOR, 0, NULL);
|
|
}
|
|
|
|
// set init focus to theme drop-down listbox
|
|
SetFocus(GetDlgItem(hDlg,DDL_THEME));
|
|
|
|
// cleanup
|
|
return (FALSE); // handled init ctl focus ourselves
|
|
break;
|
|
|
|
case WM_QUERYNEWPALETTE:
|
|
case WM_PALETTECHANGED:
|
|
if ((HWND)wParam != hDlg)
|
|
InvalidateRect(hDlg, NULL, TRUE);
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
// different paint cases for icon and window
|
|
if (IsIconic(hDlg))
|
|
return (FALSE);
|
|
|
|
hdc = BeginPaint(hDlg, &ps);
|
|
// repaint the preview area with current theme
|
|
PaintPreview(hDlg, hdc, &rView);
|
|
// paint recessed edge around preview area
|
|
DrawEdge(hdc, (LPRECT)&rView, EDGE_SUNKEN, BF_RECT);
|
|
EndPaint(hDlg, &ps);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
return(FrostCommand(hDlg, wParam, lParam)); // process and ret EXIT
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
// do the same things you do on Cancel
|
|
FrostCommand(hDlg, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
if ( gfCoInitDone )
|
|
CoUninitialize();
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
lphi = (LPHELPINFO)lParam;
|
|
|
|
if (lphi->iContextType == HELPINFO_WINDOW) {
|
|
// All of the help topics are in PLUS!.HLP except for the
|
|
// Rotate theme checkbox is in PLUS!98.HLP.
|
|
|
|
if (lphi->iCtrlId == CB_SCHEDULE) {
|
|
WinHelp(lphi->hItemHandle, (LPTSTR)szHelpFile98, HELP_WM_HELP,
|
|
(DWORD_PTR)((POPUP_HELP_ARRAY FAR *)phaMainWin));
|
|
}
|
|
else {
|
|
WinHelp(lphi->hItemHandle, (LPTSTR)szHelpFile, HELP_WM_HELP,
|
|
(DWORD_PTR)((POPUP_HELP_ARRAY FAR *)phaMainWin));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
// first check for main dlg window
|
|
if ((HWND)wParam == hDlg) {
|
|
POINT ptTest;
|
|
RECT rCurTest; // cur screen coords of Preview area
|
|
|
|
// inits
|
|
ptTest.x = GET_X_LPARAM(lParam);
|
|
ptTest.y = GET_Y_LPARAM(lParam);
|
|
rCurTest = rView;
|
|
MapWindowPoints(hDlg, NULL, (LPPOINT)&rCurTest, 2);
|
|
|
|
// if it's a click in the preview area
|
|
if (PtInRect((LPRECT)&rCurTest, ptTest)) {
|
|
WinHelp(hDlg, (LPTSTR)szHelpFile, HELP_CONTEXTPOPUP,
|
|
(DWORD)IDH_THEME_PREVIEW);
|
|
return (TRUE);
|
|
}
|
|
|
|
}
|
|
|
|
{ // Scope for ptTest & rCurTest variables
|
|
POINT ptTest;
|
|
RECT rCurTest; // cur screen coords of Preview area
|
|
|
|
// inits
|
|
ptTest.x = GET_X_LPARAM(lParam);
|
|
ptTest.y = GET_Y_LPARAM(lParam);
|
|
GetWindowRect(GetDlgItem(hDlg, CB_SCHEDULE), (LPRECT)&rCurTest);
|
|
|
|
// If user right clicked in CB_SCHEDULE area we need to load
|
|
// the help topic from PLUS!98.HLP -- otherwise it comes from
|
|
// PLUS!.HLP
|
|
if (PtInRect((LPRECT)&rCurTest, ptTest)) {
|
|
WinHelp((HWND)wParam, (LPTSTR)szHelpFile98, HELP_CONTEXTMENU,
|
|
(DWORD_PTR)((POPUP_HELP_ARRAY FAR *)phaMainWin));
|
|
}
|
|
else {
|
|
WinHelp((HWND)wParam, (LPTSTR)szHelpFile, HELP_CONTEXTMENU,
|
|
(DWORD_PTR)((POPUP_HELP_ARRAY FAR *)phaMainWin));
|
|
}
|
|
} // End scope for ptTest & rCurTest variables
|
|
|
|
break;
|
|
|
|
default:
|
|
return(FALSE); // didn't process message EXIT
|
|
break;
|
|
}
|
|
|
|
return (TRUE); // did process message
|
|
}
|
|
|
|
|
|
// InitThemeDDL
|
|
//
|
|
// Inits or Re-Inits the theme drop-down listbox: clears and then
|
|
// fills the Theme drop-down listbox with the titles of the
|
|
// available themes in the CURRENT DIRECTORY as specified by global var.
|
|
//
|
|
// Uses: szCurDir[] to get directory to list
|
|
// szCurThemeFile[] to tell whether to init selection
|
|
// szCurThemeName[] to init selection if init'ing
|
|
//
|
|
// Assumes you've already made sure that curdir\themename == themefile
|
|
// is a legit, existing file.
|
|
//
|
|
// Returns: success of initialization
|
|
|
|
BOOL InitThemeDDL(HWND hdlg)
|
|
{
|
|
int iret;
|
|
HWND hDDL;
|
|
WIN32_FIND_DATA wfdFind;
|
|
HANDLE hFind;
|
|
|
|
//
|
|
// inits
|
|
hDDL = GetDlgItem(hdlg, DDL_THEME);
|
|
|
|
// first get the directory for .THM files
|
|
lstrcpy((LPTSTR)szMsg, (LPTSTR)szCurDir);
|
|
lstrcat((LPTSTR)szMsg, (LPTSTR)TEXT("*"));
|
|
lstrcat((LPTSTR)szMsg, (LPTSTR)szExt);
|
|
|
|
//
|
|
// Use FindFirstFile, FindNextFile, FindClose to enum THM files
|
|
// and add each (cleaned-up) string to DDL
|
|
|
|
// start find process
|
|
hFind = FindFirstFile((LPCTSTR)szMsg, (LPWIN32_FIND_DATA)&wfdFind);
|
|
|
|
#ifdef DEBUG
|
|
//
|
|
// hack so we can find files when debuging...
|
|
//
|
|
if (INVALID_HANDLE_VALUE == hFind) {
|
|
lstrcpy(szThemeDir, TEXT("c:\\Program Files\\Plus!\\Themes\\"));
|
|
lstrcpy(szMsg, szThemeDir);
|
|
lstrcat(szMsg, TEXT("*"));
|
|
lstrcat(szMsg, szExt);
|
|
hFind = FindFirstFile((LPCTSTR)szMsg, (LPWIN32_FIND_DATA)&wfdFind);
|
|
}
|
|
#endif
|
|
|
|
// if that got you a valid search handle and first file
|
|
if (INVALID_HANDLE_VALUE != hFind) {
|
|
|
|
// add each long filename string to ddl without extension
|
|
do {
|
|
// copy filename to buffer
|
|
lstrcpy((LPTSTR)szMsg, (LPTSTR)wfdFind.cFileName);
|
|
// remove extension
|
|
TruncateExt((LPCTSTR)szMsg);
|
|
// add to ddl
|
|
iret = (int) SendMessage(hDDL, CB_ADDSTRING,
|
|
(WPARAM)0, (LPARAM)(LPCTSTR)szMsg);
|
|
if (iret == CB_ERRSPACE) {
|
|
FindClose(hFind);
|
|
return (FALSE); // prob low mem EXIT
|
|
}
|
|
}
|
|
// get next file
|
|
while (FindNextFile(hFind,(LPWIN32_FIND_DATA)&wfdFind));
|
|
|
|
// just checking: only reason to fail is out of files?
|
|
Assert(ERROR_NO_MORE_FILES == GetLastError(), TEXT("wrong error on FindNextFile() out of files\n"));
|
|
|
|
// cleanup file search
|
|
FindClose(hFind);
|
|
}
|
|
// else no THM files in that dir: just continue
|
|
else {
|
|
Assert(FALSE, TEXT("FindFirstFile() ret INVALID_HANDLE_VALUE: no THM files?\n"));
|
|
}
|
|
|
|
//
|
|
// add init string to beginning of DDLbox: Current Windows Settings
|
|
// note that INSERTSTRING doesn't force resort of list
|
|
iret = (int) SendMessage(hDDL, CB_INSERTSTRING,
|
|
(WPARAM)0, (LPARAM)(LPCTSTR)szCurSettings);
|
|
if (iret == CB_ERRSPACE) return (FALSE);// prob low mem EXIT
|
|
|
|
//
|
|
// add second string iff you've already applied something to _have_
|
|
// a previous Windows settings
|
|
if (bAppliedOnce) {
|
|
iret = (int) SendMessage(hDDL, CB_INSERTSTRING,
|
|
(WPARAM)1, (LPARAM)(LPCTSTR)szPrevSettings);
|
|
if (iret == CB_ERRSPACE) return (FALSE);// prob low mem EXIT
|
|
}
|
|
|
|
//
|
|
// add final string: Other...
|
|
iret = (int) SendMessage(hDDL, CB_INSERTSTRING,
|
|
(WPARAM)-1, // end of list
|
|
(LPARAM)(LPCTSTR)szOther);
|
|
if (iret == CB_ERRSPACE) return (FALSE);// prob low mem EXIT
|
|
|
|
|
|
//
|
|
// cleanup
|
|
|
|
// if "last theme applied" or first in new dir, it's already in global
|
|
if (bThemed) {
|
|
// look for cur theme name
|
|
iCurTheme = (int)SendMessage(hDDL, CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1, /* start of list */
|
|
(LPARAM)(LPCTSTR)szCurThemeName);
|
|
if (CB_ERR == iCurTheme) {
|
|
// shouldn't ever happen!! made sure file existed before setting globals
|
|
Assert(0, TEXT("couldn't find cur theme name in ddl list we just made!\n"));
|
|
iCurTheme = 0;
|
|
lstrcpy((LPTSTR)szCurThemeFile, (LPTSTR)szNULL);
|
|
lstrcpy((LPTSTR)szCurThemeName, (LPTSTR)szCurSettings);
|
|
}
|
|
}
|
|
else {
|
|
// select first item (CurWinSettings)
|
|
iCurTheme = 0;
|
|
lstrcpy((LPTSTR)szCurThemeFile, (LPTSTR)szNULL); // no cur THM file
|
|
lstrcpy((LPTSTR)szCurThemeName, (LPTSTR)szCurSettings);
|
|
}
|
|
|
|
// select cur theme name
|
|
SendMessage(hDDL, CB_SETCURSEL, (WPARAM)iCurTheme, (LPARAM)0);
|
|
|
|
// dis/enable checkboxes/buttons for initial conditions
|
|
EnableThemeButtons();
|
|
RestoreCheckboxes();
|
|
// (checkboxes don't work here, so called after ret from Inits)
|
|
|
|
// keep track of what you did and leave
|
|
iThemeCount = (int)SendMessage(hDDL, CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
|
|
return (TRUE);
|
|
}
|
|
|
|
//
|
|
// ResetTheThemeWorld
|
|
//
|
|
// With either the Other... selection from a new dir or with the SaveAs...
|
|
// to a new dir, you have to reset the globals for files and dirs and
|
|
// refresh the main window drop-down listbox. Do it all here.
|
|
//
|
|
// Input: full pathname of proposed new theme file.
|
|
// Normal assumption is that this has been checked to exist and
|
|
// be a legit theme file.
|
|
//
|
|
// Returns: BOOL success -- should always be TRUE
|
|
// FALSE is a VERY dire situation, means you're screwed
|
|
// and cannot do the basic reset for the app main window...
|
|
//
|
|
BOOL ResetTheThemeWorld(LPTSTR lpszNewThemeFile)
|
|
{
|
|
TCHAR szPrevFile[MAX_PATHLEN+1];
|
|
|
|
// inits
|
|
lstrcpy(szPrevFile, szCurThemeFile); // save for error case below
|
|
|
|
// reset globals for dir and file
|
|
lstrcpy(szCurThemeFile, lpszNewThemeFile);
|
|
lstrcpy(szCurDir, lpszNewThemeFile);
|
|
*(FileFromPath(szCurDir)) = 0;
|
|
lstrcpy(szCurThemeName, FileFromPath(lpszNewThemeFile));
|
|
TruncateExt(szCurThemeName);
|
|
|
|
// empty drop-down listbox
|
|
SendDlgItemMessage(hWndApp, DDL_THEME, CB_RESETCONTENT, 0L, 0L);
|
|
|
|
// refill drop-down listbox and select new file
|
|
if (!InitThemeDDL(hWndApp)) {
|
|
// low mem or very unusual error case
|
|
|
|
// post low-mem message
|
|
NoMemMsg(STR_TO_LIST);
|
|
|
|
// try to recover by going back to prev dir and theme
|
|
lstrcpy(szCurThemeFile, szPrevFile);
|
|
lstrcpy(szCurDir, szPrevFile);
|
|
*(FileFromPath(szCurDir)) = 0;
|
|
lstrcpy(szCurThemeName, FileFromPath(szPrevFile));
|
|
TruncateExt(szCurThemeName);
|
|
|
|
// go for it again
|
|
if (!InitThemeDDL(hWndApp)) {
|
|
|
|
// Very, very, very bad news.
|
|
// No way to do the basic initialization of the main window...
|
|
|
|
return (FALSE); // APOCALYPSE NOW EXIT
|
|
|
|
}
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
// FrostCommand
|
|
//
|
|
// Main application (dialog) window control messages
|
|
//
|
|
|
|
BOOL FrostCommand(HWND hdlg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
INT_PTR iDlgRet;
|
|
int index;
|
|
BOOL bRet;
|
|
int iPrevTheme;
|
|
extern TCHAR szFrostSection[], szMagic[], szVerify[], szThemeBPP[];
|
|
int iThemeBPP, iSysBPP;
|
|
HDC hdc;
|
|
static int sIndex = CB_ERR;
|
|
static BOOL bChosen = TRUE;
|
|
static BOOL bCanceled = FALSE;
|
|
BOOL bChangeTheme = FALSE;
|
|
TCHAR szThemesExe[MAX_PATH]; // Fully qualified path to Themes.exe
|
|
|
|
switch ((int)LOWORD(wParam)) {
|
|
|
|
case DDL_THEME:
|
|
|
|
// The following abomination is here, to trick the combo box into working
|
|
// in semi-intelligent way. The problem is, there is no consistancy in the
|
|
// ordering of CBN_SELCHANGE messages and CBN_SELENDOK messages. This supplies
|
|
// the proper functionality in most cases.
|
|
switch (HIWORD(wParam))
|
|
{
|
|
case CBN_SELCHANGE:
|
|
// User may have "chosen" a theme, or he/she might just be
|
|
// cursoring passed this selection. This decision is based on
|
|
// whether we have seen a CBN_SELENDOK message yet.
|
|
sIndex = (int)SendMessage((HWND)(LOWORD(lParam)), CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
|
|
if (bChosen == TRUE && bCanceled == FALSE)
|
|
{
|
|
bChangeTheme = TRUE;
|
|
}
|
|
break;
|
|
case CBN_DROPDOWN:
|
|
// When the list is first dropped down, init all flags
|
|
bChosen = FALSE;
|
|
bCanceled = FALSE;
|
|
bChangeTheme = FALSE;
|
|
sIndex = CB_ERR;
|
|
break;
|
|
case CBN_SELENDOK:
|
|
// The user has "chosen" a selection, if we have already recieved a
|
|
// CBN_SELCHANGE notification, assume that this is a chosen theme.
|
|
bChosen = TRUE;
|
|
if (sIndex != CB_ERR && sIndex != iCurTheme)
|
|
{
|
|
bChangeTheme = TRUE;
|
|
}
|
|
break;
|
|
case CBN_SELENDCANCEL:
|
|
// The user has "canceled" the selection of a theme.
|
|
bChosen = FALSE;
|
|
bCanceled = TRUE;
|
|
bChangeTheme = FALSE;
|
|
// Pretty soon we are going to recieve a CBN_SELCHANGE notification,
|
|
// that needs to be undone. This postevent will handle that.
|
|
PostMessage((HWND)(LOWORD(lParam)), CB_SETCURSEL, (WPARAM)iCurTheme, (LPARAM)0);
|
|
break;
|
|
}
|
|
|
|
if (bChangeTheme) {
|
|
index = sIndex;
|
|
bChangeTheme = FALSE;
|
|
iPrevTheme = iCurTheme;
|
|
iCurTheme = index;
|
|
bNewSelection = TRUE;
|
|
|
|
// meddle w/ cursor
|
|
WaitCursor();
|
|
|
|
//
|
|
// action depends on selection
|
|
// Four cases: Cur Win Settings, Prev Win Settings, Other... and normal.
|
|
|
|
//
|
|
// Current Windows settings case
|
|
if (index == 0) {
|
|
// clear pointer to cur file
|
|
lstrcpy((LPTSTR)szCurThemeFile, (LPTSTR)szNULL); // no cur THM file
|
|
lstrcpy((LPTSTR)szCurThemeName, (LPTSTR)szCurSettings);
|
|
}
|
|
|
|
//
|
|
// Previous Windows settings case
|
|
else if ((index == 1) && bAppliedOnce) {
|
|
// create full pathname of prev settings file
|
|
lstrcpy(szCurThemeFile, szThemeDir);
|
|
lstrcat(szCurThemeFile, szPrevSettingsFilename);
|
|
// use false name
|
|
lstrcpy((LPTSTR)szCurThemeName, (LPTSTR)szPrevSettings);
|
|
}
|
|
|
|
//
|
|
// Other... case
|
|
else if (index == iThemeCount-1) {
|
|
|
|
OPENFILENAME ofnOpen;
|
|
TCHAR szOpenFile[MAX_PATHLEN+1];
|
|
|
|
// save away those checkboxes
|
|
if (bThemed)
|
|
SaveCheckboxes();
|
|
|
|
do {
|
|
// inits
|
|
lstrcpy(szOpenFile, TEXT("*")); // start w/ *.Theme
|
|
lstrcat(szOpenFile, szExt);
|
|
|
|
ofnOpen.lStructSize = sizeof(OPENFILENAME);
|
|
ofnOpen.hwndOwner = hdlg;
|
|
ofnOpen.lpstrFilter = szFileTypeDesc;
|
|
ofnOpen.lpstrCustomFilter = (LPTSTR)NULL;
|
|
ofnOpen.nMaxCustFilter = 0;
|
|
ofnOpen.nFilterIndex = 1;
|
|
ofnOpen.lpstrFile = szOpenFile;
|
|
ofnOpen.nMaxFile = ARRAYSIZE(szOpenFile);
|
|
ofnOpen.lpstrFileTitle = (LPTSTR)NULL; // szFileTitle;
|
|
ofnOpen.nMaxFileTitle = 0; // sizeof(szFileTitle);
|
|
ofnOpen.lpstrInitialDir = (LPTSTR)szCurDir;
|
|
ofnOpen.lpstrTitle = (LPTSTR)szOpenTitle;
|
|
ofnOpen.Flags = OFN_PATHMUSTEXIST |
|
|
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
|
|
#ifdef USECALLBACKS
|
|
ofnOpen.Flags = OFN_PATHMUSTEXIST |
|
|
OFN_ENABLEHOOK | OFN_FILEMUSTEXIST;
|
|
ofnOpen.lpfnHook = FileOpenHookProc;
|
|
#endif
|
|
ofnOpen.lpstrDefExt = CharNext((LPTSTR)szExt);
|
|
|
|
// call common dlg
|
|
if (!GetOpenFileName((LPOPENFILENAME)&ofnOpen)) {
|
|
|
|
// if they didn't open a file, could be hit cancel but
|
|
// also check for lowmem return
|
|
|
|
iDlgRet = (int)CommDlgExtendedError();
|
|
if ((iDlgRet == CDERR_INITIALIZATION) ||
|
|
(iDlgRet == CDERR_MEMALLOCFAILURE) ||
|
|
(iDlgRet == CDERR_MEMLOCKFAILURE)
|
|
)
|
|
NoMemMsg(STR_TO_LIST);
|
|
|
|
// revert to prev entry
|
|
iCurTheme = iPrevTheme;
|
|
// select old theme in list
|
|
SendMessage((HWND)(LOWORD(lParam)), CB_SETCURSEL,
|
|
(WPARAM)iCurTheme, (LPARAM)(LPCTSTR)NULL);
|
|
|
|
// get out of this whole line of thought now
|
|
return (TRUE); // no new file/dir to open EXIT
|
|
}
|
|
|
|
// get results and check that it is a valid theme file
|
|
if (!IsValidThemeFile(szOpenFile)) {
|
|
TCHAR szTemp[MAX_MSGLEN+1];
|
|
|
|
// bad file: post msg before going back to common open
|
|
LoadString(hInstApp, STR_ERRBADOPEN, (LPTSTR)szTemp, MAX_MSGLEN);
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szTemp, (LPTSTR)szOpenFile);
|
|
MessageBox((HWND)hWndApp, (LPTSTR)szMsg, (LPTSTR)szAppName,
|
|
MB_OK | MB_ICONERROR | MB_APPLMODAL);
|
|
}
|
|
}
|
|
while (!IsValidThemeFile(szOpenFile));
|
|
|
|
// now reset the DDL with new dir listing and select new file
|
|
if (!ResetTheThemeWorld((LPTSTR)szOpenFile)) {
|
|
|
|
// prob low mem on adding strs to combobox
|
|
DestroyWindow(hdlg);
|
|
|
|
break; // APOCALYPSE NOW EXIT
|
|
}
|
|
|
|
} // end Other... case
|
|
|
|
//
|
|
// normal theme selection case
|
|
else { // NOT cur Windows settings
|
|
|
|
// get new cur theme name and file and construct filename
|
|
SendMessage((HWND)(LOWORD(lParam)), CB_GETLBTEXT, (WPARAM)index,
|
|
(LPARAM)(LPCTSTR)szCurThemeName );
|
|
lstrcpy((LPTSTR)szCurThemeFile, (LPTSTR)szCurDir);
|
|
lstrcat((LPTSTR)szCurThemeFile, (LPTSTR)szCurThemeName);
|
|
lstrcat((LPTSTR)szCurThemeFile, (LPTSTR)szExt);
|
|
|
|
//
|
|
// check that new theme file is valid theme file by looking for magic str
|
|
if (!IsValidThemeFile((LPTSTR)szCurThemeFile)) { // magic str check
|
|
//
|
|
// NOT a valid theme file with the correct magic string!
|
|
//
|
|
TCHAR szTemp[MAX_MSGLEN+1];
|
|
|
|
// post an error message
|
|
LoadString(hInstApp, STR_ERRBADTHEME, (LPTSTR)szTemp, MAX_MSGLEN);
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szTemp, (LPTSTR)szCurThemeFile);
|
|
MessageBox((HWND)hWndApp, (LPTSTR)szMsg, (LPTSTR)szAppName,
|
|
MB_OK | MB_ICONERROR | MB_APPLMODAL);
|
|
|
|
// remove entry from list
|
|
SendMessage((HWND)(LOWORD(lParam)), CB_DELETESTRING,
|
|
(WPARAM)index, (LPARAM)(LPCTSTR)NULL);
|
|
// get new theme count; ask rather than decrement -- for failsafe
|
|
iThemeCount = (int) SendMessage((HWND)(LOWORD(lParam)),
|
|
CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
|
|
|
|
//
|
|
// revert to prev entry
|
|
iCurTheme = iPrevTheme;
|
|
if (index < iPrevTheme) iCurTheme--;
|
|
|
|
// get back old cur file and filename
|
|
lstrcpy((LPTSTR)szCurThemeFile, (LPTSTR)szCurDir);
|
|
SendMessage((HWND)(LOWORD(lParam)), CB_GETLBTEXT, (WPARAM)iCurTheme,
|
|
(LPARAM)(LPCTSTR)(szCurThemeFile +
|
|
lstrlen((LPTSTR)szCurThemeFile)) );
|
|
lstrcat((LPTSTR)szCurThemeFile, (LPTSTR)szExt);
|
|
|
|
// select old theme in list
|
|
SendMessage((HWND)(LOWORD(lParam)), CB_SETCURSEL,
|
|
(WPARAM)iCurTheme, (LPARAM)(LPCTSTR)NULL);
|
|
|
|
// bad file selection didn't take EXIT
|
|
NormalCursor();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// reset preview to new theme (or cur win settings if null)
|
|
BuildPreviewBitmap((LPTSTR)szCurThemeFile);
|
|
|
|
// dis/enable buttons and checkboxes from new global THM file
|
|
EnableThemeButtons();
|
|
|
|
// update preview title
|
|
NewSampleTitle();
|
|
|
|
// cleanup
|
|
NormalCursor();
|
|
}
|
|
else
|
|
return (FALSE); // didn't process message EXIT
|
|
break;
|
|
|
|
case PB_SAVE:
|
|
|
|
#ifdef REVERT
|
|
iDlgRet = DialogBox(hInstApp, MAKEINTRESOURCE(DLG_SAVE), hWndApp, SaveAsDlgProc);
|
|
if (iDlgRet == -1)
|
|
NoMemMsg(STR_TO_SAVE);
|
|
#endif
|
|
|
|
|
|
// do the save inline here with common dlg
|
|
{
|
|
OPENFILENAME ofnSave;
|
|
TCHAR szSavedFile[MAX_PATHLEN+1];
|
|
LPTSTR lpszTempExt;
|
|
extern BOOL bReadOK, bWroteOK;
|
|
BOOL fFilenameOk;
|
|
|
|
// inits
|
|
|
|
do
|
|
{
|
|
fFilenameOk = TRUE;
|
|
lstrcpy((LPTSTR)szSavedFile, (LPTSTR)szNewFile); // start w/ suggested name
|
|
|
|
ofnSave.lStructSize = sizeof(OPENFILENAME);
|
|
ofnSave.hwndOwner = hdlg;
|
|
ofnSave.lpstrFilter = szFileTypeDesc;
|
|
ofnSave.lpstrCustomFilter = (LPTSTR)NULL;
|
|
ofnSave.nMaxCustFilter = 0;
|
|
ofnSave.nFilterIndex = 1;
|
|
ofnSave.lpstrFile = szSavedFile;
|
|
ofnSave.nMaxFile = ARRAYSIZE(szSavedFile);
|
|
ofnSave.lpstrFileTitle = (LPTSTR)NULL; // szFileTitle;
|
|
ofnSave.nMaxFileTitle = 0; // sizeof(szFileTitle);
|
|
ofnSave.lpstrInitialDir = (LPTSTR)szCurDir;
|
|
ofnSave.lpstrTitle = (LPTSTR)szSaveTitle;
|
|
ofnSave.Flags = OFN_OVERWRITEPROMPT |
|
|
OFN_HIDEREADONLY;
|
|
ofnSave.lpstrDefExt = CharNext((LPTSTR)szExt);
|
|
|
|
// call common dlg
|
|
if (!GetSaveFileName((LPOPENFILENAME)&ofnSave)) {
|
|
// if they didn't save a file, check for lowmem return
|
|
iDlgRet = (int)CommDlgExtendedError();
|
|
if ((iDlgRet == CDERR_INITIALIZATION) ||
|
|
(iDlgRet == CDERR_MEMALLOCFAILURE) ||
|
|
(iDlgRet == CDERR_MEMLOCKFAILURE)
|
|
)
|
|
NoMemMsg(STR_TO_SAVE);
|
|
|
|
return (TRUE); // no file to save EXIT
|
|
}
|
|
|
|
//
|
|
// process new filename by saving theme to file
|
|
|
|
// get new cur dir and set global
|
|
// if different than cur cur dir, first refill listbox
|
|
|
|
// enforce extension
|
|
lpszTempExt = (LPTSTR)(szSavedFile + lstrlen((LPTSTR)szSavedFile)
|
|
- lstrlen((LPTSTR)szExt));
|
|
if (2 != CompareString( LOCALE_USER_DEFAULT,
|
|
NORM_IGNOREWIDTH | NORM_IGNORECASE,
|
|
lpszTempExt, lstrlen((LPTSTR)szExt),
|
|
(LPTSTR)szExt, lstrlen((LPTSTR)szExt) )
|
|
) {
|
|
|
|
// COMMON DLG BUG: since we have a 5-letter extension, we
|
|
// sometimes get foo.theme and sometimes (if they type "foo")
|
|
// get foo.the. Until that is fixed, here's a decent workaround.
|
|
// Strips their ext if they say foo.txt, or foo.bar.
|
|
|
|
// just get rid of vestigal other ext if any
|
|
TruncateExt((LPCTSTR)szSavedFile);
|
|
lstrcat((LPTSTR)szSavedFile, (LPTSTR)szExt);
|
|
|
|
// Because the commond dlg does not handle 5-letter extensions
|
|
// properly we need to verify that the file does not already exist
|
|
// and if it does make sure the user really wants to overwrite it.
|
|
if (FileSpecExists(szSavedFile))
|
|
{
|
|
TCHAR szTitle[MAX_MSGLEN+1];
|
|
TCHAR szText[MAX_PATHLEN+MAX_MSGLEN+1];
|
|
TCHAR szTemp[MAX_MSGLEN+1];
|
|
|
|
// show the file name
|
|
LoadString(hInstApp, STR_SAVETITLE, szTitle, MAX_MSGLEN);
|
|
lstrcpy(szText, szSavedFile);
|
|
|
|
// Do you want to replace existing?
|
|
LoadString(hInstApp, STR_FILEEXISTS, szTemp, MAX_MSGLEN);
|
|
lstrcat(szText, szTemp);
|
|
|
|
if (IDYES != MessageBox(hdlg, szText, szTitle, MB_YESNO |
|
|
MB_ICONEXCLAMATION | MB_DEFBUTTON2))
|
|
{
|
|
fFilenameOk = FALSE;
|
|
}
|
|
}
|
|
}
|
|
} while (!fFilenameOk);
|
|
|
|
// gather the current windows settings and save them to a THM file
|
|
WaitCursor();
|
|
GatherThemeToFile(szSavedFile);
|
|
NormalCursor();
|
|
|
|
if (!bWroteOK) {
|
|
TCHAR szTemp[MAX_MSGLEN+1];
|
|
|
|
// out of disk space or some weird file or disk problem
|
|
// could be that most saved OK and just one or some a problem?
|
|
|
|
LoadString(hInstApp, STR_ERRCANTSAVE, (LPTSTR)szTemp, MAX_MSGLEN);
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szTemp, (LPTSTR)FileFromPath(szSavedFile));
|
|
MessageBox((HWND)hWndApp, (LPTSTR)szMsg, (LPTSTR)szAppName,
|
|
MB_OK | MB_ICONERROR | MB_APPLMODAL);
|
|
|
|
break; // couldn't write to file somehow EXIT
|
|
}
|
|
|
|
//
|
|
// OK, you have a full pathname of the file that you have
|
|
// successfully saved.
|
|
//
|
|
// You need to look
|
|
// at the directory that you saved it in and see if it is different
|
|
// than the current directory. If it is, we need to do a whole
|
|
// world change: clear out the combobox and refill it, then select
|
|
// the new file. If the dir is the same (the common case), we just
|
|
// need to select it carefully in the list and update a global or two.
|
|
//
|
|
|
|
// get new dir
|
|
lstrcpy((LPTSTR)szMsg, (LPTSTR)szSavedFile);
|
|
*(FileFromPath(szMsg)) = 0;
|
|
|
|
// compare new dir to cur dir
|
|
if (!lstrcmp(szMsg, szCurDir)) {
|
|
|
|
//
|
|
// Yes, you are still in the same dir as cur dir
|
|
|
|
// clean up and add new filename to list in drop-down listbox
|
|
lstrcpy((LPTSTR)szMsg, (LPTSTR)FileFromPath(szSavedFile));
|
|
TruncateExt((LPCTSTR)szMsg);
|
|
// check first if the same name is already there
|
|
iDlgRet = (int) SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1, /* start of list */
|
|
(LPARAM)(LPCTSTR)szMsg);
|
|
if ((CB_ERR != iDlgRet) && // found the exact string!
|
|
!((iDlgRet == 1) && bAppliedOnce) // don't delete 1-index PrevWinSettings
|
|
&& iDlgRet) { // don't delete 0-index CurWinSettings
|
|
// delete the previous
|
|
SendDlgItemMessage(hWndApp, DDL_THEME, CB_DELETESTRING,
|
|
(WPARAM)iDlgRet, (LPARAM)0);
|
|
// get new theme count; ask rather than decrement -- for failsafe
|
|
iThemeCount = (int) SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
|
|
}
|
|
// do the add
|
|
if (CB_ERRSPACE != (int) SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_INSERTSTRING,
|
|
// add before Other...
|
|
// always at least CurWinSet and Other...
|
|
// so iThemeCount always >= 2
|
|
(WPARAM) iThemeCount - 1,
|
|
(LPARAM)(LPCTSTR)szMsg) ) {
|
|
|
|
// get new theme count; ask rather than increment -- for failsafe
|
|
iThemeCount = (int) SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
|
|
|
|
// select item just added and save index of selection
|
|
iCurTheme = iThemeCount-2; // one less than last 0-based item
|
|
SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_SETCURSEL, (WPARAM)iCurTheme, (LPARAM)0);
|
|
|
|
// update cur Theme file name etc to your new one
|
|
lstrcpy((LPTSTR)szCurThemeFile, (LPTSTR)szSavedFile);
|
|
lstrcpy(szCurThemeName, FileFromPath(szCurThemeFile));
|
|
TruncateExt(szCurThemeName);
|
|
|
|
// update checkboxes
|
|
EnableThemeButtons();
|
|
|
|
}
|
|
// else not enuf mem to add new name to DDL; no biggie - already saved
|
|
}
|
|
else {
|
|
|
|
//
|
|
// You are in a new dir that needs to be made the cur dir
|
|
|
|
// now reset the DDL with new dir listing and select new file
|
|
if (!ResetTheThemeWorld((LPTSTR)szSavedFile)) {
|
|
|
|
// save away those checkboxes
|
|
if (bThemed)
|
|
SaveCheckboxes();
|
|
|
|
// You've cleared the list of themes but can't re-init it.
|
|
// prob low mem on adding strs to combobox
|
|
DestroyWindow(hdlg);
|
|
|
|
break; // APOCALYPSE NOW EXIT
|
|
}
|
|
}
|
|
|
|
// (don't need to update preview, etc; was "cur settings" or prev same last)
|
|
} // end variable scope
|
|
|
|
break;
|
|
case PB_DELETE:
|
|
{ // var scope
|
|
TCHAR szTemp[MAX_MSGLEN+1];
|
|
int iret;
|
|
HWND hDDL;
|
|
|
|
// confirm delete cur theme
|
|
LoadString(hInstApp, STR_CONFIRM_DEL, (LPTSTR)szTemp, MAX_MSGLEN);
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szTemp, (LPTSTR)szCurThemeName);
|
|
iret = MessageBox((HWND)hWndApp, (LPTSTR)szMsg, (LPTSTR)szAppName,
|
|
MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
|
|
|
// if they confirmed Yes, Do the evil deed
|
|
if (iret == IDYES) {
|
|
// do the file deletion
|
|
iret = DeleteFile((LPTSTR)szCurThemeFile);
|
|
|
|
// if successfully disposed of unwanted file
|
|
if (iret) {
|
|
// get dropdown lb
|
|
hDDL = GetDlgItem(hWndApp, DDL_THEME);
|
|
|
|
// remove name from dropdown lb
|
|
SendMessage(hDDL, CB_DELETESTRING,
|
|
(WPARAM)iCurTheme, (LPARAM)(LPCTSTR)NULL);
|
|
// get new theme count; ask rather than decrement -- for failsafe
|
|
iThemeCount = (int) SendMessage(hDDL, CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
|
|
|
|
|
|
// select first in list: Cur Win Settings
|
|
SendMessage(hDDL, CB_SETCURSEL, (WPARAM)0, (LPARAM)(LPCTSTR)NULL);
|
|
iCurTheme = 0;
|
|
|
|
// recurse to catch updated selection
|
|
SendMessage(hWndApp, WM_COMMAND, MAKEWPARAM(DDL_THEME, CBN_SELENDOK),
|
|
MAKELPARAM(hDDL, 0));
|
|
}
|
|
// otherwise, inform them that the file was too strong to kill
|
|
else {
|
|
LoadString(hInstApp, STR_ERRCANTDEL, (LPTSTR)szTemp, MAX_MSGLEN);
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szTemp, (LPTSTR)szCurThemeName);
|
|
MessageBox((HWND)hWndApp, (LPTSTR)szMsg, (LPTSTR)szAppName,
|
|
MB_OK | MB_ICONERROR | MB_APPLMODAL);
|
|
}
|
|
}
|
|
|
|
} // var scope
|
|
break;
|
|
|
|
case PB_SCRSVR:
|
|
{ // var scope
|
|
extern TCHAR szSS_Section[];
|
|
extern TCHAR szSS_Key[];
|
|
extern TCHAR szSS_File[];
|
|
extern TCHAR szCP_DT[];
|
|
extern TCHAR szSS_Active[];
|
|
BOOL bScrSaveActive = FALSE;
|
|
STARTUPINFO StartupInfo;
|
|
PROCESS_INFORMATION ProcessInformation;
|
|
|
|
|
|
// first check if the scr saver is active
|
|
if (bThemed) { // get from theme
|
|
TCHAR szSSName[MAX_MSGLEN+1];
|
|
GetPrivateProfileString((LPTSTR)szSS_Section, (LPTSTR)szSS_Key,
|
|
(LPTSTR)szNULL,
|
|
(LPTSTR)szSSName, MAX_MSGLEN,
|
|
(LPTSTR)szCurThemeFile);
|
|
if (*szSSName != TEXT('\0'))
|
|
bScrSaveActive = TRUE;
|
|
}
|
|
else // get from cur system settings
|
|
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0,
|
|
(LPVOID)&bScrSaveActive, FALSE);
|
|
|
|
// then continue if active
|
|
if (bScrSaveActive) {
|
|
|
|
// get the theme
|
|
if (bThemed) { // get from cur theme file
|
|
GetPrivateProfileString((LPTSTR)szSS_Section, (LPTSTR)szSS_Key,
|
|
(LPTSTR)szNULL,
|
|
(LPTSTR)szMsg, MAX_MSGLEN,
|
|
(LPTSTR)szCurThemeFile);
|
|
// expand filename string as necessary
|
|
InstantiatePath((LPTSTR)szMsg, MAX_MSGLEN);
|
|
// search for file if necessary
|
|
ConfirmFile((LPTSTR)szMsg, TRUE);
|
|
// in this case, if not found shouldn't be here; and just
|
|
// won't run below. still need to search, with replacement
|
|
}
|
|
else { // get from system
|
|
GetPrivateProfileString((LPTSTR)szSS_Section, (LPTSTR)szSS_Key,
|
|
(LPTSTR)szNULL,
|
|
(LPTSTR)szMsg, MAX_MSGLEN,
|
|
(LPTSTR)szSS_File);
|
|
}
|
|
|
|
// run it now!
|
|
wsprintf(pValue,TEXT("%s /s"), (LPTSTR)szMsg);
|
|
// WinExec(pValue, SW_NORMAL);
|
|
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
|
|
StartupInfo.wShowWindow = (WORD)SW_NORMAL;
|
|
|
|
CreateProcess(NULL,
|
|
pValue,
|
|
NULL,
|
|
NULL,
|
|
FALSE,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
&StartupInfo,
|
|
&ProcessInformation);
|
|
}
|
|
else {
|
|
Assert(0, TEXT("Got scrsaver button push with no active scrsaver!\n"));
|
|
}
|
|
} // var scope
|
|
break;
|
|
|
|
case PB_POINTERS:
|
|
iDlgRet = DoEtcDlgs(hdlg);
|
|
if (!iDlgRet)
|
|
NoMemMsg(STR_TO_PREVIEW);
|
|
break;
|
|
|
|
//
|
|
// check boxes are auto, but need to update preview and Apply button dep on cb states
|
|
|
|
case CB_SCHEDULE:
|
|
// Flag that SCHEDULE checkbox changed so Apply gets activated.
|
|
// get controlling checkboxes' current states in bCBStates[]
|
|
SaveCheckboxes();
|
|
// Set the SCHEDULE changed flag.
|
|
bCB_SchedChange = TRUE;
|
|
// Enable the Apply button if appropriate.
|
|
if (bCB_SchedChange) EnableWindow(GetDlgItem(hWndApp, PB_APPLY), TRUE);
|
|
break;
|
|
|
|
// these checkboxes affect the "live" preview
|
|
case CB_WALL :
|
|
case CB_ICONS :
|
|
case CB_COLORS :
|
|
case CB_FONTS :
|
|
case CB_BORDERS :
|
|
// get controlling checkboxes' current states in bCBStates[]
|
|
SaveCheckboxes();
|
|
// force new repaint with diff checkboxes
|
|
BuildPreviewBitmap((LPTSTR)szCurThemeFile);
|
|
|
|
// fall through for all-checkbox processing
|
|
|
|
case CB_SCRSVR :
|
|
case CB_SOUND :
|
|
case CB_PTRS :
|
|
// case CB_ICONSIZE:
|
|
// apply button only enabled if at least one checkbox is checked
|
|
// Note that IsAnyBoxChecked() ignores CB_SCHEDULE.
|
|
EnableWindow(GetDlgItem(hWndApp, PB_APPLY), IsAnyBoxChecked());
|
|
|
|
// new checkbox lineup counts as something new
|
|
bNewSelection = TRUE;
|
|
break;
|
|
|
|
case IDOK:
|
|
// PLUS98 BUG 1093
|
|
// If we're in a graphics filter we want to ignore this button
|
|
// press -- processing it will fault.
|
|
if (bInGrphFilter) return (FALSE);
|
|
// Has the user toggled the SCHEDULE checkbox?
|
|
// Note this code is duplicated in the PB_APPLY section below.
|
|
if (bCB_SchedChange) {
|
|
if (bCBStates[FC_SCHEDULE]) {
|
|
// We need to add the Themes task to Task Scheduler. Check
|
|
// to see if TS is running.
|
|
if (!IsTaskSchedulerRunning()) {
|
|
// TS isn't running, so start it.
|
|
if (!StartTaskScheduler(TRUE /*prompt user*/)) {
|
|
// Task Scheduler failed to start or the user opted
|
|
// to not start it. STS() already gave an error but
|
|
// we need to uncheck the SCHEDULE cb.
|
|
CheckDlgButton(hdlg, CB_SCHEDULE, BST_UNCHECKED);
|
|
SaveCheckboxes();
|
|
}
|
|
// Task Scheduler started so add Themes task if it doesn't
|
|
// already exist
|
|
else if (!IsThemesScheduled()) {
|
|
GetModuleFileName(hInstApp, (LPTSTR)szThemesExe, MAX_PATH);
|
|
if (!AddThemesTask(szThemesExe, TRUE /*Show errors*/)) {
|
|
//An error occurred adding the task. ATT() already gave
|
|
//user an error. Clear and save CB_SCHEDULE;
|
|
CheckDlgButton(hdlg, CB_SCHEDULE, BST_UNCHECKED);
|
|
SaveCheckboxes();
|
|
}
|
|
// Assume Themes task was added OK
|
|
}
|
|
// Themes.job is already there, so do nothing
|
|
}
|
|
|
|
// Assume TS is already running so add our monthly task
|
|
else if (!IsThemesScheduled()) {
|
|
GetModuleFileName(hInstApp, (LPTSTR)szThemesExe, MAX_PATH);
|
|
if (!AddThemesTask(szThemesExe, TRUE /*Show errors*/)) {
|
|
//An error occurred adding the task. ATT() already gave
|
|
//user an error. Clear and save CB_SCHEDULE;
|
|
CheckDlgButton(hdlg, CB_SCHEDULE, BST_UNCHECKED);
|
|
SaveCheckboxes();
|
|
}
|
|
// Assume Themes task was added OK
|
|
}
|
|
// else Themes.job is already there, so do nothing
|
|
}
|
|
|
|
// Gotta delete Themes.job but if TS ain't runnin' we can't do that
|
|
// through the TS api.
|
|
else {
|
|
if (IsTaskSchedulerRunning()) DeleteThemesTask();
|
|
else HandDeleteThemesTask();
|
|
}
|
|
bCB_SchedChange = FALSE;
|
|
} // Endif bCB_SchedChange
|
|
|
|
// check if anything new since last Apply
|
|
if (!bNewSelection)
|
|
goto NoApplyNeeded;
|
|
// else continue with the apply
|
|
case PB_APPLY:
|
|
// PLUS98 BUG 1093
|
|
// If we're in a graphics filter we want to ignore this button
|
|
// press -- processing it will fault.
|
|
if (bInGrphFilter) return FALSE;
|
|
// Has the user toggled the SCHEDULE checkbox?
|
|
// Note this code is duplicated in the IDOK section above.
|
|
if (bCB_SchedChange) {
|
|
if (bCBStates[FC_SCHEDULE]) {
|
|
// We need to add the Themes task to Task Scheduler. Check
|
|
// to see if TS is running.
|
|
if (!IsTaskSchedulerRunning()) {
|
|
// TS isn't running, so start it.
|
|
if (!StartTaskScheduler(TRUE /*prompt user*/)) {
|
|
// Task Scheduler failed to start or the user opted
|
|
// to not start it. STS() already gave an error but
|
|
// we need to uncheck the SCHEDULE cb.
|
|
CheckDlgButton(hdlg, CB_SCHEDULE, BST_UNCHECKED);
|
|
SaveCheckboxes();
|
|
}
|
|
// Task Scheduler started so add Themes task if it doesn't
|
|
// already exist
|
|
else if (!IsThemesScheduled()) {
|
|
GetModuleFileName(hInstApp, (LPTSTR)szThemesExe, MAX_PATH);
|
|
if (!AddThemesTask(szThemesExe, TRUE /*Show errors*/)) {
|
|
//An error occurred adding the task. ATT() already gave
|
|
//user an error. Clear and save CB_SCHEDULE;
|
|
CheckDlgButton(hdlg, CB_SCHEDULE, BST_UNCHECKED);
|
|
SaveCheckboxes();
|
|
}
|
|
// Assume Themes task was added OK
|
|
}
|
|
// Themes.job is already there, so do nothing
|
|
}
|
|
|
|
// Assume TS is already running so add our monthly task
|
|
else if (!IsThemesScheduled()) {
|
|
GetModuleFileName(hInstApp, (LPTSTR)szThemesExe, MAX_PATH);
|
|
if (!AddThemesTask(szThemesExe, TRUE /*Show errors*/)) {
|
|
//An error occurred adding the task. ATT() already gave
|
|
//user an error. Clear and save CB_SCHEDULE;
|
|
CheckDlgButton(hdlg, CB_SCHEDULE, BST_UNCHECKED);
|
|
SaveCheckboxes();
|
|
}
|
|
// Assume Themes task was added OK
|
|
}
|
|
// else Themes.job is already there, so do nothing
|
|
}
|
|
|
|
// Gotta delete Themes.job but if TS ain't runnin' we can't do that
|
|
// through the TS api.
|
|
else {
|
|
if (IsTaskSchedulerRunning()) DeleteThemesTask();
|
|
else HandDeleteThemesTask();
|
|
}
|
|
bCB_SchedChange = FALSE;
|
|
} // Endif bCB_SchedChange
|
|
|
|
// if there is a theme selected, apply it now
|
|
if (bThemed) {
|
|
|
|
// Make sure there is even enough space to do theme
|
|
// Complain, if there is a problem
|
|
if (! CheckSpace (hdlg, TRUE)) // definition in Regutils.c
|
|
break;
|
|
|
|
//
|
|
// first, check whether there is a problem with the theme bit depth
|
|
|
|
// check for theme BPP vs. system, saved to global bool
|
|
iThemeBPP = GetPrivateProfileInt((LPTSTR)szFrostSection, (LPTSTR)szThemeBPP,
|
|
0, (LPTSTR)szCurThemeFile);
|
|
hdc = GetDC(NULL);
|
|
iSysBPP = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
|
|
ReleaseDC(NULL, hdc);
|
|
bLowColorProblem = iThemeBPP > iSysBPP;
|
|
|
|
// if there is a potential problem, then ask what to do first
|
|
if (bLowColorProblem && !bNeverCheckBPP &&
|
|
( IsDlgButtonChecked(hdlg, CB_ICONS) ||
|
|
IsDlgButtonChecked(hdlg, CB_COLORS) ) ) {
|
|
iDlgRet = DialogBox(hInstApp, MAKEINTRESOURCE(DLG_BPPCHOICE), hWndApp, BPP_ChoiceDlg);
|
|
if (iDlgRet == -1) {
|
|
NoMemMsg(STR_TO_APPLY);
|
|
break; // low mem EXIT
|
|
}
|
|
|
|
if (iDlgRet == IDCANCEL) {
|
|
break; // user chicken EXIT
|
|
}
|
|
}
|
|
|
|
// meddle w/ cursor
|
|
WaitCursor();
|
|
|
|
// check if color-depth problem and they asked for nothing applied
|
|
if (bLowColorProblem && (fLowBPPFilter == APPLY_NONE))
|
|
break; // chickened out completely no work EXIT
|
|
|
|
// get controlling checkboxes' current states in bCBStates[]
|
|
SaveCheckboxes();
|
|
|
|
// Now, see if color-depth problem and they asked for just some applied
|
|
if (bLowColorProblem && (fLowBPPFilter == APPLY_SOME)) {
|
|
// apply filter
|
|
bCBStates[FC_PTRS] = FALSE;
|
|
bCBStates[FC_ICONS] = FALSE;
|
|
bCBStates[FC_COLORS] = FALSE;
|
|
RestoreCheckboxes();
|
|
}
|
|
|
|
|
|
//
|
|
// OK, you're really going to Apply. If this is your first,
|
|
// then save a memory of your virginal state, for user to
|
|
// savor later if desired.
|
|
if (!bAppliedOnce) {
|
|
TCHAR szPrevThemePath[MAX_PATHLEN+1];
|
|
extern BOOL bWroteOK;
|
|
INT_PTR iret;
|
|
|
|
// create full pathname of temp file for orig settings
|
|
lstrcpy(szPrevThemePath, szThemeDir);
|
|
lstrcat(szPrevThemePath, szPrevSettingsFilename);
|
|
|
|
// save a theme with original windows settings
|
|
GatherThemeToFile(szPrevThemePath);
|
|
|
|
// if saved OK
|
|
if (bWroteOK) {
|
|
// add an item to the list for it
|
|
iret = SendDlgItemMessage(hdlg, DDL_THEME, CB_INSERTSTRING,
|
|
(WPARAM)1, (LPARAM)(LPCTSTR)szPrevSettings);
|
|
|
|
if (iret != CB_ERRSPACE) {
|
|
// don't care if you actually _apply_ OK; you've added the item
|
|
bAppliedOnce = TRUE;
|
|
|
|
// get new ddl index for our current theme
|
|
iCurTheme = (int)SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_FINDSTRINGEXACT, (WPARAM)-1, /* start of list */
|
|
(LPARAM)(LPCTSTR)szCurThemeName);
|
|
|
|
// get new theme count; ask rather than increment -- for failsafe
|
|
iThemeCount = (int) SendDlgItemMessage(hWndApp, DDL_THEME,
|
|
CB_GETCOUNT, (WPARAM)0, (LPARAM)0);
|
|
|
|
}
|
|
// else you couldn't add, just don't get this feature
|
|
|
|
}
|
|
// else you never get a prev win settings item this session...
|
|
}
|
|
|
|
//
|
|
// apply settings from cur theme file to registry/system
|
|
bRet = ApplyThemeFile((LPTSTR)szCurThemeFile);
|
|
|
|
// restore cursor
|
|
NormalCursor();
|
|
|
|
// check whether there was any problem applying the theme
|
|
if (!bRet) {
|
|
|
|
#if 0 // DavidBa decided it was too irksome to post err to user 4/17/95
|
|
TCHAR szErrStr[MAX_MSGLEN+1];
|
|
TCHAR szFileDispStr[MAX_MSGLEN+1];
|
|
|
|
// tell the user there was a problem; but we did our best; keep on trucking
|
|
LoadString(hInstApp, STR_ERRAPPLY, (LPTSTR)szErrStr, MAX_MSGLEN);
|
|
lstrcpy((LPTSTR)szFileDispStr, (LPTSTR)szCurThemeFile);
|
|
TruncateExt((LPTSTR)szFileDispStr);
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szErrStr, FileFromPath((LPTSTR)szFileDispStr));
|
|
MessageBox((HWND)hWndApp, (LPTSTR)szMsg, (LPTSTR)szAppName,
|
|
MB_OK | MB_ICONWARNING | MB_APPLMODAL);
|
|
#endif
|
|
}
|
|
|
|
// save theme file to "last applied" slot in registry
|
|
|
|
if (!((iCurTheme == 1) && bAppliedOnce)) { // don't save PrevWinSettings
|
|
LONG lret;
|
|
HKEY hKey;
|
|
extern TCHAR szPlus_CurTheme[];
|
|
|
|
lret = RegOpenKeyEx(HKEY_CURRENT_USER, szPlus_CurTheme,
|
|
(DWORD)0, KEY_SET_VALUE, (PHKEY)&hKey );
|
|
if (lret != ERROR_SUCCESS) {
|
|
DWORD dwDisposition;
|
|
Assert(FALSE, TEXT("couldn't RegOpenKey save theme file\n"));
|
|
lret = RegCreateKeyEx( HKEY_CURRENT_USER, szPlus_CurTheme,
|
|
(DWORD)0, (LPTSTR)szNULL, REG_OPTION_NON_VOLATILE,
|
|
KEY_SET_VALUE, (LPSECURITY_ATTRIBUTES)NULL,
|
|
(PHKEY)&hKey, (LPDWORD)&dwDisposition );
|
|
}
|
|
// if open or create worked
|
|
if (lret == ERROR_SUCCESS) {
|
|
lret = RegSetValueEx(hKey, (LPTSTR)NULL, // default value
|
|
0,
|
|
(DWORD)REG_SZ,
|
|
(LPBYTE)szCurThemeFile,
|
|
(DWORD)( SZSIZEINBYTES((LPTSTR)szCurThemeFile) + 1 ));
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
Assert(lret == ERROR_SUCCESS, TEXT("couldn't open, set or create Registry save theme file\n"));
|
|
|
|
} // end if not prev settings case
|
|
|
|
// reset dirty/etc flags
|
|
bNewSelection = FALSE;
|
|
|
|
} // end if bThemed
|
|
|
|
SaveStates(); // remember things to registry
|
|
// OK falls through, Apply doesn't
|
|
if ((int)LOWORD(wParam) == PB_APPLY) {
|
|
// Gray the Apply button & make it so it's not the Default button
|
|
EnableWindow(GetDlgItem(hWndApp, PB_APPLY), FALSE);
|
|
SendDlgItemMessage(hWndApp, PB_APPLY, BM_SETSTYLE, (WPARAM)BS_PUSHBUTTON, MAKELPARAM(TRUE,0));
|
|
// Set Focus to the OK button
|
|
SetFocus(GetDlgItem(hWndApp, IDOK));
|
|
// Make the OK button the Default button
|
|
SendMessage(hWndApp, DM_SETDEFID, IDOK, 0);
|
|
break; // just apply and then EXIT without closing
|
|
}
|
|
// else fall through (from IDOK)
|
|
case IDCANCEL:
|
|
// PLUS98 BUG 1093
|
|
// If we're in a graphics filter we want to ignore this button
|
|
// press -- processing it will fault.
|
|
if (bInGrphFilter) return FALSE;
|
|
// my one unstructured jump in the whole code!
|
|
// From IDOK above only
|
|
NoApplyNeeded:
|
|
// From IDOK above only
|
|
|
|
WaitCursor();
|
|
DestroyWindow(hWndApp); // TUBE THE APPLICATION NOW
|
|
if (bAppliedOnce) {
|
|
TCHAR szPrevThemePath[MAX_PATHLEN+1];
|
|
DWORD dwIndex = 0;
|
|
TCHAR szWVFile[MAX_PATH];
|
|
|
|
// Delete the previous temp file before we exit
|
|
lstrcpy(szPrevThemePath, szThemeDir);
|
|
lstrcat(szPrevThemePath, szPrevSettingsFilename);
|
|
DeleteFile(szPrevThemePath);
|
|
|
|
// Delete any WebView files that were created for the
|
|
// previous theme as well
|
|
|
|
for (dwIndex = 0; dwIndex < MAX_WVNAMES; dwIndex++) {
|
|
if (GetWVFilename(szPrevThemePath,
|
|
szWVNames[dwIndex],
|
|
szWVFile)) {
|
|
DeleteFile(szWVFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
CloseFrost(); // final cleanups
|
|
NormalCursor();
|
|
break;
|
|
|
|
default:
|
|
return (FALSE); // didn't process message EXIT
|
|
break;
|
|
}
|
|
|
|
// normal case
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
#ifdef USECALLBACKS
|
|
//
|
|
// FileXXXXHookProc
|
|
//
|
|
// Callbacks from the common file open and save dialogs.
|
|
//
|
|
// Return: FALSE to allow standard processing; TRUE to inhibit.
|
|
// (except for WM_INITDIALOG which gets processed first)
|
|
//
|
|
UINT_PTR FAR PASCAL FileOpenHookProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
|
|
{
|
|
switch (msg) {
|
|
case WM_INITDIALOG:
|
|
return (TRUE); // special case
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
// this is where you preprocess the file selection
|
|
if (wparam == IDOK) {
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return (FALSE); // allow standard processing in common dialog
|
|
}
|
|
#endif
|
|
|
|
|
|
//
|
|
// EnableThemeButtons
|
|
//
|
|
// Utility routine to enable/disable
|
|
// OK
|
|
// Apply
|
|
// Checkboxes
|
|
// SaveAs...
|
|
// Delete
|
|
//
|
|
// Also do the screen saver button
|
|
//
|
|
// There are two cases: you have selected a THM file, or you have selected
|
|
// the "Current Windows settings" item.
|
|
//
|
|
// Uses: global szCurThemeFile to get current THM file
|
|
//
|
|
|
|
//#define CBON(x); EnableWindow(GetDlgItem(hWndApp,x),TRUE);CheckDlgButton(hWndApp,x,TRUE);
|
|
#define CBON(x); EnableWindow(GetDlgItem(hWndApp,x),TRUE);
|
|
#define CBOFF(x); EnableWindow(GetDlgItem(hWndApp,x),FALSE);
|
|
|
|
void FAR EnableThemeButtons()
|
|
{
|
|
int iCheck;
|
|
|
|
//
|
|
// always in any case get scr saver button state updated
|
|
EnableScreenSaverButton();
|
|
|
|
// Always in any case enable the SCHEDULE check box
|
|
EnableWindow(GetDlgItem(hWndApp, CB_SCHEDULE), TRUE);
|
|
|
|
//
|
|
// null THM file ==> Cur Win Settings
|
|
if (!bThemed) {
|
|
|
|
//
|
|
// BUTTONS
|
|
|
|
// enable SaveAs button, disable Delete
|
|
EnableWindow(GetDlgItem(hWndApp, PB_SAVE), TRUE);
|
|
EnableWindow(GetDlgItem(hWndApp, PB_DELETE), FALSE);
|
|
|
|
// disable OK and Apply buttons
|
|
// EnableWindow(GetDlgItem(hWndApp, IDOK), FALSE); // removed as per davidba 4/95
|
|
EnableWindow(GetDlgItem(hWndApp, PB_APPLY), FALSE);
|
|
|
|
//
|
|
// CHECKBOXES: first remember and then just uncheck and disable all
|
|
SaveCheckboxes();
|
|
for (iCheck = 0; iCheck < sizeof(iCBIDs)/sizeof(int); iCheck ++) {
|
|
CBOFF(iCBIDs[iCheck]);
|
|
}
|
|
|
|
// Always in any case enable the SCHEDULE check box
|
|
EnableWindow(GetDlgItem(hWndApp, CB_SCHEDULE), TRUE);
|
|
}
|
|
|
|
//
|
|
// else normal THM file case
|
|
|
|
else {
|
|
|
|
// can't do this anymore because also need xtion from/to
|
|
// iCurTheme == 1, PrevWinSettings
|
|
#ifdef OLDCODE
|
|
// first check whether you are already in the normal case!
|
|
if (IsWindowEnabled(GetDlgItem(hWndApp, iCBIDs[0])))
|
|
return; // NO WORK EXIT
|
|
#endif
|
|
|
|
//
|
|
// BUTTONS
|
|
// EnableWindow(GetDlgItem(hWndApp, PB_SAVE), TRUE); // as per DB 1/95
|
|
EnableWindow(GetDlgItem(hWndApp, PB_SAVE), FALSE); // as per DB 4/95
|
|
EnableWindow(GetDlgItem(hWndApp, PB_DELETE), TRUE);
|
|
// enable OK and Apply buttons
|
|
// EnableWindow(GetDlgItem(hWndApp, IDOK), TRUE); // as per DB 4.95
|
|
|
|
//
|
|
// CHECKBOXES: enable and and then restore checkstates
|
|
for (iCheck = 0; iCheck < sizeof(iCBIDs)/sizeof(int); iCheck ++) {
|
|
CBON(iCBIDs[iCheck]);
|
|
}
|
|
|
|
// APPLY BUTTON depends on checkboxes!
|
|
// Note that IsAnyBoxChecked ignores CB_SCHEDULE.
|
|
EnableWindow(GetDlgItem(hWndApp, PB_APPLY), IsAnyBoxChecked());
|
|
}
|
|
|
|
//
|
|
// special case:
|
|
// iCurTheme == 1 ==> Prev Win Settings
|
|
if ((iCurTheme == 1) && bAppliedOnce) {
|
|
// disable SaveAs button, disable Delete
|
|
EnableWindow(GetDlgItem(hWndApp, PB_SAVE), FALSE);
|
|
EnableWindow(GetDlgItem(hWndApp, PB_DELETE), FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
void EnableScreenSaverButton()
|
|
{
|
|
BOOL bScrSaveActive = FALSE;
|
|
extern TCHAR szSS_Section[];
|
|
extern TCHAR szSS_Key[];
|
|
// get scr saver state
|
|
if (bThemed) { // normal theme case
|
|
TCHAR szSSName[MAX_MSGLEN+1];
|
|
GetPrivateProfileString((LPTSTR)szSS_Section, (LPTSTR)szSS_Key,
|
|
(LPTSTR)szNULL,
|
|
(LPTSTR)szSSName, MAX_MSGLEN,
|
|
(LPTSTR)szCurThemeFile);
|
|
if (*szSSName != TEXT('\0'))
|
|
bScrSaveActive = TRUE;
|
|
}
|
|
else // cur win settings case
|
|
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0,
|
|
(LPVOID)&bScrSaveActive, FALSE);
|
|
|
|
// with screensaver status, enable scr saver button correctly
|
|
EnableWindow(GetDlgItem(hWndApp, PB_SCRSVR), bScrSaveActive);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Just updates the title at the bottom of the preview area with
|
|
// the current theme name.
|
|
//
|
|
void NewSampleTitle(void)
|
|
{
|
|
if (*szCurThemeFile)
|
|
wsprintf((LPTSTR)szMsg, (LPTSTR)szPreviewTitle, (LPTSTR)szCurThemeName);
|
|
else // current windows settings case
|
|
szMsg[0] = 0;
|
|
|
|
SetWindowText(GetDlgItem(hWndApp,TEXT_VIEW), (LPTSTR)szMsg);
|
|
}
|
|
|
|
BOOL bDontChecked;
|
|
|
|
INT_PTR FAR PASCAL BPP_ChoiceDlg(hDlg, message, wParam, lParam)
|
|
HWND hDlg;
|
|
UINT message;
|
|
WPARAM wParam;
|
|
LPARAM lParam;
|
|
{
|
|
switch (message) {
|
|
|
|
case WM_INITDIALOG:
|
|
CheckRadioButton(hDlg, RB_ALL, RB_NONE, RB_SOME);
|
|
bDontChecked = FALSE;
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch ((int)LOWORD(wParam)) {
|
|
|
|
// watch as changes the radio buttons
|
|
case RB_ALL :
|
|
case RB_SOME:
|
|
case RB_NONE:
|
|
if (IsDlgButtonChecked(hDlg, RB_NONE)) {
|
|
// save check state of cbox, before....
|
|
bDontChecked = IsDlgButtonChecked(hDlg, CB_CUT_IT_OUT);
|
|
// ... turning it off and greying it
|
|
CheckDlgButton(hDlg, CB_CUT_IT_OUT, FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, CB_CUT_IT_OUT), FALSE);
|
|
}
|
|
else {
|
|
// if it WAS disabled, enable check box and restore check state
|
|
if (!IsWindowEnabled(GetDlgItem(hDlg, CB_CUT_IT_OUT))) {
|
|
EnableWindow(GetDlgItem(hDlg, CB_CUT_IT_OUT), TRUE);
|
|
if (bDontChecked)
|
|
CheckDlgButton(hDlg, CB_CUT_IT_OUT, TRUE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
fLowBPPFilter = APPLY_ALL;
|
|
EndDialog(hDlg,IDCANCEL);
|
|
break;
|
|
|
|
case IDOK:
|
|
// first, check the never-again checkbox
|
|
if (!IsWindowEnabled(GetDlgItem(hDlg, CB_CUT_IT_OUT)))
|
|
bNeverCheckBPP = FALSE;
|
|
else
|
|
bNeverCheckBPP = IsDlgButtonChecked(hDlg, CB_CUT_IT_OUT);
|
|
|
|
// get the apply filter
|
|
if (IsDlgButtonChecked(hDlg, RB_ALL))
|
|
fLowBPPFilter = APPLY_ALL;
|
|
else if (IsDlgButtonChecked(hDlg, RB_SOME))
|
|
fLowBPPFilter = APPLY_SOME;
|
|
else
|
|
fLowBPPFilter = APPLY_NONE;
|
|
|
|
EndDialog(hDlg,(int)LOWORD(wParam));
|
|
break;
|
|
|
|
default:
|
|
return (FALSE);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
return(FALSE);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
#ifndef UNICODE
|
|
// THIS CODE IS NOT CURRENTLY USED.
|
|
|
|
// Standard entry code yanked from runtime libs to avoid having to link those
|
|
// libs. Shrinks binary by a few K.
|
|
int _stdcall ModuleEntry(void)
|
|
{
|
|
int i;
|
|
STARTUPINFO si;
|
|
LPSTR pszCmdLine = GetCommandLine();
|
|
|
|
|
|
if ( *pszCmdLine == (CHAR)'\"') {
|
|
/*
|
|
* Scan, and skip over, subsequent characters until
|
|
* another double-quote or a null is encountered.
|
|
*/
|
|
while ( *++pszCmdLine && (*pszCmdLine
|
|
!= (CHAR)'\"') );
|
|
/*
|
|
* If we stopped on a double-quote (usual case), skip
|
|
* over it.
|
|
*/
|
|
if ( *pszCmdLine == (CHAR)'\"' )
|
|
pszCmdLine++;
|
|
}
|
|
else {
|
|
while (*pszCmdLine > (CHAR)' ')
|
|
pszCmdLine++;
|
|
}
|
|
|
|
/*
|
|
* Skip past any white space preceeding the second token.
|
|
*/
|
|
while (*pszCmdLine && (*pszCmdLine <= (CHAR)' ')) {
|
|
pszCmdLine++;
|
|
}
|
|
|
|
si.dwFlags = 0;
|
|
GetStartupInfoA(&si);
|
|
|
|
i = WinMain(GetModuleHandle(NULL), NULL, pszCmdLine,
|
|
si.dwFlags & STARTF_USESHOWWINDOW ? si.wShowWindow : SW_SHOWDEFAULT);
|
|
ExitProcess(i);
|
|
return i; // We never comes here.
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// Determine if a specified file already exists in the specified path
|
|
//
|
|
BOOL FileSpecExists(LPTSTR szFilename)
|
|
{
|
|
WIN32_FIND_DATA findData;
|
|
HANDLE hFind;
|
|
BOOL fExists = FALSE;
|
|
|
|
hFind = FindFirstFile(szFilename, &findData);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
fExists = TRUE; // Something is there
|
|
FindClose(hFind);
|
|
}
|
|
|
|
return fExists;
|
|
}
|