384 lines
15 KiB
C++
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));
|
||
|
}
|
||
|
}
|