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>
10 #include "crichedit.h"
12 #include <shlobj_undoc.h>
13 #include <shlguid_undoc.h>
19 #include <shellutils.h>
22 #define SEARCH_TIMER_ID 'SR'
23 #define LISTVIEW_ICON_SIZE 24
24 #define TREEVIEW_ICON_SIZE 24
26 HWND hListView
= NULL
;
34 pDevMode
.dmSize
= sizeof(pDevMode
);
35 pDevMode
.dmDriverExtra
= 0;
37 if (!EnumDisplaySettingsW(NULL
, ENUM_CURRENT_SETTINGS
, &pDevMode
))
39 /* TODO: Error message */
43 switch (pDevMode
.dmBitsPerPel
)
45 case 32: ColorDepth
= ILC_COLOR32
; break;
46 case 24: ColorDepth
= ILC_COLOR24
; break;
47 case 16: ColorDepth
= ILC_COLOR16
; break;
48 case 8: ColorDepth
= ILC_COLOR8
; break;
49 case 4: ColorDepth
= ILC_COLOR4
; break;
50 default: ColorDepth
= ILC_COLOR
; break;
56 class CAvailableAppView
58 static inline VOID
InsertTextAfterLoaded_RichEdit(UINT uStringID
,
59 const ATL::CStringW
& szText
,
63 ATL::CStringW szLoadedText
;
64 if (!szText
.IsEmpty() && szLoadedText
.LoadStringW(uStringID
))
66 InsertRichEditText(szLoadedText
, StringFlags
);
67 InsertRichEditText(szText
, TextFlags
);
71 static inline VOID
InsertLoadedTextNewl_RichEdit(UINT uStringID
,
74 ATL::CStringW szLoadedText
;
75 if (szLoadedText
.LoadStringW(uStringID
))
77 InsertRichEditText(L
"\n", 0);
78 InsertRichEditText(szLoadedText
, StringFlags
);
79 InsertRichEditText(L
"\n", 0);
83 static VOID
InsertVersionInfo_RichEdit(CAvailableApplicationInfo
* Info
)
85 if (Info
->IsInstalled())
87 if (Info
->HasInstalledVersion())
89 if (Info
->HasUpdate())
90 InsertLoadedTextNewl_RichEdit(IDS_STATUS_UPDATE_AVAILABLE
, CFE_ITALIC
);
92 InsertLoadedTextNewl_RichEdit(IDS_STATUS_INSTALLED
, CFE_ITALIC
);
94 InsertTextAfterLoaded_RichEdit(IDS_AINFO_VERSION
, Info
->szInstalledVersion
, CFE_BOLD
, 0);
98 InsertLoadedTextNewl_RichEdit(IDS_STATUS_INSTALLED
, CFE_ITALIC
);
103 InsertLoadedTextNewl_RichEdit(IDS_STATUS_NOTINSTALLED
, CFE_ITALIC
);
106 InsertTextAfterLoaded_RichEdit(IDS_AINFO_AVAILABLEVERSION
, Info
->szVersion
, CFE_BOLD
, 0);
109 static VOID
InsertLicenseInfo_RichEdit(CAvailableApplicationInfo
* Info
)
111 ATL::CStringW szLicense
;
112 switch (Info
->LicenseType
)
114 case LICENSE_TYPE::OpenSource
:
115 szLicense
.LoadStringW(IDS_LICENSE_OPENSOURCE
);
117 case LICENSE_TYPE::Freeware
:
118 szLicense
.LoadStringW(IDS_LICENSE_FREEWARE
);
120 case LICENSE_TYPE::Trial
:
121 szLicense
.LoadStringW(IDS_LICENSE_TRIAL
);
124 InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE
, Info
->szLicense
, CFE_BOLD
, 0);
128 szLicense
+= L
" (" + Info
->szLicense
+ L
")";
129 InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE
, szLicense
, CFE_BOLD
, 0);
132 static VOID
InsertLanguageInfo_RichEdit(CAvailableApplicationInfo
* Info
)
134 if (!Info
->HasLanguageInfo())
139 const INT nTranslations
= Info
->Languages
.GetSize();
140 ATL::CStringW szLangInfo
;
141 ATL::CStringW szLoadedTextAvailability
;
142 ATL::CStringW szLoadedAInfoText
;
144 szLoadedAInfoText
.LoadStringW(IDS_AINFO_LANGUAGES
);
146 //TODO: replace those hardcoded strings
147 if (Info
->HasNativeLanguage())
149 szLoadedTextAvailability
.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION
);
150 if (nTranslations
> 1)
153 buf
.LoadStringW(IDS_LANGUAGE_MORE_PLACEHOLDER
);
154 szLangInfo
.Format(buf
, nTranslations
- 1);
158 szLangInfo
.LoadStringW(IDS_LANGUAGE_SINGLE
);
159 szLangInfo
= L
" (" + szLangInfo
+ L
")";
162 else if (Info
->HasEnglishLanguage())
164 szLoadedTextAvailability
.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION
);
165 if (nTranslations
> 1)
168 buf
.LoadStringW(IDS_LANGUAGE_AVAILABLE_PLACEHOLDER
);
169 szLangInfo
.Format(buf
, nTranslations
- 1);
173 szLangInfo
.LoadStringW(IDS_LANGUAGE_SINGLE
);
174 szLangInfo
= L
" (" + szLangInfo
+ L
")";
179 szLoadedTextAvailability
.LoadStringW(IDS_LANGUAGE_NO_TRANSLATION
);
182 InsertRichEditText(szLoadedAInfoText
, CFE_BOLD
);
183 InsertRichEditText(szLoadedTextAvailability
, NULL
);
184 InsertRichEditText(szLangInfo
, CFE_ITALIC
);
188 static BOOL
ShowAvailableAppInfo(INT Index
)
190 CAvailableApplicationInfo
* Info
= (CAvailableApplicationInfo
*) ListViewGetlParam(Index
);
191 if (!Info
) return FALSE
;
193 NewRichEditText(Info
->szName
, CFE_BOLD
);
194 InsertVersionInfo_RichEdit(Info
);
195 InsertLicenseInfo_RichEdit(Info
);
196 InsertLanguageInfo_RichEdit(Info
);
198 InsertTextAfterLoaded_RichEdit(IDS_AINFO_SIZE
, Info
->szSize
, CFE_BOLD
, 0);
199 InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLSITE
, Info
->szUrlSite
, CFE_BOLD
, CFE_LINK
);
200 InsertTextAfterLoaded_RichEdit(IDS_AINFO_DESCRIPTION
, Info
->szDesc
, CFE_BOLD
, 0);
201 InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLDOWNLOAD
, Info
->szUrlDownload
, CFE_BOLD
, CFE_LINK
);
208 public CUiWindow
< CToolbar
<> >
210 #define TOOLBAR_HEIGHT 24
212 WCHAR szInstallBtn
[MAX_STR_LEN
];
213 WCHAR szUninstallBtn
[MAX_STR_LEN
];
214 WCHAR szModifyBtn
[MAX_STR_LEN
];
215 WCHAR szSelectAll
[MAX_STR_LEN
];
217 VOID
AddImageToImageList(HIMAGELIST hImageList
, UINT ImageIndex
)
221 if (!(hImage
= (HICON
) LoadImageW(hInst
,
222 MAKEINTRESOURCE(ImageIndex
),
228 /* TODO: Error message */
231 ImageList_AddIcon(hImageList
, hImage
);
232 DeleteObject(hImage
);
235 HIMAGELIST
InitImageList()
237 HIMAGELIST hImageList
;
239 /* Create the toolbar icon image list */
240 hImageList
= ImageList_Create(TOOLBAR_HEIGHT
,//GetSystemMetrics(SM_CXSMICON),
241 TOOLBAR_HEIGHT
,//GetSystemMetrics(SM_CYSMICON),
242 ILC_MASK
| GetSystemColorDepth(),
246 /* TODO: Error message */
250 AddImageToImageList(hImageList
, IDI_INSTALL
);
251 AddImageToImageList(hImageList
, IDI_UNINSTALL
);
252 AddImageToImageList(hImageList
, IDI_MODIFY
);
253 AddImageToImageList(hImageList
, IDI_CHECK_ALL
);
254 AddImageToImageList(hImageList
, IDI_REFRESH
);
255 AddImageToImageList(hImageList
, IDI_UPDATE_DB
);
256 AddImageToImageList(hImageList
, IDI_SETTINGS
);
257 AddImageToImageList(hImageList
, IDI_EXIT
);
263 VOID
OnGetDispInfo(LPTOOLTIPTEXT lpttt
)
265 UINT idButton
= (UINT
) lpttt
->hdr
.idFrom
;
270 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_EXIT
);
274 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_INSTALL
);
278 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_UNINSTALL
);
282 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_MODIFY
);
286 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_SETTINGS
);
290 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_REFRESH
);
294 lpttt
->lpszText
= MAKEINTRESOURCEW(IDS_TOOLTIP_UPDATE_DB
);
299 HWND
Create(HWND hwndParent
)
301 HIMAGELIST hImageList
;
304 static TBBUTTON Buttons
[] =
305 { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
306 { 0, ID_INSTALL
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, (INT_PTR
) szInstallBtn
},
307 { 1, ID_UNINSTALL
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, (INT_PTR
) szUninstallBtn
},
308 { 2, ID_MODIFY
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, (INT_PTR
) szModifyBtn
},
309 { 3, ID_CHECK_ALL
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
,{0}, 0, (INT_PTR
) szSelectAll
},
310 {-1, 0, TBSTATE_ENABLED
, BTNS_SEP
, { 0 }, 0, 0 },
311 { 4, ID_REFRESH
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
312 { 5, ID_RESETDB
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
313 {-1, 0, TBSTATE_ENABLED
, BTNS_SEP
, { 0 }, 0, 0 },
314 { 6, ID_SETTINGS
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
315 { 7, ID_EXIT
, TBSTATE_ENABLED
, BTNS_BUTTON
| BTNS_AUTOSIZE
, { 0 }, 0, 0 },
318 LoadStringW(hInst
, IDS_INSTALL
, szInstallBtn
, _countof(szInstallBtn
));
319 LoadStringW(hInst
, IDS_UNINSTALL
, szUninstallBtn
, _countof(szUninstallBtn
));
320 LoadStringW(hInst
, IDS_MODIFY
, szModifyBtn
, _countof(szModifyBtn
));
321 LoadStringW(hInst
, IDS_SELECT_ALL
, szSelectAll
, _countof(szSelectAll
));
323 m_hWnd
= CreateWindowExW(0, TOOLBARCLASSNAMEW
, NULL
,
324 WS_CHILD
| WS_VISIBLE
| TBSTYLE_FLAT
| TBSTYLE_TOOLTIPS
| TBSTYLE_LIST
,
331 /* TODO: Show error message */
335 SendMessageW(TB_SETEXTENDEDSTYLE
, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS
);
336 SetButtonStructSize();
338 hImageList
= InitImageList();
342 /* TODO: Show error message */
346 ImageList_Destroy((HIMAGELIST
) SetImageList(hImageList
));
348 AddButtons(_countof(Buttons
), Buttons
);
354 class CAppsListView
:
355 public CUiWindow
<CListView
>
369 bHasAllChecked(FALSE
)
373 VOID
ColumnClick(LPNMLISTVIEW pnmv
)
375 SortContext ctx
= {this, pnmv
->iSubItem
};
377 SortItems(s_CompareFunc
, &ctx
);
379 bAscending
= !bAscending
;
382 PVOID
GetLParam(INT Index
)
389 ItemIndex
= (INT
) SendMessage(LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
398 ZeroMemory(&Item
, sizeof(Item
));
400 Item
.mask
= LVIF_PARAM
;
401 Item
.iItem
= ItemIndex
;
405 return (PVOID
) Item
.lParam
;
408 BOOL
AddColumn(INT Index
, ATL::CStringW
& Text
, INT Width
, INT Format
)
410 return AddColumn(Index
, const_cast<LPWSTR
>(Text
.GetString()), Width
, Format
);
413 BOOL
AddColumn(INT Index
, LPWSTR lpText
, INT Width
, INT Format
)
417 ZeroMemory(&Column
, sizeof(Column
));
419 Column
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_WIDTH
| LVCF_SUBITEM
;
420 Column
.iSubItem
= Index
;
421 Column
.pszText
= lpText
;
425 return (InsertColumn(Index
, &Column
) == -1) ? FALSE
: TRUE
;
428 INT
AddItem(INT ItemIndex
, INT IconIndex
, LPWSTR lpText
, LPARAM lParam
)
432 ZeroMemory(&Item
, sizeof(Item
));
434 Item
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
435 Item
.pszText
= lpText
;
436 Item
.lParam
= lParam
;
437 Item
.iItem
= ItemIndex
;
438 Item
.iImage
= IconIndex
;
440 return InsertItem(&Item
);
443 static INT CALLBACK
s_CompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
445 SortContext
* ctx
= ((SortContext
*) lParamSort
);
446 return ctx
->lvw
->CompareFunc(lParam1
, lParam2
, ctx
->iSubItem
);
449 INT
CompareFunc(LPARAM lParam1
, LPARAM lParam2
, INT iSubItem
)
451 ATL::CStringW Item1
, Item2
;
452 LVFINDINFOW IndexInfo
;
455 IndexInfo
.flags
= LVFI_PARAM
;
457 IndexInfo
.lParam
= lParam1
;
458 Index
= FindItem(-1, &IndexInfo
);
459 GetItemText(Index
, iSubItem
, Item1
.GetBuffer(MAX_STR_LEN
), MAX_STR_LEN
);
460 Item1
.ReleaseBuffer();
462 IndexInfo
.lParam
= lParam2
;
463 Index
= FindItem(-1, &IndexInfo
);
464 GetItemText(Index
, iSubItem
, Item2
.GetBuffer(MAX_STR_LEN
), MAX_STR_LEN
);
465 Item2
.ReleaseBuffer();
468 return Item2
== Item1
;
470 return Item1
== Item2
;
475 HWND
Create(HWND hwndParent
)
477 RECT r
= {205, 28, 465, 250};
478 DWORD style
= WS_CHILD
| WS_VISIBLE
| LVS_SORTASCENDING
| LVS_REPORT
| LVS_SINGLESEL
| LVS_SHOWSELALWAYS
;
479 HMENU menu
= GetSubMenu(LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATIONMENU
)), 0);
481 HWND hwnd
= CListView::Create(hwndParent
, r
, NULL
, style
, WS_EX_CLIENTEDGE
, menu
);
485 SetExtendedListViewStyle(LVS_EX_CHECKBOXES
| LVS_EX_FULLROWSELECT
);
491 BOOL
GetCheckState(INT item
)
493 return (BOOL
) (GetItemState(item
, LVIS_STATEIMAGEMASK
) >> 12) - 1;
496 VOID
SetCheckState(INT item
, BOOL fCheck
)
498 SetItemState(item
, INDEXTOSTATEIMAGEMASK((fCheck
) ? 2 : 1), LVIS_STATEIMAGEMASK
);
503 bHasAllChecked
= !bHasAllChecked
;
504 SetCheckState(-1, bHasAllChecked
);
507 ATL::CSimpleArray
<CAvailableApplicationInfo
*> GetCheckedItems()
509 ATL::CSimpleArray
<CAvailableApplicationInfo
*> list
;
510 for (INT i
= 0; i
>= 0; i
= GetNextItem(i
, LVNI_ALL
))
512 if (GetCheckState(i
) != FALSE
)
514 CAvailableApplicationInfo
* pAppInfo
= (CAvailableApplicationInfo
*) GetItemData(i
);
521 CAvailableApplicationInfo
* GetSelectedData()
523 INT item
= GetSelectionMark();
524 return (CAvailableApplicationInfo
*) GetItemData(item
);
528 class CSideTreeView
:
529 public CUiWindow
<CTreeView
>
531 HIMAGELIST hImageTreeView
= ImageList_Create(TREEVIEW_ICON_SIZE
, TREEVIEW_ICON_SIZE
,
532 GetSystemColorDepth() | ILC_MASK
,
536 HTREEITEM
AddItem(HTREEITEM hParent
, ATL::CStringW
&Text
, INT Image
, INT SelectedImage
, LPARAM lParam
)
538 return CUiWindow
<CTreeView
>::AddItem(hParent
, const_cast<LPWSTR
>(Text
.GetString()), Image
, SelectedImage
, lParam
);
541 HTREEITEM
AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
543 ATL::CStringW szText
;
547 hIcon
= (HICON
) LoadImageW(hInst
,
548 MAKEINTRESOURCE(IconIndex
),
552 LR_CREATEDIBSECTION
);
555 Index
= ImageList_AddIcon(hImageTreeView
, hIcon
);
559 szText
.LoadStringW(TextIndex
);
560 return AddItem(hRootItem
, szText
, Index
, Index
, TextIndex
);
563 HIMAGELIST
SetImageList()
565 return CUiWindow
<CTreeView
>::SetImageList(hImageTreeView
, TVSIL_NORMAL
);
568 VOID
DestroyImageList()
571 ImageList_Destroy(hImageTreeView
);
577 CUiWindow
<CTreeView
>::~CUiWindow();
585 VOID
SetText(LPCWSTR lpszText
)
587 SendMessageW(SB_SETTEXT
, SBT_NOBORDERS
, (LPARAM
) lpszText
);
590 HWND
Create(HWND hwndParent
)
593 m_hWnd
= CreateWindowExW(WS_EX_CLIENTEDGE
, L
"Edit", NULL
,
594 WS_CHILD
| WS_VISIBLE
| ES_LEFT
| ES_AUTOHSCROLL
,
596 hwndParent
, (HMENU
) NULL
,
599 SendMessageW(WM_SETFONT
, (WPARAM
) GetStockObject(DEFAULT_GUI_FONT
), 0);
600 szBuf
.LoadStringW(IDS_SEARCH_TEXT
);
601 SetWindowTextW(szBuf
);
608 public CWindowImpl
<CMainWindow
, CWindow
, CFrameWinTraits
>
610 CUiPanel
* m_ClientPanel
;
611 CUiSplitPanel
* m_VSplitter
;
612 CUiSplitPanel
* m_HSplitter
;
614 CMainToolbar
* m_Toolbar
;
615 CAppsListView
* m_ListView
;
617 CSideTreeView
* m_TreeView
;
618 CUiWindow
<CStatusBar
> * m_StatusBar
;
619 CUiWindow
<CRichEdit
> * m_RichEdit
;
621 CUiWindow
<CSearchBar
> * m_SearchBar
;
622 CAvailableApps m_AvailableApps
;
634 bSearchEnabled(FALSE
)
639 VOID
InitApplicationsList()
641 ATL::CStringW szText
;
643 /* Add columns to ListView */
644 szText
.LoadStringW(IDS_APP_NAME
);
645 m_ListView
->AddColumn(0, szText
, 200, LVCFMT_LEFT
);
647 szText
.LoadStringW(IDS_APP_INST_VERSION
);
648 m_ListView
->AddColumn(1, szText
, 90, LVCFMT_RIGHT
);
650 szText
.LoadStringW(IDS_APP_DESCRIPTION
);
651 m_ListView
->AddColumn(3, szText
, 250, LVCFMT_LEFT
);
653 // Unnesesary since the list updates on every TreeView selection
654 // UpdateApplicationsList(ENUM_ALL_COMPONENTS);
657 HTREEITEM
AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
659 return m_TreeView
->AddCategory(hRootItem
, TextIndex
, IconIndex
);
662 VOID
InitCategoriesList()
664 HTREEITEM hRootItem1
, hRootItem2
;
666 hRootItem1
= AddCategory(TVI_ROOT
, IDS_INSTALLED
, IDI_CATEGORY
);
667 AddCategory(hRootItem1
, IDS_APPLICATIONS
, IDI_APPS
);
668 AddCategory(hRootItem1
, IDS_UPDATES
, IDI_APPUPD
);
670 hRootItem2
= AddCategory(TVI_ROOT
, IDS_AVAILABLEFORINST
, IDI_CATEGORY
);
671 AddCategory(hRootItem2
, IDS_CAT_AUDIO
, IDI_CAT_AUDIO
);
672 AddCategory(hRootItem2
, IDS_CAT_VIDEO
, IDI_CAT_VIDEO
);
673 AddCategory(hRootItem2
, IDS_CAT_GRAPHICS
, IDI_CAT_GRAPHICS
);
674 AddCategory(hRootItem2
, IDS_CAT_GAMES
, IDI_CAT_GAMES
);
675 AddCategory(hRootItem2
, IDS_CAT_INTERNET
, IDI_CAT_INTERNET
);
676 AddCategory(hRootItem2
, IDS_CAT_OFFICE
, IDI_CAT_OFFICE
);
677 AddCategory(hRootItem2
, IDS_CAT_DEVEL
, IDI_CAT_DEVEL
);
678 AddCategory(hRootItem2
, IDS_CAT_EDU
, IDI_CAT_EDU
);
679 AddCategory(hRootItem2
, IDS_CAT_ENGINEER
, IDI_CAT_ENGINEER
);
680 AddCategory(hRootItem2
, IDS_CAT_FINANCE
, IDI_CAT_FINANCE
);
681 AddCategory(hRootItem2
, IDS_CAT_SCIENCE
, IDI_CAT_SCIENCE
);
682 AddCategory(hRootItem2
, IDS_CAT_TOOLS
, IDI_CAT_TOOLS
);
683 AddCategory(hRootItem2
, IDS_CAT_DRIVERS
, IDI_CAT_DRIVERS
);
684 AddCategory(hRootItem2
, IDS_CAT_LIBS
, IDI_CAT_LIBS
);
685 AddCategory(hRootItem2
, IDS_CAT_OTHER
, IDI_CAT_OTHER
);
687 m_TreeView
->SetImageList();
688 m_TreeView
->Expand(hRootItem1
, TVE_EXPAND
);
689 m_TreeView
->Expand(hRootItem2
, TVE_EXPAND
);
690 m_TreeView
->SelectItem(hRootItem1
);
693 BOOL
CreateStatusBar()
695 m_StatusBar
= new CUiWindow
<CStatusBar
>();
696 m_StatusBar
->m_VerticalAlignment
= UiAlign_RightBtm
;
697 m_StatusBar
->m_HorizontalAlignment
= UiAlign_Stretch
;
698 m_ClientPanel
->Children().Append(m_StatusBar
);
700 return m_StatusBar
->Create(m_hWnd
, (HMENU
) IDC_STATUSBAR
) != NULL
;
705 m_Toolbar
= new CMainToolbar();
706 m_Toolbar
->m_VerticalAlignment
= UiAlign_LeftTop
;
707 m_Toolbar
->m_HorizontalAlignment
= UiAlign_Stretch
;
708 m_ClientPanel
->Children().Append(m_Toolbar
);
710 return m_Toolbar
->Create(m_hWnd
) != NULL
;
713 BOOL
CreateTreeView()
715 m_TreeView
= new CSideTreeView();
716 m_TreeView
->m_VerticalAlignment
= UiAlign_Stretch
;
717 m_TreeView
->m_HorizontalAlignment
= UiAlign_Stretch
;
718 m_VSplitter
->First().Append(m_TreeView
);
720 return m_TreeView
->Create(m_hWnd
) != NULL
;
723 BOOL
CreateListView()
725 m_ListView
= new CAppsListView();
726 m_ListView
->m_VerticalAlignment
= UiAlign_Stretch
;
727 m_ListView
->m_HorizontalAlignment
= UiAlign_Stretch
;
728 m_HSplitter
->First().Append(m_ListView
);
730 hListView
= m_ListView
->Create(m_hWnd
);
731 return hListView
!= NULL
;
734 BOOL
CreateRichEdit()
736 m_RichEdit
= new CUiWindow
<CRichEdit
>();
737 m_RichEdit
->m_VerticalAlignment
= UiAlign_Stretch
;
738 m_RichEdit
->m_HorizontalAlignment
= UiAlign_Stretch
;
739 m_HSplitter
->Second().Append(m_RichEdit
);
741 return m_RichEdit
->Create(m_hWnd
) != NULL
;
744 BOOL
CreateVSplitter()
746 m_VSplitter
= new CUiSplitPanel();
747 m_VSplitter
->m_VerticalAlignment
= UiAlign_Stretch
;
748 m_VSplitter
->m_HorizontalAlignment
= UiAlign_Stretch
;
749 m_VSplitter
->m_DynamicFirst
= FALSE
;
750 m_VSplitter
->m_Horizontal
= FALSE
;
751 m_VSplitter
->m_MinFirst
= 240;
752 m_VSplitter
->m_MinSecond
= 300;
753 m_ClientPanel
->Children().Append(m_VSplitter
);
755 return m_VSplitter
->Create(m_hWnd
) != NULL
;
758 BOOL
CreateHSplitter()
760 m_HSplitter
= new CUiSplitPanel();
761 m_HSplitter
->m_VerticalAlignment
= UiAlign_Stretch
;
762 m_HSplitter
->m_HorizontalAlignment
= UiAlign_Stretch
;
763 m_HSplitter
->m_DynamicFirst
= TRUE
;
764 m_HSplitter
->m_Horizontal
= TRUE
;
765 m_HSplitter
->m_Pos
= 32768;
766 m_HSplitter
->m_MinFirst
= 300;
767 m_HSplitter
->m_MinSecond
= 150;
768 m_VSplitter
->Second().Append(m_HSplitter
);
770 return m_HSplitter
->Create(m_hWnd
) != NULL
;
773 BOOL
CreateSearchBar()
775 m_SearchBar
= new CUiWindow
<CSearchBar
>();
776 m_SearchBar
->m_VerticalAlignment
= UiAlign_LeftTop
;
777 m_SearchBar
->m_HorizontalAlignment
= UiAlign_RightBtm
;
778 m_SearchBar
->m_Margin
.top
= 6;
779 m_SearchBar
->m_Margin
.right
= 6;
781 return m_SearchBar
->Create(m_Toolbar
->m_hWnd
) != NULL
;
789 m_ClientPanel
= new CUiPanel();
790 m_ClientPanel
->m_VerticalAlignment
= UiAlign_Stretch
;
791 m_ClientPanel
->m_HorizontalAlignment
= UiAlign_Stretch
;
794 b
= b
&& CreateStatusBar();
795 b
= b
&& CreateToolbar();
796 b
= b
&& CreateSearchBar();
797 b
= b
&& CreateVSplitter();
800 b
= b
&& CreateHSplitter();
801 b
= b
&& CreateTreeView();
804 b
= b
&& CreateListView();
805 b
= b
&& CreateRichEdit();
812 /* Size status bar */
813 m_StatusBar
->SendMessageW(WM_SIZE
, 0, 0);
816 m_Toolbar
->AutoSize();
818 ::GetWindowRect(m_Toolbar
->m_hWnd
, &rTop
);
819 ::GetWindowRect(m_StatusBar
->m_hWnd
, &rBottom
);
821 m_VSplitter
->m_Margin
.top
= rTop
.bottom
- rTop
.top
;
822 m_VSplitter
->m_Margin
.bottom
= rBottom
.bottom
- rBottom
.top
;
834 InitApplicationsList();
835 InitCategoriesList();
838 UpdateStatusBarText();
846 VOID
OnSize(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
848 /* Size status bar */
849 m_StatusBar
->SendMessage(WM_SIZE
, 0, 0);
852 m_Toolbar
->AutoSize();
854 RECT r
= {0, 0, LOWORD(lParam
), HIWORD(lParam
)};
856 INT count
= m_ClientPanel
->CountSizableChildren();
858 hdwp
= BeginDeferWindowPos(count
);
861 hdwp
= m_ClientPanel
->OnParentSize(r
, hdwp
);
865 EndDeferWindowPos(hdwp
);
868 // TODO: Sub-layouts for children of children
869 count
= m_SearchBar
->CountSizableChildren();
870 hdwp
= BeginDeferWindowPos(count
);
873 hdwp
= m_SearchBar
->OnParentSize(r
, hdwp
);
877 EndDeferWindowPos(hdwp
);
881 BOOL
ProcessWindowMessage(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
& theResult
, DWORD dwMapId
)
888 ::PostMessage(hwnd
, WM_CLOSE
, 0, 0);
897 m_AvailableApps
.FreeCachedEntries();
899 if (IS_INSTALLED_ENUM(SelectedEnumType
))
900 FreeInstalledAppList();
902 delete m_ClientPanel
;
909 OnCommand(wParam
, lParam
);
914 LPNMHDR data
= (LPNMHDR
) lParam
;
920 if (data
->hwndFrom
== m_TreeView
->m_hWnd
)
922 switch (((LPNMTREEVIEW
) lParam
)->itemNew
.lParam
)
925 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
928 case IDS_APPLICATIONS
:
929 UpdateApplicationsList(ENUM_APPLICATIONS
);
933 UpdateApplicationsList(ENUM_UPDATES
);
936 case IDS_AVAILABLEFORINST
:
937 UpdateApplicationsList(ENUM_ALL_AVAILABLE
);
941 UpdateApplicationsList(ENUM_CAT_AUDIO
);
945 UpdateApplicationsList(ENUM_CAT_DEVEL
);
948 case IDS_CAT_DRIVERS
:
949 UpdateApplicationsList(ENUM_CAT_DRIVERS
);
953 UpdateApplicationsList(ENUM_CAT_EDU
);
956 case IDS_CAT_ENGINEER
:
957 UpdateApplicationsList(ENUM_CAT_ENGINEER
);
960 case IDS_CAT_FINANCE
:
961 UpdateApplicationsList(ENUM_CAT_FINANCE
);
965 UpdateApplicationsList(ENUM_CAT_GAMES
);
968 case IDS_CAT_GRAPHICS
:
969 UpdateApplicationsList(ENUM_CAT_GRAPHICS
);
972 case IDS_CAT_INTERNET
:
973 UpdateApplicationsList(ENUM_CAT_INTERNET
);
977 UpdateApplicationsList(ENUM_CAT_LIBS
);
981 UpdateApplicationsList(ENUM_CAT_OFFICE
);
985 UpdateApplicationsList(ENUM_CAT_OTHER
);
988 case IDS_CAT_SCIENCE
:
989 UpdateApplicationsList(ENUM_CAT_SCIENCE
);
993 UpdateApplicationsList(ENUM_CAT_TOOLS
);
997 UpdateApplicationsList(ENUM_CAT_VIDEO
);
1002 HMENU mainMenu
= ::GetMenu(hwnd
);
1003 HMENU lvwMenu
= ::GetMenu(m_ListView
->m_hWnd
);
1005 /* Disable/enable items based on treeview selection */
1006 if (IsSelectedNodeInstalled())
1008 EnableMenuItem(mainMenu
, ID_REGREMOVE
, MF_ENABLED
);
1009 EnableMenuItem(mainMenu
, ID_INSTALL
, MF_GRAYED
);
1010 EnableMenuItem(mainMenu
, ID_UNINSTALL
, MF_ENABLED
);
1011 EnableMenuItem(mainMenu
, ID_MODIFY
, MF_ENABLED
);
1013 EnableMenuItem(lvwMenu
, ID_REGREMOVE
, MF_ENABLED
);
1014 EnableMenuItem(lvwMenu
, ID_INSTALL
, MF_GRAYED
);
1015 EnableMenuItem(lvwMenu
, ID_UNINSTALL
, MF_ENABLED
);
1016 EnableMenuItem(lvwMenu
, ID_MODIFY
, MF_ENABLED
);
1018 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_REGREMOVE
, TRUE
);
1019 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_INSTALL
, FALSE
);
1020 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_UNINSTALL
, TRUE
);
1021 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_MODIFY
, TRUE
);
1025 EnableMenuItem(mainMenu
, ID_REGREMOVE
, MF_GRAYED
);
1026 EnableMenuItem(mainMenu
, ID_INSTALL
, MF_ENABLED
);
1027 EnableMenuItem(mainMenu
, ID_UNINSTALL
, MF_GRAYED
);
1028 EnableMenuItem(mainMenu
, ID_MODIFY
, MF_GRAYED
);
1030 EnableMenuItem(lvwMenu
, ID_REGREMOVE
, MF_GRAYED
);
1031 EnableMenuItem(lvwMenu
, ID_INSTALL
, MF_ENABLED
);
1032 EnableMenuItem(lvwMenu
, ID_UNINSTALL
, MF_GRAYED
);
1033 EnableMenuItem(lvwMenu
, ID_MODIFY
, MF_GRAYED
);
1035 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_REGREMOVE
, FALSE
);
1036 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_INSTALL
, TRUE
);
1037 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_UNINSTALL
, FALSE
);
1038 m_Toolbar
->SendMessageW(TB_ENABLEBUTTON
, ID_MODIFY
, FALSE
);
1043 case LVN_ITEMCHANGED
:
1045 LPNMLISTVIEW pnic
= (LPNMLISTVIEW
) lParam
;
1047 if (pnic
->hdr
.hwndFrom
== m_ListView
->m_hWnd
)
1049 /* Check if this is a valid item
1050 * (technically, it can be also an unselect) */
1051 INT ItemIndex
= pnic
->iItem
;
1052 if (ItemIndex
== -1 ||
1053 ItemIndex
>= ListView_GetItemCount(pnic
->hdr
.hwndFrom
))
1058 /* Check if the focus has been moved to another item */
1059 if ((pnic
->uChanged
& LVIF_STATE
) &&
1060 (pnic
->uNewState
& LVIS_FOCUSED
) &&
1061 !(pnic
->uOldState
& LVIS_FOCUSED
))
1063 if (IS_INSTALLED_ENUM(SelectedEnumType
))
1064 ShowInstalledAppInfo(ItemIndex
);
1065 if (IsAvailableEnum(SelectedEnumType
))
1066 CAvailableAppView::ShowAvailableAppInfo(ItemIndex
);
1068 /* Check if the item is checked */
1069 if ((pnic
->uNewState
& LVIS_STATEIMAGEMASK
) && !bUpdating
)
1071 BOOL checked
= ListView_GetCheckState(pnic
->hdr
.hwndFrom
, pnic
->iItem
);
1073 - preventing decremention below zero as a safeguard for ReactOS
1074 In ReactOS this action is triggered whenever user changes *selection*, but should be only when *checkbox* state toggled
1075 Maybe LVIS_STATEIMAGEMASK is set incorrectly
1080 : ((nSelectedApps
> 0)
1083 UpdateStatusBarText();
1089 case LVN_COLUMNCLICK
:
1091 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
1093 m_ListView
->ColumnClick(pnmv
);
1099 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
1101 if (IS_INSTALLED_ENUM(SelectedEnumType
))
1102 ShowInstalledAppInfo(-1);
1103 if (IsAvailableEnum(SelectedEnumType
))
1104 CAvailableAppView::ShowAvailableAppInfo(-1);
1111 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
1113 /* this won't do anything if the program is already installed */
1114 SendMessageW(hwnd
, WM_COMMAND
, ID_INSTALL
, 0);
1121 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
1123 ShowPopupMenu(m_ListView
->m_hWnd
, 0, ID_INSTALL
);
1129 OnLink((ENLINK
*) lParam
);
1132 case TTN_GETDISPINFO
:
1133 m_Toolbar
->OnGetDispInfo((LPTOOLTIPTEXT
) lParam
);
1140 OnSize(hwnd
, wParam
, lParam
);
1145 LPRECT pRect
= (LPRECT
) lParam
;
1147 if (pRect
->right
- pRect
->left
< 565)
1148 pRect
->right
= pRect
->left
+ 565;
1150 if (pRect
->bottom
- pRect
->top
< 300)
1151 pRect
->bottom
= pRect
->top
+ 300;
1156 case WM_SYSCOLORCHANGE
:
1158 /* Forward WM_SYSCOLORCHANGE to common controls */
1159 m_ListView
->SendMessageW(WM_SYSCOLORCHANGE
, 0, 0);
1160 m_TreeView
->SendMessageW(WM_SYSCOLORCHANGE
, 0, 0);
1161 m_Toolbar
->SendMessageW(WM_SYSCOLORCHANGE
, 0, 0);
1162 m_ListView
->SendMessageW(EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
1167 if (wParam
== SEARCH_TIMER_ID
)
1169 ::KillTimer(hwnd
, SEARCH_TIMER_ID
);
1171 UpdateApplicationsList(-1);
1179 virtual VOID
OnLink(ENLINK
*Link
)
1186 if (pLink
) HeapFree(GetProcessHeap(), 0, pLink
);
1188 pLink
= (LPWSTR
) HeapAlloc(GetProcessHeap(), 0,
1189 (max(Link
->chrg
.cpMin
, Link
->chrg
.cpMax
) -
1190 min(Link
->chrg
.cpMin
, Link
->chrg
.cpMax
) + 1) * sizeof(WCHAR
));
1193 /* TODO: Error message */
1197 m_RichEdit
->SendMessageW(EM_SETSEL
, Link
->chrg
.cpMin
, Link
->chrg
.cpMax
);
1198 m_RichEdit
->SendMessageW(EM_GETSELTEXT
, 0, (LPARAM
) pLink
);
1200 ShowPopupMenu(m_RichEdit
->m_hWnd
, IDR_LINKMENU
, -1);
1206 BOOL
IsSelectedNodeInstalled()
1208 HTREEITEM hSelectedItem
= m_TreeView
->GetSelection();
1211 tItem
.mask
= TVIF_PARAM
| TVIF_HANDLE
;
1212 tItem
.hItem
= hSelectedItem
;
1213 m_TreeView
->GetItem(&tItem
);
1214 switch (tItem
.lParam
)
1217 case IDS_APPLICATIONS
:
1225 VOID
OnCommand(WPARAM wParam
, LPARAM lParam
)
1227 WORD wCommand
= LOWORD(wParam
);
1229 if (lParam
== (LPARAM
) m_SearchBar
->m_hWnd
)
1231 ATL::CStringW szBuf
;
1233 switch (HIWORD(wParam
))
1237 ATL::CStringW szWndText
;
1239 szBuf
.LoadStringW(IDS_SEARCH_TEXT
);
1240 m_SearchBar
->GetWindowTextW(szWndText
);
1241 if (szBuf
== szWndText
)
1243 bSearchEnabled
= FALSE
;
1244 m_SearchBar
->SetWindowTextW(L
"");
1251 m_SearchBar
->GetWindowTextW(szBuf
);
1252 if (szBuf
.IsEmpty())
1254 szBuf
.LoadStringW(IDS_SEARCH_TEXT
);
1255 bSearchEnabled
= FALSE
;
1256 m_SearchBar
->SetWindowTextW(szBuf
.GetString());
1263 ATL::CStringW szWndText
;
1265 if (!bSearchEnabled
)
1267 bSearchEnabled
= TRUE
;
1271 szBuf
.LoadStringW(IDS_SEARCH_TEXT
);
1272 m_SearchBar
->GetWindowTextW(szWndText
);
1273 if (szBuf
== szWndText
)
1275 szSearchPattern
.Empty();
1279 szSearchPattern
= szWndText
;
1283 SystemParametersInfoW(SPI_GETMENUSHOWDELAY
, 0, &dwDelay
, 0);
1284 SetTimer(SEARCH_TIMER_ID
, dwDelay
);
1295 ShellExecuteW(m_hWnd
, L
"open", pLink
, NULL
, NULL
, SW_SHOWNOACTIVATE
);
1296 HeapFree(GetProcessHeap(), 0, pLink
);
1300 CopyTextToClipboard(pLink
);
1301 HeapFree(GetProcessHeap(), 0, pLink
);
1305 CreateSettingsDlg(m_hWnd
);
1309 PostMessageW(WM_CLOSE
, 0, 0);
1313 if (IsAvailableEnum(SelectedEnumType
))
1315 if (nSelectedApps
> 0)
1317 CDownloadManager::DownloadListOfApplications(m_ListView
->GetCheckedItems());
1318 UpdateApplicationsList(-1);
1320 else if (CDownloadManager::DownloadApplication(m_ListView
->GetSelectedData()))
1322 UpdateApplicationsList(-1);
1329 if (UninstallApplication(-1, FALSE
))
1330 UpdateApplicationsList(-1);
1334 if (UninstallApplication(-1, TRUE
))
1335 UpdateApplicationsList(-1);
1339 RemoveAppFromRegistry(-1);
1343 UpdateApplicationsList(-1);
1347 CAvailableApps::ForceUpdateAppsDB();
1348 UpdateApplicationsList(-1);
1352 MessageBoxW(L
"Help not implemented yet", NULL
, MB_OK
);
1360 m_ListView
->CheckAll();
1365 VOID
FreeInstalledAppList()
1367 INT Count
= m_ListView
->GetItemCount() - 1;
1368 PINSTALLED_INFO Info
;
1372 Info
= (PINSTALLED_INFO
) ListViewGetlParam(Count
);
1375 RegCloseKey(Info
->hSubKey
);
1382 static BOOL
SearchPatternMatch(PCWSTR szHaystack
, PCWSTR szNeedle
)
1386 /* TODO: Improve pattern search beyond a simple case-insensitive substring search. */
1387 return StrStrIW(szHaystack
, szNeedle
) != NULL
;
1390 static BOOL CALLBACK
s_EnumInstalledAppProc(INT ItemIndex
, ATL::CStringW
&szName
, PINSTALLED_INFO Info
)
1392 PINSTALLED_INFO ItemInfo
;
1393 ATL::CStringW szText
;
1396 if (!SearchPatternMatch(szName
.GetString(), szSearchPattern
))
1398 RegCloseKey(Info
->hSubKey
);
1402 ItemInfo
= new INSTALLED_INFO(*Info
);
1405 RegCloseKey(Info
->hSubKey
);
1409 Index
= ListViewAddItem(ItemIndex
, 0, szName
, (LPARAM
) ItemInfo
);
1411 /* Get version info */
1412 GetApplicationString(ItemInfo
->hSubKey
, L
"DisplayVersion", szText
);
1413 ListView_SetItemText(hListView
, Index
, 1, const_cast<LPWSTR
>(szText
.GetString()));
1416 GetApplicationString(ItemInfo
->hSubKey
, L
"Comments", szText
);
1417 ListView_SetItemText(hListView
, Index
, 2, const_cast<LPWSTR
>(szText
.GetString()));
1422 static BOOL CALLBACK
s_EnumAvailableAppProc(CAvailableApplicationInfo
* Info
, LPCWSTR szFolderPath
)
1427 HIMAGELIST hImageListView
= ListView_GetImageList(hListView
, LVSIL_SMALL
);
1429 if (!SearchPatternMatch(Info
->szName
, szSearchPattern
) &&
1430 !SearchPatternMatch(Info
->szDesc
, szSearchPattern
))
1435 /* Load icon from file */
1436 ATL::CStringW szIconPath
;
1437 szIconPath
.Format(L
"%lsicons\\%ls.ico", szFolderPath
, Info
->szName
);
1438 hIcon
= (HICON
) LoadImageW(NULL
,
1439 szIconPath
.GetString(),
1445 if (!hIcon
|| GetLastError() != ERROR_SUCCESS
)
1447 /* Load default icon */
1448 hIcon
= (HICON
) LoadIconW(hInst
, MAKEINTRESOURCEW(IDI_MAIN
));
1451 Index
= ImageList_AddIcon(hImageListView
, hIcon
);
1454 Index
= ListViewAddItem(Info
->Category
, Index
, Info
->szName
, (LPARAM
) Info
);
1455 ListView_SetImageList(hListView
, hImageListView
, LVSIL_SMALL
);
1457 ListView_SetItemText(hListView
, Index
, 1, const_cast<LPWSTR
>(Info
->szVersion
.GetString()));
1458 ListView_SetItemText(hListView
, Index
, 2, const_cast<LPWSTR
>(Info
->szDesc
.GetString()));
1463 VOID
UpdateStatusBarText()
1467 ATL::CStringW szBuffer
;
1469 szBuffer
.Format(IDS_APPS_COUNT
, m_ListView
->GetItemCount(), nSelectedApps
);
1470 m_StatusBar
->SetText(szBuffer
);
1474 VOID
UpdateApplicationsList(INT EnumType
)
1476 ATL::CStringW szBuffer1
, szBuffer2
;
1477 HIMAGELIST hImageListView
;
1480 m_ListView
->SetRedraw(FALSE
);
1483 if (EnumType
< 0) EnumType
= SelectedEnumType
;
1485 if (IS_INSTALLED_ENUM(SelectedEnumType
))
1487 FreeInstalledAppList();
1490 m_ListView
->DeleteAllItems();
1492 /* Create new ImageList */
1493 hImageListView
= ImageList_Create(LISTVIEW_ICON_SIZE
,
1495 GetSystemColorDepth() | ILC_MASK
,
1497 HIMAGELIST hImageListBuf
= m_ListView
->SetImageList(hImageListView
, LVSIL_SMALL
);
1500 ImageList_Destroy(hImageListBuf
);
1503 if (IS_INSTALLED_ENUM(EnumType
))
1505 HICON hIcon
= (HICON
) LoadIconW(hInst
, MAKEINTRESOURCEW(IDI_MAIN
));
1506 ImageList_AddIcon(hImageListView
, hIcon
);
1508 /* Enum installed applications and updates */
1509 EnumInstalledApplications(EnumType
, TRUE
, s_EnumInstalledAppProc
);
1510 EnumInstalledApplications(EnumType
, FALSE
, s_EnumInstalledAppProc
);
1512 else if (IsAvailableEnum(EnumType
))
1514 /* Enum available applications */
1515 m_AvailableApps
.EnumAvailableApplications(EnumType
, s_EnumAvailableAppProc
);
1518 SelectedEnumType
= EnumType
;
1519 UpdateStatusBarText();
1522 /* Set automatic column width for program names if the list is not empty */
1523 if (m_ListView
->GetItemCount() > 0)
1525 ListView_SetColumnWidth(m_ListView
->GetWindow(), 0, LVSCW_AUTOSIZE
);
1529 m_ListView
->SetRedraw(TRUE
);
1533 static ATL::CWndClassInfo
& GetWndClassInfo()
1535 DWORD csStyle
= CS_VREDRAW
| CS_HREDRAW
;
1536 static ATL::CWndClassInfo wc
=
1545 LoadIconW(_AtlBaseModule
.GetModuleInstance(), MAKEINTRESOURCEW(IDI_MAIN
)),
1546 LoadCursorW(NULL
, IDC_ARROW
),
1547 (HBRUSH
) (COLOR_BTNFACE
+ 1),
1548 MAKEINTRESOURCEW(IDR_MAINMENU
),
1552 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
1559 ATL::CStringW szWindowName
;
1560 szWindowName
.LoadStringW(IDS_APPTITLE
);
1563 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Left
: CW_USEDEFAULT
),
1564 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Top
: CW_USEDEFAULT
),
1565 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Width
: 680),
1566 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Height
: 450)
1571 return CWindowImpl::Create(NULL
, r
, szWindowName
.GetString(), WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_WINDOWEDGE
);
1574 CStatusBar
* GetStatusBar()
1579 CAppsListView
* GetListView()
1584 CRichEdit
* GetRichEdit()
1589 CAvailableApps
* GetAvailableApps()
1591 return &m_AvailableApps
;
1597 CMainWindow
* g_MainWindow
;
1599 HWND
CreateMainWindow()
1601 g_MainWindow
= new CMainWindow();
1602 return g_MainWindow
->Create();
1605 DWORD_PTR
ListViewGetlParam(INT item
)
1609 item
= g_MainWindow
->GetListView()->GetSelectionMark();
1611 return g_MainWindow
->GetListView()->GetItemData(item
);
1614 VOID
SetStatusBarText(LPCWSTR szText
)
1616 g_MainWindow
->GetStatusBar()->SetText(szText
);
1619 INT
ListViewAddItem(INT ItemIndex
, INT IconIndex
, LPWSTR lpName
, LPARAM lParam
)
1621 return g_MainWindow
->GetListView()->AddItem(ItemIndex
, IconIndex
, lpName
, lParam
);
1624 VOID
NewRichEditText(LPCWSTR szText
, DWORD flags
)
1626 g_MainWindow
->GetRichEdit()->SetText(szText
, flags
);
1629 VOID
InsertRichEditText(LPCWSTR szText
, DWORD flags
)
1631 g_MainWindow
->GetRichEdit()->InsertText(szText
, flags
);
1634 /* ATL version of functions */
1635 VOID
SetStatusBarText(const ATL::CStringW
& szText
)
1637 SetStatusBarText(szText
.GetString());
1640 INT
ListViewAddItem(INT ItemIndex
, INT IconIndex
, const ATL::CStringW
& Name
, LPARAM lParam
)
1642 return ListViewAddItem(ItemIndex
, IconIndex
, const_cast<LPWSTR
>(Name
.GetString()), lParam
);
1645 VOID
NewRichEditText(const ATL::CStringW
& szText
, DWORD flags
)
1647 NewRichEditText(szText
.GetString(), flags
);
1650 VOID
InsertRichEditText(const ATL::CStringW
& szText
, DWORD flags
)
1652 InsertRichEditText(szText
.GetString(), flags
);
1655 CAvailableApps
* GetAvailableApps()
1657 return g_MainWindow
->GetAvailableApps();