|
|
/*--------------------------------------------------------------------------*
* * Microsoft Windows * Copyright (C) Microsoft Corporation, 1992 - 1999 * * File: props.cpp * * Contents: Implementation file for console property sheet and page(s) * * History: 05-Dec-97 JeffRo Created * *--------------------------------------------------------------------------*/
#include "stdafx.h"
#include "amc.h"
#include "props.h"
#include "mainfrm.h"
#include "amcdoc.h"
#include "pickicon.h"
//#ifdef _DEBUG
//#define new DEBUG_NEW
//#undef THIS_FILE
//static char THIS_FILE[] = __FILE__;
//#endif
/////////////////////////////////////////////////////////////////////////////
// CConsolePropSheet
IMPLEMENT_DYNAMIC(CConsolePropSheet, CPropertySheet)
CConsolePropSheet::CConsolePropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) : CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { CommonConstruct (); }
CConsolePropSheet::CConsolePropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage) { CommonConstruct (); }
void CConsolePropSheet::CommonConstruct() { DECLARE_SC(sc, TEXT("CConsolePropSheet::CommonConstruct"));
CAMCApp *pAMCApp = AMCGetApp(); sc = ScCheckPointers( pAMCApp, E_UNEXPECTED ); if (sc) sc.TraceAndClear();
// add the main page only for author mode
if ( (pAMCApp != NULL) && (pAMCApp->GetMode() == eMode_Author) ) { AddPage (&m_ConsolePage); }
AddPage (&m_diskCleanupPage); }
BOOL CConsolePropSheet::OnInitDialog() { ModifyStyleEx(0, WS_EX_CONTEXTHELP, SWP_NOSIZE); return CPropertySheet::OnInitDialog(); }
CConsolePropSheet::~CConsolePropSheet() { }
BEGIN_MESSAGE_MAP(CConsolePropSheet, CPropertySheet) //{{AFX_MSG_MAP(CConsolePropSheet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*+-------------------------------------------------------------------------*
* CConsolePropSheet::DoModal * * *--------------------------------------------------------------------------*/ INT_PTR CConsolePropSheet::DoModal() { CThemeContextActivator activator; return CPropertySheet::DoModal(); }
/////////////////////////////////////////////////////////////////////////////
// CConsolePropPage property page
IMPLEMENT_DYNCREATE(CConsolePropPage, CPropertyPage)
CConsolePropPage::CConsolePropPage() : CPropertyPage(CConsolePropPage::IDD), m_pDoc (CAMCDoc::GetDocument()) { ASSERT (m_pDoc != NULL); ASSERT_VALID (m_pDoc); ASSERT_KINDOF (CAMCDoc, m_pDoc);
m_hinstSelf = AfxGetInstanceHandle (); m_fTitleChanged = false; m_fIconChanged = false; m_strTitle = m_pDoc->GetCustomTitle (); m_nConsoleMode = m_pDoc->GetMode (); m_fDontSaveChanges = m_pDoc->IsLogicalReadOnly (); m_fAllowViewCustomization = m_pDoc->AllowViewCustomization (); }
CConsolePropPage::~CConsolePropPage() { }
void CConsolePropPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CConsolePropPage)
DDX_Control(pDX, IDC_DONTSAVECHANGES, m_wndDontSaveChanges); DDX_Control(pDX, IDC_AllowViewCustomization, m_wndAllowViewCustomization); DDX_Control(pDX, IDC_CONSOLE_MODE_DESCRIPTION, m_wndModeDescription); DDX_Control(pDX, IDC_CUSTOM_TITLE, m_wndTitle); DDX_CBIndex(pDX, IDC_CONSOLE_MODE, m_nConsoleMode); DDX_Check(pDX, IDC_DONTSAVECHANGES, m_fDontSaveChanges); DDX_Text(pDX, IDC_CUSTOM_TITLE, m_strTitle); DDX_Check(pDX, IDC_AllowViewCustomization, m_fAllowViewCustomization); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CConsolePropPage, CPropertyPage) //{{AFX_MSG_MAP(CConsolePropPage)
ON_CBN_SELENDOK(IDC_CONSOLE_MODE, OnSelendokConsoleMode) ON_BN_CLICKED(IDC_DONTSAVECHANGES, OnDontSaveChanges) ON_BN_CLICKED(IDC_AllowViewCustomization, OnAllowViewCustomization) ON_BN_CLICKED(IDC_CHANGE_ICON, OnChangeIcon) ON_EN_CHANGE(IDC_CUSTOM_TITLE, OnChangeCustomTitle) //}}AFX_MSG_MAP
ON_MMC_CONTEXT_HELP() END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CConsolePropPage message handlers
void CConsolePropPage::OnOK() { m_pDoc->SetMode (static_cast<ProgramMode>(m_nConsoleMode)); m_pDoc->SetLogicalReadOnlyFlag (m_fDontSaveChanges); m_pDoc->AllowViewCustomization (m_fAllowViewCustomization);
if (m_fIconChanged) { m_pDoc->SetCustomIcon (m_strIconFile, m_nIconIndex); m_fIconChanged = false; }
if (m_fTitleChanged) { m_pDoc->SetCustomTitle (m_strTitle); m_fTitleChanged = false; }
CPropertyPage::OnOK(); }
void CConsolePropPage::OnSelendokConsoleMode() { SetModified (); UpdateData (); SetDescriptionText (); EnableDontSaveChanges (); }
void CConsolePropPage::SetDescriptionText () { // make sure the mode index is within range
ASSERT (IsValidProgramMode (static_cast<ProgramMode>(m_nConsoleMode)));
m_wndModeDescription.SetWindowText (m_strDescription[m_nConsoleMode]); }
BOOL CConsolePropPage::OnInitDialog() { CPropertyPage::OnInitDialog();
/*
* make sure the string IDs are as the code expects them */ ASSERT ((IDS_ModeAuthor + 1) == IDS_ModeUserFull); ASSERT ((IDS_ModeUserFull + 1) == IDS_ModeUserMDI); ASSERT ((IDS_ModeUserMDI + 1) == IDS_ModeUserSDI); ASSERT ((IDS_ModeAuthor_Description + 1) == IDS_ModeUserFull_Description); ASSERT ((IDS_ModeUserFull_Description + 1) == IDS_ModeUserMDI_Description); ASSERT ((IDS_ModeUserMDI_Description + 1) == IDS_ModeUserSDI_Description);
/*
* load the mode names into the combo box */ int i; CString strComboText; CComboBox* pCombo = reinterpret_cast<CComboBox*>(GetDlgItem (IDC_CONSOLE_MODE)); ASSERT (pCombo != NULL);
for (i = 0; i < eMode_Count; i++) { VERIFY (LoadString (strComboText, IDS_ModeAuthor + i)); pCombo->AddString (strComboText); }
pCombo->SetCurSel (m_nConsoleMode - eMode_Author);
/*
* load up the description text */ ASSERT (countof (m_strDescription) == eMode_Count);
for (i = 0; i < countof (m_strDescription); i++) { VERIFY (LoadString (m_strDescription[i], IDS_ModeAuthor_Description + i)); }
SetDescriptionText (); EnableDontSaveChanges ();
/*
* Get the current icon for this console file */ ASSERT (m_pDoc != NULL); HICON hIcon = m_pDoc->GetCustomIcon (true, &m_strIconFile, &m_nIconIndex); m_wndIcon.SubclassDlgItem (IDC_CONSOLE_ICON, this);
/*
* if we haven't specified a custom icon yet, use MMC.EXE */ if (hIcon == NULL) { ASSERT (m_strIconFile.IsEmpty()); const int cchBuffer = MAX_PATH;
GetModuleFileName (AfxGetInstanceHandle(), m_strIconFile.GetBuffer(cchBuffer), cchBuffer); m_strIconFile.ReleaseBuffer(); m_nIconIndex = 0; } else m_wndIcon.SetIcon (hIcon);
/*
* Get the current title for this console file */ m_wndTitle.SetWindowText (m_pDoc->GetCustomTitle()); m_fTitleChanged = false;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CConsolePropPage::OnDontSaveChanges() { SetModified (); }
void CConsolePropPage::OnAllowViewCustomization() { SetModified (); }
void CConsolePropPage::EnableDontSaveChanges() { if (m_nConsoleMode == eMode_Author) { m_wndDontSaveChanges. EnableWindow (false); m_wndDontSaveChanges. SetCheck (0);
m_wndAllowViewCustomization.EnableWindow (false); m_wndAllowViewCustomization.SetCheck (1); } else { m_wndDontSaveChanges. EnableWindow (true); m_wndAllowViewCustomization.EnableWindow (true); } }
void CConsolePropPage::OnChangeIcon() { DECLARE_SC(sc, TEXT("CConsolePropPage::OnChangeIcon"));
int nIconIndex = m_nIconIndex; TCHAR szIconFile[MAX_PATH];
sc = StringCchCopy(szIconFile, countof(szIconFile), m_strIconFile); if (sc) return;
/*
* show the pick 'em dialog; if something changed, enable OK/Apply */ if (MMC_PickIconDlg (m_hWnd, szIconFile, countof (szIconFile), &nIconIndex) && ((nIconIndex != m_nIconIndex) || (lstrcmpi (szIconFile, m_strIconFile) != 0))) { m_icon.Attach (ExtractIcon (m_hinstSelf, szIconFile, nIconIndex));
if (m_icon != NULL) { m_fIconChanged = true; m_strIconFile = szIconFile; m_nIconIndex = nIconIndex; m_wndIcon.SetIcon (m_icon); SetModified(); } } }
void CConsolePropPage::OnChangeCustomTitle() { m_fTitleChanged = true; SetModified(); }
/////////////////////////////////////////////////////////////////////////////
// CDiskCleanupPage property page
IMPLEMENT_DYNCREATE(CDiskCleanupPage, CPropertyPage)
BEGIN_MESSAGE_MAP(CDiskCleanupPage, CPropertyPage) ON_MMC_CONTEXT_HELP() ON_BN_CLICKED(IDC_DELETE_TEMP_FILES, OnDeleteTemporaryFiles) END_MESSAGE_MAP()
CDiskCleanupPage::CDiskCleanupPage() : CPropertyPage(CDiskCleanupPage::IDD) { }
CDiskCleanupPage::~CDiskCleanupPage() { }
BOOL CDiskCleanupPage::OnInitDialog() { CPropertyPage::OnInitDialog();
ScRecalculateUsedSpace();
return TRUE; }
/***************************************************************************\
* * METHOD: CDiskCleanupPage::OnDeleteTemporaryFiles * * PURPOSE: Invoked when "Delete Filed" button is pressed * Removes all files from MMC folder storing the user data * * PARAMETERS: * * RETURNS: * \***************************************************************************/ void CDiskCleanupPage::OnDeleteTemporaryFiles() { DECLARE_SC(sc, TEXT("CDiskCleanupPage::OnDeleteTemporaryFiles"));
// ask user if he is sure...
CString strConfirmMessage; CString strConfirmCaption; if (!LoadString(strConfirmMessage, IDS_ConfirmDeleteTempFiles) || !LoadString(strConfirmCaption, IDR_MAINFRAME)) { sc = E_UNEXPECTED; return; }
int ans = ::MessageBox( m_hWnd, strConfirmMessage, strConfirmCaption, MB_YESNO | MB_ICONWARNING); if ( ans != IDYES ) return;
// display wait cursor while working
CWaitCursor cursorWait;
// get folder
tstring strFileFolder; sc = CConsoleFilePersistor::ScGetUserDataFolder(strFileFolder); if (sc) return;
// get file mask
tstring strFileMask = strFileFolder; strFileMask += _T("\\*.*");
WIN32_FIND_DATA findFileData; ZeroMemory( &findFileData, sizeof(findFileData) );
// start file search
HANDLE hFindFile = FindFirstFile( strFileMask.c_str(), &findFileData ); if ( hFindFile == INVALID_HANDLE_VALUE ) { sc.FromLastError(); return; }
// loop thru files and delete them
bool bContinue = true; while ( bContinue ) { tstring strFileToDelete = strFileFolder + _T('\\') + findFileData.cFileName; DWORD dwFileAttributes = findFileData.dwFileAttributes;
// get to the next file first
bContinue = FindNextFile( hFindFile, &findFileData );
// delete files, but not directories
if ( 0 == (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { // delete
if ( !DeleteFile( strFileToDelete.c_str() ) ) { // trace on errors (but do not stop)
sc.FromLastError().TraceAndClear(); } } }
// Done, release the handle
FindClose(hFindFile);
sc = ScRecalculateUsedSpace(); if (sc) sc.TraceAndClear();
}
/***************************************************************************\
* * METHOD: CDiskCleanupPage::ScRecalculateUsedSpace * * PURPOSE: Recalculates and displays disk space occupied by user data in this profile * * PARAMETERS: * * RETURNS: * SC - result code * \***************************************************************************/ SC CDiskCleanupPage::ScRecalculateUsedSpace() { DECLARE_SC(sc, TEXT("CDiskCleanupPage::ScRecalculateUsedSpace"));
// display wait cursor while working
CWaitCursor cursorWait;
// get folder
tstring strFileFolder; sc = CConsoleFilePersistor::ScGetUserDataFolder(strFileFolder); if (sc) return sc;
// get file mask
tstring strFileMask = strFileFolder; strFileMask += _T("\\*.*");
WIN32_FIND_DATA findFileData; ZeroMemory( &findFileData, sizeof(findFileData) );
// start file search
HANDLE hFindFile = FindFirstFile( strFileMask.c_str(), &findFileData ); if ( hFindFile == INVALID_HANDLE_VALUE ) return sc.FromLastError();
// loop thru files and count size
ULARGE_INTEGER ulgOccupied = {0}; bool bContinue = true; while ( bContinue ) { DWORD dwFileAttributes = findFileData.dwFileAttributes; if ( 0 == (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { // add the high and low part separatelly, since findFileData does not have it bundled
ulgOccupied.HighPart += findFileData.nFileSizeHigh; // add lower part to the whole large integer not to lose carry on overflow
ulgOccupied.QuadPart += findFileData.nFileSizeLow; }
// get to the next file first
bContinue = FindNextFile( hFindFile, &findFileData ); }
// Done, release the handle
FindClose(hFindFile);
// now conver the size into string
UINT nTerraBytes = (UINT)(ulgOccupied.QuadPart >> 40); UINT nGigaBytes = (UINT)(ulgOccupied.QuadPart >> 30) & 0x3ff; UINT nMegaBytes = ((ulgOccupied.LowPart >> 20) & 0x3ff); UINT nKiloBytes = ((ulgOccupied.LowPart >> 10) & 0x3ff); UINT nBytes = ( ulgOccupied.LowPart & 0x3ff);
CString strUnit; double dSize = 0.0; bool bNonZeroOccupied = (ulgOccupied.QuadPart != 0);
// display only biggest units, and never more than 999
// instead of "1001 KB" we display "0.98 MB"
if ( (nTerraBytes) > 0 || (nGigaBytes > 999) ) { LoadString(strUnit, IDS_FileSize_TB); dSize = (double)nTerraBytes + ((double)nGigaBytes / 1024.); } else if ( (nGigaBytes) > 0 || (nMegaBytes > 999) ) { LoadString(strUnit, IDS_FileSize_GB); dSize = (double)nGigaBytes + ((double)nMegaBytes / 1024.); } else if ( (nMegaBytes) > 0 || (nKiloBytes > 999) ) { LoadString(strUnit, IDS_FileSize_MB); dSize = (double)nMegaBytes + ((double)nKiloBytes / 1024.); } else if ( (nKiloBytes) > 0 || (nBytes > 999) ) { LoadString(strUnit, IDS_FileSize_KB); dSize = (double)nKiloBytes + ((double)nBytes / 1024.); } else { LoadString(strUnit, IDS_FileSize_bytes); dSize = (double)nBytes; }
// format with op to two decimal points
CString strSize; strSize.Format(_T("%.2f"), dSize);
//truncate trailing zeros
while (strSize.Right(1) == _T("0")) strSize = strSize.Left(strSize.GetLength() - 1); //truncate trailing decimal point
if (strSize.Right(1) == _T(".")) strSize = strSize.Left(strSize.GetLength() - 1);
// add units ( in locale independant way )
strUnit.Replace(_T("%1"), strSize);
// set to the window
SetDlgItemText( IDC_DISKCLEANUP_OCCUPIED, strUnit );
// enable/disable "Delete Files" button
CWnd *pWndDeleteBtn = GetDlgItem(IDC_DELETE_TEMP_FILES); sc = ScCheckPointers( pWndDeleteBtn, E_UNEXPECTED ); if (sc) return sc;
pWndDeleteBtn->EnableWindow( bNonZeroOccupied );
// if the focus went away (belonged to the window being disabled)
// set it to the OK button
if ( ::GetFocus() == NULL && GetParent()) { GetParent()->SetFocus(); GetParent()->SendMessage(DM_SETDEFID, IDOK); }
return sc; }
|