2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/rapps/winmain.c
5 * PURPOSE: Main program
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
13 #define SEARCH_TIMER_ID 'SR'
17 HIMAGELIST hImageTreeView
= NULL
;
18 INT SelectedEnumType
= ENUM_ALL_COMPONENTS
;
19 SETTINGS_INFO SettingsInfo
;
21 WCHAR szSearchPattern
[MAX_STR_LEN
] = L
"";
22 BOOL SearchEnabled
= TRUE
;
25 SearchPatternMatch(PCWSTR szHaystack
, PCWSTR szNeedle
)
29 /* TODO: Improve pattern search beyond a simple case-insensitive substring search. */
30 return StrStrIW(szHaystack
, szNeedle
) != NULL
;
34 FillDefaultSettings(PSETTINGS_INFO pSettingsInfo
)
36 pSettingsInfo
->bSaveWndPos
= TRUE
;
37 pSettingsInfo
->bUpdateAtStart
= FALSE
;
38 pSettingsInfo
->bLogEnabled
= TRUE
;
39 StringCbCopyW(pSettingsInfo
->szDownloadDir
,
40 sizeof(pSettingsInfo
->szDownloadDir
),
42 pSettingsInfo
->bDelInstaller
= FALSE
;
44 pSettingsInfo
->Maximized
= FALSE
;
45 pSettingsInfo
->Left
= 0;
46 pSettingsInfo
->Top
= 0;
47 pSettingsInfo
->Right
= 680;
48 pSettingsInfo
->Bottom
= 450;
57 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\rapps", 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
59 dwSize
= sizeof(SETTINGS_INFO
);
60 if (RegQueryValueExW(hKey
, L
"Settings", NULL
, NULL
, (LPBYTE
)&SettingsInfo
, &dwSize
) == ERROR_SUCCESS
)
73 SaveSettings(HWND hwnd
)
78 if (SettingsInfo
.bSaveWndPos
)
80 wp
.length
= sizeof(WINDOWPLACEMENT
);
81 GetWindowPlacement(hwnd
, &wp
);
83 SettingsInfo
.Left
= wp
.rcNormalPosition
.left
;
84 SettingsInfo
.Top
= wp
.rcNormalPosition
.top
;
85 SettingsInfo
.Right
= wp
.rcNormalPosition
.right
;
86 SettingsInfo
.Bottom
= wp
.rcNormalPosition
.bottom
;
87 SettingsInfo
.Maximized
= (IsZoomed(hwnd
) || (wp
.flags
& WPF_RESTORETOMAXIMIZED
));
90 if (RegCreateKeyExW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\rapps", 0, NULL
,
91 REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
)
93 RegSetValueExW(hKey
, L
"Settings", 0, REG_BINARY
, (LPBYTE
)&SettingsInfo
, sizeof(SETTINGS_INFO
));
99 FreeInstalledAppList(VOID
)
101 INT Count
= ListView_GetItemCount(hListView
) - 1;
102 PINSTALLED_INFO Info
;
106 Info
= ListViewGetlParam(Count
);
109 RegCloseKey(Info
->hSubKey
);
110 HeapFree(GetProcessHeap(), 0, Info
);
118 EnumInstalledAppProc(INT ItemIndex
, LPWSTR lpName
, PINSTALLED_INFO Info
)
120 PINSTALLED_INFO ItemInfo
;
121 WCHAR szText
[MAX_PATH
];
124 if (!SearchPatternMatch(lpName
, szSearchPattern
))
127 ItemInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO
));
128 if (!ItemInfo
) return FALSE
;
130 RtlCopyMemory(ItemInfo
, Info
, sizeof(INSTALLED_INFO
));
132 Index
= ListViewAddItem(ItemIndex
, 0, lpName
, (LPARAM
)ItemInfo
);
134 /* Get version info */
135 GetApplicationString(ItemInfo
->hSubKey
, L
"DisplayVersion", szText
);
136 ListView_SetItemText(hListView
, Index
, 1, szText
);
138 GetApplicationString(ItemInfo
->hSubKey
, L
"Comments", szText
);
139 ListView_SetItemText(hListView
, Index
, 2, szText
);
145 FreeAvailableAppList(VOID
)
147 INT Count
= ListView_GetItemCount(hListView
) - 1;
152 Info
= ListViewGetlParam(Count
);
154 HeapFree(GetProcessHeap(), 0, Info
);
161 EnumAvailableAppProc(PAPPLICATION_INFO Info
)
163 PAPPLICATION_INFO ItemInfo
;
166 if (!SearchPatternMatch(Info
->szName
, szSearchPattern
) &&
167 !SearchPatternMatch(Info
->szDesc
, szSearchPattern
))
172 /* Only add a ListView entry if...
173 - no RegName was supplied (so we cannot determine whether the application is installed or not) or
174 - a RegName was supplied and the application is not installed
176 if (!*Info
->szRegName
|| (!IsInstalledApplication(Info
->szRegName
, FALSE
) && !IsInstalledApplication(Info
->szRegName
, TRUE
)))
178 ItemInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_INFO
));
179 if (!ItemInfo
) return FALSE
;
181 RtlCopyMemory(ItemInfo
, Info
, sizeof(APPLICATION_INFO
));
183 Index
= ListViewAddItem(Info
->Category
, 0, Info
->szName
, (LPARAM
)ItemInfo
);
184 ListView_SetItemText(hListView
, Index
, 1, Info
->szVersion
);
185 ListView_SetItemText(hListView
, Index
, 2, Info
->szDesc
);
192 UpdateApplicationsList(INT EnumType
)
194 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
196 HIMAGELIST hImageListView
;
198 (VOID
) ListView_DeleteAllItems(hListView
);
200 /* Create image list */
201 hImageListView
= ImageList_Create(LISTVIEW_ICON_SIZE
,
203 GetSystemColorDepth() | ILC_MASK
,
206 hIcon
= LoadImage(hInst
,
207 MAKEINTRESOURCE(IDI_MAIN
),
211 LR_CREATEDIBSECTION
);
213 ImageList_AddIcon(hImageListView
, hIcon
);
216 if (EnumType
== -1) EnumType
= SelectedEnumType
;
218 if (IS_INSTALLED_ENUM(SelectedEnumType
))
219 FreeInstalledAppList();
220 else if (IS_AVAILABLE_ENUM(SelectedEnumType
))
221 FreeAvailableAppList();
223 if (IS_INSTALLED_ENUM(EnumType
))
225 /* Enum installed applications and updates */
226 EnumInstalledApplications(EnumType
, TRUE
, EnumInstalledAppProc
);
227 EnumInstalledApplications(EnumType
, FALSE
, EnumInstalledAppProc
);
229 else if (IS_AVAILABLE_ENUM(EnumType
))
231 /* Enum availabled applications */
232 EnumAvailableApplications(EnumType
, EnumAvailableAppProc
);
235 /* Set image list for ListView */
236 hImageListView
= ListView_SetImageList(hListView
, hImageListView
, LVSIL_SMALL
);
238 /* Destroy old image list */
240 ImageList_Destroy(hImageListView
);
242 SelectedEnumType
= EnumType
;
244 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, sizeof(szBuffer2
) / sizeof(WCHAR
));
245 StringCbPrintfW(szBuffer1
, sizeof(szBuffer1
),
247 ListView_GetItemCount(hListView
));
248 SetStatusBarText(szBuffer1
);
254 InitApplicationsList(VOID
)
256 WCHAR szText
[MAX_STR_LEN
];
258 /* Add columns to ListView */
259 LoadStringW(hInst
, IDS_APP_NAME
, szText
, sizeof(szText
) / sizeof(WCHAR
));
260 ListViewAddColumn(0, szText
, 200, LVCFMT_LEFT
);
262 LoadStringW(hInst
, IDS_APP_INST_VERSION
, szText
, sizeof(szText
) / sizeof(WCHAR
));
263 ListViewAddColumn(1, szText
, 90, LVCFMT_RIGHT
);
265 LoadStringW(hInst
, IDS_APP_DESCRIPTION
, szText
, sizeof(szText
) / sizeof(WCHAR
));
266 ListViewAddColumn(3, szText
, 250, LVCFMT_LEFT
);
268 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
272 AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
274 WCHAR szText
[MAX_STR_LEN
];
278 hIcon
= LoadImage(hInst
,
279 MAKEINTRESOURCE(IconIndex
),
283 LR_CREATEDIBSECTION
);
285 Index
= ImageList_AddIcon(hImageTreeView
, hIcon
);
288 LoadStringW(hInst
, TextIndex
, szText
, sizeof(szText
) / sizeof(TCHAR
));
290 return TreeViewAddItem(hRootItem
, szText
, Index
, Index
, TextIndex
);
294 InitCategoriesList(VOID
)
296 HTREEITEM hRootItem1
, hRootItem2
;
298 /* Create image list */
299 hImageTreeView
= ImageList_Create(TREEVIEW_ICON_SIZE
,
301 GetSystemColorDepth() | ILC_MASK
,
304 hRootItem1
= AddCategory(TVI_ROOT
, IDS_INSTALLED
, IDI_CATEGORY
);
305 AddCategory(hRootItem1
, IDS_APPLICATIONS
, IDI_APPS
);
306 AddCategory(hRootItem1
, IDS_UPDATES
, IDI_APPUPD
);
308 hRootItem2
= AddCategory(TVI_ROOT
, IDS_AVAILABLEFORINST
, IDI_CATEGORY
);
309 AddCategory(hRootItem2
, IDS_CAT_AUDIO
, IDI_CAT_AUDIO
);
310 AddCategory(hRootItem2
, IDS_CAT_VIDEO
, IDI_CAT_VIDEO
);
311 AddCategory(hRootItem2
, IDS_CAT_GRAPHICS
, IDI_CAT_GRAPHICS
);
312 AddCategory(hRootItem2
, IDS_CAT_GAMES
, IDI_CAT_GAMES
);
313 AddCategory(hRootItem2
, IDS_CAT_INTERNET
, IDI_CAT_INTERNET
);
314 AddCategory(hRootItem2
, IDS_CAT_OFFICE
, IDI_CAT_OFFICE
);
315 AddCategory(hRootItem2
, IDS_CAT_DEVEL
, IDI_CAT_DEVEL
);
316 AddCategory(hRootItem2
, IDS_CAT_EDU
, IDI_CAT_EDU
);
317 AddCategory(hRootItem2
, IDS_CAT_ENGINEER
, IDI_CAT_ENGINEER
);
318 AddCategory(hRootItem2
, IDS_CAT_FINANCE
, IDI_CAT_FINANCE
);
319 AddCategory(hRootItem2
, IDS_CAT_SCIENCE
, IDI_CAT_SCIENCE
);
320 AddCategory(hRootItem2
, IDS_CAT_TOOLS
, IDI_CAT_TOOLS
);
321 AddCategory(hRootItem2
, IDS_CAT_DRIVERS
, IDI_CAT_DRIVERS
);
322 AddCategory(hRootItem2
, IDS_CAT_LIBS
, IDI_CAT_LIBS
);
323 AddCategory(hRootItem2
, IDS_CAT_OTHER
, IDI_CAT_OTHER
);
325 (VOID
) TreeView_SetImageList(hTreeView
, hImageTreeView
, TVSIL_NORMAL
);
327 (VOID
) TreeView_Expand(hTreeView
, hRootItem2
, TVE_EXPAND
);
328 (VOID
) TreeView_Expand(hTreeView
, hRootItem1
, TVE_EXPAND
);
330 (VOID
) TreeView_SelectItem(hTreeView
, hRootItem1
);
334 InitControls(HWND hwnd
)
336 if (SettingsInfo
.bSaveWndPos
)
338 MoveWindow(hwnd
, SettingsInfo
.Left
, SettingsInfo
.Top
,
339 SettingsInfo
.Right
- SettingsInfo
.Left
,
340 SettingsInfo
.Bottom
- SettingsInfo
.Top
, TRUE
);
342 if (SettingsInfo
.Maximized
) ShowWindow(hwnd
, SW_MAXIMIZE
);
345 if (CreateStatusBar(hwnd
) &&
346 CreateToolBar(hwnd
) &&
347 CreateListView(hwnd
) &&
348 CreateTreeView(hwnd
) &&
349 CreateRichEdit(hwnd
) &&
350 CreateVSplitBar(hwnd
) &&
351 CreateHSplitBar(hwnd
))
353 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
355 InitApplicationsList();
357 InitCategoriesList();
359 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, sizeof(szBuffer2
) / sizeof(WCHAR
));
360 StringCbPrintfW(szBuffer1
, sizeof(szBuffer1
),
362 ListView_GetItemCount(hListView
));
363 SetStatusBarText(szBuffer1
);
371 SearchTimerProc(HWND hwnd
, UINT uMsg
, UINT_PTR idEvent
, DWORD dwTime
)
373 KillTimer(hwnd
, SEARCH_TIMER_ID
);
374 UpdateApplicationsList(-1);
378 MainWndOnCommand(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
380 WORD wCommand
= LOWORD(wParam
);
382 if (lParam
== (LPARAM
)hSearchBar
)
384 WCHAR szBuf
[MAX_STR_LEN
];
386 switch (HIWORD(wParam
))
390 WCHAR szWndText
[MAX_STR_LEN
];
392 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
393 GetWindowTextW(hSearchBar
, szWndText
, MAX_STR_LEN
);
394 if (wcscmp(szBuf
, szWndText
) == 0)
396 SearchEnabled
= FALSE
;
397 SetWindowTextW(hSearchBar
, L
"");
404 GetWindowTextW(hSearchBar
, szBuf
, MAX_STR_LEN
);
405 if (wcslen(szBuf
) < 1)
407 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
408 SearchEnabled
= FALSE
;
409 SetWindowTextW(hSearchBar
, szBuf
);
416 WCHAR szWndText
[MAX_STR_LEN
];
420 SearchEnabled
= TRUE
;
424 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
425 GetWindowTextW(hSearchBar
, szWndText
, MAX_STR_LEN
);
426 if (wcscmp(szBuf
, szWndText
) != 0)
428 StringCbCopy(szSearchPattern
, sizeof(szSearchPattern
),
433 szSearchPattern
[0] = UNICODE_NULL
;
436 SetTimer(hwnd
, SEARCH_TIMER_ID
, 250, SearchTimerProc
);
447 ShellExecuteW(hwnd
, L
"open", pLink
, NULL
, NULL
, SW_SHOWNOACTIVATE
);
448 HeapFree(GetProcessHeap(), 0, pLink
);
452 CopyTextToClipboard(pLink
);
453 HeapFree(GetProcessHeap(), 0, pLink
);
457 CreateSettingsDlg(hwnd
);
461 PostMessageW(hwnd
, WM_CLOSE
, 0, 0);
465 if (DownloadApplication(-1))
466 /* TODO: Implement install dialog
467 * if (InstallApplication(-1))
469 UpdateApplicationsList(-1);
473 if (UninstallApplication(-1, FALSE
))
474 UpdateApplicationsList(-1);
478 if (UninstallApplication(-1, TRUE
))
479 UpdateApplicationsList(-1);
483 RemoveAppFromRegistry(-1);
487 UpdateApplicationsList(-1);
492 UpdateApplicationsList(-1);
496 MessageBoxW(hwnd
, L
"Help not implemented yet", NULL
, MB_OK
);
506 MainWndOnSize(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
508 HDWP hdwp
= BeginDeferWindowPos(5);
509 INT SearchBarWidth
= GetWindowWidth(hSearchBar
);
510 INT RichPos
= GetWindowHeight(hRichEdit
);
511 INT NewPos
= HIWORD(lParam
) - (RichPos
+ SPLIT_WIDTH
+ GetWindowHeight(hStatusBar
));
514 /* Size status bar */
515 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
518 SendMessage(hToolBar
, TB_AUTOSIZE
, 0, 0);
521 MoveWindow(hSearchBar
, LOWORD(lParam
) - SearchBarWidth
- 4, 5, SearchBarWidth
, 22, TRUE
);
524 * HIWORD(lParam) - Height of main window
525 * LOWORD(lParam) - Width of main window
528 /* Size vertical splitter bar */
532 (VSplitterPos
= GetWindowWidth(hTreeView
)),
533 GetWindowHeight(hToolBar
),
535 HIWORD(lParam
) - GetWindowHeight(hToolBar
) - GetWindowHeight(hStatusBar
),
536 SWP_NOZORDER
|SWP_NOACTIVATE
);
543 GetWindowHeight(hToolBar
),
545 HIWORD(lParam
) - GetWindowHeight(hToolBar
) - GetWindowHeight(hStatusBar
),
546 SWP_NOZORDER
|SWP_NOACTIVATE
);
548 if(wParam
!= SIZE_MINIMIZED
)
550 while (NewPos
< SPLIT_WIDTH
+ GetWindowHeight(hToolBar
))
553 NewPos
= HIWORD(lParam
) - (RichPos
+
554 SPLIT_WIDTH
+ GetWindowHeight(hStatusBar
));
557 SetHSplitterPos(NewPos
);
563 VSplitterPos
+ SPLIT_WIDTH
,
564 GetWindowHeight(hToolBar
),
565 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
566 GetHSplitterPos() - GetWindowHeight(hToolBar
),
567 SWP_NOZORDER
|SWP_NOACTIVATE
);
573 VSplitterPos
+ SPLIT_WIDTH
,
574 GetHSplitterPos() + SPLIT_WIDTH
,
575 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
577 SWP_NOZORDER
|SWP_NOACTIVATE
);
579 /* Size horizontal splitter bar */
583 VSplitterPos
+ SPLIT_WIDTH
,
585 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
587 SWP_NOZORDER
|SWP_NOACTIVATE
);
589 EndDeferWindowPos(hdwp
);
592 BOOL
IsSelectedNodeInstalled(void)
594 HTREEITEM hSelectedItem
= TreeView_GetSelection(hTreeView
);
597 tItem
.mask
= TVIF_PARAM
| TVIF_HANDLE
;
598 tItem
.hItem
= hSelectedItem
;
599 TreeView_GetItem(hTreeView
, &tItem
);
600 switch (tItem
.lParam
)
603 case IDS_APPLICATIONS
:
612 MainWindowProc(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
)
617 if (!InitControls(hwnd
))
618 PostMessage(hwnd
, WM_CLOSE
, 0, 0);
623 MainWndOnCommand(hwnd
, wParam
, lParam
);
628 LPNMHDR data
= (LPNMHDR
)lParam
;
634 if (data
->hwndFrom
== hTreeView
)
636 switch (((LPNMTREEVIEW
)lParam
)->itemNew
.lParam
)
639 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
642 case IDS_APPLICATIONS
:
643 UpdateApplicationsList(ENUM_APPLICATIONS
);
647 UpdateApplicationsList(ENUM_UPDATES
);
650 case IDS_AVAILABLEFORINST
:
651 UpdateApplicationsList(ENUM_ALL_AVAILABLE
);
655 UpdateApplicationsList(ENUM_CAT_AUDIO
);
659 UpdateApplicationsList(ENUM_CAT_DEVEL
);
662 case IDS_CAT_DRIVERS
:
663 UpdateApplicationsList(ENUM_CAT_DRIVERS
);
667 UpdateApplicationsList(ENUM_CAT_EDU
);
670 case IDS_CAT_ENGINEER
:
671 UpdateApplicationsList(ENUM_CAT_ENGINEER
);
674 case IDS_CAT_FINANCE
:
675 UpdateApplicationsList(ENUM_CAT_FINANCE
);
679 UpdateApplicationsList(ENUM_CAT_GAMES
);
682 case IDS_CAT_GRAPHICS
:
683 UpdateApplicationsList(ENUM_CAT_GRAPHICS
);
686 case IDS_CAT_INTERNET
:
687 UpdateApplicationsList(ENUM_CAT_INTERNET
);
691 UpdateApplicationsList(ENUM_CAT_LIBS
);
695 UpdateApplicationsList(ENUM_CAT_OFFICE
);
699 UpdateApplicationsList(ENUM_CAT_OTHER
);
702 case IDS_CAT_SCIENCE
:
703 UpdateApplicationsList(ENUM_CAT_SCIENCE
);
707 UpdateApplicationsList(ENUM_CAT_TOOLS
);
711 UpdateApplicationsList(ENUM_CAT_VIDEO
);
716 /* Disable/enable items based on treeview selection */
717 if (IsSelectedNodeInstalled())
719 EnableMenuItem(GetMenu(hwnd
), ID_REGREMOVE
, MF_ENABLED
);
720 EnableMenuItem(GetMenu(hwnd
), ID_INSTALL
, MF_GRAYED
);
721 EnableMenuItem(GetMenu(hwnd
), ID_UNINSTALL
, MF_ENABLED
);
722 EnableMenuItem(GetMenu(hwnd
), ID_MODIFY
, MF_ENABLED
);
724 EnableMenuItem(GetMenu(hListView
), ID_REGREMOVE
, MF_ENABLED
);
725 EnableMenuItem(GetMenu(hListView
), ID_INSTALL
, MF_GRAYED
);
726 EnableMenuItem(GetMenu(hListView
), ID_UNINSTALL
, MF_ENABLED
);
727 EnableMenuItem(GetMenu(hListView
), ID_MODIFY
, MF_ENABLED
);
729 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_REGREMOVE
, TRUE
);
730 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_INSTALL
, FALSE
);
731 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_UNINSTALL
, TRUE
);
732 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_MODIFY
, TRUE
);
736 EnableMenuItem(GetMenu(hwnd
), ID_REGREMOVE
, MF_GRAYED
);
737 EnableMenuItem(GetMenu(hwnd
), ID_INSTALL
, MF_ENABLED
);
738 EnableMenuItem(GetMenu(hwnd
), ID_UNINSTALL
, MF_GRAYED
);
739 EnableMenuItem(GetMenu(hwnd
), ID_MODIFY
, MF_GRAYED
);
741 EnableMenuItem(GetMenu(hListView
), ID_REGREMOVE
, MF_GRAYED
);
742 EnableMenuItem(GetMenu(hListView
), ID_INSTALL
, MF_ENABLED
);
743 EnableMenuItem(GetMenu(hListView
), ID_UNINSTALL
, MF_GRAYED
);
744 EnableMenuItem(GetMenu(hListView
), ID_MODIFY
, MF_GRAYED
);
746 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_REGREMOVE
, FALSE
);
747 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_INSTALL
, TRUE
);
748 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_UNINSTALL
, FALSE
);
749 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_MODIFY
, FALSE
);
754 case LVN_ITEMCHANGED
:
756 LPNMLISTVIEW pnic
= (LPNMLISTVIEW
) lParam
;
758 if (pnic
->hdr
.hwndFrom
== hListView
)
760 /* Check if this is a valid item
761 * (technically, it can be also an unselect) */
762 INT ItemIndex
= pnic
->iItem
;
763 if (ItemIndex
== -1 ||
764 ItemIndex
>= ListView_GetItemCount(pnic
->hdr
.hwndFrom
))
769 /* Check if the focus has been moved to another item */
770 if ((pnic
->uChanged
& LVIF_STATE
) &&
771 (pnic
->uNewState
& LVIS_FOCUSED
) &&
772 !(pnic
->uOldState
& LVIS_FOCUSED
))
774 if (IS_INSTALLED_ENUM(SelectedEnumType
))
775 ShowInstalledAppInfo(ItemIndex
);
776 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
777 ShowAvailableAppInfo(ItemIndex
);
783 case LVN_COLUMNCLICK
:
785 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
787 (VOID
) ListView_SortItems(hListView
, ListViewCompareFunc
, pnmv
->iSubItem
);
788 bAscending
= !bAscending
;
794 if (data
->hwndFrom
== hListView
&& ((LPNMLISTVIEW
)lParam
)->iItem
!= -1)
796 if (IS_INSTALLED_ENUM(SelectedEnumType
))
797 ShowInstalledAppInfo(-1);
798 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
799 ShowAvailableAppInfo(-1);
806 if (data
->hwndFrom
== hListView
&& ((LPNMLISTVIEW
)lParam
)->iItem
!= -1)
808 SendMessage(hwnd
, WM_COMMAND
, ID_INSTALL
, 0); //Won't do anything if the program is already installed
815 if (data
->hwndFrom
== hListView
&& ((LPNMLISTVIEW
)lParam
)->iItem
!= -1)
817 ShowPopupMenu(hListView
, 0, ID_INSTALL
);
823 RichEditOnLink(hwnd
, (ENLINK
*)lParam
);
826 case TTN_GETDISPINFO
:
827 ToolBarOnGetDispInfo((LPTOOLTIPTEXT
)lParam
);
838 if ((GetClientWindowHeight(hMainWnd
) - GetWindowHeight(hStatusBar
) - SPLIT_WIDTH
) < GetHSplitterPos())
840 INT NewSplitPos
= GetClientWindowHeight(hwnd
) - 100 - GetWindowHeight(hStatusBar
) - SPLIT_WIDTH
;
841 if (NewSplitPos
> GetWindowHeight(hToolBar
) + SPLIT_WIDTH
)
842 SetHSplitterPos(NewSplitPos
);
845 MainWndOnSize(hwnd
, wParam
, lParam
);
851 int RichEditHeight
= GetWindowHeight(hRichEdit
);
852 LPRECT pRect
= (LPRECT
)lParam
;
854 while (RichEditHeight
<= 100)
856 if (GetHSplitterPos() - 1 < GetWindowHeight(hToolBar
) + GetWindowHeight(hListView
) + SPLIT_WIDTH
)
858 SetHSplitterPos(GetHSplitterPos() - 1);
862 if (pRect
->right
-pRect
->left
< 565)
863 pRect
->right
= pRect
->left
+ 565;
865 if (pRect
->bottom
-pRect
->top
< 300)
866 pRect
->bottom
= pRect
->top
+ 300;
870 case WM_SYSCOLORCHANGE
:
872 /* Forward WM_SYSCOLORCHANGE to common controls */
873 SendMessage(hListView
, WM_SYSCOLORCHANGE
, 0, 0);
874 SendMessage(hTreeView
, WM_SYSCOLORCHANGE
, 0, 0);
875 SendMessage(hToolBar
, WM_SYSCOLORCHANGE
, 0, 0);
876 SendMessageW(hRichEdit
, EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
882 ShowWindow(hwnd
, SW_HIDE
);
887 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
888 FreeAvailableAppList();
889 if (IS_INSTALLED_ENUM(SelectedEnumType
))
890 FreeInstalledAppList();
891 if (hImageTreeView
) ImageList_Destroy(hImageTreeView
);
899 return DefWindowProc(hwnd
, Msg
, wParam
, lParam
);
903 wWinMain(HINSTANCE hInstance
, HINSTANCE hPrevInstance
, LPWSTR lpCmdLine
, int nShowCmd
)
905 WNDCLASSEXW WndClass
= {0};
906 WCHAR szWindowClass
[] = L
"ROSAPPMGR";
907 WCHAR szWindowName
[MAX_STR_LEN
];
908 HANDLE hMutex
= NULL
;
911 switch (GetUserDefaultUILanguage())
913 case MAKELANGID(LANG_HEBREW
, SUBLANG_DEFAULT
):
914 SetProcessDefaultLayout(LAYOUT_RTL
);
923 hMutex
= CreateMutexW(NULL
, FALSE
, szWindowClass
);
924 if ((!hMutex
) || (GetLastError() == ERROR_ALREADY_EXISTS
))
926 /* If already started, it is found its window */
927 HWND hWindow
= FindWindowW(szWindowClass
, NULL
);
929 /* Activate window */
930 ShowWindow(hWindow
, SW_SHOWNORMAL
);
931 SetForegroundWindow(hWindow
);
937 FillDefaultSettings(&SettingsInfo
);
942 InitCommonControls();
944 /* Create the window */
945 WndClass
.cbSize
= sizeof(WNDCLASSEXW
);
946 WndClass
.lpszClassName
= szWindowClass
;
947 WndClass
.lpfnWndProc
= MainWindowProc
;
948 WndClass
.hInstance
= hInstance
;
949 WndClass
.hIcon
= LoadIcon(hInstance
, MAKEINTRESOURCE(IDI_MAIN
));
950 WndClass
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
951 WndClass
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+ 1);
952 WndClass
.lpszMenuName
= MAKEINTRESOURCEW(IDR_MAINMENU
);
954 if (RegisterClassExW(&WndClass
) == (ATOM
)0) goto Exit
;
956 LoadStringW(hInst
, IDS_APPTITLE
, szWindowName
, sizeof(szWindowName
) / sizeof(WCHAR
));
958 hMainWnd
= CreateWindowExW(WS_EX_WINDOWEDGE
,
961 WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
,
971 if (!hMainWnd
) goto Exit
;
974 ShowWindow(hMainWnd
, nShowCmd
);
975 UpdateWindow(hMainWnd
);
977 if (SettingsInfo
.bUpdateAtStart
)
981 while (GetMessage(&Msg
, NULL
, 0, 0))
983 TranslateMessage(&Msg
);
984 DispatchMessage(&Msg
);
988 if (hMutex
) CloseHandle(hMutex
);