[RAPPS]
[reactos.git] / reactos / base / applications / rapps / gui.cpp
index 5f3edf2..66cb10a 100644 (file)
@@ -1,9 +1,12 @@
-/* PROJECT:     ReactOS CE Applications Manager
- * LICENSE:     GPL - See COPYING in the top level directory
- * AUTHORS:     David Quintana             <gigaherz@gmail.com>
- *              Alexander Shaposhnikov     <chaez.san@gmail.com>
+/*
+ * PROJECT:     ReactOS Applications Manager
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * FILE:        base/applications/rapps/gui.cpp
+ * PURPOSE:     GUI classes for RAPPS
+ * COPYRIGHT:   Copyright 2015 David Quintana           (gigaherz@gmail.com)
+ *              Copyright 2017 Alexander Shaposhnikov   (sanchaez@reactos.org)
  */
-#include "defines.h"
+#include "rapps.h"
 
 #include "rapps.h"
 #include "rosui.h"
@@ -25,8 +28,7 @@
 
 HWND hListView = NULL;
 
-INT
-GetSystemColorDepth()
+INT GetSystemColorDepth()
 {
     DEVMODEW pDevMode;
     INT ColorDepth;
@@ -91,7 +93,7 @@ class CAvailableAppView
                 else
                     InsertLoadedTextNewl_RichEdit(IDS_STATUS_INSTALLED, CFE_ITALIC);
 
-                InsertTextAfterLoaded_RichEdit(IDS_AINFO_VERSION, Info->szInstalledVersion, CFE_BOLD, 0);
+                InsertTextAfterLoaded_RichEdit(IDS_AINFO_VERSION, Info->m_szInstalledVersion, CFE_BOLD, 0);
             }
             else
             {
@@ -103,29 +105,29 @@ class CAvailableAppView
             InsertLoadedTextNewl_RichEdit(IDS_STATUS_NOTINSTALLED, CFE_ITALIC);
         }
 
-        InsertTextAfterLoaded_RichEdit(IDS_AINFO_AVAILABLEVERSION, Info->szVersion, CFE_BOLD, 0);
+        InsertTextAfterLoaded_RichEdit(IDS_AINFO_AVAILABLEVERSION, Info->m_szVersion, CFE_BOLD, 0);
     }
 
     static VOID InsertLicenseInfo_RichEdit(CAvailableApplicationInfo* Info)
     {
         ATL::CStringW szLicense;
-        switch (Info->LicenseType)
+        switch (Info->m_LicenseType)
         {
-        case LICENSE_TYPE::OpenSource:
+        case LICENSE_OPENSOURCE:
             szLicense.LoadStringW(IDS_LICENSE_OPENSOURCE);
             break;
-        case LICENSE_TYPE::Freeware:
+        case LICENSE_FREEWARE:
             szLicense.LoadStringW(IDS_LICENSE_FREEWARE);
             break;
-        case LICENSE_TYPE::Trial:
+        case LICENSE_TRIAL:
             szLicense.LoadStringW(IDS_LICENSE_TRIAL);
             break;
         default:
-            InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
+            InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, Info->m_szLicense, CFE_BOLD, 0);
             return;
         }
 
-        szLicense += L" (" + Info->szLicense + L")";
+        szLicense += L" (" + Info->m_szLicense + L")";
         InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, szLicense, CFE_BOLD, 0);
     }
 
@@ -136,7 +138,7 @@ class CAvailableAppView
             return;
         }
 
-        const INT nTranslations = Info->Languages.GetSize();
+        const INT nTranslations = Info->m_LanguageLCIDs.GetSize();
         ATL::CStringW szLangInfo;
         ATL::CStringW szLoadedTextAvailability;
         ATL::CStringW szLoadedAInfoText;
@@ -190,15 +192,15 @@ public:
         CAvailableApplicationInfo* Info = (CAvailableApplicationInfo*) ListViewGetlParam(Index);
         if (!Info) return FALSE;
 
-        NewRichEditText(Info->szName, CFE_BOLD);
+        NewRichEditText(Info->m_szName, CFE_BOLD);
         InsertVersionInfo_RichEdit(Info);
         InsertLicenseInfo_RichEdit(Info);
         InsertLanguageInfo_RichEdit(Info);
 
-        InsertTextAfterLoaded_RichEdit(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
-        InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
-        InsertTextAfterLoaded_RichEdit(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
-        InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLDOWNLOAD, Info->szUrlDownload, CFE_BOLD, CFE_LINK);
+        InsertTextAfterLoaded_RichEdit(IDS_AINFO_SIZE, Info->m_szSize, CFE_BOLD, 0);
+        InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLSITE, Info->m_szUrlSite, CFE_BOLD, CFE_LINK);
+        InsertTextAfterLoaded_RichEdit(IDS_AINFO_DESCRIPTION, Info->m_szDesc, CFE_BOLD, 0);
+        InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLDOWNLOAD, Info->m_szUrlDownload, CFE_BOLD, CFE_LINK);
 
         return TRUE;
     }
@@ -306,7 +308,7 @@ 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 },
-            { 3, ID_CHECK_ALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE,{0}, 0, (INT_PTR) szSelectAll},
+            { 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 },
@@ -362,14 +364,30 @@ class CAppsListView :
 
     BOOL bHasAllChecked;
     BOOL bAscending;
+    BOOL bHasCheckboxes;
 
 public:
     CAppsListView() :
+        bHasAllChecked(FALSE),
         bAscending(TRUE),
-        bHasAllChecked(FALSE)
+        bHasCheckboxes(FALSE)
     {
     }
 
+    VOID SetCheckboxesVisible(BOOL bIsVisible)
+    {
+        if (bIsVisible)
+        {
+            SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
+        }
+        else
+        {
+            SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
+        }
+
+        bHasCheckboxes = bIsVisible;
+    }
+
     VOID ColumnClick(LPNMLISTVIEW pnmv)
     {
         SortContext ctx = {this, pnmv->iSubItem};
@@ -482,7 +500,7 @@ public:
 
         if (hwnd)
         {
-            SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
+            SetCheckboxesVisible(FALSE);
         }
 
         return hwnd;
@@ -495,44 +513,61 @@ public:
 
     VOID SetCheckState(INT item, BOOL fCheck)
     {
-        SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
+        if (bHasCheckboxes)
+        {
+            SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
+        }
     }
 
     VOID CheckAll()
     {
-        bHasAllChecked = !bHasAllChecked;
-        SetCheckState(-1, bHasAllChecked);
+        if (bHasCheckboxes)
+        {
+            bHasAllChecked = !bHasAllChecked;
+            SetCheckState(-1, bHasAllChecked);
+        }
     }
 
-    ATL::CSimpleArray<PAPPLICATION_INFO> GetCheckedItems()
+    ATL::CSimpleArray<CAvailableApplicationInfo*> GetCheckedItems()
     {
-        ATL::CSimpleArray<PAPPLICATION_INFO> list;
+        if (!bHasCheckboxes)
+        {
+            return ATL::CSimpleArray<CAvailableApplicationInfo*>();
+        }
+
+        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);
     }
 };
 
 class CSideTreeView :
     public CUiWindow<CTreeView>
 {
-    HIMAGELIST hImageTreeView = ImageList_Create(TREEVIEW_ICON_SIZE, TREEVIEW_ICON_SIZE,
-                                                 GetSystemColorDepth() | ILC_MASK,
-                                                 0, 1);
+    HIMAGELIST hImageTreeView;
 
 public:
+    CSideTreeView() :
+        CUiWindow(),
+        hImageTreeView(ImageList_Create(TREEVIEW_ICON_SIZE, TREEVIEW_ICON_SIZE,
+                                        GetSystemColorDepth() | ILC_MASK,
+                                        0, 1))
+    {
+    }
+
     HTREEITEM AddItem(HTREEITEM hParent, ATL::CStringW &Text, INT Image, INT SelectedImage, LPARAM lParam)
     {
         return CUiWindow<CTreeView>::AddItem(hParent, const_cast<LPWSTR>(Text.GetString()), Image, SelectedImage, lParam);
@@ -574,7 +609,6 @@ public:
     ~CSideTreeView()
     {
         DestroyImageList();
-        CUiWindow<CTreeView>::~CUiWindow();
     }
 };
 
@@ -607,18 +641,18 @@ public:
 class CMainWindow :
     public CWindowImpl<CMainWindow, CWindow, CFrameWinTraits>
 {
-    CUiPanel * m_ClientPanel;
-    CUiSplitPanel * m_VSplitter;
-    CUiSplitPanel * m_HSplitter;
+    CUiPanel* m_ClientPanel;
+    CUiSplitPanel* m_VSplitter;
+    CUiSplitPanel* m_HSplitter;
 
-    CMainToolbar * m_Toolbar;
-    CAppsListView * m_ListView;
+    CMainToolbar* m_Toolbar;
+    CAppsListView* m_ListView;
 
-    CSideTreeView * m_TreeView;
-    CUiWindow<CStatusBar> * m_StatusBar;
-    CUiWindow<CRichEdit> * m_RichEdit;
+    CSideTreeView* m_TreeView;
+    CUiWindow<CStatusBar>* m_StatusBar;
+    CUiWindow<CRichEdit>* m_RichEdit;
 
-    CUiWindow<CSearchBar> * m_SearchBar;
+    CUiWindow<CSearchBar>* m_SearchBar;
     CAvailableApps m_AvailableApps;
 
     LPWSTR pLink;
@@ -748,8 +782,9 @@ private:
         m_VSplitter->m_HorizontalAlignment = UiAlign_Stretch;
         m_VSplitter->m_DynamicFirst = FALSE;
         m_VSplitter->m_Horizontal = FALSE;
-        m_VSplitter->m_MinFirst = 240;
-        m_VSplitter->m_MinSecond = 300;
+        m_VSplitter->m_MinFirst = 0;
+        m_VSplitter->m_MinSecond = 320;
+        m_VSplitter->m_Pos = 240;
         m_ClientPanel->Children().Append(m_VSplitter);
 
         return m_VSplitter->Create(m_hWnd) != NULL;
@@ -762,9 +797,9 @@ private:
         m_HSplitter->m_HorizontalAlignment = UiAlign_Stretch;
         m_HSplitter->m_DynamicFirst = TRUE;
         m_HSplitter->m_Horizontal = TRUE;
-        m_HSplitter->m_Pos = 32768;
-        m_HSplitter->m_MinFirst = 300;
-        m_HSplitter->m_MinSecond = 150;
+        m_HSplitter->m_Pos = INT_MAX;        //set INT_MAX to use lowest possible position (m_MinSecond)
+        m_HSplitter->m_MinFirst = 10;
+        m_HSplitter->m_MinSecond = 140;
         m_VSplitter->Second().Append(m_HSplitter);
 
         return m_HSplitter->Create(m_hWnd) != NULL;
@@ -896,7 +931,7 @@ private:
             FreeLogs();
             m_AvailableApps.FreeCachedEntries();
 
-            if (IS_INSTALLED_ENUM(SelectedEnumType))
+            if (IsInstalledEnum(SelectedEnumType))
                 FreeInstalledAppList();
 
             delete m_ClientPanel;
@@ -922,11 +957,11 @@ private:
                     switch (((LPNMTREEVIEW) lParam)->itemNew.lParam)
                     {
                     case IDS_INSTALLED:
-                        UpdateApplicationsList(ENUM_ALL_COMPONENTS);
+                        UpdateApplicationsList(ENUM_ALL_INSTALLED);
                         break;
 
                     case IDS_APPLICATIONS:
-                        UpdateApplicationsList(ENUM_APPLICATIONS);
+                        UpdateApplicationsList(ENUM_INSTALLED_APPLICATIONS);
                         break;
 
                     case IDS_UPDATES:
@@ -1060,9 +1095,9 @@ private:
                         (pnic->uNewState & LVIS_FOCUSED) &&
                         !(pnic->uOldState & LVIS_FOCUSED))
                     {
-                        if (IS_INSTALLED_ENUM(SelectedEnumType))
+                        if (IsInstalledEnum(SelectedEnumType))
                             ShowInstalledAppInfo(ItemIndex);
-                        if (isAvailableEnum(SelectedEnumType))
+                        if (IsAvailableEnum(SelectedEnumType))
                             CAvailableAppView::ShowAvailableAppInfo(ItemIndex);
                     }
                     /* Check if the item is checked */
@@ -1098,9 +1133,9 @@ private:
             {
                 if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1)
                 {
-                    if (IS_INSTALLED_ENUM(SelectedEnumType))
+                    if (IsInstalledEnum(SelectedEnumType))
                         ShowInstalledAppInfo(-1);
-                    if (isAvailableEnum(SelectedEnumType))
+                    if (IsAvailableEnum(SelectedEnumType))
                         CAvailableAppView::ShowAvailableAppInfo(-1);
                 }
             }
@@ -1310,16 +1345,19 @@ private:
             break;
 
         case ID_INSTALL:
-            if (nSelectedApps > 0)
+            if (IsAvailableEnum(SelectedEnumType))
             {
-                CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
-                UpdateApplicationsList(-1);
-            }
-            else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
-            {
-                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:
@@ -1376,7 +1414,7 @@ private:
         }
     }
 
-    static BOOL SearchPatternMatch(PCWSTR szHaystack, PCWSTR szNeedle)
+    static BOOL SearchPatternMatch(LPCWSTR szHaystack, LPCWSTR szNeedle)
     {
         if (!*szNeedle)
             return TRUE;
@@ -1384,28 +1422,26 @@ private:
         return StrStrIW(szHaystack, szNeedle) != NULL;
     }
 
-    static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &szName, PINSTALLED_INFO Info)
+    static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &m_szName, PINSTALLED_INFO Info)
     {
         PINSTALLED_INFO ItemInfo;
         ATL::CStringW szText;
         INT Index;
 
-        if (!SearchPatternMatch(szName.GetString(), szSearchPattern))
+        if (!SearchPatternMatch(m_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, szName, (LPARAM) ItemInfo);
+        Index = ListViewAddItem(ItemIndex, 0, m_szName, (LPARAM) ItemInfo);
 
         /* Get version info */
         GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText);
@@ -1418,22 +1454,22 @@ 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;
 
         HIMAGELIST hImageListView = ListView_GetImageList(hListView, LVSIL_SMALL);
 
-        if (!SearchPatternMatch(Info->szName, szSearchPattern) &&
-            !SearchPatternMatch(Info->szDesc, szSearchPattern))
+        if (!SearchPatternMatch(Info->m_szName.GetString(), szSearchPattern) &&
+            !SearchPatternMatch(Info->m_szDesc.GetString(), szSearchPattern))
         {
             return TRUE;
         }
 
         /* Load icon from file */
         ATL::CStringW szIconPath;
-        szIconPath.Format(L"%lsicons\\%ls.ico", szFolderPath, Info->szName);
+        szIconPath.Format(L"%lsicons\\%ls.ico", szFolderPath, Info->m_szName.GetString());
         hIcon = (HICON) LoadImageW(NULL,
                                    szIconPath.GetString(),
                                    IMAGE_ICON,
@@ -1450,11 +1486,11 @@ private:
         Index = ImageList_AddIcon(hImageListView, hIcon);
         DestroyIcon(hIcon);
 
-        Index = ListViewAddItem(Info->Category, Index, Info->szName, (LPARAM) Info);
+        Index = ListViewAddItem(Info->m_Category, Index, Info->m_szName.GetString(), (LPARAM) Info);
         ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL);
 
-        ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->szVersion.GetString()));
-        ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->szDesc.GetString()));
+        ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->m_szVersion.GetString()));
+        ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->m_szDesc.GetString()));
 
         return TRUE;
     }
@@ -1474,21 +1510,27 @@ private:
     {
         ATL::CStringW szBuffer1, szBuffer2;
         HIMAGELIST hImageListView;
-        bUpdating = TRUE;
+        BOOL bWasInInstalled = IsInstalledEnum(SelectedEnumType);
 
+        bUpdating = TRUE;
         m_ListView->SetRedraw(FALSE);
 
         nSelectedApps = 0;
-        if (EnumType < 0) EnumType = SelectedEnumType;
+        if (EnumType < 0)
+        {
+            EnumType = SelectedEnumType;
+        }
 
-        if (IS_INSTALLED_ENUM(EnumType))
+        //if previous one was INSTALLED purge the list
+        //TODO: make the Installed category a separate class to avoid doing this
+        if (bWasInInstalled)
         {
             FreeInstalledAppList();
         }
 
         m_ListView->DeleteAllItems();
 
-        /* Create new ImageList */
+        // Create new ImageList 
         hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE,
                                           LISTVIEW_ICON_SIZE,
                                           GetSystemColorDepth() | ILC_MASK,
@@ -1499,23 +1541,37 @@ private:
             ImageList_Destroy(hImageListBuf);
         }
 
-        if (IS_INSTALLED_ENUM(EnumType))
+        if (IsInstalledEnum(EnumType))
         {
-            /* Enum installed applications and updates */
+            if (!bWasInInstalled)
+            {
+                m_ListView->SetCheckboxesVisible(FALSE);
+            }
+
+            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))
+        else if (IsAvailableEnum(EnumType))
         {
-            /* Enum available applications */
-            m_AvailableApps.EnumAvailableApplications(EnumType, s_EnumAvailableAppProc);
+            if (bWasInInstalled)
+            {
+                m_ListView->SetCheckboxesVisible(TRUE);
+            }
+
+            // Enum available applications
+            m_AvailableApps.Enum(EnumType, s_EnumAvailableAppProc);
         }
 
         SelectedEnumType = EnumType;
         UpdateStatusBarText();
         SetWelcomeText();
 
-        /* Set automatic column width for program names if the list is not empty */
+        // Set automatic column width for program names if the list is not empty
         if (m_ListView->GetItemCount() > 0)
         {
             ListView_SetColumnWidth(m_ListView->GetWindow(), 0, LVSCW_AUTOSIZE);
@@ -1588,8 +1644,7 @@ public:
     }
 };
 
-// File interface
-
+// global interface
 CMainWindow * g_MainWindow;
 
 HWND CreateMainWindow()
@@ -1627,7 +1682,12 @@ VOID InsertRichEditText(LPCWSTR szText, DWORD flags)
     g_MainWindow->GetRichEdit()->InsertText(szText, flags);
 }
 
-/* ATL version of functions */
+CAvailableApps* GetAvailableApps()
+{
+    return g_MainWindow->GetAvailableApps();
+}
+
+// ATL version of functions above
 VOID SetStatusBarText(const ATL::CStringW& szText)
 {
     SetStatusBarText(szText.GetString());
@@ -1647,8 +1707,3 @@ VOID InsertRichEditText(const ATL::CStringW& szText, DWORD flags)
 {
     InsertRichEditText(szText.GetString(), flags);
 }
-
-CAvailableApps* GetAvailableApps()
-{
-    return g_MainWindow->GetAvailableApps();
-}