1
/* PROJECT: ReactOS CE Applications Manager
2 * LICENSE: GPL - See COPYING in the top level directory
3 * AUTHORS: David Quintana <gigaherz@gmail.com>
4 * Alexander Shaposhnikov <chaez.san@gmail.com>
9 #include <shlobj_undoc.h>
10 #include <shlguid_undoc.h>
16 #include <shellutils.h>
21 #include "crichedit.h"
23 #define SEARCH_TIMER_ID 'SR'
25 HWND hListView
= NULL
;
27 class CAvailableAppView
29 static inline VOID
InsertTextAfterLoaded_RichEdit(UINT uStringID
,
30 const ATL::CStringW
& szText
,
34 ATL::CStringW szLoadedText
;
35 if (!szText
.IsEmpty() && szLoadedText
.LoadStringW(hInst
, uStringID
))
37 InsertRichEditText(szLoadedText
, StringFlags
);
38 InsertRichEditText(szText
, TextFlags
);
42 static inline VOID
InsertLoadedTextNewl_RichEdit(UINT uStringID
,
45 ATL::CStringW szLoadedText
;
46 if (szLoadedText
.LoadStringW(hInst
, uStringID
))
48 InsertRichEditText(L
"\n", 0);
49 InsertRichEditText(szLoadedText
, StringFlags
);
50 InsertRichEditText(L
"\n", 0);
54 static VOID
InsertVersionInfo_RichEdit(CAvailableApplicationInfo
* Info
)
56 if (Info
->IsInstalled())
58 if (Info
->HasInstalledVersion())
60 if (Info
->HasUpdate())
61 InsertLoadedTextNewl_RichEdit(IDS_STATUS_UPDATE_AVAILABLE
, CFE_ITALIC
);
63 InsertLoadedTextNewl_RichEdit(IDS_STATUS_INSTALLED
, CFE_ITALIC
);
65 InsertTextAfterLoaded_RichEdit(IDS_AINFO_VERSION
, Info
->szInstalledVersion
, CFE_BOLD
, 0);
69 InsertLoadedTextNewl_RichEdit(IDS_STATUS_INSTALLED
, CFE_ITALIC
);
74 InsertLoadedTextNewl_RichEdit(IDS_STATUS_NOTINSTALLED
, CFE_ITALIC
);
77 InsertTextAfterLoaded_RichEdit(IDS_AINFO_AVAILABLEVERSION
, Info
->szVersion
, CFE_BOLD
, 0);
80 static VOID
InsertLicenseInfo_RichEdit(CAvailableApplicationInfo
* Info
)
82 ATL::CStringW szLicense
;
83 switch (Info
->LicenseType
)
85 case LICENSE_TYPE::OpenSource
:
86 szLicense
.LoadStringW(hInst
, IDS_LICENSE_OPENSOURCE
);
88 case LICENSE_TYPE::Freeware
:
89 szLicense
.LoadStringW(hInst
, IDS_LICENSE_FREEWARE
);
91 case LICENSE_TYPE::Trial
:
92 szLicense
.LoadStringW(hInst
, IDS_LICENSE_TRIAL
);
95 InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE
, Info
->szLicense
, CFE_BOLD
, 0);
99 szLicense
+= L
" (" + Info
->szLicense
+ L
")";
100 InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE
, szLicense
, CFE_BOLD
, 0);
103 static VOID
InsertLanguageInfo_RichEdit(CAvailableApplicationInfo
* Info
)
105 if (!Info
->HasLanguageInfo())
110 const INT nTranslations
= Info
->Languages
.GetSize();
111 ATL::CStringW szLangInfo
;
112 ATL::CStringW szLoadedTextAvailability
;
113 ATL::CStringW szLoadedAInfoText
;
115 szLoadedAInfoText
.LoadStringW(IDS_AINFO_LANGUAGES
);
117 //TODO: replace those hardcoded strings
118 if (Info
->HasNativeLanguage())
120 szLoadedTextAvailability
.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION
);
121 if (nTranslations
> 1)
123 szLangInfo
.Format(L
" (+%d more)", nTranslations
- 1);
127 szLangInfo
.LoadStringW(IDS_LANGUAGE_SINGLE
);
128 szLangInfo
= L
" (" + szLangInfo
+ L
")";
131 else if (Info
->HasEnglishLanguage())
133 szLoadedTextAvailability
.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION
);
134 if (nTranslations
> 1)
136 szLangInfo
.Format(L
" (+%d available)", nTranslations
- 1);
140 szLangInfo
.LoadStringW(IDS_LANGUAGE_SINGLE
);
141 szLangInfo
= L
" (" + szLangInfo
+ L
")";
146 szLoadedTextAvailability
.LoadStringW(IDS_LANGUAGE_NO_TRANSLATION
);
149 InsertRichEditText(szLoadedAInfoText
, CFE_BOLD
);
150 InsertRichEditText(szLoadedTextAvailability
, NULL
);
151 InsertRichEditText(szLangInfo
, CFE_ITALIC
);
155 static BOOL
ShowAvailableAppInfo(INT Index
)
157 CAvailableApplicationInfo
* Info
= (CAvailableApplicationInfo
*) ListViewGetlParam(Index
);
158 if (!Info
) return FALSE
;
160 NewRichEditText(Info
->szName
, CFE_BOLD
);
161 InsertVersionInfo_RichEdit(Info
);
162 InsertLicenseInfo_RichEdit(Info
);
163 InsertLanguageInfo_RichEdit(Info
);
165 InsertTextAfterLoaded_RichEdit(IDS_AINFO_SIZE
, Info
->szSize
, CFE_BOLD
, 0);
166 InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLSITE
, Info
->szUrlSite
, CFE_BOLD
, CFE_LINK
);
167 InsertTextAfterLoaded_RichEdit(IDS_AINFO_DESCRIPTION
, Info
->szDesc
, CFE_BOLD
, 0);
168 InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLDOWNLOAD
, Info
->szUrlDownload
, CFE_BOLD
, CFE_LINK
);
175 public CUiWindow
< CToolbar
<> >
177 #define TOOLBAR_HEIGHT 24
179 WCHAR szInstallBtn
[MAX_STR_LEN
];
180 WCHAR szUninstallBtn
[MAX_STR_LEN
];
181 WCHAR szModifyBtn
[MAX_STR_LEN
];
182 WCHAR szSelectAll
[MAX_STR_LEN
];
184 VOID
AddImageToImageList(HIMAGELIST hImageList
, UINT ImageIndex
)
188 if (!(hImage
= (HICON
) LoadImageW(hInst
,
189 MAKEINTRESOURCE(ImageIndex
),
195 /* TODO: Error message */
198 ImageList_AddIcon(hImageList
, hImage
);
199 DeleteObject(hImage
);
202 HIMAGELIST
InitImageList()
204 HIMAGELIST hImageList
;
206 /* Create the toolbar icon image list */
207 hImageList
= ImageList_Create(TOOLBAR_HEIGHT
,//GetSystemMetrics(SM_CXSMICON),
208 TOOLBAR_HEIGHT
,//GetSystemMetrics(SM_CYSMICON),
209 ILC_MASK
| GetSystemColorDepth(),
214 /* TODO: Error message */
218 AddImageToImageList(hImageList
, IDI_INSTALL
);
219 AddImageToImageList(hImageList
, IDI_UNINSTALL
);
220 AddImageToImageList(hImageList
, IDI_MODIFY
);
221 AddImageToImageList(hImageList
, IDI_CHECK_ALL
);
222 AddImageToImageList(hImageList
, IDI_REFRESH
);
223 AddImageToImageList(hImageList
, IDI_UPDATE_DB
);
224 AddImageToImageList(hImageList
, IDI_SETTINGS
);
225 AddImageToImageList(hImageList
, IDI_EXIT
);
231 VOID
OnGetDispInfo(LPTOOLTIPTEXT lpttt
)
233 UINT idButton
= (UINT
) lpttt
->hdr
.idFrom
;
238 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_EXIT
);
242 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_INSTALL
);
246 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_UNINSTALL
);
250 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_MODIFY
);
254 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_SETTINGS
);
258 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH
);
262 lpttt
->lpszText
= MAKEINTRESOURCE(IDS_TOOLTIP_UPDATE_DB
);
267 HWND
Create(HWND hwndParent
)
269 HIMAGELIST hImageList
;
272 static TBBUTTON Buttons
[] =
273 { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
274 { 0, ID_INSTALL
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, (INT_PTR
) szInstallBtn
},
275 { 1, ID_UNINSTALL
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, (INT_PTR
) szUninstallBtn
},
276 { 2, ID_MODIFY
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, (INT_PTR
) szModifyBtn
},
277 { 3, ID_CHECK_ALL
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
,{0}, 0, (INT_PTR
) szSelectAll
},
278 {-1, 0, TBSTATE_ENABLED
, BTNS_SEP
, { 0 }, 0, 0 },
279 { 4, ID_REFRESH
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
280 { 5, ID_RESETDB
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
281 {-1, 0, TBSTATE_ENABLED
, BTNS_SEP
, { 0 }, 0, 0 },
282 { 6, ID_SETTINGS
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
283 { 7, ID_EXIT
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
286 LoadStringW(hInst
, IDS_INSTALL
, szInstallBtn
, _countof(szInstallBtn
));
287 LoadStringW(hInst
, IDS_UNINSTALL
, szUninstallBtn
, _countof(szUninstallBtn
));
288 LoadStringW(hInst
, IDS_MODIFY
, szModifyBtn
, _countof(szModifyBtn
));
289 LoadStringW(hInst
, IDS_SELECT_ALL
, szSelectAll
, _countof(szSelectAll
));
291 m_hWnd
= CreateWindowExW(0, TOOLBARCLASSNAMEW
, NULL
,
292 WS_CHILD
| WS_VISIBLE
| TBSTYLE_FLAT
| TBSTYLE_TOOLTIPS
| TBSTYLE_LIST
,
299 /* TODO: Show error message */
303 SendMessageW(TB_SETEXTENDEDSTYLE
, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS
);
304 SetButtonStructSize();
306 hImageList
= InitImageList();
310 /* TODO: Show error message */
314 ImageList_Destroy((HIMAGELIST
) SetImageList(hImageList
));
316 AddButtons(_countof(Buttons
), Buttons
);
322 class CAppsListView
:
323 public CUiWindow
<CListView
>
337 bHasAllChecked(FALSE
)
341 VOID
ColumnClick(LPNMLISTVIEW pnmv
)
343 SortContext ctx
= {this, pnmv
->iSubItem
};
345 SortItems(s_CompareFunc
, &ctx
);
347 bAscending
= !bAscending
;
350 PVOID
GetLParam(INT Index
)
357 ItemIndex
= (INT
) SendMessage(LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
366 ZeroMemory(&Item
, sizeof(Item
));
368 Item
.mask
= LVIF_PARAM
;
369 Item
.iItem
= ItemIndex
;
373 return (PVOID
) Item
.lParam
;
376 BOOL
AddColumn(INT Index
, ATL::CStringW
& Text
, INT Width
, INT Format
)
378 return AddColumn(Index
, const_cast<LPWSTR
>(Text
.GetString()), Width
, Format
);
381 BOOL
AddColumn(INT Index
, LPWSTR lpText
, INT Width
, INT Format
)
385 ZeroMemory(&Column
, sizeof(Column
));
387 Column
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_WIDTH
| LVCF_SUBITEM
;
388 Column
.iSubItem
= Index
;
389 Column
.pszText
= lpText
;
393 return (InsertColumn(Index
, &Column
) == -1) ? FALSE
: TRUE
;
396 INT
AddItem(INT ItemIndex
, INT IconIndex
, LPWSTR lpText
, LPARAM lParam
)
400 ZeroMemory(&Item
, sizeof(Item
));
402 Item
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
403 Item
.pszText
= lpText
;
404 Item
.lParam
= lParam
;
405 Item
.iItem
= ItemIndex
;
406 Item
.iImage
= IconIndex
;
408 return InsertItem(&Item
);
411 static INT CALLBACK
s_CompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
413 SortContext
* ctx
= ((SortContext
*) lParamSort
);
414 return ctx
->lvw
->CompareFunc(lParam1
, lParam2
, ctx
->iSubItem
);
417 INT
CompareFunc(LPARAM lParam1
, LPARAM lParam2
, INT iSubItem
)
419 ATL::CStringW Item1
, Item2
;
420 LVFINDINFOW IndexInfo
;
423 IndexInfo
.flags
= LVFI_PARAM
;
425 IndexInfo
.lParam
= lParam1
;
426 Index
= FindItem(-1, &IndexInfo
);
427 GetItemText(Index
, iSubItem
, Item1
.GetBuffer(MAX_STR_LEN
), MAX_STR_LEN
);
428 Item1
.ReleaseBuffer();
430 IndexInfo
.lParam
= lParam2
;
431 Index
= FindItem(-1, &IndexInfo
);
432 GetItemText(Index
, iSubItem
, Item2
.GetBuffer(MAX_STR_LEN
), MAX_STR_LEN
);
433 Item2
.ReleaseBuffer();
436 return Item2
== Item1
;
438 return Item1
== Item2
;
443 HWND
Create(HWND hwndParent
)
445 RECT r
= {205, 28, 465, 250};
446 DWORD style
= WS_CHILD
| WS_VISIBLE
| LVS_SORTASCENDING
| LVS_REPORT
| LVS_SINGLESEL
| LVS_SHOWSELALWAYS
;
447 HMENU menu
= GetSubMenu(LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATIONMENU
)), 0);
449 HWND hwnd
= CListView::Create(hwndParent
, r
, NULL
, style
, WS_EX_CLIENTEDGE
, menu
);
453 SetExtendedListViewStyle(LVS_EX_CHECKBOXES
| LVS_EX_FULLROWSELECT
);
459 BOOL
GetCheckState(INT item
)
461 return (BOOL
) (GetItemState(item
, LVIS_STATEIMAGEMASK
) >> 12) - 1;
464 VOID
SetCheckState(INT item
, BOOL fCheck
)
466 SetItemState(item
, INDEXTOSTATEIMAGEMASK((fCheck
) ? 2 : 1), LVIS_STATEIMAGEMASK
);
471 bHasAllChecked
= !bHasAllChecked
;
472 SetCheckState(-1, bHasAllChecked
);
475 ATL::CSimpleArray
<PAPPLICATION_INFO
> GetCheckedItems()
477 ATL::CSimpleArray
<PAPPLICATION_INFO
> list
;
478 for (INT i
= 0; i
>= 0; i
= GetNextItem(i
, LVNI_ALL
))
480 if (GetCheckState(i
) != FALSE
)
482 PAPPLICATION_INFO pAppInfo
= (PAPPLICATION_INFO
) GetItemData(i
);
490 class CSideTreeView
:
491 public CUiWindow
<CTreeView
>
493 HIMAGELIST hImageTreeView
= ImageList_Create(TREEVIEW_ICON_SIZE
, TREEVIEW_ICON_SIZE
,
494 GetSystemColorDepth() | ILC_MASK
,
498 HTREEITEM
AddItem(HTREEITEM hParent
, ATL::CStringW
&Text
, INT Image
, INT SelectedImage
, LPARAM lParam
)
500 return CUiWindow
<CTreeView
>::AddItem(hParent
, const_cast<LPWSTR
>(Text
.GetString()), Image
, SelectedImage
, lParam
);
503 HTREEITEM
AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
505 ATL::CStringW szText
;
509 hIcon
= (HICON
) LoadImage(hInst
,
510 MAKEINTRESOURCE(IconIndex
),
514 LR_CREATEDIBSECTION
);
517 Index
= ImageList_AddIcon(hImageTreeView
, hIcon
);
521 szText
.LoadStringW(hInst
, TextIndex
);
522 return AddItem(hRootItem
, szText
, Index
, Index
, TextIndex
);
525 HIMAGELIST
SetImageList()
527 return CUiWindow
<CTreeView
>::SetImageList(hImageTreeView
, TVSIL_NORMAL
);
530 VOID
DestroyImageList()
533 ImageList_Destroy(hImageTreeView
);
539 CUiWindow
<CTreeView
>::~CUiWindow();
547 VOID
SetText(LPCWSTR lpszText
)
549 SendMessageW(SB_SETTEXT
, SBT_NOBORDERS
, (LPARAM
) lpszText
);
552 HWND
Create(HWND hwndParent
)
555 m_hWnd
= CreateWindowExW(WS_EX_CLIENTEDGE
, L
"Edit", NULL
,
556 WS_CHILD
| WS_VISIBLE
| ES_LEFT
| ES_AUTOHSCROLL
,
558 hwndParent
, (HMENU
) NULL
,
561 SendMessageW(WM_SETFONT
, (WPARAM
) GetStockObject(DEFAULT_GUI_FONT
), 0);
562 szBuf
.LoadStringW(hInst
, IDS_SEARCH_TEXT
);
563 SetWindowTextW(szBuf
);
570 public CWindowImpl
<CMainWindow
, CWindow
, CFrameWinTraits
>
572 CUiPanel
* m_ClientPanel
;
573 CUiSplitPanel
* m_VSplitter
;
574 CUiSplitPanel
* m_HSplitter
;
576 CMainToolbar
* m_Toolbar
;
577 CAppsListView
* m_ListView
;
579 CSideTreeView
* m_TreeView
;
580 CUiWindow
<CStatusBar
> * m_StatusBar
;
581 CUiWindow
<CRichEdit
> * m_RichEdit
;
583 CUiWindow
<CSearchBar
> * m_SearchBar
;
584 CAvailableApps m_AvailableApps
;
596 bSearchEnabled(FALSE
)
601 VOID
InitApplicationsList()
603 ATL::CStringW szText
;
605 /* Add columns to ListView */
606 szText
.LoadStringW(hInst
, IDS_APP_NAME
);
607 m_ListView
->AddColumn(0, szText
, 200, LVCFMT_LEFT
);
609 szText
.LoadStringW(hInst
, IDS_APP_INST_VERSION
);
610 m_ListView
->AddColumn(1, szText
, 90, LVCFMT_RIGHT
);
612 szText
.LoadStringW(hInst
, IDS_APP_DESCRIPTION
);
613 m_ListView
->AddColumn(3, szText
, 250, LVCFMT_LEFT
);
615 // Unnesesary since the list updates on every TreeView selection
616 // UpdateApplicationsList(ENUM_ALL_COMPONENTS);
619 HTREEITEM
AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
621 return m_TreeView
->AddCategory(hRootItem
, TextIndex
, IconIndex
);
624 VOID
InitCategoriesList()
628 hRootItem
= AddCategory(TVI_ROOT
, IDS_AVAILABLEFORINST
, IDI_CATEGORY
);
629 AddCategory(hRootItem
, IDS_CAT_AUDIO
, IDI_CAT_AUDIO
);
630 AddCategory(hRootItem
, IDS_CAT_VIDEO
, IDI_CAT_VIDEO
);
631 AddCategory(hRootItem
, IDS_CAT_GRAPHICS
, IDI_CAT_GRAPHICS
);
632 AddCategory(hRootItem
, IDS_CAT_GAMES
, IDI_CAT_GAMES
);
633 AddCategory(hRootItem
, IDS_CAT_INTERNET
, IDI_CAT_INTERNET
);
634 AddCategory(hRootItem
, IDS_CAT_OFFICE
, IDI_CAT_OFFICE
);
635 AddCategory(hRootItem
, IDS_CAT_DEVEL
, IDI_CAT_DEVEL
);
636 AddCategory(hRootItem
, IDS_CAT_EDU
, IDI_CAT_EDU
);
637 AddCategory(hRootItem
, IDS_CAT_ENGINEER
, IDI_CAT_ENGINEER
);
638 AddCategory(hRootItem
, IDS_CAT_FINANCE
, IDI_CAT_FINANCE
);
639 AddCategory(hRootItem
, IDS_CAT_SCIENCE
, IDI_CAT_SCIENCE
);
640 AddCategory(hRootItem
, IDS_CAT_TOOLS
, IDI_CAT_TOOLS
);
641 AddCategory(hRootItem
, IDS_CAT_DRIVERS
, IDI_CAT_DRIVERS
);
642 AddCategory(hRootItem
, IDS_CAT_LIBS
, IDI_CAT_LIBS
);
643 AddCategory(hRootItem
, IDS_CAT_OTHER
, IDI_CAT_OTHER
);
645 m_TreeView
->SetImageList();
646 m_TreeView
->Expand(hRootItem
, TVE_EXPAND
);
647 m_TreeView
->SelectItem(hRootItem
);
650 BOOL
CreateStatusBar()
652 m_StatusBar
= new CUiWindow
<CStatusBar
>();
653 m_StatusBar
->m_VerticalAlignment
= UiAlign_RightBtm
;
654 m_StatusBar
->m_HorizontalAlignment
= UiAlign_Stretch
;
655 m_ClientPanel
->Children().Append(m_StatusBar
);
657 return m_StatusBar
->Create(m_hWnd
, (HMENU
) IDC_STATUSBAR
) != NULL
;
662 m_Toolbar
= new CMainToolbar();
663 m_Toolbar
->m_VerticalAlignment
= UiAlign_LeftTop
;
664 m_Toolbar
->m_HorizontalAlignment
= UiAlign_Stretch
;
665 m_ClientPanel
->Children().Append(m_Toolbar
);
667 return m_Toolbar
->Create(m_hWnd
) != NULL
;
670 BOOL
CreateTreeView()
672 m_TreeView
= new CSideTreeView();
673 m_TreeView
->m_VerticalAlignment
= UiAlign_Stretch
;
674 m_TreeView
->m_HorizontalAlignment
= UiAlign_Stretch
;
675 m_VSplitter
->First().Append(m_TreeView
);
677 return m_TreeView
->Create(m_hWnd
) != NULL
;
680 BOOL
CreateListView()
682 m_ListView
= new CAppsListView();
683 m_ListView
->m_VerticalAlignment
= UiAlign_Stretch
;
684 m_ListView
->m_HorizontalAlignment
= UiAlign_Stretch
;
685 m_HSplitter
->First().Append(m_ListView
);
687 hListView
= m_ListView
->Create(m_hWnd
);
688 return hListView
!= NULL
;
691 BOOL
CreateRichEdit()
693 m_RichEdit
= new CUiWindow
<CRichEdit
>();
694 m_RichEdit
->m_VerticalAlignment
= UiAlign_Stretch
;
695 m_RichEdit
->m_HorizontalAlignment
= UiAlign_Stretch
;
696 m_HSplitter
->Second().Append(m_RichEdit
);
698 return m_RichEdit
->Create(m_hWnd
) != NULL
;
701 BOOL
CreateVSplitter()
703 m_VSplitter
= new CUiSplitPanel();
704 m_VSplitter
->m_VerticalAlignment
= UiAlign_Stretch
;
705 m_VSplitter
->m_HorizontalAlignment
= UiAlign_Stretch
;
706 m_VSplitter
->m_DynamicFirst
= FALSE
;
707 m_VSplitter
->m_Horizontal
= FALSE
;
708 m_VSplitter
->m_MinFirst
= 240;
709 m_VSplitter
->m_MinSecond
= 300;
710 m_ClientPanel
->Children().Append(m_VSplitter
);
712 return m_VSplitter
->Create(m_hWnd
) != NULL
;
715 BOOL
CreateHSplitter()
717 m_HSplitter
= new CUiSplitPanel();
718 m_HSplitter
->m_VerticalAlignment
= UiAlign_Stretch
;
719 m_HSplitter
->m_HorizontalAlignment
= UiAlign_Stretch
;
720 m_HSplitter
->m_DynamicFirst
= TRUE
;
721 m_HSplitter
->m_Horizontal
= TRUE
;
722 m_HSplitter
->m_Pos
= 32768;
723 m_HSplitter
->m_MinFirst
= 300;
724 m_HSplitter
->m_MinSecond
= 150;
725 m_VSplitter
->Second().Append(m_HSplitter
);
727 return m_HSplitter
->Create(m_hWnd
) != NULL
;
730 BOOL
CreateSearchBar()
732 m_SearchBar
= new CUiWindow
<CSearchBar
>();
733 m_SearchBar
->m_VerticalAlignment
= UiAlign_LeftTop
;
734 m_SearchBar
->m_HorizontalAlignment
= UiAlign_RightBtm
;
735 m_SearchBar
->m_Margin
.top
= 6;
736 m_SearchBar
->m_Margin
.right
= 6;
738 return m_SearchBar
->Create(m_Toolbar
->m_hWnd
) != NULL
;
746 m_ClientPanel
= new CUiPanel();
747 m_ClientPanel
->m_VerticalAlignment
= UiAlign_Stretch
;
748 m_ClientPanel
->m_HorizontalAlignment
= UiAlign_Stretch
;
751 b
= b
&& CreateStatusBar();
752 b
= b
&& CreateToolbar();
753 b
= b
&& CreateSearchBar();
754 b
= b
&& CreateVSplitter();
757 b
= b
&& CreateHSplitter();
758 b
= b
&& CreateTreeView();
761 b
= b
&& CreateListView();
762 b
= b
&& CreateRichEdit();
769 /* Size status bar */
770 m_StatusBar
->SendMessage(WM_SIZE
, 0, 0);
773 m_Toolbar
->AutoSize();
775 ::GetWindowRect(m_Toolbar
->m_hWnd
, &rTop
);
776 ::GetWindowRect(m_StatusBar
->m_hWnd
, &rBottom
);
778 m_VSplitter
->m_Margin
.top
= rTop
.bottom
- rTop
.top
;
779 m_VSplitter
->m_Margin
.bottom
= rBottom
.bottom
- rBottom
.top
;
791 InitApplicationsList();
792 InitCategoriesList();
795 UpdateStatusBarText();
803 VOID
OnSize(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
805 /* Size status bar */
806 m_StatusBar
->SendMessage(WM_SIZE
, 0, 0);
809 m_Toolbar
->AutoSize();
811 RECT r
= {0, 0, LOWORD(lParam
), HIWORD(lParam
)};
813 int count
= m_ClientPanel
->CountSizableChildren();
815 hdwp
= BeginDeferWindowPos(count
);
818 hdwp
= m_ClientPanel
->OnParentSize(r
, hdwp
);
822 EndDeferWindowPos(hdwp
);
825 // TODO: Sub-layouts for children of children
826 count
= m_SearchBar
->CountSizableChildren();
827 hdwp
= BeginDeferWindowPos(count
);
830 hdwp
= m_SearchBar
->OnParentSize(r
, hdwp
);
834 EndDeferWindowPos(hdwp
);
838 BOOL
ProcessWindowMessage(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
& theResult
, DWORD dwMapId
)
845 ::PostMessage(hwnd
, WM_CLOSE
, 0, 0);
855 if (IS_INSTALLED_ENUM(SelectedEnumType
))
856 FreeInstalledAppList();
858 delete m_ClientPanel
;
865 OnCommand(wParam
, lParam
);
870 LPNMHDR data
= (LPNMHDR
) lParam
;
876 if (data
->hwndFrom
== m_TreeView
->m_hWnd
)
878 switch (((LPNMTREEVIEW
) lParam
)->itemNew
.lParam
)
881 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
884 case IDS_APPLICATIONS
:
885 UpdateApplicationsList(ENUM_APPLICATIONS
);
889 UpdateApplicationsList(ENUM_UPDATES
);
892 case IDS_AVAILABLEFORINST
:
893 UpdateApplicationsList(ENUM_ALL_AVAILABLE
);
897 UpdateApplicationsList(ENUM_CAT_AUDIO
);
901 UpdateApplicationsList(ENUM_CAT_DEVEL
);
904 case IDS_CAT_DRIVERS
:
905 UpdateApplicationsList(ENUM_CAT_DRIVERS
);
909 UpdateApplicationsList(ENUM_CAT_EDU
);
912 case IDS_CAT_ENGINEER
:
913 UpdateApplicationsList(ENUM_CAT_ENGINEER
);
916 case IDS_CAT_FINANCE
:
917 UpdateApplicationsList(ENUM_CAT_FINANCE
);
921 UpdateApplicationsList(ENUM_CAT_GAMES
);
924 case IDS_CAT_GRAPHICS
:
925 UpdateApplicationsList(ENUM_CAT_GRAPHICS
);
928 case IDS_CAT_INTERNET
:
929 UpdateApplicationsList(ENUM_CAT_INTERNET
);
933 UpdateApplicationsList(ENUM_CAT_LIBS
);
937 UpdateApplicationsList(ENUM_CAT_OFFICE
);
941 UpdateApplicationsList(ENUM_CAT_OTHER
);
944 case IDS_CAT_SCIENCE
:
945 UpdateApplicationsList(ENUM_CAT_SCIENCE
);
949 UpdateApplicationsList(ENUM_CAT_TOOLS
);
953 UpdateApplicationsList(ENUM_CAT_VIDEO
);
958 HMENU mainMenu
= ::GetMenu(hwnd
);
959 HMENU lvwMenu
= ::GetMenu(m_ListView
->m_hWnd
);
961 /* Disable/enable items based on treeview selection */
962 if (IsSelectedNodeInstalled())
964 EnableMenuItem(mainMenu
, ID_REGREMOVE
, MF_ENABLED
);
965 EnableMenuItem(mainMenu
, ID_INSTALL
, MF_GRAYED
);
966 EnableMenuItem(mainMenu
, ID_UNINSTALL
, MF_ENABLED
);
967 EnableMenuItem(mainMenu
, ID_MODIFY
, MF_ENABLED
);
969 EnableMenuItem(lvwMenu
, ID_REGREMOVE
, MF_ENABLED
);
970 EnableMenuItem(lvwMenu
, ID_INSTALL
, MF_GRAYED
);
971 EnableMenuItem(lvwMenu
, ID_UNINSTALL
, MF_ENABLED
);
972 EnableMenuItem(lvwMenu
, ID_MODIFY
, MF_ENABLED
);
974 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_REGREMOVE
, TRUE
);
975 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_INSTALL
, FALSE
);
976 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_UNINSTALL
, TRUE
);
977 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_MODIFY
, TRUE
);
981 EnableMenuItem(mainMenu
, ID_REGREMOVE
, MF_GRAYED
);
982 EnableMenuItem(mainMenu
, ID_INSTALL
, MF_ENABLED
);
983 EnableMenuItem(mainMenu
, ID_UNINSTALL
, MF_GRAYED
);
984 EnableMenuItem(mainMenu
, ID_MODIFY
, MF_GRAYED
);
986 EnableMenuItem(lvwMenu
, ID_REGREMOVE
, MF_GRAYED
);
987 EnableMenuItem(lvwMenu
, ID_INSTALL
, MF_ENABLED
);
988 EnableMenuItem(lvwMenu
, ID_UNINSTALL
, MF_GRAYED
);
989 EnableMenuItem(lvwMenu
, ID_MODIFY
, MF_GRAYED
);
991 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_REGREMOVE
, FALSE
);
992 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_INSTALL
, TRUE
);
993 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_UNINSTALL
, FALSE
);
994 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_MODIFY
, FALSE
);
999 case LVN_ITEMCHANGED
:
1001 LPNMLISTVIEW pnic
= (LPNMLISTVIEW
) lParam
;
1003 if (pnic
->hdr
.hwndFrom
== m_ListView
->m_hWnd
)
1005 /* Check if this is a valid item
1006 * (technically, it can be also an unselect) */
1007 INT ItemIndex
= pnic
->iItem
;
1008 if (ItemIndex
== -1 ||
1009 ItemIndex
>= ListView_GetItemCount(pnic
->hdr
.hwndFrom
))
1014 /* Check if the focus has been moved to another item */
1015 if ((pnic
->uChanged
& LVIF_STATE
) &&
1016 (pnic
->uNewState
& LVIS_FOCUSED
) &&
1017 !(pnic
->uOldState
& LVIS_FOCUSED
))
1019 if (IS_INSTALLED_ENUM(SelectedEnumType
))
1020 ShowInstalledAppInfo(ItemIndex
);
1021 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
1022 CAvailableAppView::ShowAvailableAppInfo(ItemIndex
);
1024 /* Check if the item is checked */
1025 if ((pnic
->uNewState
& LVIS_STATEIMAGEMASK
) && !bUpdating
)
1027 BOOL checked
= ListView_GetCheckState(pnic
->hdr
.hwndFrom
, pnic
->iItem
);
1028 nSelectedApps
+= (checked
) ? 1 : -1;
1029 UpdateStatusBarText();
1035 case LVN_COLUMNCLICK
:
1037 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
1039 m_ListView
->ColumnClick(pnmv
);
1045 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
1047 if (IS_INSTALLED_ENUM(SelectedEnumType
))
1048 ShowInstalledAppInfo(-1);
1049 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
1050 CAvailableAppView::ShowAvailableAppInfo(-1);
1057 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
1059 /* this won't do anything if the program is already installed */
1060 SendMessageW(hwnd
, WM_COMMAND
, ID_INSTALL
, 0);
1067 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
1069 ShowPopupMenu(m_ListView
->m_hWnd
, 0, ID_INSTALL
);
1075 OnLink((ENLINK
*) lParam
);
1078 case TTN_GETDISPINFO
:
1079 m_Toolbar
->OnGetDispInfo((LPTOOLTIPTEXT
) lParam
);
1086 OnSize(hwnd
, wParam
, lParam
);
1091 LPRECT pRect
= (LPRECT
) lParam
;
1093 if (pRect
->right
- pRect
->left
< 565)
1094 pRect
->right
= pRect
->left
+ 565;
1096 if (pRect
->bottom
- pRect
->top
< 300)
1097 pRect
->bottom
= pRect
->top
+ 300;
1102 case WM_SYSCOLORCHANGE
:
1104 /* Forward WM_SYSCOLORCHANGE to common controls */
1105 m_ListView
->SendMessageW(WM_SYSCOLORCHANGE
, 0, 0);
1106 m_TreeView
->SendMessageW(WM_SYSCOLORCHANGE
, 0, 0);
1107 m_Toolbar
->SendMessageW(WM_SYSCOLORCHANGE
, 0, 0);
1108 m_ListView
->SendMessageW(EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
1113 if (wParam
== SEARCH_TIMER_ID
)
1115 ::KillTimer(hwnd
, SEARCH_TIMER_ID
);
1117 UpdateApplicationsList(-1);
1125 virtual VOID
OnLink(ENLINK
*Link
)
1132 if (pLink
) HeapFree(GetProcessHeap(), 0, pLink
);
1134 pLink
= (LPWSTR
) HeapAlloc(GetProcessHeap(), 0,
1135 (max(Link
->chrg
.cpMin
, Link
->chrg
.cpMax
) -
1136 min(Link
->chrg
.cpMin
, Link
->chrg
.cpMax
) + 1) * sizeof(WCHAR
));
1139 /* TODO: Error message */
1143 m_RichEdit
->SendMessageW(EM_SETSEL
, Link
->chrg
.cpMin
, Link
->chrg
.cpMax
);
1144 m_RichEdit
->SendMessageW(EM_GETSELTEXT
, 0, (LPARAM
) pLink
);
1146 ShowPopupMenu(m_RichEdit
->m_hWnd
, IDR_LINKMENU
, -1);
1152 BOOL
IsSelectedNodeInstalled()
1154 HTREEITEM hSelectedItem
= m_TreeView
->GetSelection();
1157 tItem
.mask
= TVIF_PARAM
| TVIF_HANDLE
;
1158 tItem
.hItem
= hSelectedItem
;
1159 m_TreeView
->GetItem(&tItem
);
1160 switch (tItem
.lParam
)
1163 case IDS_APPLICATIONS
:
1171 VOID
OnCommand(WPARAM wParam
, LPARAM lParam
)
1173 WORD wCommand
= LOWORD(wParam
);
1175 if (lParam
== (LPARAM
) m_SearchBar
->m_hWnd
)
1177 ATL::CStringW szBuf
;
1179 switch (HIWORD(wParam
))
1183 ATL::CStringW szWndText
;
1185 szBuf
.LoadStringW(hInst
, IDS_SEARCH_TEXT
);
1186 m_SearchBar
->GetWindowTextW(szWndText
);
1187 if (szBuf
== szWndText
)
1189 bSearchEnabled
= FALSE
;
1190 m_SearchBar
->SetWindowTextW(L
"");
1197 m_SearchBar
->GetWindowTextW(szBuf
);
1198 if (szBuf
.IsEmpty())
1200 szBuf
.LoadStringW(hInst
, IDS_SEARCH_TEXT
);
1201 bSearchEnabled
= FALSE
;
1202 m_SearchBar
->SetWindowTextW(szBuf
.GetString());
1209 ATL::CStringW szWndText
;
1211 if (!bSearchEnabled
)
1213 bSearchEnabled
= TRUE
;
1217 szBuf
.LoadStringW(hInst
, IDS_SEARCH_TEXT
);
1218 m_SearchBar
->GetWindowTextW(szWndText
);
1219 if (szBuf
== szWndText
)
1221 szSearchPattern
.Empty();
1225 szSearchPattern
= szWndText
;
1229 SystemParametersInfoW(SPI_GETMENUSHOWDELAY
, 0, &dwDelay
, 0);
1230 SetTimer(SEARCH_TIMER_ID
, dwDelay
);
1241 ShellExecuteW(m_hWnd
, L
"open", pLink
, NULL
, NULL
, SW_SHOWNOACTIVATE
);
1242 HeapFree(GetProcessHeap(), 0, pLink
);
1246 CopyTextToClipboard(pLink
);
1247 HeapFree(GetProcessHeap(), 0, pLink
);
1251 CreateSettingsDlg(m_hWnd
);
1255 PostMessageW(WM_CLOSE
, 0, 0);
1261 DownloadManager::DownloadListOfApplications(m_ListView
->GetCheckedItems());
1262 UpdateApplicationsList(-1);
1264 else if(DownloadManager::DownloadApplication((PAPPLICATION_INFO
) m_ListView
->GetSelectionMark()))
1266 UpdateApplicationsList(-1);
1272 if (UninstallApplication(-1, FALSE
))
1273 UpdateApplicationsList(-1);
1277 if (UninstallApplication(-1, TRUE
))
1278 UpdateApplicationsList(-1);
1282 RemoveAppFromRegistry(-1);
1286 UpdateApplicationsList(-1);
1290 m_AvailableApps
.UpdateAppsDB();
1291 UpdateApplicationsList(-1);
1295 MessageBoxW(L
"Help not implemented yet", NULL
, MB_OK
);
1303 m_ListView
->CheckAll();
1308 VOID
FreeInstalledAppList()
1310 INT Count
= m_ListView
->GetItemCount() - 1;
1311 PINSTALLED_INFO Info
;
1315 Info
= (PINSTALLED_INFO
) ListViewGetlParam(Count
);
1318 RegCloseKey(Info
->hSubKey
);
1325 static BOOL
SearchPatternMatch(PCWSTR szHaystack
, PCWSTR szNeedle
)
1329 /* TODO: Improve pattern search beyond a simple case-insensitive substring search. */
1330 return StrStrIW(szHaystack
, szNeedle
) != NULL
;
1333 static BOOL CALLBACK
s_EnumInstalledAppProc(INT ItemIndex
, LPWSTR lpName
, PINSTALLED_INFO Info
)
1335 PINSTALLED_INFO ItemInfo
;
1336 ATL::CStringW szText
;
1339 if (!SearchPatternMatch(lpName
, szSearchPattern
))
1341 RegCloseKey(Info
->hSubKey
);
1345 ItemInfo
= (PINSTALLED_INFO
) HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO
));
1348 RegCloseKey(Info
->hSubKey
);
1352 RtlCopyMemory(ItemInfo
, Info
, sizeof(INSTALLED_INFO
));
1354 Index
= ListViewAddItem(ItemIndex
, 0, lpName
, (LPARAM
) ItemInfo
);
1356 /* Get version info */
1357 GetApplicationString(ItemInfo
->hSubKey
, L
"DisplayVersion", szText
);
1358 ListView_SetItemText(hListView
, Index
, 1, const_cast<LPWSTR
>(szText
.GetString()));
1361 GetApplicationString(ItemInfo
->hSubKey
, L
"Comments", szText
);
1362 ListView_SetItemText(hListView
, Index
, 2, const_cast<LPWSTR
>(szText
.GetString()));
1367 static BOOL CALLBACK
s_EnumAvailableAppProc(PAPPLICATION_INFO Info
, LPCWSTR szFolderPath
)
1372 HIMAGELIST hImageListView
= ListView_GetImageList(hListView
, LVSIL_SMALL
);
1374 if (!SearchPatternMatch(Info
->szName
, szSearchPattern
) &&
1375 !SearchPatternMatch(Info
->szDesc
, szSearchPattern
))
1380 /* Load icon from file */
1381 ATL::CStringW szIconPath
;
1382 szIconPath
.Format(L
"%lsicons\\%ls.ico", szFolderPath
, Info
->szName
);
1383 hIcon
= (HICON
) LoadImageW(NULL
,
1384 szIconPath
.GetString(),
1390 if (!hIcon
|| GetLastError() != ERROR_SUCCESS
)
1392 /* Load default icon */
1393 hIcon
= (HICON
) LoadIconW(hInst
, MAKEINTRESOURCEW(IDI_MAIN
));
1396 Index
= ImageList_AddIcon(hImageListView
, hIcon
);
1399 Index
= ListViewAddItem(Info
->Category
, Index
, Info
->szName
, (LPARAM
) Info
);
1400 ListView_SetImageList(hListView
, hImageListView
, LVSIL_SMALL
);
1402 ListView_SetItemText(hListView
, Index
, 1, const_cast<LPWSTR
>(Info
->szVersion
.GetString()));
1403 ListView_SetItemText(hListView
, Index
, 2, const_cast<LPWSTR
>(Info
->szDesc
.GetString()));
1408 VOID
UpdateStatusBarText()
1412 ATL::CStringW szBuffer
;
1414 szBuffer
.Format(IDS_APPS_COUNT
, m_ListView
->GetItemCount(), nSelectedApps
);
1415 m_StatusBar
->SetText(szBuffer
);
1419 VOID
UpdateApplicationsList(INT EnumType
)
1421 ATL::CStringW szBuffer1
, szBuffer2
;
1422 HIMAGELIST hImageListView
;
1425 m_ListView
->SetRedraw(FALSE
);
1428 if (EnumType
< 0) EnumType
= SelectedEnumType
;
1430 if (IS_INSTALLED_ENUM(SelectedEnumType
))
1431 FreeInstalledAppList();
1433 m_ListView
->DeleteAllItems();
1435 /* Create new ImageList */
1436 hImageListView
= ImageList_Create(LISTVIEW_ICON_SIZE
,
1438 GetSystemColorDepth() | ILC_MASK
,
1440 HIMAGELIST hImageListBuf
= m_ListView
->SetImageList(hImageListView
, LVSIL_SMALL
);
1443 ImageList_Destroy(hImageListBuf
);
1446 if (IS_AVAILABLE_ENUM(EnumType
))
1448 /* Enum available applications */
1449 m_AvailableApps
.EnumAvailableApplications(EnumType
, s_EnumAvailableAppProc
);
1452 SelectedEnumType
= EnumType
;
1454 UpdateStatusBarText();
1458 /* set automatic column width for program names if the list is not empty */
1459 if (m_ListView
->GetItemCount() > 0)
1460 ListView_SetColumnWidth(m_ListView
->GetWindow(), 0, LVSCW_AUTOSIZE
);
1463 m_ListView
->SetRedraw(TRUE
);
1467 static ATL::CWndClassInfo
& GetWndClassInfo()
1469 DWORD csStyle
= CS_VREDRAW
| CS_HREDRAW
;
1470 static ATL::CWndClassInfo wc
=
1479 LoadIconW(_AtlBaseModule
.GetModuleInstance(), MAKEINTRESOURCEW(IDI_MAIN
)),
1480 LoadCursorW(NULL
, IDC_ARROW
),
1481 (HBRUSH
) (COLOR_BTNFACE
+ 1),
1482 MAKEINTRESOURCEW(IDR_MAINMENU
),
1486 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
1493 ATL::CStringW szWindowName
;
1494 szWindowName
.LoadStringW(hInst
, IDS_APPTITLE
);
1497 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Left
: CW_USEDEFAULT
),
1498 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Top
: CW_USEDEFAULT
),
1499 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Width
: 680),
1500 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Height
: 450)
1505 return CWindowImpl::Create(NULL
, r
, szWindowName
.GetString(), WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_WINDOWEDGE
);
1508 CStatusBar
* GetStatusBar()
1513 CAppsListView
* GetListView()
1518 CRichEdit
* GetRichEdit()
1523 CAvailableApps
* GetAvailableApps()
1525 return &m_AvailableApps
;
1531 CMainWindow
* g_MainWindow
;
1533 HWND
CreateMainWindow()
1535 g_MainWindow
= new CMainWindow();
1536 return g_MainWindow
->Create();
1539 DWORD_PTR
ListViewGetlParam(INT item
)
1543 item
= g_MainWindow
->GetListView()->GetSelectionMark();
1545 return g_MainWindow
->GetListView()->GetItemData(item
);
1548 VOID
SetStatusBarText(LPCWSTR szText
)
1550 g_MainWindow
->GetStatusBar()->SetText(szText
);
1553 INT
ListViewAddItem(INT ItemIndex
, INT IconIndex
, LPWSTR lpName
, LPARAM lParam
)
1555 return g_MainWindow
->GetListView()->AddItem(ItemIndex
, IconIndex
, lpName
, lParam
);
1558 VOID
NewRichEditText(LPCWSTR szText
, DWORD flags
)
1560 g_MainWindow
->GetRichEdit()->SetText(szText
, flags
);
1563 VOID
InsertRichEditText(LPCWSTR szText
, DWORD flags
)
1565 g_MainWindow
->GetRichEdit()->InsertText(szText
, flags
);
1568 /* ATL version of functions */
1569 VOID
SetStatusBarText(const ATL::CStringW
& szText
)
1571 SetStatusBarText(szText
.GetString());
1574 INT
ListViewAddItem(INT ItemIndex
, INT IconIndex
, ATL::CStringW
& Name
, LPARAM lParam
)
1576 return ListViewAddItem(ItemIndex
, IconIndex
, const_cast<LPWSTR
>(Name
.GetString()), lParam
);
1579 VOID
NewRichEditText(const ATL::CStringW
& szText
, DWORD flags
)
1581 NewRichEditText(szText
.GetString(), flags
);
1584 VOID
InsertRichEditText(const ATL::CStringW
& szText
, DWORD flags
)
1586 InsertRichEditText(szText
.GetString(), flags
);
1589 CAvailableApps
* GetAvailableApps()
1591 return g_MainWindow
->GetAvailableApps();