windows-nt/Source/XPSP1/NT/base/fs/utils/tuneup/runnow.cpp
2020-09-26 16:20:57 +08:00

384 lines
15 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// RUNNOW.CPP / Tuneup
//
// Microsoft Confidential
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// 8/98 - Jason Cohen (JCOHEN)
//
//////////////////////////////////////////////////////////////////////////////
//
// Internal include file(s).
//
#include <windows.h>
#include "tasks.h"
#include "main.h"
//
// Internal defined value(s).
//
#define CHECK_WIDTH 18
#define FIRST_SPACING 7
#define LINE_SPACING 13
#define WINGDING_CHECK 0xFC
#define WINGDING_ARROW 0xD8 //0x77 //0xE8 //0xE0
#define WM_PROGRESS (WM_USER + 1000)
//
// Internal global variable(s).
//
HWND g_hWndRunNowDlg = NULL;
//
// Inernal function prototype(s).
//
static INT RunNowProgressProc(DWORD);
static BOOL CALLBACK RunNowDlgProc(HWND, UINT, WPARAM, LPARAM);
static VOID InitWingdingFont(HWND);
//
// External function(s).
//
VOID RunTasksNow(HWND hWndParent, LPTASKDATA lpTasks)
{
HANDLE hThread;
DWORD dwThreadID;
// Use another thread to run progressing dialog.
//
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) RunNowProgressProc, (LPVOID) NULL, 0, (LPDWORD) &dwThreadID);
// Hide the wizard window.
//
ShowEnableWindow(hWndParent, FALSE);
// Wait for the dialog to be created.
//
while ( g_hWndRunNowDlg == NULL )
Sleep(10);
// Loop through all the tasks.
//
while ( lpTasks && g_hWndRunNowDlg )
{
// Check to see if it is scheduled.
//
if ( !(g_dwFlags & TUNEUP_CUSTOM) || (lpTasks->dwOptions & TASK_SCHEDULED) )
{
// Put an arrow next to the item.
//
SendMessage(g_hWndRunNowDlg, WM_PROGRESS, 0, 0L);
// Execute the task.
//
ExecAndWait(hWndParent, lpTasks->lpFullPathName, lpTasks->lpParameters, NULL, FALSE, FALSE);
}
lpTasks = lpTasks->lpNext;
}
// If the progress dialog is still there, close it
//
if ( g_hWndRunNowDlg )
SendMessage(g_hWndRunNowDlg, WM_CLOSE, 0, 0);
}
//
// Internal function(s).
//
static INT RunNowProgressProc(DWORD dwDummy)
{
return (INT)DialogBox(g_hInst, MAKEINTRESOURCE(IDD_PROGRESS), NULL, (DLGPROC) RunNowDlgProc);
}
static BOOL CALLBACK RunNowDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static POINT Point;
static INT nHeight,
nIndex = -1;
static HWND hWndTemp = NULL,
*lphWnd = NULL;
static HFONT hBoldFont = NULL,
hNormFont = NULL;
TCHAR szWingDing[] = _T(" ");
POINT PointMove;
RECT Rect,
RectDlg;
LPTASKDATA lpTasks;
switch (message)
{
case WM_COMMAND:
if ( (INT) LOWORD(wParam) == IDCANCEL )
EndDialog(hDlg, 0);
return 0;
case WM_DESTROY:
// Free the font handles.
//
if ( hBoldFont )
DeleteObject(hBoldFont);
if ( hNormFont )
DeleteObject(hNormFont);
InitWingdingFont(NULL);
// Free the hWnd.
//
FREE(lphWnd);
g_hWndRunNowDlg = NULL;
return TRUE;
case WM_INITDIALOG:
// Disable system menu itmes.
//
//EnableMenuItem(GetSystemMenu(hDlg, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_DISABLED);
// Move the window to the upper right corner of the desktop.
//
CenterWindow(hDlg, NULL, TRUE);
// Get the rect of the title control we are going to base all the others of.
//
GetWindowRect(GetDlgItem(hDlg, IDC_TITLE), &Rect);
MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2);
// Figure the width and height of the new controls.
//
Rect.right -= Rect.left; // The width of the control.
Rect.bottom -= Rect.top; // The height of the control.
// Now we need to convert the left top coordinates from screen to client coordinates.
//
Point.x = Rect.left; // The left of the control.
Point.y = Rect.top; // The top of the control.
Point.y += FIRST_SPACING;
// Allocate the memory for the hWnds.
//
nHeight = TasksScheduled(g_Tasks);
lphWnd = (HWND *) MALLOC(sizeof(HWND) * nHeight--);
nIndex = nHeight;
for (lpTasks = g_Tasks; lpTasks; lpTasks = lpTasks->lpNext)
{
// Check to see if it is scheduled.
//
if ( !(g_dwFlags & TUNEUP_CUSTOM) || (lpTasks->dwOptions & TASK_SCHEDULED) )
{
// Each new control should be 2 times the width of the control down
// from the previous control. This will give 1 width of the control
// between each.
//
Point.y += Rect.bottom + LINE_SPACING;
// Create the control and set the font and text.
//
hWndTemp = CreateWindow(_T("STATIC"), _T(""), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, Point.x + CHECK_WIDTH, Point.y, Rect.right - CHECK_WIDTH, Rect.bottom, hDlg, NULL, g_hInst, NULL);
if ( hNormFont == NULL )
hNormFont = (HFONT) SendDlgItemMessage(hDlg, IDC_TITLE, WM_GETFONT, 0, 0L);
SendMessage(hWndTemp, WM_SETFONT, (WPARAM) hNormFont, MAKELPARAM(FALSE, 0));
SetWindowText(hWndTemp, lpTasks->lpTitle);
// If we can, save the hwnd so we can use it to make
// the current text bold.
//
if ( lphWnd && (nIndex >= 0) )
*(lphWnd + nIndex) = hWndTemp;
nIndex--;
}
}
// Make sure we allocated the memory and used all of it.
// nIndex should be exatly -1 if we got the right number
// of hWnds.
//
if ( lphWnd && (nIndex == -1) )
nIndex = nHeight;
else
nIndex = -1;
// Reset this so that the progress message knows the
// first time it is run.
//
hWndTemp = NULL;
// Make sure that the Point.y is at the bottom of the
// last control created by adding the height of the control
// to it.
//
Point.y += Rect.bottom;
// Get the current position in client coordinates
// of the Cancel button.
//
GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &Rect);
MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2);
PointMove.x = Rect.left;
PointMove.y = Rect.top;
GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &Rect);
// Get the rect of the dialog in screen coordinates.
//
GetWindowRect(hDlg, &RectDlg);
// Move up the cancel button based on the bottom of the last control
// created and adding the space between the bottom of the cancel button
// and the bottom of the dialog.
//
PointMove.y = Point.y + (RectDlg.bottom - Rect.bottom);
// Move the Cancel button so it is up under the last control created.
//
SetWindowPos(GetDlgItem(hDlg, IDCANCEL), NULL, PointMove.x, PointMove.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
// Set where the bottom of the dialog in screen coordinates should
// be based on where the cancel button was moved to.
//
Point.x = 0; // Don't care.
Point.y = PointMove.y + RectDlg.bottom - Rect.top;
ClientToScreen(hDlg, &Point);
// Move up the bottom of the dialog so it is just under the cancel button.
//
SetWindowPos(hDlg, NULL, 0, 0, RectDlg.right - RectDlg.left, Point.y - RectDlg.top, SWP_NOMOVE | SWP_NOZORDER);
g_hWndRunNowDlg = hDlg;
return FALSE;
case WM_PROGRESS:
// Check to see if this is the first
// time this function is run.
//
if ( hWndTemp == NULL )
{
// Get the rect of the title control we are going to base all the others of.
// We need to convert the left top coordinates from screen to client coordinates.
//
GetWindowRect(GetDlgItem(hDlg, IDC_TITLE), &Rect);
MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2);
Point.x = Rect.left; // The left of the control.
Point.y = Rect.top; // The top of the control.
nHeight = Rect.bottom - Rect.top; // The height of the control.
MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2);
Point.y += FIRST_SPACING;
}
else
{
// Set the previous control to checked before creating the next one.
//
szWingDing[0] = (TCHAR) WINGDING_CHECK;
SetWindowText(hWndTemp, szWingDing);
if ( lphWnd && (nIndex >= 0) )
SendMessage(*(lphWnd + nIndex), WM_SETFONT, (WPARAM) hNormFont, MAKELPARAM(TRUE, 0));
nIndex--;
}
// Each new control should be 2 times the width of the control down
// from the previous control. This will give 1 width of the control
// between each.
//
Point.y += nHeight + LINE_SPACING;
// Create the control and set the wingding font and arrow text.
//
hWndTemp = CreateWindow(_T("STATIC"), _T(""), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, Point.x, Point.y, CHECK_WIDTH, nHeight, hDlg, NULL, g_hInst, NULL);
InitWingdingFont(hWndTemp);
szWingDing[0] = (TCHAR) WINGDING_ARROW;
SetWindowText(hWndTemp, szWingDing);
// Bold the current item if we can.
//
if ( lphWnd && (nIndex >= 0) )
{
if ( hBoldFont == NULL )
hBoldFont = GetFont(*(lphWnd + nIndex), NULL, 10, FW_BOLD);
if ( hBoldFont )
SendMessage(*(lphWnd + nIndex), WM_SETFONT, (WPARAM) hBoldFont, MAKELPARAM(TRUE, 0));
}
return TRUE;
default:
return FALSE;
}
}
static VOID InitWingdingFont(HWND hWndCtrl)
{
static HFONT hCheckFont = NULL;
TCHAR szFontName[32];
DWORD dwFontSize;
// If NULL is passed in, we should free the font handle.
//
if ( hWndCtrl == NULL )
{
// Free the font handle.
//
if ( hCheckFont )
DeleteObject(hCheckFont);
}
else
{
// We may already have the handle to the font we need,
// but if not, we need to get it.
//
if ( hCheckFont == NULL )
{
// Get the font size.
//
if ( LoadString(NULL, IDS_CHECKFONTSIZE, szFontName, sizeof(szFontName) / sizeof(TCHAR)) )
dwFontSize = _tcstoul(szFontName, NULL, 10);
else
dwFontSize = 12;
// Get the font name.
//
if ( !LoadString(NULL, IDS_CHECKFONTNAME, szFontName, sizeof(szFontName) / sizeof(TCHAR)) )
lstrcpy(szFontName, _T("Wingdings"));
hCheckFont = GetFont(hWndCtrl, szFontName, dwFontSize, FW_BOLD, TRUE);
}
// Now send the font to the control.
//
if ( hCheckFont )
SendMessage(hWndCtrl, WM_SETFONT, (WPARAM) hCheckFont, MAKELPARAM(TRUE, 0));
}
}