1 /* PROJECT: ReactOS CE Applications Manager
2 * LICENSE: GPL - See COPYING in the top level directory
3 * AUTHORS: David Quintana <gigaherz@gmail.com>
8 #include <shlobj_undoc.h>
9 #include <shlguid_undoc.h>
15 #include <shellutils.h>
23 HWND hListView
= NULL
;
25 VOID
UpdateApplicationsList(INT EnumType
);
26 VOID
MainWndOnCommand(HWND hwnd
, WPARAM wParam
, LPARAM lParam
);
27 BOOL
IsSelectedNodeInstalled(void);
28 VOID
FreeInstalledAppList(VOID
);
31 public CUiWindow
< CWindowImplBaseT
<CWindow
> >
33 BOOL
ProcessWindowMessage(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
& theResult
, DWORD dwMapId
)
40 VOID
SetRangeFormatting(LONG Start
, LONG End
, DWORD dwEffects
)
42 CHARFORMAT2 CharFormat
;
44 SendMessageW(EM_SETSEL
, Start
, End
);
46 ZeroMemory(&CharFormat
, sizeof(CHARFORMAT2
));
48 CharFormat
.cbSize
= sizeof(CHARFORMAT2
);
49 CharFormat
.dwMask
= dwEffects
;
50 CharFormat
.dwEffects
= dwEffects
;
52 SendMessageW(EM_SETCHARFORMAT
, SCF_WORD
| SCF_SELECTION
, (LPARAM
) &CharFormat
);
54 SendMessageW(EM_SETSEL
, End
, End
+ 1);
59 GETTEXTLENGTHEX TxtLenStruct
;
61 TxtLenStruct
.flags
= GTL_NUMCHARS
;
62 TxtLenStruct
.codepage
= 1200;
64 return (LONG
) SendMessageW(EM_GETTEXTLENGTHEX
, (WPARAM
) &TxtLenStruct
, 0);
68 * Insert text (without cleaning old text)
75 VOID
InsertText(LPCWSTR lpszText
, DWORD dwEffects
)
78 LONG Len
= GetTextLen();
81 SetText
.flags
= ST_SELECTION
;
82 SetText
.codepage
= 1200;
84 SendMessageW(EM_SETTEXTEX
, (WPARAM
) &SetText
, (LPARAM
) lpszText
);
86 SetRangeFormatting(Len
, Len
+ wcslen(lpszText
),
87 (dwEffects
== CFM_LINK
) ? (PathIsURLW(lpszText
) ? dwEffects
: 0) : dwEffects
);
91 * Clear old text and add new
93 VOID
SetText(LPCWSTR lpszText
, DWORD dwEffects
)
96 InsertText(lpszText
, dwEffects
);
99 VOID
OnLink(ENLINK
*Link
)
106 if (pLink
) HeapFree(GetProcessHeap(), 0, pLink
);
108 pLink
= (PWSTR
) HeapAlloc(GetProcessHeap(), 0,
109 (max(Link
->chrg
.cpMin
, Link
->chrg
.cpMax
) -
110 min(Link
->chrg
.cpMin
, Link
->chrg
.cpMax
) + 1) * sizeof(WCHAR
));
113 /* TODO: Error message */
117 SendMessageW(EM_SETSEL
, Link
->chrg
.cpMin
, Link
->chrg
.cpMax
);
118 SendMessageW(EM_GETSELTEXT
, 0, (LPARAM
) pLink
);
120 ShowPopupMenu(m_hWnd
, IDR_LINKMENU
, -1);
126 HWND
Create(HWND hwndParent
)
128 LoadLibraryW(L
"riched20.dll");
130 HWND hwnd
= CreateWindowExW(0,
133 WS_CHILD
| WS_VISIBLE
| ES_MULTILINE
|
134 ES_LEFT
| ES_READONLY
,
141 SubclassWindow(hwnd
);
145 SendMessageW(EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
146 SendMessageW(WM_SETFONT
, (WPARAM
) GetStockObject(DEFAULT_GUI_FONT
), 0);
147 SendMessageW(EM_SETEVENTMASK
, 0, ENM_LINK
| ENM_MOUSEEVENTS
);
148 SendMessageW(EM_SHOWSCROLLBAR
, SB_VERT
, TRUE
);
157 public CUiWindow
<CListView
>
173 VOID
ColumnClick(LPNMLISTVIEW pnmv
)
175 SortContext ctx
= { this, pnmv
->iSubItem
};
177 SortItems(s_CompareFunc
, &ctx
);
179 bAscending
= !bAscending
;
182 PVOID
GetLParam(INT Index
)
189 ItemIndex
= (INT
) SendMessage(LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
198 ZeroMemory(&Item
, sizeof(LVITEM
));
200 Item
.mask
= LVIF_PARAM
;
201 Item
.iItem
= ItemIndex
;
205 return (PVOID
) Item
.lParam
;
208 BOOL
AddColumn(INT Index
, LPWSTR lpText
, INT Width
, INT Format
)
212 ZeroMemory(&Column
, sizeof(LV_COLUMN
));
214 Column
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_WIDTH
| LVCF_SUBITEM
;
215 Column
.iSubItem
= Index
;
216 Column
.pszText
= (LPTSTR
) lpText
;
220 return (InsertColumn(Index
, &Column
) == -1) ? FALSE
: TRUE
;
223 INT
AddItem(INT ItemIndex
, INT IconIndex
, LPWSTR lpText
, LPARAM lParam
)
227 ZeroMemory(&Item
, sizeof(LV_ITEM
));
229 Item
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
230 Item
.pszText
= lpText
;
231 Item
.lParam
= lParam
;
232 Item
.iItem
= ItemIndex
;
233 Item
.iImage
= IconIndex
;
235 return InsertItem(&Item
);
238 static INT CALLBACK
s_CompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
240 SortContext
* ctx
= ((SortContext
*) lParamSort
);
241 return ctx
->lvw
->CompareFunc(lParam1
, lParam2
, ctx
->iSubItem
);
244 INT
CompareFunc(LPARAM lParam1
, LPARAM lParam2
, INT iSubItem
)
246 WCHAR Item1
[MAX_STR_LEN
], Item2
[MAX_STR_LEN
];
247 LVFINDINFO IndexInfo
;
250 IndexInfo
.flags
= LVFI_PARAM
;
252 IndexInfo
.lParam
= lParam1
;
253 Index
= FindItem(-1, &IndexInfo
);
254 GetItemText(Index
, iSubItem
, Item1
, sizeof(Item1
) / sizeof(WCHAR
));
256 IndexInfo
.lParam
= lParam2
;
257 Index
= FindItem(-1, &IndexInfo
);
258 GetItemText(Index
, iSubItem
, Item2
, sizeof(Item2
) / sizeof(WCHAR
));
261 return wcscmp(Item2
, Item1
);
263 return wcscmp(Item1
, Item2
);
268 HWND
Create(HWND hwndParent
)
270 RECT r
= { 205, 28, 465, 250 };
271 DWORD style
= WS_CHILD
| WS_VISIBLE
| LVS_SORTASCENDING
| LVS_REPORT
| LVS_SINGLESEL
| LVS_SHOWSELALWAYS
;
272 HMENU menu
= GetSubMenu(LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATIONMENU
)), 0);
274 HWND hwnd
= CListView::Create(hwndParent
, r
, NULL
, style
, WS_EX_CLIENTEDGE
, menu
);
277 SetExtendedListViewStyle(LVS_EX_FULLROWSELECT
);
285 public CUiWindow
<CStatusBar
>
289 class CUiMainWindow
:
290 public CWindowImpl
<CUiMainWindow
, CWindow
, CFrameWinTraits
>
292 CUiPanel
* m_ClientPanel
;
294 CUiWindow
<> * m_Toolbar
;
295 CUiWindow
<> * m_TreeView
;
296 CUiWindow
<> * m_SearchBar
;
297 CUiStatusBar
* m_StatusBar
;
298 CUiListView
* m_ListView
;
299 CUiRichEdit
* m_RichEdit
;
300 CUiSplitPanel
* m_VSplitter
;
301 CUiSplitPanel
* m_HSplitter
;
303 HIMAGELIST hImageTreeView
;
305 VOID
InitApplicationsList(VOID
)
307 WCHAR szText
[MAX_STR_LEN
];
309 /* Add columns to ListView */
310 LoadStringW(hInst
, IDS_APP_NAME
, szText
, _countof(szText
));
311 m_ListView
->AddColumn(0, szText
, 200, LVCFMT_LEFT
);
313 LoadStringW(hInst
, IDS_APP_INST_VERSION
, szText
, _countof(szText
));
314 m_ListView
->AddColumn(1, szText
, 90, LVCFMT_RIGHT
);
316 LoadStringW(hInst
, IDS_APP_DESCRIPTION
, szText
, _countof(szText
));
317 m_ListView
->AddColumn(3, szText
, 250, LVCFMT_LEFT
);
319 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
322 HTREEITEM
AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
324 WCHAR szText
[MAX_STR_LEN
];
328 hIcon
= (HICON
) LoadImage(hInst
,
329 MAKEINTRESOURCE(IconIndex
),
333 LR_CREATEDIBSECTION
);
335 Index
= ImageList_AddIcon(hImageTreeView
, hIcon
);
338 LoadStringW(hInst
, TextIndex
, szText
, _countof(szText
));
340 return TreeViewAddItem(hRootItem
, szText
, Index
, Index
, TextIndex
);
343 VOID
InitCategoriesList(VOID
)
345 HTREEITEM hRootItem1
, hRootItem2
;
347 hRootItem1
= AddCategory(TVI_ROOT
, IDS_INSTALLED
, IDI_CATEGORY
);
348 AddCategory(hRootItem1
, IDS_APPLICATIONS
, IDI_APPS
);
349 AddCategory(hRootItem1
, IDS_UPDATES
, IDI_APPUPD
);
351 hRootItem2
= AddCategory(TVI_ROOT
, IDS_AVAILABLEFORINST
, IDI_CATEGORY
);
352 AddCategory(hRootItem2
, IDS_CAT_AUDIO
, IDI_CAT_AUDIO
);
353 AddCategory(hRootItem2
, IDS_CAT_VIDEO
, IDI_CAT_VIDEO
);
354 AddCategory(hRootItem2
, IDS_CAT_GRAPHICS
, IDI_CAT_GRAPHICS
);
355 AddCategory(hRootItem2
, IDS_CAT_GAMES
, IDI_CAT_GAMES
);
356 AddCategory(hRootItem2
, IDS_CAT_INTERNET
, IDI_CAT_INTERNET
);
357 AddCategory(hRootItem2
, IDS_CAT_OFFICE
, IDI_CAT_OFFICE
);
358 AddCategory(hRootItem2
, IDS_CAT_DEVEL
, IDI_CAT_DEVEL
);
359 AddCategory(hRootItem2
, IDS_CAT_EDU
, IDI_CAT_EDU
);
360 AddCategory(hRootItem2
, IDS_CAT_ENGINEER
, IDI_CAT_ENGINEER
);
361 AddCategory(hRootItem2
, IDS_CAT_FINANCE
, IDI_CAT_FINANCE
);
362 AddCategory(hRootItem2
, IDS_CAT_SCIENCE
, IDI_CAT_SCIENCE
);
363 AddCategory(hRootItem2
, IDS_CAT_TOOLS
, IDI_CAT_TOOLS
);
364 AddCategory(hRootItem2
, IDS_CAT_DRIVERS
, IDI_CAT_DRIVERS
);
365 AddCategory(hRootItem2
, IDS_CAT_LIBS
, IDI_CAT_LIBS
);
366 AddCategory(hRootItem2
, IDS_CAT_OTHER
, IDI_CAT_OTHER
);
368 (VOID
) TreeView_SetImageList(hTreeView
, hImageTreeView
, TVSIL_NORMAL
);
370 (VOID
) TreeView_Expand(hTreeView
, hRootItem2
, TVE_EXPAND
);
371 (VOID
) TreeView_Expand(hTreeView
, hRootItem1
, TVE_EXPAND
);
373 (VOID
) TreeView_SelectItem(hTreeView
, hRootItem1
);
376 BOOL
CreateStatusBar()
378 m_StatusBar
= new CUiStatusBar();
379 m_StatusBar
->m_VerticalAlignment
= UiAlign_RightBtm
;
380 m_StatusBar
->m_HorizontalAlignment
= UiAlign_Stretch
;
381 m_ClientPanel
->Children().Append(m_StatusBar
);
383 return m_StatusBar
->Create(m_hWnd
, (HMENU
)IDC_STATUSBAR
) != NULL
;
389 m_Toolbar
= new CUiWindow
<>();
390 m_Toolbar
->m_VerticalAlignment
= UiAlign_LeftTop
;
391 m_Toolbar
->m_HorizontalAlignment
= UiAlign_Stretch
;
392 m_ClientPanel
->Children().Append(m_Toolbar
);
394 CreateToolBar(m_hWnd
);
395 m_Toolbar
->m_hWnd
= hToolBar
;
397 return hToolBar
!= NULL
;
400 BOOL
CreateTreeView()
403 m_TreeView
= new CUiWindow
<>();
404 m_TreeView
->m_VerticalAlignment
= UiAlign_Stretch
;
405 m_TreeView
->m_HorizontalAlignment
= UiAlign_Stretch
;
406 m_VSplitter
->First().Append(m_TreeView
);
408 ::CreateTreeView(m_hWnd
);
409 m_TreeView
->m_hWnd
= hTreeView
;
411 return hTreeView
!= NULL
;
414 BOOL
CreateListView()
416 m_ListView
= new CUiListView();
417 m_ListView
->m_VerticalAlignment
= UiAlign_Stretch
;
418 m_ListView
->m_HorizontalAlignment
= UiAlign_Stretch
;
419 m_HSplitter
->First().Append(m_ListView
);
421 hListView
= m_ListView
->Create(m_hWnd
);
422 return hListView
!= NULL
;
425 BOOL
CreateRichEdit()
427 m_RichEdit
= new CUiRichEdit();
428 m_RichEdit
->m_VerticalAlignment
= UiAlign_Stretch
;
429 m_RichEdit
->m_HorizontalAlignment
= UiAlign_Stretch
;
430 m_HSplitter
->Second().Append(m_RichEdit
);
432 return m_RichEdit
->Create(m_hWnd
) != NULL
;
435 BOOL
CreateVSplitter()
437 m_VSplitter
= new CUiSplitPanel();
438 m_VSplitter
->m_VerticalAlignment
= UiAlign_Stretch
;
439 m_VSplitter
->m_HorizontalAlignment
= UiAlign_Stretch
;
440 m_VSplitter
->m_DynamicFirst
= FALSE
;
441 m_VSplitter
->m_Horizontal
= FALSE
;
442 m_VSplitter
->m_MinFirst
= 240;
443 m_VSplitter
->m_MinSecond
= 300;
444 m_ClientPanel
->Children().Append(m_VSplitter
);
446 return m_VSplitter
->Create(m_hWnd
) != NULL
;
449 BOOL
CreateHSplitter()
451 m_HSplitter
= new CUiSplitPanel();
452 m_HSplitter
->m_VerticalAlignment
= UiAlign_Stretch
;
453 m_HSplitter
->m_HorizontalAlignment
= UiAlign_Stretch
;
454 m_HSplitter
->m_DynamicFirst
= TRUE
;
455 m_HSplitter
->m_Horizontal
= TRUE
;
456 m_HSplitter
->m_Pos
= 32768;
457 m_HSplitter
->m_MinFirst
= 300;
458 m_HSplitter
->m_MinSecond
= 80;
459 m_VSplitter
->Second().Append(m_HSplitter
);
461 return m_HSplitter
->Create(m_hWnd
) != NULL
;
464 BOOL
CreateSearchBar(VOID
)
466 WCHAR szBuf
[MAX_STR_LEN
];
469 m_SearchBar
= new CUiWindow
<>();
470 m_SearchBar
->m_VerticalAlignment
= UiAlign_LeftTop
;
471 m_SearchBar
->m_HorizontalAlignment
= UiAlign_RightBtm
;
472 m_SearchBar
->m_Margin
.top
= 6;
473 m_SearchBar
->m_Margin
.right
= 6;
474 //m_ClientPanel->Children().Append(m_SearchBar);
476 hSearchBar
= CreateWindowExW(WS_EX_CLIENTEDGE
,
479 WS_CHILD
| WS_VISIBLE
| ES_LEFT
| ES_AUTOHSCROLL
,
489 m_SearchBar
->m_hWnd
= hSearchBar
;
491 m_SearchBar
->SendMessageW(WM_SETFONT
, (WPARAM
) GetStockObject(DEFAULT_GUI_FONT
), 0);
493 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
494 m_SearchBar
->SetWindowTextW(szBuf
);
496 return hSearchBar
!= NULL
;
503 m_ClientPanel
= new CUiPanel();
504 m_ClientPanel
->m_VerticalAlignment
= UiAlign_Stretch
;
505 m_ClientPanel
->m_HorizontalAlignment
= UiAlign_Stretch
;
508 b
= b
&& CreateStatusBar();
509 b
= b
&& CreateToolbar();
510 b
= b
&& CreateSearchBar();
511 b
= b
&& CreateVSplitter();
514 b
= b
&& CreateHSplitter();
515 b
= b
&& CreateTreeView();
518 b
= b
&& CreateListView();
519 b
= b
&& CreateRichEdit();
526 /* Size status bar */
527 m_StatusBar
->SendMessage(WM_SIZE
, 0, 0);
530 SendMessage(hToolBar
, TB_AUTOSIZE
, 0, 0);
532 ::GetWindowRect(m_Toolbar
->m_hWnd
, &rTop
);
533 ::GetWindowRect(m_StatusBar
->m_hWnd
, &rBottom
);
535 m_VSplitter
->m_Margin
.left
= 3;
536 m_VSplitter
->m_Margin
.right
= 3;
537 m_VSplitter
->m_Margin
.top
= rTop
.bottom
- rTop
.top
+ 3;
538 m_VSplitter
->m_Margin
.bottom
= rBottom
.bottom
-rBottom
.top
+ 3;
546 /* Create image list */
547 hImageTreeView
= ImageList_Create(TREEVIEW_ICON_SIZE
, TREEVIEW_ICON_SIZE
,
548 GetSystemColorDepth() | ILC_MASK
,
553 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
555 InitApplicationsList();
557 InitCategoriesList();
559 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, _countof(szBuffer2
));
560 StringCbPrintfW(szBuffer1
, sizeof(szBuffer1
),
562 m_ListView
->GetItemCount());
563 m_StatusBar
->SetText(szBuffer1
);
570 VOID
OnSize(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
572 /* Size status bar */
573 m_StatusBar
->SendMessage(WM_SIZE
, 0, 0);
576 SendMessage(hToolBar
, TB_AUTOSIZE
, 0, 0);
579 RECT r
= { 0, 0, LOWORD(lParam
), HIWORD(lParam
) };
583 int count
= m_ClientPanel
->CountSizableChildren();
584 hdwp
= BeginDeferWindowPos(count
);
585 hdwp
= m_ClientPanel
->OnParentSize(r
, hdwp
);
586 EndDeferWindowPos(hdwp
);
588 // TODO: Sub-layouts for children of children
589 count
= m_SearchBar
->CountSizableChildren();
590 hdwp
= BeginDeferWindowPos(count
);
591 hdwp
= m_SearchBar
->OnParentSize(r
, hdwp
);
592 EndDeferWindowPos(hdwp
);
595 BOOL
ProcessWindowMessage(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
& theResult
, DWORD dwMapId
)
602 PostMessage(hwnd
, WM_CLOSE
, 0, 0);
612 FreeCachedAvailableEntries();
614 if (IS_INSTALLED_ENUM(SelectedEnumType
))
615 FreeInstalledAppList();
618 ImageList_Destroy(hImageTreeView
);
620 delete m_ClientPanel
;
627 MainWndOnCommand(hwnd
, wParam
, lParam
);
632 LPNMHDR data
= (LPNMHDR
) lParam
;
638 if (data
->hwndFrom
== hTreeView
)
640 switch (((LPNMTREEVIEW
) lParam
)->itemNew
.lParam
)
643 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
646 case IDS_APPLICATIONS
:
647 UpdateApplicationsList(ENUM_APPLICATIONS
);
651 UpdateApplicationsList(ENUM_UPDATES
);
654 case IDS_AVAILABLEFORINST
:
655 UpdateApplicationsList(ENUM_ALL_AVAILABLE
);
659 UpdateApplicationsList(ENUM_CAT_AUDIO
);
663 UpdateApplicationsList(ENUM_CAT_DEVEL
);
666 case IDS_CAT_DRIVERS
:
667 UpdateApplicationsList(ENUM_CAT_DRIVERS
);
671 UpdateApplicationsList(ENUM_CAT_EDU
);
674 case IDS_CAT_ENGINEER
:
675 UpdateApplicationsList(ENUM_CAT_ENGINEER
);
678 case IDS_CAT_FINANCE
:
679 UpdateApplicationsList(ENUM_CAT_FINANCE
);
683 UpdateApplicationsList(ENUM_CAT_GAMES
);
686 case IDS_CAT_GRAPHICS
:
687 UpdateApplicationsList(ENUM_CAT_GRAPHICS
);
690 case IDS_CAT_INTERNET
:
691 UpdateApplicationsList(ENUM_CAT_INTERNET
);
695 UpdateApplicationsList(ENUM_CAT_LIBS
);
699 UpdateApplicationsList(ENUM_CAT_OFFICE
);
703 UpdateApplicationsList(ENUM_CAT_OTHER
);
706 case IDS_CAT_SCIENCE
:
707 UpdateApplicationsList(ENUM_CAT_SCIENCE
);
711 UpdateApplicationsList(ENUM_CAT_TOOLS
);
715 UpdateApplicationsList(ENUM_CAT_VIDEO
);
720 HMENU mainMenu
= GetMenu(hwnd
);
721 HMENU lvwMenu
= GetMenu(m_ListView
->m_hWnd
);
723 /* Disable/enable items based on treeview selection */
724 if (IsSelectedNodeInstalled())
726 EnableMenuItem(mainMenu
, ID_REGREMOVE
, MF_ENABLED
);
727 EnableMenuItem(mainMenu
, ID_INSTALL
, MF_GRAYED
);
728 EnableMenuItem(mainMenu
, ID_UNINSTALL
, MF_ENABLED
);
729 EnableMenuItem(mainMenu
, ID_MODIFY
, MF_ENABLED
);
731 EnableMenuItem(lvwMenu
, ID_REGREMOVE
, MF_ENABLED
);
732 EnableMenuItem(lvwMenu
, ID_INSTALL
, MF_GRAYED
);
733 EnableMenuItem(lvwMenu
, ID_UNINSTALL
, MF_ENABLED
);
734 EnableMenuItem(lvwMenu
, ID_MODIFY
, MF_ENABLED
);
736 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_REGREMOVE
, TRUE
);
737 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_INSTALL
, FALSE
);
738 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_UNINSTALL
, TRUE
);
739 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_MODIFY
, TRUE
);
743 EnableMenuItem(mainMenu
, ID_REGREMOVE
, MF_GRAYED
);
744 EnableMenuItem(mainMenu
, ID_INSTALL
, MF_ENABLED
);
745 EnableMenuItem(mainMenu
, ID_UNINSTALL
, MF_GRAYED
);
746 EnableMenuItem(mainMenu
, ID_MODIFY
, MF_GRAYED
);
748 EnableMenuItem(lvwMenu
, ID_REGREMOVE
, MF_GRAYED
);
749 EnableMenuItem(lvwMenu
, ID_INSTALL
, MF_ENABLED
);
750 EnableMenuItem(lvwMenu
, ID_UNINSTALL
, MF_GRAYED
);
751 EnableMenuItem(lvwMenu
, ID_MODIFY
, MF_GRAYED
);
753 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_REGREMOVE
, FALSE
);
754 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_INSTALL
, TRUE
);
755 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_UNINSTALL
, FALSE
);
756 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_MODIFY
, FALSE
);
761 case LVN_ITEMCHANGED
:
763 LPNMLISTVIEW pnic
= (LPNMLISTVIEW
) lParam
;
765 if (pnic
->hdr
.hwndFrom
== m_ListView
->m_hWnd
)
767 /* Check if this is a valid item
768 * (technically, it can be also an unselect) */
769 INT ItemIndex
= pnic
->iItem
;
770 if (ItemIndex
== -1 ||
771 ItemIndex
>= ListView_GetItemCount(pnic
->hdr
.hwndFrom
))
776 /* Check if the focus has been moved to another item */
777 if ((pnic
->uChanged
& LVIF_STATE
) &&
778 (pnic
->uNewState
& LVIS_FOCUSED
) &&
779 !(pnic
->uOldState
& LVIS_FOCUSED
))
781 if (IS_INSTALLED_ENUM(SelectedEnumType
))
782 ShowInstalledAppInfo(ItemIndex
);
783 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
784 ShowAvailableAppInfo(ItemIndex
);
790 case LVN_COLUMNCLICK
:
792 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
794 m_ListView
->ColumnClick(pnmv
);
800 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
802 if (IS_INSTALLED_ENUM(SelectedEnumType
))
803 ShowInstalledAppInfo(-1);
804 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
805 ShowAvailableAppInfo(-1);
812 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
814 /* this won't do anything if the program is already installed */
815 SendMessage(hwnd
, WM_COMMAND
, ID_INSTALL
, 0);
822 if (data
->hwndFrom
== m_ListView
->m_hWnd
&& ((LPNMLISTVIEW
) lParam
)->iItem
!= -1)
824 ShowPopupMenu(m_ListView
->m_hWnd
, 0, ID_INSTALL
);
830 m_RichEdit
->OnLink((ENLINK
*) lParam
);
833 case TTN_GETDISPINFO
:
834 ToolBarOnGetDispInfo((LPTOOLTIPTEXT
) lParam
);
841 OnSize(hwnd
, wParam
, lParam
);
846 LPRECT pRect
= (LPRECT
) lParam
;
848 if (pRect
->right
- pRect
->left
< 565)
849 pRect
->right
= pRect
->left
+ 565;
851 if (pRect
->bottom
- pRect
->top
< 300)
852 pRect
->bottom
= pRect
->top
+ 300;
857 case WM_SYSCOLORCHANGE
:
859 /* Forward WM_SYSCOLORCHANGE to common controls */
860 m_ListView
->SendMessage(WM_SYSCOLORCHANGE
, 0, 0);
861 SendMessage(hTreeView
, WM_SYSCOLORCHANGE
, 0, 0);
862 SendMessage(hToolBar
, WM_SYSCOLORCHANGE
, 0, 0);
863 m_ListView
->SendMessage(EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
879 static ATL::CWndClassInfo
& GetWndClassInfo()
881 DWORD csStyle
= CS_VREDRAW
|CS_HREDRAW
;
882 static ATL::CWndClassInfo wc
=
884 { sizeof(WNDCLASSEX
), csStyle
, StartWindowProc
,
886 LoadIcon(_AtlBaseModule
.GetModuleInstance(), MAKEINTRESOURCE(IDI_MAIN
)),
887 LoadCursor(NULL
, IDC_ARROW
),
888 (HBRUSH
) (COLOR_BTNFACE
+ 1), NULL
,
890 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
897 WCHAR szWindowName
[MAX_STR_LEN
];
899 LoadStringW(hInst
, IDS_APPTITLE
, szWindowName
, _countof(szWindowName
));
902 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Left
: CW_USEDEFAULT
),
903 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Top
: CW_USEDEFAULT
),
904 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Width
: 680),
905 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Height
: 450)
910 return CWindowImpl::Create(NULL
, r
, szWindowName
, WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_WINDOWEDGE
);
913 CUiStatusBar
* GetStatusBar()
918 CUiListView
* GetListView()
923 CUiRichEdit
* GetRichEdit()
929 CUiMainWindow
* g_MainWindow
;
931 HWND
CreateMainWindow()
933 g_MainWindow
= new CUiMainWindow();
934 return g_MainWindow
->Create();
937 DWORD_PTR
ListViewGetlParam(INT item
)
939 return g_MainWindow
->GetListView()->GetItemData(item
);
942 VOID
SetStatusBarText(PCWSTR szText
)
944 g_MainWindow
->GetStatusBar()->SetText(szText
);
947 INT
ListViewAddItem(INT ItemIndex
, INT IconIndex
, PWSTR lpName
, LPARAM lParam
)
949 return g_MainWindow
->GetListView()->AddItem(ItemIndex
, IconIndex
, lpName
, lParam
);
952 VOID
NewRichEditText(PCWSTR szText
, DWORD flags
)
954 g_MainWindow
->GetRichEdit()->SetText(szText
, flags
);
957 VOID
InsertRichEditText(PCWSTR szText
, DWORD flags
)
959 g_MainWindow
->GetRichEdit()->InsertText(szText
, flags
);