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)
7 * Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
14 #define SEARCH_TIMER_ID 'SR'
18 HIMAGELIST hImageTreeView
= NULL
;
19 INT SelectedEnumType
= ENUM_ALL_COMPONENTS
;
20 SETTINGS_INFO SettingsInfo
;
22 WCHAR szSearchPattern
[MAX_STR_LEN
] = L
"";
23 BOOL SearchEnabled
= TRUE
;
26 SearchPatternMatch(PCWSTR szHaystack
, PCWSTR szNeedle
)
30 /* TODO: Improve pattern search beyond a simple case-insensitive substring search. */
31 return StrStrIW(szHaystack
, szNeedle
) != NULL
;
35 FillDefaultSettings(PSETTINGS_INFO pSettingsInfo
)
37 pSettingsInfo
->bSaveWndPos
= TRUE
;
38 pSettingsInfo
->bUpdateAtStart
= FALSE
;
39 pSettingsInfo
->bLogEnabled
= TRUE
;
40 StringCbCopyW(pSettingsInfo
->szDownloadDir
,
41 sizeof(pSettingsInfo
->szDownloadDir
),
43 pSettingsInfo
->bDelInstaller
= FALSE
;
45 pSettingsInfo
->Maximized
= FALSE
;
46 pSettingsInfo
->Left
= CW_USEDEFAULT
;
47 pSettingsInfo
->Top
= CW_USEDEFAULT
;
48 pSettingsInfo
->Width
= 680;
49 pSettingsInfo
->Height
= 450;
51 pSettingsInfo
->Proxy
= 0;
52 StringCbCopyW(pSettingsInfo
->szProxyServer
, sizeof(pSettingsInfo
->szProxyServer
), L
"");
53 StringCbCopyW(pSettingsInfo
->szNoProxyFor
, sizeof(pSettingsInfo
->szNoProxyFor
), L
"");
62 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\rapps", 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
64 dwSize
= sizeof(SettingsInfo
);
65 if (RegQueryValueExW(hKey
, L
"Settings", NULL
, NULL
, (LPBYTE
)&SettingsInfo
, &dwSize
) == ERROR_SUCCESS
)
78 SaveSettings(HWND hwnd
)
83 if (SettingsInfo
.bSaveWndPos
)
85 wp
.length
= sizeof(wp
);
86 GetWindowPlacement(hwnd
, &wp
);
88 SettingsInfo
.Left
= wp
.rcNormalPosition
.left
;
89 SettingsInfo
.Top
= wp
.rcNormalPosition
.top
;
90 SettingsInfo
.Width
= wp
.rcNormalPosition
.right
- wp
.rcNormalPosition
.left
;
91 SettingsInfo
.Height
= wp
.rcNormalPosition
.bottom
- wp
.rcNormalPosition
.top
;
92 SettingsInfo
.Maximized
= (wp
.showCmd
== SW_MAXIMIZE
|| (wp
.showCmd
== SW_SHOWMINIMIZED
&& (wp
.flags
& WPF_RESTORETOMAXIMIZED
)));
95 if (RegCreateKeyExW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\rapps", 0, NULL
,
96 REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
)
98 RegSetValueExW(hKey
, L
"Settings", 0, REG_BINARY
, (LPBYTE
)&SettingsInfo
, sizeof(SettingsInfo
));
104 FreeInstalledAppList(VOID
)
106 INT Count
= ListView_GetItemCount(hListView
) - 1;
107 PINSTALLED_INFO Info
;
111 Info
= ListViewGetlParam(Count
);
114 RegCloseKey(Info
->hSubKey
);
115 HeapFree(GetProcessHeap(), 0, Info
);
123 EnumInstalledAppProc(INT ItemIndex
, LPWSTR lpName
, PINSTALLED_INFO Info
)
125 PINSTALLED_INFO ItemInfo
;
126 WCHAR szText
[MAX_PATH
];
129 if (!SearchPatternMatch(lpName
, szSearchPattern
))
131 RegCloseKey(Info
->hSubKey
);
135 ItemInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO
));
138 RegCloseKey(Info
->hSubKey
);
142 RtlCopyMemory(ItemInfo
, Info
, sizeof(INSTALLED_INFO
));
144 Index
= ListViewAddItem(ItemIndex
, 0, lpName
, (LPARAM
)ItemInfo
);
146 /* Get version info */
147 GetApplicationString(ItemInfo
->hSubKey
, L
"DisplayVersion", szText
);
148 ListView_SetItemText(hListView
, Index
, 1, szText
);
151 GetApplicationString(ItemInfo
->hSubKey
, L
"Comments", szText
);
152 ListView_SetItemText(hListView
, Index
, 2, szText
);
159 EnumAvailableAppProc(PAPPLICATION_INFO Info
)
163 if (!SearchPatternMatch(Info
->szName
, szSearchPattern
) &&
164 !SearchPatternMatch(Info
->szDesc
, szSearchPattern
))
169 /* Only add a ListView entry if...
170 - no RegName was supplied (so we cannot determine whether the application is installed or not) or
171 - a RegName was supplied and the application is not installed
173 if (!*Info
->szRegName
|| (!IsInstalledApplication(Info
->szRegName
, FALSE
) && !IsInstalledApplication(Info
->szRegName
, TRUE
)))
175 Index
= ListViewAddItem(Info
->Category
, 0, Info
->szName
, (LPARAM
)Info
);
177 ListView_SetItemText(hListView
, Index
, 1, Info
->szVersion
);
178 ListView_SetItemText(hListView
, Index
, 2, Info
->szDesc
);
185 UpdateApplicationsList(INT EnumType
)
187 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
189 HIMAGELIST hImageListView
;
191 SendMessage(hListView
, WM_SETREDRAW
, FALSE
, 0);
193 if (EnumType
== -1) EnumType
= SelectedEnumType
;
195 if (IS_INSTALLED_ENUM(SelectedEnumType
))
196 FreeInstalledAppList();
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 (IS_INSTALLED_ENUM(EnumType
))
218 /* Enum installed applications and updates */
219 EnumInstalledApplications(EnumType
, TRUE
, EnumInstalledAppProc
);
220 EnumInstalledApplications(EnumType
, FALSE
, EnumInstalledAppProc
);
222 else if (IS_AVAILABLE_ENUM(EnumType
))
224 /* Enum available applications */
225 EnumAvailableApplications(EnumType
, EnumAvailableAppProc
);
228 /* Set image list for ListView */
229 hImageListView
= ListView_SetImageList(hListView
, hImageListView
, LVSIL_SMALL
);
231 /* Destroy old image list */
233 ImageList_Destroy(hImageListView
);
235 SelectedEnumType
= EnumType
;
237 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, _countof(szBuffer2
));
238 StringCbPrintfW(szBuffer1
, sizeof(szBuffer1
),
240 ListView_GetItemCount(hListView
));
241 SetStatusBarText(szBuffer1
);
245 /* set automatic column width for program names if the list is not empty */
246 if (ListView_GetItemCount(hListView
) > 0)
247 ListView_SetColumnWidth(hListView
, 0, LVSCW_AUTOSIZE
);
249 SendMessage(hListView
, WM_SETREDRAW
, TRUE
, 0);
253 InitApplicationsList(VOID
)
255 WCHAR szText
[MAX_STR_LEN
];
257 /* Add columns to ListView */
258 LoadStringW(hInst
, IDS_APP_NAME
, szText
, _countof(szText
));
259 ListViewAddColumn(0, szText
, 200, LVCFMT_LEFT
);
261 LoadStringW(hInst
, IDS_APP_INST_VERSION
, szText
, _countof(szText
));
262 ListViewAddColumn(1, szText
, 90, LVCFMT_RIGHT
);
264 LoadStringW(hInst
, IDS_APP_DESCRIPTION
, szText
, _countof(szText
));
265 ListViewAddColumn(3, szText
, 250, LVCFMT_LEFT
);
267 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
271 AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
273 WCHAR szText
[MAX_STR_LEN
];
277 hIcon
= LoadImage(hInst
,
278 MAKEINTRESOURCE(IconIndex
),
282 LR_CREATEDIBSECTION
);
284 Index
= ImageList_AddIcon(hImageTreeView
, hIcon
);
287 LoadStringW(hInst
, TextIndex
, szText
, _countof(szText
));
289 return TreeViewAddItem(hRootItem
, szText
, Index
, Index
, TextIndex
);
293 InitCategoriesList(VOID
)
295 HTREEITEM hRootItem1
, hRootItem2
;
297 /* Create image list */
298 hImageTreeView
= ImageList_Create(TREEVIEW_ICON_SIZE
,
300 GetSystemColorDepth() | ILC_MASK
,
303 hRootItem1
= AddCategory(TVI_ROOT
, IDS_INSTALLED
, IDI_CATEGORY
);
304 AddCategory(hRootItem1
, IDS_APPLICATIONS
, IDI_APPS
);
305 AddCategory(hRootItem1
, IDS_UPDATES
, IDI_APPUPD
);
307 hRootItem2
= AddCategory(TVI_ROOT
, IDS_AVAILABLEFORINST
, IDI_CATEGORY
);
308 AddCategory(hRootItem2
, IDS_CAT_AUDIO
, IDI_CAT_AUDIO
);
309 AddCategory(hRootItem2
, IDS_CAT_VIDEO
, IDI_CAT_VIDEO
);
310 AddCategory(hRootItem2
, IDS_CAT_GRAPHICS
, IDI_CAT_GRAPHICS
);
311 AddCategory(hRootItem2
, IDS_CAT_GAMES
, IDI_CAT_GAMES
);
312 AddCategory(hRootItem2
, IDS_CAT_INTERNET
, IDI_CAT_INTERNET
);
313 AddCategory(hRootItem2
, IDS_CAT_OFFICE
, IDI_CAT_OFFICE
);
314 AddCategory(hRootItem2
, IDS_CAT_DEVEL
, IDI_CAT_DEVEL
);
315 AddCategory(hRootItem2
, IDS_CAT_EDU
, IDI_CAT_EDU
);
316 AddCategory(hRootItem2
, IDS_CAT_ENGINEER
, IDI_CAT_ENGINEER
);
317 AddCategory(hRootItem2
, IDS_CAT_FINANCE
, IDI_CAT_FINANCE
);
318 AddCategory(hRootItem2
, IDS_CAT_SCIENCE
, IDI_CAT_SCIENCE
);
319 AddCategory(hRootItem2
, IDS_CAT_TOOLS
, IDI_CAT_TOOLS
);
320 AddCategory(hRootItem2
, IDS_CAT_DRIVERS
, IDI_CAT_DRIVERS
);
321 AddCategory(hRootItem2
, IDS_CAT_LIBS
, IDI_CAT_LIBS
);
322 AddCategory(hRootItem2
, IDS_CAT_OTHER
, IDI_CAT_OTHER
);
324 (VOID
) TreeView_SetImageList(hTreeView
, hImageTreeView
, TVSIL_NORMAL
);
326 (VOID
) TreeView_Expand(hTreeView
, hRootItem2
, TVE_EXPAND
);
327 (VOID
) TreeView_Expand(hTreeView
, hRootItem1
, TVE_EXPAND
);
329 (VOID
) TreeView_SelectItem(hTreeView
, hRootItem1
);
333 InitControls(HWND hwnd
)
336 if (CreateStatusBar(hwnd
) &&
337 CreateToolBar(hwnd
) &&
338 CreateListView(hwnd
) &&
339 CreateTreeView(hwnd
) &&
340 CreateRichEdit(hwnd
) &&
341 CreateVSplitBar(hwnd
) &&
342 CreateHSplitBar(hwnd
))
344 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
346 InitApplicationsList();
348 InitCategoriesList();
350 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, _countof(szBuffer2
));
351 StringCbPrintfW(szBuffer1
, sizeof(szBuffer1
),
353 ListView_GetItemCount(hListView
));
354 SetStatusBarText(szBuffer1
);
362 SearchTimerProc(HWND hwnd
, UINT uMsg
, UINT_PTR idEvent
, DWORD dwTime
)
364 KillTimer(hwnd
, SEARCH_TIMER_ID
);
365 UpdateApplicationsList(-1);
369 MainWndOnCommand(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
371 WORD wCommand
= LOWORD(wParam
);
373 if (lParam
== (LPARAM
)hSearchBar
)
375 WCHAR szBuf
[MAX_STR_LEN
];
377 switch (HIWORD(wParam
))
381 WCHAR szWndText
[MAX_STR_LEN
];
383 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, _countof(szBuf
));
384 GetWindowTextW(hSearchBar
, szWndText
, MAX_STR_LEN
);
385 if (wcscmp(szBuf
, szWndText
) == 0)
387 SearchEnabled
= FALSE
;
388 SetWindowTextW(hSearchBar
, L
"");
395 GetWindowTextW(hSearchBar
, szBuf
, MAX_STR_LEN
);
396 if (wcslen(szBuf
) < 1)
398 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, _countof(szBuf
));
399 SearchEnabled
= FALSE
;
400 SetWindowTextW(hSearchBar
, szBuf
);
407 WCHAR szWndText
[MAX_STR_LEN
];
411 SearchEnabled
= TRUE
;
415 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, _countof(szBuf
));
416 GetWindowTextW(hSearchBar
, szWndText
, MAX_STR_LEN
);
417 if (wcscmp(szBuf
, szWndText
) != 0)
419 StringCbCopy(szSearchPattern
, sizeof(szSearchPattern
),
424 szSearchPattern
[0] = UNICODE_NULL
;
427 SetTimer(hwnd
, SEARCH_TIMER_ID
, 250, SearchTimerProc
);
438 ShellExecuteW(hwnd
, L
"open", pLink
, NULL
, NULL
, SW_SHOWNOACTIVATE
);
439 HeapFree(GetProcessHeap(), 0, pLink
);
443 CopyTextToClipboard(pLink
);
444 HeapFree(GetProcessHeap(), 0, pLink
);
448 CreateSettingsDlg(hwnd
);
452 PostMessageW(hwnd
, WM_CLOSE
, 0, 0);
456 if (DownloadApplication(-1))
457 /* TODO: Implement install dialog
458 * if (InstallApplication(-1))
460 UpdateApplicationsList(-1);
464 if (UninstallApplication(-1, FALSE
))
465 UpdateApplicationsList(-1);
469 if (UninstallApplication(-1, TRUE
))
470 UpdateApplicationsList(-1);
474 RemoveAppFromRegistry(-1);
478 UpdateApplicationsList(-1);
483 UpdateApplicationsList(-1);
487 MessageBoxW(hwnd
, L
"Help not implemented yet", NULL
, MB_OK
);
497 MainWndOnSize(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
499 HDWP hdwp
= BeginDeferWindowPos(5);
500 INT SearchBarWidth
= GetWindowWidth(hSearchBar
);
501 INT RichPos
= GetWindowHeight(hRichEdit
);
502 INT NewPos
= HIWORD(lParam
) - (RichPos
+ SPLIT_WIDTH
+ GetWindowHeight(hStatusBar
));
505 /* Size status bar */
506 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
509 SendMessage(hToolBar
, TB_AUTOSIZE
, 0, 0);
512 MoveWindow(hSearchBar
, LOWORD(lParam
) - SearchBarWidth
- 4, 5, SearchBarWidth
, 22, TRUE
);
515 * HIWORD(lParam) - Height of main window
516 * LOWORD(lParam) - Width of main window
519 /* Size vertical splitter bar */
521 hdwp
= DeferWindowPos(hdwp
,
524 (VSplitterPos
= GetWindowWidth(hTreeView
)),
525 GetWindowHeight(hToolBar
),
527 HIWORD(lParam
) - GetWindowHeight(hToolBar
) - GetWindowHeight(hStatusBar
),
528 SWP_NOZORDER
|SWP_NOACTIVATE
);
532 hdwp
= DeferWindowPos(hdwp
,
536 GetWindowHeight(hToolBar
),
538 HIWORD(lParam
) - GetWindowHeight(hToolBar
) - GetWindowHeight(hStatusBar
),
539 SWP_NOZORDER
|SWP_NOACTIVATE
);
541 if(wParam
!= SIZE_MINIMIZED
)
543 while (NewPos
< SPLIT_WIDTH
+ GetWindowHeight(hToolBar
))
546 NewPos
= HIWORD(lParam
) - (RichPos
+
547 SPLIT_WIDTH
+ GetWindowHeight(hStatusBar
));
550 SetHSplitterPos(NewPos
);
554 hdwp
= DeferWindowPos(hdwp
,
557 VSplitterPos
+ SPLIT_WIDTH
,
558 GetWindowHeight(hToolBar
),
559 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
560 GetHSplitterPos() - GetWindowHeight(hToolBar
),
561 SWP_NOZORDER
|SWP_NOACTIVATE
);
565 hdwp
= DeferWindowPos(hdwp
,
568 VSplitterPos
+ SPLIT_WIDTH
,
569 GetHSplitterPos() + SPLIT_WIDTH
,
570 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
572 SWP_NOZORDER
|SWP_NOACTIVATE
);
574 /* Size horizontal splitter bar */
576 hdwp
= DeferWindowPos(hdwp
,
579 VSplitterPos
+ SPLIT_WIDTH
,
581 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
583 SWP_NOZORDER
|SWP_NOACTIVATE
);
586 EndDeferWindowPos(hdwp
);
589 BOOL
IsSelectedNodeInstalled(void)
591 HTREEITEM hSelectedItem
= TreeView_GetSelection(hTreeView
);
594 tItem
.mask
= TVIF_PARAM
| TVIF_HANDLE
;
595 tItem
.hItem
= hSelectedItem
;
596 TreeView_GetItem(hTreeView
, &tItem
);
597 switch (tItem
.lParam
)
600 case IDS_APPLICATIONS
:
609 MainWindowProc(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
)
615 if (!InitControls(hwnd
))
616 PostMessage(hwnd
, WM_CLOSE
, 0, 0);
620 MainWndOnCommand(hwnd
, wParam
, lParam
);
625 LPNMHDR data
= (LPNMHDR
)lParam
;
631 if (data
->hwndFrom
== hTreeView
)
633 switch (((LPNMTREEVIEW
)lParam
)->itemNew
.lParam
)
636 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
639 case IDS_APPLICATIONS
:
640 UpdateApplicationsList(ENUM_APPLICATIONS
);
644 UpdateApplicationsList(ENUM_UPDATES
);
647 case IDS_AVAILABLEFORINST
:
648 UpdateApplicationsList(ENUM_ALL_AVAILABLE
);
652 UpdateApplicationsList(ENUM_CAT_AUDIO
);
656 UpdateApplicationsList(ENUM_CAT_DEVEL
);
659 case IDS_CAT_DRIVERS
:
660 UpdateApplicationsList(ENUM_CAT_DRIVERS
);
664 UpdateApplicationsList(ENUM_CAT_EDU
);
667 case IDS_CAT_ENGINEER
:
668 UpdateApplicationsList(ENUM_CAT_ENGINEER
);
671 case IDS_CAT_FINANCE
:
672 UpdateApplicationsList(ENUM_CAT_FINANCE
);
676 UpdateApplicationsList(ENUM_CAT_GAMES
);
679 case IDS_CAT_GRAPHICS
:
680 UpdateApplicationsList(ENUM_CAT_GRAPHICS
);
683 case IDS_CAT_INTERNET
:
684 UpdateApplicationsList(ENUM_CAT_INTERNET
);
688 UpdateApplicationsList(ENUM_CAT_LIBS
);
692 UpdateApplicationsList(ENUM_CAT_OFFICE
);
696 UpdateApplicationsList(ENUM_CAT_OTHER
);
699 case IDS_CAT_SCIENCE
:
700 UpdateApplicationsList(ENUM_CAT_SCIENCE
);
704 UpdateApplicationsList(ENUM_CAT_TOOLS
);
708 UpdateApplicationsList(ENUM_CAT_VIDEO
);
713 /* Disable/enable items based on treeview selection */
714 if (IsSelectedNodeInstalled())
716 EnableMenuItem(GetMenu(hwnd
), ID_REGREMOVE
, MF_ENABLED
);
717 EnableMenuItem(GetMenu(hwnd
), ID_INSTALL
, MF_GRAYED
);
718 EnableMenuItem(GetMenu(hwnd
), ID_UNINSTALL
, MF_ENABLED
);
719 EnableMenuItem(GetMenu(hwnd
), ID_MODIFY
, MF_ENABLED
);
721 EnableMenuItem(GetMenu(hListView
), ID_REGREMOVE
, MF_ENABLED
);
722 EnableMenuItem(GetMenu(hListView
), ID_INSTALL
, MF_GRAYED
);
723 EnableMenuItem(GetMenu(hListView
), ID_UNINSTALL
, MF_ENABLED
);
724 EnableMenuItem(GetMenu(hListView
), ID_MODIFY
, MF_ENABLED
);
726 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_REGREMOVE
, TRUE
);
727 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_INSTALL
, FALSE
);
728 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_UNINSTALL
, TRUE
);
729 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_MODIFY
, TRUE
);
733 EnableMenuItem(GetMenu(hwnd
), ID_REGREMOVE
, MF_GRAYED
);
734 EnableMenuItem(GetMenu(hwnd
), ID_INSTALL
, MF_ENABLED
);
735 EnableMenuItem(GetMenu(hwnd
), ID_UNINSTALL
, MF_GRAYED
);
736 EnableMenuItem(GetMenu(hwnd
), ID_MODIFY
, MF_GRAYED
);
738 EnableMenuItem(GetMenu(hListView
), ID_REGREMOVE
, MF_GRAYED
);
739 EnableMenuItem(GetMenu(hListView
), ID_INSTALL
, MF_ENABLED
);
740 EnableMenuItem(GetMenu(hListView
), ID_UNINSTALL
, MF_GRAYED
);
741 EnableMenuItem(GetMenu(hListView
), ID_MODIFY
, MF_GRAYED
);
743 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_REGREMOVE
, FALSE
);
744 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_INSTALL
, TRUE
);
745 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_UNINSTALL
, FALSE
);
746 SendMessage(hToolBar
, TB_ENABLEBUTTON
, ID_MODIFY
, FALSE
);
751 case LVN_ITEMCHANGED
:
753 LPNMLISTVIEW pnic
= (LPNMLISTVIEW
) lParam
;
755 if (pnic
->hdr
.hwndFrom
== hListView
)
757 /* Check if this is a valid item
758 * (technically, it can be also an unselect) */
759 INT ItemIndex
= pnic
->iItem
;
760 if (ItemIndex
== -1 ||
761 ItemIndex
>= ListView_GetItemCount(pnic
->hdr
.hwndFrom
))
766 /* Check if the focus has been moved to another item */
767 if ((pnic
->uChanged
& LVIF_STATE
) &&
768 (pnic
->uNewState
& LVIS_FOCUSED
) &&
769 !(pnic
->uOldState
& LVIS_FOCUSED
))
771 if (IS_INSTALLED_ENUM(SelectedEnumType
))
772 ShowInstalledAppInfo(ItemIndex
);
773 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
774 ShowAvailableAppInfo(ItemIndex
);
780 case LVN_COLUMNCLICK
:
782 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
784 (VOID
) ListView_SortItems(hListView
, ListViewCompareFunc
, pnmv
->iSubItem
);
785 bAscending
= !bAscending
;
791 if (data
->hwndFrom
== hListView
&& ((LPNMLISTVIEW
)lParam
)->iItem
!= -1)
793 if (IS_INSTALLED_ENUM(SelectedEnumType
))
794 ShowInstalledAppInfo(-1);
795 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
796 ShowAvailableAppInfo(-1);
803 if (data
->hwndFrom
== hListView
&& ((LPNMLISTVIEW
)lParam
)->iItem
!= -1)
805 /* this won't do anything if the program is already installed */
806 SendMessage(hwnd
, WM_COMMAND
, ID_INSTALL
, 0);
813 if (data
->hwndFrom
== hListView
&& ((LPNMLISTVIEW
)lParam
)->iItem
!= -1)
815 ShowPopupMenu(hListView
, 0, ID_INSTALL
);
821 RichEditOnLink(hwnd
, (ENLINK
*)lParam
);
824 case TTN_GETDISPINFO
:
825 ToolBarOnGetDispInfo((LPTOOLTIPTEXT
)lParam
);
836 if ((GetClientWindowHeight(hMainWnd
) - GetWindowHeight(hStatusBar
) - SPLIT_WIDTH
) < GetHSplitterPos())
838 INT NewSplitPos
= GetClientWindowHeight(hwnd
) - 100 - GetWindowHeight(hStatusBar
) - SPLIT_WIDTH
;
839 if (NewSplitPos
> GetWindowHeight(hToolBar
) + SPLIT_WIDTH
)
840 SetHSplitterPos(NewSplitPos
);
843 MainWndOnSize(hwnd
, wParam
, lParam
);
849 int RichEditHeight
= GetWindowHeight(hRichEdit
);
850 LPRECT pRect
= (LPRECT
)lParam
;
852 while (RichEditHeight
<= 100)
854 if (GetHSplitterPos() - 1 < GetWindowHeight(hToolBar
) + GetWindowHeight(hListView
) + SPLIT_WIDTH
)
856 SetHSplitterPos(GetHSplitterPos() - 1);
860 if (pRect
->right
-pRect
->left
< 565)
861 pRect
->right
= pRect
->left
+ 565;
863 if (pRect
->bottom
-pRect
->top
< 300)
864 pRect
->bottom
= pRect
->top
+ 300;
868 case WM_SYSCOLORCHANGE
:
870 /* Forward WM_SYSCOLORCHANGE to common controls */
871 SendMessage(hListView
, WM_SYSCOLORCHANGE
, 0, 0);
872 SendMessage(hTreeView
, WM_SYSCOLORCHANGE
, 0, 0);
873 SendMessage(hToolBar
, WM_SYSCOLORCHANGE
, 0, 0);
874 SendMessageW(hRichEdit
, EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
880 ShowWindow(hwnd
, SW_HIDE
);
885 FreeCachedAvailableEntries();
887 if (IS_INSTALLED_ENUM(SelectedEnumType
))
888 FreeInstalledAppList();
891 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
;
912 switch (GetUserDefaultUILanguage())
914 case MAKELANGID(LANG_HEBREW
, SUBLANG_DEFAULT
):
915 SetProcessDefaultLayout(LAYOUT_RTL
);
924 hMutex
= CreateMutexW(NULL
, FALSE
, szWindowClass
);
925 if ((!hMutex
) || (GetLastError() == ERROR_ALREADY_EXISTS
))
927 /* If already started, it is found its window */
928 HWND hWindow
= FindWindowW(szWindowClass
, NULL
);
930 /* Activate window */
931 ShowWindow(hWindow
, SW_SHOWNORMAL
);
932 SetForegroundWindow(hWindow
);
938 FillDefaultSettings(&SettingsInfo
);
943 InitCommonControls();
945 /* Create the window */
946 WndClass
.cbSize
= sizeof(WndClass
);
947 WndClass
.lpszClassName
= szWindowClass
;
948 WndClass
.lpfnWndProc
= MainWindowProc
;
949 WndClass
.hInstance
= hInstance
;
950 WndClass
.hIcon
= LoadIcon(hInstance
, MAKEINTRESOURCE(IDI_MAIN
));
951 WndClass
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
952 WndClass
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+ 1);
953 WndClass
.lpszMenuName
= MAKEINTRESOURCEW(IDR_MAINMENU
);
955 if (RegisterClassExW(&WndClass
) == (ATOM
)0) goto Exit
;
957 LoadStringW(hInst
, IDS_APPTITLE
, szWindowName
, _countof(szWindowName
));
959 hMainWnd
= CreateWindowExW(WS_EX_WINDOWEDGE
,
962 WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
,
963 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Left
: CW_USEDEFAULT
),
964 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Top
: CW_USEDEFAULT
),
965 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Width
: 680),
966 (SettingsInfo
.bSaveWndPos
? SettingsInfo
.Height
: 450),
972 if (!hMainWnd
) goto Exit
;
974 /* Maximize it if we must */
975 ShowWindow(hMainWnd
, (SettingsInfo
.bSaveWndPos
&& SettingsInfo
.Maximized
? SW_MAXIMIZE
: nShowCmd
));
976 UpdateWindow(hMainWnd
);
978 if (SettingsInfo
.bUpdateAtStart
)
981 /* Load the menu hotkeys */
982 KeyBrd
= LoadAccelerators(NULL
, MAKEINTRESOURCE(HOTKEYS
));
985 while (GetMessage(&Msg
, NULL
, 0, 0))
987 if (!TranslateAccelerator(hMainWnd
, KeyBrd
, &Msg
))
989 TranslateMessage(&Msg
);
990 DispatchMessage(&Msg
);