mirror of
https://github.com/reactos/reactos.git
synced 2024-06-25 23:41:35 +00:00
[RAPPS] Improvements & multiple selections
- Improved translations view - storing LCIDs now - Added checkboxes on list view and Select All button (although they do nothing just yet) - Made download dialogs nonmodal (yay, download and install multiple apps at once!) - Minor code improvements svn path=/branches/GSoC_2017/rapps/; revision=75384
This commit is contained in:
parent
bbc5642138
commit
1866b89100
|
@ -84,23 +84,30 @@ VOID CAvailableApplicationInfo::RetrieveLanguages()
|
|||
|
||||
// Parse parameter string
|
||||
ATL::CStringW m_szLocale;
|
||||
int iLCID;
|
||||
for (INT i = 0; szBuffer[i] != UNICODE_NULL; ++i)
|
||||
{
|
||||
if (szBuffer[i] != cDelimiter)
|
||||
if (szBuffer[i] != cDelimiter && szBuffer[i] != L'\n')
|
||||
{
|
||||
m_szLocale += szBuffer[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
Languages.Add(m_szLocale);
|
||||
m_szLocale.Empty();
|
||||
if (StrToIntExW(m_szLocale.GetString(), STIF_DEFAULT, &iLCID))
|
||||
{
|
||||
Languages.Add(static_cast<LCID>(iLCID));
|
||||
m_szLocale.Empty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For the text after delimiter
|
||||
if (!m_szLocale.IsEmpty())
|
||||
{
|
||||
Languages.Add(m_szLocale);
|
||||
if (StrToIntExW(m_szLocale.GetString(), STIF_DEFAULT, &iLCID))
|
||||
{
|
||||
Languages.Add(static_cast<LCID>(iLCID));
|
||||
}
|
||||
}
|
||||
|
||||
m_HasLanguageInfo = TRUE;
|
||||
|
@ -120,6 +127,26 @@ VOID CAvailableApplicationInfo::RetrieveLicenseType()
|
|||
}
|
||||
}
|
||||
|
||||
BOOL CAvailableApplicationInfo::FindInLanguages(LCID what) const
|
||||
{
|
||||
if (!m_HasLanguageInfo)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//Find locale code in the list
|
||||
const INT nLanguagesSize = Languages.GetSize();
|
||||
for (INT i = 0; i < nLanguagesSize; ++i)
|
||||
{
|
||||
if (Languages[i] == what)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL CAvailableApplicationInfo::HasLanguageInfo() const
|
||||
{
|
||||
return m_HasLanguageInfo;
|
||||
|
@ -127,57 +154,12 @@ BOOL CAvailableApplicationInfo::HasLanguageInfo() const
|
|||
|
||||
BOOL CAvailableApplicationInfo::HasNativeLanguage() const
|
||||
{
|
||||
if (!m_HasLanguageInfo)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//Find locale code in the list
|
||||
const INT nLanguagesSize = Languages.GetSize();
|
||||
for (INT i = 0; i < nLanguagesSize; ++i)
|
||||
{
|
||||
if (Languages[i] == CConfigParser::GetLocale())
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FindInLanguages(GetUserDefaultLCID());
|
||||
}
|
||||
|
||||
BOOL CAvailableApplicationInfo::HasEnglishLanguage() const
|
||||
{
|
||||
static ATL::CStringW szEnglishLocaleID;
|
||||
const INT cchLocaleSize = m_Parser.GetLocaleSize();
|
||||
if (!m_HasLanguageInfo)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//Get English locale code
|
||||
if (szEnglishLocaleID.IsEmpty())
|
||||
{
|
||||
INT result = GetLocaleInfoW(MAKELCID(LANG_ENGLISH, SORT_DEFAULT), LOCALE_ILANGUAGE,
|
||||
szEnglishLocaleID.GetBuffer(cchLocaleSize), cchLocaleSize);
|
||||
szEnglishLocaleID.ReleaseBuffer();
|
||||
if (result != ERROR_SUCCESS)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Find locale code in the list
|
||||
const INT nLanguagesSize = Languages.GetSize();
|
||||
for (INT i = 0; i < nLanguagesSize; ++i)
|
||||
{
|
||||
if (Languages[i] == szEnglishLocaleID)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FindInLanguages(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), SORT_DEFAULT));
|
||||
}
|
||||
|
||||
BOOL CAvailableApplicationInfo::IsInstalled() const
|
||||
|
@ -397,7 +379,7 @@ const LPCWSTR CAvailableApps::GetCabPathString()
|
|||
// CAvailableApps
|
||||
|
||||
// CConfigParser
|
||||
ATL::CStringW CConfigParser::m_szLocale;
|
||||
ATL::CStringW CConfigParser::m_szLocaleID;
|
||||
ATL::CStringW CConfigParser::m_szCachedINISectionLocale;
|
||||
ATL::CStringW CConfigParser::m_szCachedINISectionLocaleNeutral;
|
||||
|
||||
|
@ -410,7 +392,7 @@ CConfigParser::CConfigParser(const ATL::CStringW& FileName) : szConfigPath(GetIN
|
|||
ATL::CStringW CConfigParser::GetINIFullPath(const ATL::CStringW& FileName)
|
||||
{
|
||||
ATL::CStringW szDir;
|
||||
static ATL::CStringW szBuffer;
|
||||
ATL::CStringW szBuffer;
|
||||
|
||||
GetStorageDirectory(szDir);
|
||||
szBuffer.Format(L"%ls\\rapps\\%ls", szDir, FileName);
|
||||
|
@ -420,24 +402,25 @@ ATL::CStringW CConfigParser::GetINIFullPath(const ATL::CStringW& FileName)
|
|||
|
||||
VOID CConfigParser::CacheINILocaleLazy()
|
||||
{
|
||||
if (m_szLocale.IsEmpty())
|
||||
if (m_szLocaleID.IsEmpty())
|
||||
{
|
||||
// TODO: Set default locale if call fails
|
||||
// find out what is the current system lang code (e.g. "0a") and append it to SectionLocale
|
||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE,
|
||||
m_szLocale.GetBuffer(m_cchLocaleSize), m_cchLocaleSize);
|
||||
m_szLocale.ReleaseBuffer();
|
||||
m_szCachedINISectionLocale = L"Section." + m_szLocale;
|
||||
GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
|
||||
m_szLocaleID.GetBuffer(m_cchLocaleSize), m_cchLocaleSize);
|
||||
|
||||
m_szLocaleID.ReleaseBuffer();
|
||||
m_szCachedINISectionLocale = L"Section." + m_szLocaleID;
|
||||
|
||||
// turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part
|
||||
m_szCachedINISectionLocaleNeutral = m_szCachedINISectionLocale + m_szLocale.Right(2);
|
||||
m_szCachedINISectionLocaleNeutral = m_szCachedINISectionLocale + m_szLocaleID.Right(2);
|
||||
}
|
||||
}
|
||||
|
||||
const ATL::CStringW& CConfigParser::GetLocale()
|
||||
{
|
||||
CacheINILocaleLazy();
|
||||
return m_szLocale;
|
||||
return m_szLocaleID;
|
||||
}
|
||||
|
||||
INT CConfigParser::GetLocaleSize()
|
||||
|
@ -486,8 +469,6 @@ UINT CConfigParser::GetString(const ATL::CStringW& KeyName, ATL::CStringW& Resul
|
|||
UINT CConfigParser::GetInt(const ATL::CStringW& KeyName)
|
||||
{
|
||||
ATL::CStringW Buffer;
|
||||
UNICODE_STRING BufferW;
|
||||
ULONG Result;
|
||||
|
||||
// grab the text version of our entry
|
||||
if (!GetString(KeyName, Buffer))
|
||||
|
@ -497,9 +478,8 @@ UINT CConfigParser::GetInt(const ATL::CStringW& KeyName)
|
|||
return FALSE;
|
||||
|
||||
// convert it to an actual integer
|
||||
RtlInitUnicodeString(&BufferW, Buffer.GetString());
|
||||
RtlUnicodeStringToInteger(&BufferW, 0, &Result);
|
||||
int result = StrToIntW(Buffer.GetString());
|
||||
|
||||
return (UINT) Result;
|
||||
return (UINT) (result <= 0) ? 0 : result;
|
||||
}
|
||||
// CConfigParser
|
||||
// CConfigParser
|
|
@ -179,6 +179,7 @@ class CMainToolbar :
|
|||
WCHAR szInstallBtn[MAX_STR_LEN];
|
||||
WCHAR szUninstallBtn[MAX_STR_LEN];
|
||||
WCHAR szModifyBtn[MAX_STR_LEN];
|
||||
WCHAR szSelectAll[MAX_STR_LEN];
|
||||
|
||||
VOID AddImageToImageList(HIMAGELIST hImageList, UINT ImageIndex)
|
||||
{
|
||||
|
@ -217,6 +218,7 @@ class CMainToolbar :
|
|||
AddImageToImageList(hImageList, IDI_INSTALL);
|
||||
AddImageToImageList(hImageList, IDI_UNINSTALL);
|
||||
AddImageToImageList(hImageList, IDI_MODIFY);
|
||||
AddImageToImageList(hImageList, IDI_CHECK_ALL);
|
||||
AddImageToImageList(hImageList, IDI_REFRESH);
|
||||
AddImageToImageList(hImageList, IDI_UPDATE_DB);
|
||||
AddImageToImageList(hImageList, IDI_SETTINGS);
|
||||
|
@ -272,17 +274,19 @@ public:
|
|||
{ 0, ID_INSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szInstallBtn },
|
||||
{ 1, ID_UNINSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szUninstallBtn },
|
||||
{ 2, ID_MODIFY, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szModifyBtn },
|
||||
{ 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
|
||||
{ 3, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
|
||||
{ 4, ID_RESETDB, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0},
|
||||
{ 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
|
||||
{ 5, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
|
||||
{ 6, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 }
|
||||
{ 3, ID_CHECK_ALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE,{0}, 0, (INT_PTR) szSelectAll},
|
||||
{-1, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
|
||||
{ 4, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
|
||||
{ 5, ID_RESETDB, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
|
||||
{-1, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
|
||||
{ 6, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
|
||||
{ 7, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
|
||||
};
|
||||
|
||||
LoadStringW(hInst, IDS_INSTALL, szInstallBtn, _countof(szInstallBtn));
|
||||
LoadStringW(hInst, IDS_UNINSTALL, szUninstallBtn, _countof(szUninstallBtn));
|
||||
LoadStringW(hInst, IDS_MODIFY, szModifyBtn, _countof(szModifyBtn));
|
||||
LoadStringW(hInst, IDS_SELECT_ALL, szSelectAll, _countof(szSelectAll));
|
||||
|
||||
m_hWnd = CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL,
|
||||
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_LIST,
|
||||
|
@ -324,6 +328,7 @@ class CAppsListView :
|
|||
int iSubItem;
|
||||
};
|
||||
|
||||
BOOL HasAllChecked;
|
||||
public:
|
||||
BOOL bAscending;
|
||||
|
||||
|
@ -443,11 +448,20 @@ public:
|
|||
HWND hwnd = CListView::Create(hwndParent, r, NULL, style, WS_EX_CLIENTEDGE, menu);
|
||||
|
||||
if (hwnd)
|
||||
SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
|
||||
{
|
||||
SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
|
||||
}
|
||||
|
||||
return hwnd;
|
||||
}
|
||||
|
||||
VOID CheckAll()
|
||||
{
|
||||
if (HasAllChecked)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class CSideTreeView :
|
||||
|
@ -558,8 +572,8 @@ public:
|
|||
SearchEnabled(FALSE)
|
||||
{
|
||||
}
|
||||
private:
|
||||
|
||||
private:
|
||||
VOID InitApplicationsList(VOID)
|
||||
{
|
||||
ATL::CStringW szText;
|
||||
|
@ -574,7 +588,8 @@ private:
|
|||
szText.LoadStringW(hInst, IDS_APP_DESCRIPTION);
|
||||
m_ListView->AddColumn(3, szText, 250, LVCFMT_LEFT);
|
||||
|
||||
//UpdateApplicationsList(ENUM_ALL_COMPONENTS);
|
||||
// Unnesesary since the list updates on every TreeView selection
|
||||
// UpdateApplicationsList(ENUM_ALL_COMPONENTS);
|
||||
}
|
||||
|
||||
HTREEITEM AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
|
||||
|
@ -1012,7 +1027,7 @@ private:
|
|||
if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1)
|
||||
{
|
||||
/* this won't do anything if the program is already installed */
|
||||
SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0);
|
||||
SendMessageW(hwnd, WM_COMMAND, ID_INSTALL, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -1068,7 +1083,7 @@ private:
|
|||
if (wParam == SEARCH_TIMER_ID)
|
||||
{
|
||||
::KillTimer(hwnd, SEARCH_TIMER_ID);
|
||||
if(SearchEnabled)
|
||||
if (SearchEnabled)
|
||||
UpdateApplicationsList(-1);
|
||||
}
|
||||
break;
|
||||
|
@ -1248,6 +1263,9 @@ private:
|
|||
case ID_ABOUT:
|
||||
ShowAboutDialog();
|
||||
break;
|
||||
|
||||
case ID_CHECK_ALL:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 220, 72
|
||||
STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
|
||||
STYLE DS_SHELLFONT | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE
|
||||
CAPTION "Downloading..."
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
@ -207,6 +207,8 @@ BEGIN
|
|||
IDS_INTEG_CHECK_FAIL "The package did not pass the integrity check, it may have been corrupted or tampered with during downloading. Running the software is not recommended."
|
||||
IDS_INTERRUPTED_DOWNLOAD "The download was interrupted. Check connection to Internet."
|
||||
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
|
||||
IDS_SELECT_ALL "Select/Desellect All"
|
||||
IDS_INSTALL_SELECTED "Install Selected"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
|
|
|
@ -602,7 +602,7 @@ DownloadDlgProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
return FALSE;
|
||||
|
||||
case WM_CLOSE:
|
||||
EndDialog(Dlg, 0);
|
||||
DestroyWindow(Dlg);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
|
@ -622,7 +622,7 @@ DownloadApplication(INT Index)
|
|||
|
||||
WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_INSTALL, AppInfo->szName.GetString());
|
||||
|
||||
DialogBoxW(hInst,
|
||||
CreateDialogW(hInst,
|
||||
MAKEINTRESOURCEW(IDD_DOWNLOAD_DIALOG),
|
||||
hMainWnd,
|
||||
DownloadDlgProc);
|
||||
|
@ -638,7 +638,7 @@ DownloadApplicationsDB(LPCWSTR lpUrl)
|
|||
|
||||
AppInfo = &IntInfo;
|
||||
|
||||
DialogBoxW(hInst,
|
||||
CreateDialogW(hInst,
|
||||
MAKEINTRESOURCEW(IDD_DOWNLOAD_DIALOG),
|
||||
hMainWnd,
|
||||
DownloadDlgProc);
|
||||
|
|
|
@ -101,7 +101,7 @@ typedef struct
|
|||
ATL::CStringW szUrlSite;
|
||||
ATL::CStringW szUrlDownload;
|
||||
ATL::CStringW szCDPath;
|
||||
ATL::CSimpleArray<ATL::CStringW> Languages;
|
||||
ATL::CSimpleArray<LCID> Languages;
|
||||
|
||||
/* caching mechanism related entries */
|
||||
ATL::CStringW sFileName;
|
||||
|
@ -146,7 +146,7 @@ typedef struct
|
|||
class CConfigParser
|
||||
{
|
||||
// Loacale names cache
|
||||
static ATL::CStringW m_szLocale;
|
||||
static ATL::CStringW m_szLocaleID;
|
||||
const static INT m_cchLocaleSize = 5;
|
||||
static ATL::CStringW m_szCachedINISectionLocale;
|
||||
static ATL::CStringW m_szCachedINISectionLocaleNeutral;
|
||||
|
@ -200,6 +200,7 @@ private:
|
|||
VOID RetrieveInstalledVersion();
|
||||
VOID RetrieveLanguages();
|
||||
VOID RetrieveLicenseType();
|
||||
inline BOOL FindInLanguages(LCID what) const;
|
||||
};
|
||||
|
||||
class CAvailableApps
|
||||
|
|
|
@ -22,6 +22,7 @@ IDI_APPS ICON "res/apps.ico"
|
|||
IDI_APPUPD ICON "res/appupd.ico"
|
||||
IDI_CATEGORY ICON "res/cat.ico"
|
||||
IDI_UPDATE_DB ICON "res/updatedb.ico"
|
||||
IDI_CHECK_ALL ICON "res/checksheet.ico"
|
||||
|
||||
/* Categories */
|
||||
IDI_CAT_AUDIO ICON "res/cats/audio.ico"
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#define IDI_APPUPD 18
|
||||
#define IDI_CATEGORY 19
|
||||
#define IDI_UPDATE_DB 20
|
||||
#define IDI_CHECK_ALL 21
|
||||
|
||||
/* Icons for categories */
|
||||
#define IDI_CAT_AUDIO 50
|
||||
|
@ -76,6 +77,7 @@
|
|||
#define ID_REFRESH 559
|
||||
#define ID_REGREMOVE 560
|
||||
#define ID_RESETDB 561
|
||||
#define ID_CHECK_ALL 562
|
||||
|
||||
/* Strings */
|
||||
#define IDS_APPTITLE 100
|
||||
|
@ -103,6 +105,8 @@
|
|||
#define IDS_INTEG_CHECK_FAIL 123
|
||||
#define IDS_INTERRUPTED_DOWNLOAD 124
|
||||
#define IDS_UNABLE_TO_WRITE 125
|
||||
#define IDS_SELECT_ALL 126
|
||||
#define IDS_INSTALL_SELECTED 127
|
||||
|
||||
/* Tooltips */
|
||||
#define IDS_TOOLTIP_INSTALL 200
|
||||
|
|
|
@ -188,15 +188,15 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
|
|||
GetAvailableApps()->UpdateAppsDB();
|
||||
|
||||
/* Load the menu hotkeys */
|
||||
KeyBrd = LoadAccelerators(NULL, MAKEINTRESOURCE(HOTKEYS));
|
||||
KeyBrd = LoadAcceleratorsW(NULL, MAKEINTRESOURCE(HOTKEYS));
|
||||
|
||||
/* Message Loop */
|
||||
while (GetMessage(&Msg, NULL, 0, 0))
|
||||
{
|
||||
if (!TranslateAccelerator(hMainWnd, KeyBrd, &Msg))
|
||||
if (!TranslateAcceleratorW(hMainWnd, KeyBrd, &Msg))
|
||||
{
|
||||
TranslateMessage(&Msg);
|
||||
DispatchMessage(&Msg);
|
||||
DispatchMessageW(&Msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue