[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:
Alexander Shaposhnikov 2017-07-20 22:57:48 +00:00
parent bbc5642138
commit 1866b89100
8 changed files with 92 additions and 86 deletions

View file

@ -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

View file

@ -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;
}
}

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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);
}
}