Files
nsis-plugin-ns7zip/versions/26.00/CPP/7zip/UI/FileManager/MemDialog.cpp
T
Simone d074cc7c07 chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0
Architectures: x86-ansi, x86-unicode, amd64-unicode
License: LGPL-2.1-or-later
2026-04-29 14:07:51 +02:00

219 lines
4.9 KiB
C++

// MemDialog.cpp
#include "StdAfx.h"
#include <CommCtrl.h>
#include "MemDialog.h"
#include "../../../Common/StringToInt.h"
#include "../../../Windows/System.h"
#include "../../../Windows/ErrorMsg.h"
#include "../Explorer/MyMessages.h"
#include "../GUI/ExtractRes.h"
#include "resourceGui.h"
#ifdef Z7_LANG
#include "LangUtils.h"
#endif
#ifdef Z7_LANG
static const UInt32 kLangIDs[] =
{
IDX_MEM_SAVE_LIMIT,
IDX_MEM_REMEMBER,
IDG_MEM_ACTION,
IDR_MEM_ACTION_ALLOW,
IDR_MEM_ACTION_SKIP_ARC
// , IDR_MEM_SKIP_FILE
};
#endif
static const unsigned k_Action_Buttons[] =
{
IDR_MEM_ACTION_ALLOW,
IDR_MEM_ACTION_SKIP_ARC
// , IDR_MEM_SKIP_FILE
};
void CMemDialog::EnableSpin(bool enable)
{
EnableItem(IDC_MEM_SPIN, enable);
EnableItem(IDE_MEM_SPIN_EDIT, enable);
}
static void AddSize_GB(UString &s, UInt32 size_GB, UInt32 id)
{
s.Add_LF();
s += " ";
s.Add_UInt32(size_GB);
s += " GB : ";
AddLangString(s, id);
}
void CMemDialog::AddInfoMessage_To_String(UString &s, const UInt32 *ramSize_GB)
{
AddLangString(s, IDS_MEM_REQUIRES_BIG_MEM);
AddSize_GB(s, Required_GB, IDS_MEM_REQUIRED_MEM_SIZE);
AddSize_GB(s, Limit_GB, IDS_MEM_CURRENT_MEM_LIMIT);
if (ramSize_GB)
AddSize_GB(s, *ramSize_GB, IDS_MEM_RAM_SIZE);
if (!FilePath.IsEmpty())
{
s.Add_LF();
s += "File: ";
s += FilePath;
}
}
/*
int CMemDialog::AddAction(UINT id)
{
const int index = (int)m_Action.AddString(LangString(id));
m_Action.SetItemData(index, (LPARAM)id);
return index;
}
*/
bool CMemDialog::OnInit()
{
#ifdef Z7_LANG
LangSetWindowText(*this, IDD_MEM);
LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
#endif
// m_Action.Attach(GetItem(IDC_MEM_ACTION));
size_t ramSize = (size_t)sizeof(size_t) << 29;
const bool ramSize_defined = NWindows::NSystem::GetRamSize(ramSize);
// ramSize *= 10; // for debug
UInt32 ramSize_GB = (UInt32)(((UInt64)ramSize + (1u << 29)) >> 30);
if (ramSize_GB == 0)
ramSize_GB = 1;
const bool is_Allowed = (!ramSize_defined || ramSize > ((UInt64)Required_GB << 30));
{
UString s;
if (!is_Allowed)
{
AddLangString(s, IDS_MEM_ERROR);
s.Add_LF();
}
AddInfoMessage_To_String(s, is_Allowed ? NULL : &ramSize_GB);
if (!ArcPath.IsEmpty())
// for (int i = 0; i < 10; i++)
{
s.Add_LF();
AddLangString(s, TestMode ?
IDS_PROGRESS_TESTING :
IDS_PROGRESS_EXTRACTING);
s += ": ";
s += ArcPath;
}
SetItemText(IDT_MEM_MESSAGE, s);
s = "GB";
if (ramSize_defined)
{
s += " / ";
s.Add_UInt32(ramSize_GB);
s += " GB (RAM)";
}
SetItemText(IDT_MEM_GB, s);
}
const UINT valMin = 1;
UINT valMax = 64; // 64GB for RAR7
if (ramSize_defined /* && ramSize_GB > valMax */)
{
const UINT k_max_val = 1u << 14;
if (ramSize_GB >= k_max_val)
valMax = k_max_val;
else if (ramSize_GB > 1)
valMax = (UINT)ramSize_GB - 1;
else
valMax = 1;
}
SendItemMessage(IDC_MEM_SPIN, UDM_SETRANGE, 0, MAKELPARAM(valMax, valMin)); // Sets the controls direction
// UDM_SETPOS doesn't set value larger than max value (valMax) of range:
SendItemMessage(IDC_MEM_SPIN, UDM_SETPOS, 0, Required_GB);
{
UString s;
s.Add_UInt32(Required_GB);
SetItemText(IDE_MEM_SPIN_EDIT, s);
}
EnableSpin(false);
/*
AddAction(IDB_ALLOW_OPERATION);
m_Action.SetCurSel(0);
AddAction(IDB_MEM_SKIP_ARC);
AddAction(IDB_MEM_SKIP_FILE);
*/
const UINT buttonId = is_Allowed ?
IDR_MEM_ACTION_ALLOW :
IDR_MEM_ACTION_SKIP_ARC;
CheckRadioButton(
k_Action_Buttons[0],
k_Action_Buttons[Z7_ARRAY_SIZE(k_Action_Buttons) - 1],
buttonId);
/*
if (!ShowSkipFile)
HideItem(IDR_MEM_SKIP_FILE);
*/
if (!ShowRemember)
HideItem(IDX_MEM_REMEMBER);
return CModalDialog::OnInit();
}
bool CMemDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
{
if (buttonID == IDX_MEM_SAVE_LIMIT)
{
EnableSpin(IsButtonCheckedBool(IDX_MEM_SAVE_LIMIT));
return true;
}
return CDialog::OnButtonClicked(buttonID, buttonHWND);
}
void CMemDialog::OnContinue()
{
Remember = IsButtonCheckedBool(IDX_MEM_REMEMBER);
NeedSave = IsButtonCheckedBool(IDX_MEM_SAVE_LIMIT);
SkipArc = IsButtonCheckedBool(IDR_MEM_ACTION_SKIP_ARC);
if (NeedSave)
{
#if 0
// UDM_GETPOS doesn't support value outside of range that was set:
LRESULT lresult = SendItemMessage(IDC_MEM_SPIN, UDM_GETPOS, 0, 0);
const UInt32 val = LOWORD(lresult);
if (HIWORD(lresult) != 0) // the value outside of allowed range
#else
UString s;
GetItemText(IDE_MEM_SPIN_EDIT, s);
const wchar_t *end;
const UInt32 val = ConvertStringToUInt32(s.Ptr(), &end);
if (s.IsEmpty() || *end != 0 || val > (1u << 30))
#endif
{
ShowErrorMessage(*this,
NWindows::NError::MyFormatMessage(E_INVALIDARG)
// L"Incorrect value"
);
return;
}
Limit_GB = val;
}
CModalDialog::OnContinue();
}