[RAPPS]
[reactos.git] / reactos / base / applications / rapps / gui.cpp
index fd824c7..e98e11c 100644 (file)
@@ -61,7 +61,7 @@ class CAvailableAppView
                                                       DWORD TextFlags)
     {
         ATL::CStringW szLoadedText;
-        if (!szText.IsEmpty() && szLoadedText.LoadStringW(hInst, uStringID))
+        if (!szText.IsEmpty() && szLoadedText.LoadStringW(uStringID))
         {
             InsertRichEditText(szLoadedText, StringFlags);
             InsertRichEditText(szText, TextFlags);
@@ -72,7 +72,7 @@ class CAvailableAppView
                                                      DWORD StringFlags)
     {
         ATL::CStringW szLoadedText;
-        if (szLoadedText.LoadStringW(hInst, uStringID))
+        if (szLoadedText.LoadStringW(uStringID))
         {
             InsertRichEditText(L"\n", 0);
             InsertRichEditText(szLoadedText, StringFlags);
@@ -112,13 +112,13 @@ class CAvailableAppView
         switch (Info->LicenseType)
         {
         case LICENSE_TYPE::OpenSource:
-            szLicense.LoadStringW(hInst, IDS_LICENSE_OPENSOURCE);
+            szLicense.LoadStringW(IDS_LICENSE_OPENSOURCE);
             break;
         case LICENSE_TYPE::Freeware:
-            szLicense.LoadStringW(hInst, IDS_LICENSE_FREEWARE);
+            szLicense.LoadStringW(IDS_LICENSE_FREEWARE);
             break;
         case LICENSE_TYPE::Trial:
-            szLicense.LoadStringW(hInst, IDS_LICENSE_TRIAL);
+            szLicense.LoadStringW(IDS_LICENSE_TRIAL);
             break;
         default:
             InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
@@ -149,7 +149,9 @@ class CAvailableAppView
             szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION);
             if (nTranslations > 1)
             {
-                szLangInfo.Format(L" (+%d more)", nTranslations - 1);
+                ATL::CStringW buf;
+                buf.LoadStringW(IDS_LANGUAGE_MORE_PLACEHOLDER);
+                szLangInfo.Format(buf, nTranslations - 1);
             }
             else
             {
@@ -162,7 +164,9 @@ class CAvailableAppView
             szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION);
             if (nTranslations > 1)
             {
-                szLangInfo.Format(L" (+%d available)", nTranslations - 1);
+                ATL::CStringW buf;
+                buf.LoadStringW(IDS_LANGUAGE_AVAILABLE_PLACEHOLDER);
+                szLangInfo.Format(buf, nTranslations - 1);
             }
             else
             {
@@ -500,24 +504,24 @@ public:
         SetCheckState(-1, bHasAllChecked);
     }
 
-    ATL::CSimpleArray<PAPPLICATION_INFO> GetCheckedItems()
+    ATL::CSimpleArray<CAvailableApplicationInfo*> GetCheckedItems()
     {
-        ATL::CSimpleArray<PAPPLICATION_INFO> list;
+        ATL::CSimpleArray<CAvailableApplicationInfo*> list;
         for (INT i = 0; i >= 0; i = GetNextItem(i, LVNI_ALL))
         {
             if (GetCheckState(i) != FALSE)
             {
-                PAPPLICATION_INFO pAppInfo = (PAPPLICATION_INFO) GetItemData(i);
+                CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(i);
                 list.Add(pAppInfo);
             }
         }
         return list;
     }
-    
-    PAPPLICATION_INFO GetSelectedData()
+
+    CAvailableApplicationInfo* GetSelectedData()
     {
         INT item = GetSelectionMark();
-        return (PAPPLICATION_INFO) GetItemData(item);
+        return (CAvailableApplicationInfo*) GetItemData(item);
     }
 };
 
@@ -540,19 +544,19 @@ public:
         INT Index;
         HICON hIcon;
 
-        hIcon = (HICON) LoadImage(hInst,
-                                  MAKEINTRESOURCE(IconIndex),
-                                  IMAGE_ICON,
-                                  TREEVIEW_ICON_SIZE,
-                                  TREEVIEW_ICON_SIZE,
-                                  LR_CREATEDIBSECTION);
+        hIcon = (HICON) LoadImageW(hInst,
+                                   MAKEINTRESOURCE(IconIndex),
+                                   IMAGE_ICON,
+                                   TREEVIEW_ICON_SIZE,
+                                   TREEVIEW_ICON_SIZE,
+                                   LR_CREATEDIBSECTION);
         if (hIcon)
         {
             Index = ImageList_AddIcon(hImageTreeView, hIcon);
             DestroyIcon(hIcon);
         }
 
-        szText.LoadStringW(hInst, TextIndex);
+        szText.LoadStringW(TextIndex);
         return AddItem(hRootItem, szText, Index, Index, TextIndex);
     }
 
@@ -593,7 +597,7 @@ public:
                                  hInst, 0);
 
         SendMessageW(WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0);
-        szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+        szBuf.LoadStringW(IDS_SEARCH_TEXT);
         SetWindowTextW(szBuf);
         return m_hWnd;
     }
@@ -637,13 +641,13 @@ private:
         ATL::CStringW szText;
 
         /* Add columns to ListView */
-        szText.LoadStringW(hInst, IDS_APP_NAME);
+        szText.LoadStringW(IDS_APP_NAME);
         m_ListView->AddColumn(0, szText, 200, LVCFMT_LEFT);
 
-        szText.LoadStringW(hInst, IDS_APP_INST_VERSION);
+        szText.LoadStringW(IDS_APP_INST_VERSION);
         m_ListView->AddColumn(1, szText, 90, LVCFMT_RIGHT);
 
-        szText.LoadStringW(hInst, IDS_APP_DESCRIPTION);
+        szText.LoadStringW(IDS_APP_DESCRIPTION);
         m_ListView->AddColumn(3, szText, 250, LVCFMT_LEFT);
 
         // Unnesesary since the list updates on every TreeView selection
@@ -657,28 +661,33 @@ private:
 
     VOID InitCategoriesList()
     {
-        HTREEITEM hRootItem;
-
-        hRootItem = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
-        AddCategory(hRootItem, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
-        AddCategory(hRootItem, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
-        AddCategory(hRootItem, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
-        AddCategory(hRootItem, IDS_CAT_GAMES, IDI_CAT_GAMES);
-        AddCategory(hRootItem, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
-        AddCategory(hRootItem, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
-        AddCategory(hRootItem, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
-        AddCategory(hRootItem, IDS_CAT_EDU, IDI_CAT_EDU);
-        AddCategory(hRootItem, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
-        AddCategory(hRootItem, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
-        AddCategory(hRootItem, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
-        AddCategory(hRootItem, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
-        AddCategory(hRootItem, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
-        AddCategory(hRootItem, IDS_CAT_LIBS, IDI_CAT_LIBS);
-        AddCategory(hRootItem, IDS_CAT_OTHER, IDI_CAT_OTHER);
+        HTREEITEM hRootItem1, hRootItem2;
+
+        hRootItem1 = AddCategory(TVI_ROOT, IDS_INSTALLED, IDI_CATEGORY);
+        AddCategory(hRootItem1, IDS_APPLICATIONS, IDI_APPS);
+        AddCategory(hRootItem1, IDS_UPDATES, IDI_APPUPD);
+
+        hRootItem2 = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
+        AddCategory(hRootItem2, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
+        AddCategory(hRootItem2, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
+        AddCategory(hRootItem2, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
+        AddCategory(hRootItem2, IDS_CAT_GAMES, IDI_CAT_GAMES);
+        AddCategory(hRootItem2, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
+        AddCategory(hRootItem2, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
+        AddCategory(hRootItem2, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
+        AddCategory(hRootItem2, IDS_CAT_EDU, IDI_CAT_EDU);
+        AddCategory(hRootItem2, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
+        AddCategory(hRootItem2, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
+        AddCategory(hRootItem2, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
+        AddCategory(hRootItem2, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
+        AddCategory(hRootItem2, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
+        AddCategory(hRootItem2, IDS_CAT_LIBS, IDI_CAT_LIBS);
+        AddCategory(hRootItem2, IDS_CAT_OTHER, IDI_CAT_OTHER);
 
         m_TreeView->SetImageList();
-        m_TreeView->Expand(hRootItem, TVE_EXPAND);
-        m_TreeView->SelectItem(hRootItem);
+        m_TreeView->Expand(hRootItem1, TVE_EXPAND);
+        m_TreeView->Expand(hRootItem2, TVE_EXPAND);
+        m_TreeView->SelectItem(hRootItem1);
     }
 
     BOOL CreateStatusBar()
@@ -885,6 +894,7 @@ private:
             SaveSettings(hwnd);
 
             FreeLogs();
+            m_AvailableApps.FreeCachedEntries();
 
             if (IS_INSTALLED_ENUM(SelectedEnumType))
                 FreeInstalledAppList();
@@ -1052,7 +1062,7 @@ private:
                     {
                         if (IS_INSTALLED_ENUM(SelectedEnumType))
                             ShowInstalledAppInfo(ItemIndex);
-                        if (isAvailableEnum(SelectedEnumType))
+                        if (IsAvailableEnum(SelectedEnumType))
                             CAvailableAppView::ShowAvailableAppInfo(ItemIndex);
                     }
                     /* Check if the item is checked */
@@ -1064,12 +1074,12 @@ private:
                           In ReactOS this action is triggered whenever user changes *selection*, but should be only when *checkbox* state toggled
                           Maybe LVIS_STATEIMAGEMASK is set incorrectly
                         */
-                        nSelectedApps += 
-                            (checked) 
-                            ? 1 
-                            :((nSelectedApps > 0) 
-                              ? -1 
-                              : 0);
+                        nSelectedApps +=
+                            (checked)
+                            ? 1
+                            : ((nSelectedApps > 0)
+                               ? -1
+                               : 0);
                         UpdateStatusBarText();
                     }
                 }
@@ -1090,7 +1100,7 @@ private:
                 {
                     if (IS_INSTALLED_ENUM(SelectedEnumType))
                         ShowInstalledAppInfo(-1);
-                    if (isAvailableEnum(SelectedEnumType))
+                    if (IsAvailableEnum(SelectedEnumType))
                         CAvailableAppView::ShowAvailableAppInfo(-1);
                 }
             }
@@ -1160,7 +1170,7 @@ private:
                 if (bSearchEnabled)
                     UpdateApplicationsList(-1);
             }
-        break;
+            break;
         }
 
         return FALSE;
@@ -1226,7 +1236,7 @@ private:
             {
                 ATL::CStringW szWndText;
 
-                szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+                szBuf.LoadStringW(IDS_SEARCH_TEXT);
                 m_SearchBar->GetWindowTextW(szWndText);
                 if (szBuf == szWndText)
                 {
@@ -1241,7 +1251,7 @@ private:
                 m_SearchBar->GetWindowTextW(szBuf);
                 if (szBuf.IsEmpty())
                 {
-                    szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+                    szBuf.LoadStringW(IDS_SEARCH_TEXT);
                     bSearchEnabled = FALSE;
                     m_SearchBar->SetWindowTextW(szBuf.GetString());
                 }
@@ -1258,7 +1268,7 @@ private:
                     break;
                 }
 
-                szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+                szBuf.LoadStringW(IDS_SEARCH_TEXT);
                 m_SearchBar->GetWindowTextW(szWndText);
                 if (szBuf == szWndText)
                 {
@@ -1300,16 +1310,19 @@ private:
             break;
 
         case ID_INSTALL:
-            if (nSelectedApps > 0)
-            {
-                CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
-                UpdateApplicationsList(-1);
-            } 
-            else if(CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
+            if (IsAvailableEnum(SelectedEnumType))
             {
-                UpdateApplicationsList(-1);
-            }
-            
+                if (nSelectedApps > 0)
+                {
+                    CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
+                    UpdateApplicationsList(-1);
+                }
+                else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
+                {
+                    UpdateApplicationsList(-1);
+                }
+
+            }          
             break;
 
         case ID_UNINSTALL:
@@ -1374,28 +1387,26 @@ private:
         return StrStrIW(szHaystack, szNeedle) != NULL;
     }
 
-    static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info)
+    static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &szName, PINSTALLED_INFO Info)
     {
         PINSTALLED_INFO ItemInfo;
         ATL::CStringW szText;
         INT Index;
 
-        if (!SearchPatternMatch(lpName, szSearchPattern))
+        if (!SearchPatternMatch(szName.GetString(), szSearchPattern))
         {
             RegCloseKey(Info->hSubKey);
             return TRUE;
         }
 
-        ItemInfo = (PINSTALLED_INFO) HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO));
+        ItemInfo = new INSTALLED_INFO(*Info);
         if (!ItemInfo)
         {
             RegCloseKey(Info->hSubKey);
             return FALSE;
         }
 
-        RtlCopyMemory(ItemInfo, Info, sizeof(INSTALLED_INFO));
-
-        Index = ListViewAddItem(ItemIndex, 0, lpName, (LPARAM) ItemInfo);
+        Index = ListViewAddItem(ItemIndex, 0, szName, (LPARAM) ItemInfo);
 
         /* Get version info */
         GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText);
@@ -1408,7 +1419,7 @@ private:
         return TRUE;
     }
 
-    static BOOL CALLBACK s_EnumAvailableAppProc(PAPPLICATION_INFO Info, LPCWSTR szFolderPath)
+    static BOOL CALLBACK s_EnumAvailableAppProc(CAvailableApplicationInfo* Info, LPCWSTR szFolderPath)
     {
         INT Index;
         HICON hIcon = NULL;
@@ -1471,7 +1482,7 @@ private:
         nSelectedApps = 0;
         if (EnumType < 0) EnumType = SelectedEnumType;
 
-        if (IS_INSTALLED_ENUM(EnumType))
+        if (IS_INSTALLED_ENUM(SelectedEnumType))
         {
             FreeInstalledAppList();
         }
@@ -1489,13 +1500,19 @@ private:
             ImageList_Destroy(hImageListBuf);
         }
 
-        if (isAvailableEnum(EnumType))
+        if (IS_INSTALLED_ENUM(EnumType))
+        {
+            HICON hIcon = (HICON) LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
+            ImageList_AddIcon(hImageListView, hIcon);
+            DestroyIcon(hIcon);
+            /* Enum installed applications and updates */
+            EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc);
+            EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc);
+        }
+        else if (IsAvailableEnum(EnumType))
         {
             /* Enum available applications */
-            if (!m_AvailableApps.EnumAvailableApplications(EnumType, s_EnumAvailableAppProc))
-            {
-                return;
-            }
+            m_AvailableApps.EnumAvailableApplications(EnumType, s_EnumAvailableAppProc);
         }
 
         SelectedEnumType = EnumType;
@@ -1540,7 +1557,7 @@ public:
     HWND Create()
     {
         ATL::CStringW szWindowName;
-        szWindowName.LoadStringW(hInst, IDS_APPTITLE);
+        szWindowName.LoadStringW(IDS_APPTITLE);
 
         RECT r = {
             (SettingsInfo.bSaveWndPos ? SettingsInfo.Left : CW_USEDEFAULT),
@@ -1620,7 +1637,7 @@ VOID SetStatusBarText(const ATL::CStringW& szText)
     SetStatusBarText(szText.GetString());
 }
 
-INT ListViewAddItem(INT ItemIndex, INT IconIndex, ATL::CStringW & Name, LPARAM lParam)
+INT ListViewAddItem(INT ItemIndex, INT IconIndex, const ATL::CStringW& Name, LPARAM lParam)
 {
     return ListViewAddItem(ItemIndex, IconIndex, const_cast<LPWSTR>(Name.GetString()), lParam);
 }