mirror of
https://github.com/fadden/ciderpress.git
synced 2024-11-27 08:49:20 +00:00
d8223dbcfd
This moves method comments from the .cpp file to the .h file, where users of the methods can find them. This also makes it possible for the IDE to show the comments when you mouse-hover over the method name, though Visual Studio is a bit weak in this regard. Also, added "override" keywords on overridden methods. Reasonably current versions of popular compilers seem to support this. Also, don't have the return type on a separate line in the .cpp file. The motivation for the practice -- quickly finding a method definition with "^name" -- is less useful in C++ than C, and modern IDEs provide more convenient ways to do the same thing. Also, do some more conversion from unsigned types to uintXX_t. This commit is primarily for the "app" directory.
309 lines
12 KiB
C++
309 lines
12 KiB
C++
/*
|
|
* CiderPress
|
|
* Copyright (C) 2007 by faddenSoft, LLC. All Rights Reserved.
|
|
* See the file LICENSE for distribution terms.
|
|
*/
|
|
/*
|
|
* Support for ConvDiskOptionsDialog.
|
|
*/
|
|
#include "stdafx.h"
|
|
#include "CreateImageDialog.h"
|
|
#include "NewDiskSize.h"
|
|
#include "HelpTopics.h"
|
|
#include "../diskimg/DiskImgDetail.h" // need ProDOS filename validator
|
|
|
|
BEGIN_MESSAGE_MAP(CreateImageDialog, CDialog)
|
|
ON_WM_HELPINFO()
|
|
ON_COMMAND(IDHELP, OnHelp)
|
|
ON_CONTROL_RANGE(BN_CLICKED, IDC_CREATEFS_DOS32, IDC_CREATEFS_BLANK,
|
|
OnFormatChangeRange)
|
|
ON_CONTROL_RANGE(BN_CLICKED, IDC_CONVDISK_140K, IDC_CONVDISK_SPECIFY,
|
|
OnSizeChangeRange)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
// TODO: obtain from DiskImgLib header?
|
|
const int kProDOSVolNameMax = 15; // longest possible ProDOS volume name
|
|
const int kPascalVolNameMax = 7; // longest possible Pascal volume name
|
|
const int kHFSVolNameMax = 27; // longest possible HFS volume name
|
|
const long kMaxBlankBlocks = 16777216; // 8GB in 512-byte blocks
|
|
|
|
BOOL CreateImageDialog::OnInitDialog(void)
|
|
{
|
|
// high bit set in signed short means key is down
|
|
if (::GetKeyState(VK_SHIFT) < 0) {
|
|
LOGI("Shift key is down, enabling extended options");
|
|
fExtendedOpts = true;
|
|
}
|
|
|
|
CEdit* pEdit = (CEdit*) GetDlgItem(IDC_CREATEFSPRODOS_VOLNAME);
|
|
ASSERT(pEdit != NULL);
|
|
pEdit->SetLimitText(kProDOSVolNameMax);
|
|
|
|
pEdit = (CEdit*) GetDlgItem(IDC_CREATEFSPASCAL_VOLNAME);
|
|
ASSERT(pEdit != NULL);
|
|
pEdit->SetLimitText(kPascalVolNameMax);
|
|
|
|
pEdit = (CEdit*) GetDlgItem(IDC_CREATEFSHFS_VOLNAME);
|
|
ASSERT(pEdit != NULL);
|
|
pEdit->SetLimitText(kHFSVolNameMax);
|
|
|
|
pEdit = (CEdit*) GetDlgItem(IDC_CREATEFSDOS_VOLNUM);
|
|
ASSERT(pEdit != NULL);
|
|
pEdit->SetLimitText(3); // 3 digit volume number
|
|
|
|
pEdit = (CEdit*) GetDlgItem(IDC_CONVDISK_SPECIFY_EDIT);
|
|
ASSERT(pEdit != NULL);
|
|
pEdit->EnableWindow(FALSE);
|
|
|
|
return CDialog::OnInitDialog();
|
|
}
|
|
|
|
void CreateImageDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
UINT specifyBlocks = 280;
|
|
CString errMsg;
|
|
|
|
DDX_Radio(pDX, IDC_CONVDISK_140K, fDiskSizeIdx);
|
|
DDX_Radio(pDX, IDC_CREATEFS_DOS32, fDiskFormatIdx);
|
|
DDX_Check(pDX, IDC_CREATEFSDOS_ALLOCDOS, fAllocTracks_DOS);
|
|
DDX_Text(pDX, IDC_CREATEFSDOS_VOLNUM, fDOSVolumeNum);
|
|
DDX_Text(pDX, IDC_CREATEFSPRODOS_VOLNAME, fVolName_ProDOS);
|
|
DDX_Text(pDX, IDC_CREATEFSPASCAL_VOLNAME, fVolName_Pascal);
|
|
DDX_Text(pDX, IDC_CREATEFSHFS_VOLNAME, fVolName_HFS);
|
|
DDX_Text(pDX, IDC_CONVDISK_SPECIFY_EDIT, specifyBlocks);
|
|
|
|
ASSERT(fDiskSizeIdx >= 0 && fDiskSizeIdx < (int)NewDiskSize::GetNumSizeEntries());
|
|
|
|
if (pDX->m_bSaveAndValidate) {
|
|
fNumBlocks = NewDiskSize::GetDiskSizeByIndex(fDiskSizeIdx);
|
|
if (fNumBlocks == NewDiskSize::kSpecified)
|
|
fNumBlocks = specifyBlocks;
|
|
|
|
if (fDiskFormatIdx == kFmtDOS32) {
|
|
CString tmpStr;
|
|
tmpStr.Format(L"%d", fDOSVolumeNum);
|
|
if (!IsValidVolumeName_DOS(tmpStr))
|
|
errMsg.LoadString(IDS_VALID_VOLNAME_DOS);
|
|
} else if (fDiskFormatIdx == kFmtDOS33) {
|
|
CString tmpStr;
|
|
tmpStr.Format(L"%d", fDOSVolumeNum);
|
|
if (!IsValidVolumeName_DOS(tmpStr))
|
|
errMsg.LoadString(IDS_VALID_VOLNAME_DOS);
|
|
|
|
// only needed in "extended" mode -- this stuff is too painful to
|
|
// inflict on the average user
|
|
if (fNumBlocks < 18*8 || fNumBlocks > 800 ||
|
|
(fNumBlocks <= 400 && (fNumBlocks % 8) != 0) ||
|
|
(fNumBlocks > 400 && (fNumBlocks % 16) != 0))
|
|
{
|
|
errMsg = L"Specify a size between 144 blocks (18 tracks) and"
|
|
L" 800 blocks (50 tracks/32 sectors). The block count"
|
|
L" must be a multiple of 8 for 16-sector disks, or a"
|
|
L" multiple of 16 for 32-sector disks. 32 sector"
|
|
L" formatting starts at 400 blocks. Disks larger than"
|
|
L" 400 blocks but less than 800 aren't recognized by"
|
|
L" CiderPress.";
|
|
}
|
|
} else if (fDiskFormatIdx == kFmtProDOS) {
|
|
// Max is really 65535, but we allow 65536 for creation of volumes
|
|
// that can be copied to CFFA cards.
|
|
if (fNumBlocks < 16 || fNumBlocks > 65536) {
|
|
errMsg = L"Specify a size of at least 16 blocks and no more"
|
|
L" than 65536 blocks.";
|
|
} else if (fVolName_ProDOS.IsEmpty() ||
|
|
fVolName_ProDOS.GetLength() > kProDOSVolNameMax)
|
|
{
|
|
errMsg = L"You must specify a volume name 1-15 characters long.";
|
|
} else {
|
|
if (!IsValidVolumeName_ProDOS(fVolName_ProDOS))
|
|
errMsg.LoadString(IDS_VALID_VOLNAME_PRODOS);
|
|
}
|
|
} else if (fDiskFormatIdx == kFmtPascal) {
|
|
if (fVolName_Pascal.IsEmpty() ||
|
|
fVolName_Pascal.GetLength() > kPascalVolNameMax)
|
|
{
|
|
errMsg = L"You must specify a volume name 1-7 characters long.";
|
|
} else {
|
|
if (!IsValidVolumeName_Pascal(fVolName_Pascal))
|
|
errMsg.LoadString(IDS_VALID_VOLNAME_PASCAL);
|
|
}
|
|
} else if (fDiskFormatIdx == kFmtHFS) {
|
|
if (fNumBlocks < 1600 || fNumBlocks > 4194303) {
|
|
errMsg = L"Specify a size of at least 1600 blocks and no more"
|
|
L" than 4194303 blocks.";
|
|
} else if (fVolName_HFS.IsEmpty() ||
|
|
fVolName_HFS.GetLength() > kHFSVolNameMax)
|
|
{
|
|
errMsg = L"You must specify a volume name 1-27 characters long.";
|
|
} else {
|
|
if (!IsValidVolumeName_HFS(fVolName_HFS))
|
|
errMsg.LoadString(IDS_VALID_VOLNAME_HFS);
|
|
}
|
|
} else if (fDiskFormatIdx == kFmtBlank) {
|
|
if (fNumBlocks < 1 || fNumBlocks > kMaxBlankBlocks)
|
|
errMsg = L"Specify a size of at least 1 block and no more"
|
|
L" than 16777216 blocks.";
|
|
} else {
|
|
ASSERT(false);
|
|
}
|
|
} else {
|
|
OnFormatChangeRange(IDC_CREATEFS_DOS32 + fDiskFormatIdx);
|
|
}
|
|
|
|
if (!errMsg.IsEmpty()) {
|
|
CString appName;
|
|
appName.LoadString(IDS_MB_APP_NAME);
|
|
MessageBox(errMsg, appName, MB_OK);
|
|
pDX->Fail();
|
|
}
|
|
|
|
CDialog::DoDataExchange(pDX);
|
|
}
|
|
|
|
void CreateImageDialog::OnFormatChangeRange(UINT nID)
|
|
{
|
|
static const struct {
|
|
UINT buttonID;
|
|
UINT ctrlID;
|
|
} kFormatTab[] = {
|
|
{ IDC_CREATEFS_DOS32, IDC_CREATEFSDOS_ALLOCDOS },
|
|
{ IDC_CREATEFS_DOS32, IDC_CREATEFSDOS_VOLNUM },
|
|
{ IDC_CREATEFS_DOS32, IDC_CONVDISK_140K },
|
|
{ IDC_CREATEFS_DOS33, IDC_CREATEFSDOS_ALLOCDOS },
|
|
{ IDC_CREATEFS_DOS33, IDC_CREATEFSDOS_VOLNUM },
|
|
{ IDC_CREATEFS_DOS33, IDC_CONVDISK_140K },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CREATEFSPRODOS_VOLNAME },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_140K },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_800K },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_1440K },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_5MB },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_16MB },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_20MB },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_32MB },
|
|
{ IDC_CREATEFS_PRODOS, IDC_CONVDISK_SPECIFY },
|
|
{ IDC_CREATEFS_PASCAL, IDC_CREATEFSPASCAL_VOLNAME },
|
|
{ IDC_CREATEFS_PASCAL, IDC_CONVDISK_140K },
|
|
{ IDC_CREATEFS_PASCAL, IDC_CONVDISK_800K },
|
|
{ IDC_CREATEFS_HFS, IDC_CREATEFSHFS_VOLNAME },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_800K },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_1440K },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_5MB },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_16MB },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_20MB },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_32MB },
|
|
{ IDC_CREATEFS_HFS, IDC_CONVDISK_SPECIFY },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_140K },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_800K },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_1440K },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_5MB },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_16MB },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_20MB },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_32MB },
|
|
{ IDC_CREATEFS_BLANK, IDC_CONVDISK_SPECIFY },
|
|
};
|
|
static const UINT kDetailControls[] = {
|
|
IDC_CREATEFSDOS_ALLOCDOS,
|
|
IDC_CREATEFSDOS_VOLNUM,
|
|
IDC_CREATEFSPRODOS_VOLNAME,
|
|
IDC_CREATEFSPASCAL_VOLNAME,
|
|
IDC_CREATEFSHFS_VOLNAME
|
|
};
|
|
int i;
|
|
|
|
LOGI("OnFormatChangeRange id=%d", nID);
|
|
|
|
/* reset so 140K is highlighted */
|
|
NewDiskSize::EnableButtons_ProDOS(this, 32, 16);
|
|
|
|
/* disable all buttons */
|
|
NewDiskSize::EnableButtons(this, FALSE);
|
|
|
|
for (i = 0; i < NELEM(kDetailControls); i++) {
|
|
CWnd* pWnd = GetDlgItem(kDetailControls[i]);
|
|
if (pWnd != NULL)
|
|
pWnd->EnableWindow(FALSE);
|
|
}
|
|
|
|
/* re-enable just the ones we like */
|
|
for (i = 0; i < NELEM(kFormatTab); i++) {
|
|
if (kFormatTab[i].buttonID == nID) {
|
|
CWnd* pWnd = GetDlgItem(kFormatTab[i].ctrlID);
|
|
ASSERT(pWnd != NULL);
|
|
if (pWnd != NULL)
|
|
pWnd->EnableWindow(TRUE);
|
|
}
|
|
}
|
|
if (fExtendedOpts && nID != IDC_CREATEFS_DOS32) {
|
|
CWnd* pWnd = GetDlgItem(IDC_CONVDISK_SPECIFY);
|
|
pWnd->EnableWindow(TRUE);
|
|
}
|
|
|
|
/* make sure 140K is viable; doesn't work for HFS */
|
|
CButton* pButton;
|
|
pButton = (CButton*) GetDlgItem(IDC_CONVDISK_140K);
|
|
if (!pButton->IsWindowEnabled()) {
|
|
pButton->SetCheck(BST_UNCHECKED);
|
|
pButton = (CButton*) GetDlgItem(IDC_CONVDISK_800K);
|
|
pButton->SetCheck(BST_CHECKED);
|
|
}
|
|
}
|
|
|
|
void CreateImageDialog::OnSizeChangeRange(UINT nID)
|
|
{
|
|
LOGI("OnSizeChangeRange id=%d", nID);
|
|
|
|
CButton* pButton = (CButton*) GetDlgItem(IDC_CONVDISK_SPECIFY);
|
|
CEdit* pEdit = (CEdit*) GetDlgItem(IDC_CONVDISK_SPECIFY_EDIT);
|
|
pEdit->EnableWindow(pButton->GetCheck() == BST_CHECKED);
|
|
|
|
CButton* pBlank;
|
|
CButton* pHFS;
|
|
pBlank = (CButton*) GetDlgItem(IDC_CREATEFS_BLANK);
|
|
pHFS = (CButton*) GetDlgItem(IDC_CREATEFS_HFS);
|
|
if (pHFS->GetCheck() == BST_CHECKED)
|
|
pEdit->SetLimitText(10); // enough for "2147483647"
|
|
else if (pBlank->GetCheck() == BST_CHECKED)
|
|
pEdit->SetLimitText(8); // enough for "16777216"
|
|
else
|
|
pEdit->SetLimitText(5); // enough for "65535"
|
|
|
|
NewDiskSize::UpdateSpecifyEdit(this);
|
|
}
|
|
|
|
|
|
bool CreateImageDialog::IsValidVolumeName_DOS(const WCHAR* name)
|
|
{
|
|
CStringA nameStr(name);
|
|
return DiskImgLib::DiskFSDOS33::IsValidVolumeName(nameStr);
|
|
}
|
|
|
|
bool CreateImageDialog::IsValidVolumeName_ProDOS(const WCHAR* name)
|
|
{
|
|
CStringA nameStr(name);
|
|
return DiskImgLib::DiskFSProDOS::IsValidVolumeName(nameStr);
|
|
}
|
|
|
|
bool CreateImageDialog::IsValidVolumeName_Pascal(const WCHAR* name)
|
|
{
|
|
CStringA nameStr(name);
|
|
return DiskImgLib::DiskFSPascal::IsValidVolumeName(nameStr);
|
|
}
|
|
|
|
bool CreateImageDialog::IsValidVolumeName_HFS(const WCHAR* name)
|
|
{
|
|
CStringA nameStr(name);
|
|
return DiskImgLib::DiskFSHFS::IsValidVolumeName(nameStr);
|
|
}
|
|
|
|
BOOL CreateImageDialog::OnHelpInfo(HELPINFO* lpHelpInfo)
|
|
{
|
|
WinHelp((DWORD) lpHelpInfo->iCtrlId, HELP_CONTEXTPOPUP);
|
|
return TRUE; // yes, we handled it
|
|
}
|
|
|
|
void CreateImageDialog::OnHelp(void)
|
|
{
|
|
WinHelp(HELP_TOPIC_IMAGE_CREATOR, HELP_CONTEXT);
|
|
}
|