diff --git a/reactos/base/applications/rapps_new/CMakeLists.txt b/reactos/base/applications/rapps_new/CMakeLists.txt index bf91615b532..e004f93d813 100644 --- a/reactos/base/applications/rapps_new/CMakeLists.txt +++ b/reactos/base/applications/rapps_new/CMakeLists.txt @@ -13,8 +13,6 @@ list(APPEND SOURCE loaddlg.cpp misc.cpp settingsdlg.cpp - toolbar.cpp - treeview.cpp winmain.cpp rapps.h) diff --git a/reactos/base/applications/rapps_new/crichedit.h b/reactos/base/applications/rapps_new/crichedit.h new file mode 100644 index 00000000000..bb91643a86d --- /dev/null +++ b/reactos/base/applications/rapps_new/crichedit.h @@ -0,0 +1,98 @@ +#pragma once + +class CRichEdit : + public CWindow +{ +public: + VOID SetRangeFormatting(LONG Start, LONG End, DWORD dwEffects) + { + CHARFORMAT2 CharFormat; + + SendMessageW(EM_SETSEL, Start, End); + + ZeroMemory(&CharFormat, sizeof(CHARFORMAT2)); + + CharFormat.cbSize = sizeof(CHARFORMAT2); + CharFormat.dwMask = dwEffects; + CharFormat.dwEffects = dwEffects; + + SendMessageW(EM_SETCHARFORMAT, SCF_WORD | SCF_SELECTION, (LPARAM) &CharFormat); + + SendMessageW(EM_SETSEL, End, End + 1); + } + + LONG GetTextLen(VOID) + { + GETTEXTLENGTHEX TxtLenStruct; + + TxtLenStruct.flags = GTL_NUMCHARS; + TxtLenStruct.codepage = 1200; + + return (LONG) SendMessageW(EM_GETTEXTLENGTHEX, (WPARAM) &TxtLenStruct, 0); + } + + /* + * Insert text (without cleaning old text) + * Supported effects: + * - CFM_BOLD + * - CFM_ITALIC + * - CFM_UNDERLINE + * - CFM_LINK + */ + VOID InsertText(LPCWSTR lpszText, DWORD dwEffects) + { + SETTEXTEX SetText; + LONG Len = GetTextLen(); + + /* Insert new text */ + SetText.flags = ST_SELECTION; + SetText.codepage = 1200; + + SendMessageW(EM_SETTEXTEX, (WPARAM) &SetText, (LPARAM) lpszText); + + SetRangeFormatting(Len, Len + wcslen(lpszText), + (dwEffects == CFM_LINK) ? (PathIsURLW(lpszText) ? dwEffects : 0) : dwEffects); + } + + /* + * Clear old text and add new + */ + VOID SetText(LPCWSTR lpszText, DWORD dwEffects) + { + SetWindowTextW(L""); + InsertText(lpszText, dwEffects); + } + + HWND Create(HWND hwndParent) + { + // TODO: FreeLibrary when the window is destroyed + LoadLibraryW(L"riched20.dll"); + + m_hWnd = CreateWindowExW(0, + L"RichEdit20W", + NULL, + WS_CHILD | WS_VISIBLE | ES_MULTILINE | + ES_LEFT | ES_READONLY, + 205, 28, 465, 100, + hwndParent, + NULL, + _AtlBaseModule.GetModuleInstance(), + NULL); + + if (m_hWnd) + { + SendMessageW(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); + SendMessageW(WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0); + SendMessageW(EM_SETEVENTMASK, 0, ENM_LINK | ENM_MOUSEEVENTS); + SendMessageW(EM_SHOWSCROLLBAR, SB_VERT, TRUE); + } + + return m_hWnd; + } + +public: + virtual VOID OnLink(ENLINK *Link) + { + } + +}; diff --git a/reactos/base/applications/rapps_new/gui.cpp b/reactos/base/applications/rapps_new/gui.cpp index c441b948e38..d1cab777279 100644 --- a/reactos/base/applications/rapps_new/gui.cpp +++ b/reactos/base/applications/rapps_new/gui.cpp @@ -17,155 +17,167 @@ #include #include "rosui.h" +#include "crichedit.h" -PWSTR pLink = NULL; +#define SEARCH_TIMER_ID 'SR' HWND hListView = NULL; -VOID UpdateApplicationsList(INT EnumType); -VOID MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam); -BOOL IsSelectedNodeInstalled(void); -VOID FreeInstalledAppList(VOID); - -class CUiRichEdit : - public CUiWindow< CWindowImplBaseT > +class CMainToolbar : + public CUiWindow< CToolbar<> > { - BOOL ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT& theResult, DWORD dwMapId) +#define TOOLBAR_HEIGHT 24 + + WCHAR szInstallBtn[MAX_STR_LEN]; + WCHAR szUninstallBtn[MAX_STR_LEN]; + WCHAR szModifyBtn[MAX_STR_LEN]; + + VOID AddImageToImageList(HIMAGELIST hImageList, UINT ImageIndex) { - theResult = 0; - return FALSE; + HICON hImage; + + if (!(hImage = (HICON) LoadImage(hInst, + MAKEINTRESOURCE(ImageIndex), + IMAGE_ICON, + TOOLBAR_HEIGHT, + TOOLBAR_HEIGHT, + 0))) + { + /* TODO: Error message */ + } + + ImageList_AddIcon(hImageList, hImage); + DeleteObject(hImage); + } + + HIMAGELIST InitImageList(VOID) + { + HIMAGELIST hImageList; + + /* Create the toolbar icon image list */ + hImageList = ImageList_Create(TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CXSMICON), + TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CYSMICON), + ILC_MASK | GetSystemColorDepth(), + 1, + 1); + if (!hImageList) + { + /* TODO: Error message */ + return NULL; + } + + AddImageToImageList(hImageList, IDI_INSTALL); + AddImageToImageList(hImageList, IDI_UNINSTALL); + AddImageToImageList(hImageList, IDI_MODIFY); + AddImageToImageList(hImageList, IDI_REFRESH); + AddImageToImageList(hImageList, IDI_SETTINGS); + AddImageToImageList(hImageList, IDI_EXIT); + + return hImageList; } public: - VOID SetRangeFormatting(LONG Start, LONG End, DWORD dwEffects) + VOID OnGetDispInfo(LPTOOLTIPTEXT lpttt) { - CHARFORMAT2 CharFormat; + UINT idButton = (UINT) lpttt->hdr.idFrom; - SendMessageW(EM_SETSEL, Start, End); - - ZeroMemory(&CharFormat, sizeof(CHARFORMAT2)); - - CharFormat.cbSize = sizeof(CHARFORMAT2); - CharFormat.dwMask = dwEffects; - CharFormat.dwEffects = dwEffects; - - SendMessageW(EM_SETCHARFORMAT, SCF_WORD | SCF_SELECTION, (LPARAM) &CharFormat); - - SendMessageW(EM_SETSEL, End, End + 1); - } - - LONG GetTextLen(VOID) - { - GETTEXTLENGTHEX TxtLenStruct; - - TxtLenStruct.flags = GTL_NUMCHARS; - TxtLenStruct.codepage = 1200; - - return (LONG) SendMessageW(EM_GETTEXTLENGTHEX, (WPARAM) &TxtLenStruct, 0); - } - - /* - * Insert text (without cleaning old text) - * Supported effects: - * - CFM_BOLD - * - CFM_ITALIC - * - CFM_UNDERLINE - * - CFM_LINK - */ - VOID InsertText(LPCWSTR lpszText, DWORD dwEffects) - { - SETTEXTEX SetText; - LONG Len = GetTextLen(); - - /* Insert new text */ - SetText.flags = ST_SELECTION; - SetText.codepage = 1200; - - SendMessageW(EM_SETTEXTEX, (WPARAM) &SetText, (LPARAM) lpszText); - - SetRangeFormatting(Len, Len + wcslen(lpszText), - (dwEffects == CFM_LINK) ? (PathIsURLW(lpszText) ? dwEffects : 0) : dwEffects); - } - - /* - * Clear old text and add new - */ - VOID SetText(LPCWSTR lpszText, DWORD dwEffects) - { - SetWindowTextW(L""); - InsertText(lpszText, dwEffects); - } - - VOID OnLink(ENLINK *Link) - { - switch (Link->msg) + switch (idButton) { - case WM_LBUTTONUP: - case WM_RBUTTONUP: - { - if (pLink) HeapFree(GetProcessHeap(), 0, pLink); + case ID_EXIT: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXIT); + break; - pLink = (PWSTR) HeapAlloc(GetProcessHeap(), 0, - (max(Link->chrg.cpMin, Link->chrg.cpMax) - - min(Link->chrg.cpMin, Link->chrg.cpMax) + 1) * sizeof(WCHAR)); - if (!pLink) - { - /* TODO: Error message */ - return; - } + case ID_INSTALL: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_INSTALL); + break; - SendMessageW(EM_SETSEL, Link->chrg.cpMin, Link->chrg.cpMax); - SendMessageW(EM_GETSELTEXT, 0, (LPARAM) pLink); + case ID_UNINSTALL: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_UNINSTALL); + break; - ShowPopupMenu(m_hWnd, IDR_LINKMENU, -1); - } - break; + case ID_MODIFY: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_MODIFY); + break; + + case ID_SETTINGS: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SETTINGS); + break; + + case ID_REFRESH: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH); + break; } } HWND Create(HWND hwndParent) { - LoadLibraryW(L"riched20.dll"); + static TBBUTTON Buttons [] = + { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ + { 0, ID_INSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szInstallBtn }, + { 1, ID_UNINSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szUninstallBtn }, + { 2, ID_MODIFY, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szModifyBtn }, + { 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 }, + { 3, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 }, + { 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 }, + { 4, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 }, + { 5, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 } + }; - HWND hwnd = CreateWindowExW(0, - L"RichEdit20W", + INT NumButtons = sizeof(Buttons) / sizeof(Buttons[0]); + HIMAGELIST hImageList; + + LoadStringW(hInst, IDS_INSTALL, szInstallBtn, sizeof(szInstallBtn) / sizeof(WCHAR)); + LoadStringW(hInst, IDS_UNINSTALL, szUninstallBtn, sizeof(szUninstallBtn) / sizeof(WCHAR)); + LoadStringW(hInst, IDS_MODIFY, szModifyBtn, sizeof(szModifyBtn) / sizeof(WCHAR)); + + m_hWnd = CreateWindowExW(0, + TOOLBARCLASSNAMEW, NULL, - WS_CHILD | WS_VISIBLE | ES_MULTILINE | - ES_LEFT | ES_READONLY, - 205, 28, 465, 100, + WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_LIST, + 0, 0, 0, 0, hwndParent, - NULL, + 0, hInst, NULL); - - SubclassWindow(hwnd); - if (hwnd) + if (!m_hWnd) { - SendMessageW(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); - SendMessageW(WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0); - SendMessageW(EM_SETEVENTMASK, 0, ENM_LINK | ENM_MOUSEEVENTS); - SendMessageW(EM_SHOWSCROLLBAR, SB_VERT, TRUE); + /* TODO: Show error message */ + return FALSE; } - return hwnd; - } + SendMessageW(TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); + SetButtonStructSize(); + hImageList = InitImageList(); + + if (!hImageList) + { + /* TODO: Show error message */ + return FALSE; + } + + ImageList_Destroy((HIMAGELIST) SetImageList(hImageList)); + + AddButtons(NumButtons, Buttons); + + return m_hWnd; + } }; -class CUiListView : +class CAppsListView : public CUiWindow { struct SortContext { - CUiListView * lvw; + CAppsListView * lvw; int iSubItem; }; public: BOOL bAscending; - CUiListView() + CAppsListView() { bAscending = TRUE; } @@ -281,27 +293,39 @@ public: }; -class CUiStatusBar : - public CUiWindow -{ -}; - -class CUiMainWindow : - public CWindowImpl +class CMainWindow : + public CWindowImpl { CUiPanel * m_ClientPanel; - - CUiWindow<> * m_Toolbar; - CUiWindow<> * m_TreeView; - CUiWindow<> * m_SearchBar; - CUiStatusBar * m_StatusBar; - CUiListView * m_ListView; - CUiRichEdit * m_RichEdit; CUiSplitPanel * m_VSplitter; CUiSplitPanel * m_HSplitter; + CMainToolbar * m_Toolbar; + CAppsListView * m_ListView; + + CUiWindow * m_TreeView; + CUiWindow * m_StatusBar; + CUiWindow * m_RichEdit; + + CUiWindow<> * m_SearchBar; + HIMAGELIST hImageTreeView; + PWSTR pLink; + + BOOL SearchEnabled; + +public: + CMainWindow() : + m_ClientPanel(NULL), + hImageTreeView(NULL), + pLink(NULL), + SearchEnabled(TRUE) + { + } + +private: + VOID InitApplicationsList(VOID) { WCHAR szText[MAX_STR_LEN]; @@ -337,7 +361,7 @@ class CUiMainWindow : LoadStringW(hInst, TextIndex, szText, _countof(szText)); - return TreeViewAddItem(hRootItem, szText, Index, Index, TextIndex); + return m_TreeView->AddItem(hRootItem, szText, Index, Index, TextIndex); } VOID InitCategoriesList(VOID) @@ -365,17 +389,15 @@ class CUiMainWindow : AddCategory(hRootItem2, IDS_CAT_LIBS, IDI_CAT_LIBS); AddCategory(hRootItem2, IDS_CAT_OTHER, IDI_CAT_OTHER); - (VOID) TreeView_SetImageList(hTreeView, hImageTreeView, TVSIL_NORMAL); - - (VOID) TreeView_Expand(hTreeView, hRootItem2, TVE_EXPAND); - (VOID) TreeView_Expand(hTreeView, hRootItem1, TVE_EXPAND); - - (VOID) TreeView_SelectItem(hTreeView, hRootItem1); + m_TreeView->SetImageList(hImageTreeView, TVSIL_NORMAL); + m_TreeView->Expand(hRootItem2, TVE_EXPAND); + m_TreeView->Expand(hRootItem1, TVE_EXPAND); + m_TreeView->SelectItem(hRootItem1); } BOOL CreateStatusBar() { - m_StatusBar = new CUiStatusBar(); + m_StatusBar = new CUiWindow(); m_StatusBar->m_VerticalAlignment = UiAlign_RightBtm; m_StatusBar->m_HorizontalAlignment = UiAlign_Stretch; m_ClientPanel->Children().Append(m_StatusBar); @@ -385,35 +407,27 @@ class CUiMainWindow : BOOL CreateToolbar() { - // TODO: WRAPPER - m_Toolbar = new CUiWindow<>(); + m_Toolbar = new CMainToolbar(); m_Toolbar->m_VerticalAlignment = UiAlign_LeftTop; m_Toolbar->m_HorizontalAlignment = UiAlign_Stretch; m_ClientPanel->Children().Append(m_Toolbar); - - CreateToolBar(m_hWnd); - m_Toolbar->m_hWnd = hToolBar; - - return hToolBar != NULL; + + return m_Toolbar->Create(m_hWnd) != NULL; } BOOL CreateTreeView() { - // TODO: WRAPPER - m_TreeView = new CUiWindow<>(); + m_TreeView = new CUiWindow(); m_TreeView->m_VerticalAlignment = UiAlign_Stretch; m_TreeView->m_HorizontalAlignment = UiAlign_Stretch; m_VSplitter->First().Append(m_TreeView); - - ::CreateTreeView(m_hWnd); - m_TreeView->m_hWnd = hTreeView; - - return hTreeView != NULL; + + return m_TreeView->Create(m_hWnd) != NULL; } BOOL CreateListView() { - m_ListView = new CUiListView(); + m_ListView = new CAppsListView(); m_ListView->m_VerticalAlignment = UiAlign_Stretch; m_ListView->m_HorizontalAlignment = UiAlign_Stretch; m_HSplitter->First().Append(m_ListView); @@ -424,7 +438,7 @@ class CUiMainWindow : BOOL CreateRichEdit() { - m_RichEdit = new CUiRichEdit(); + m_RichEdit = new CUiWindow(); m_RichEdit->m_VerticalAlignment = UiAlign_Stretch; m_RichEdit->m_HorizontalAlignment = UiAlign_Stretch; m_HSplitter->Second().Append(m_RichEdit); @@ -473,7 +487,7 @@ class CUiMainWindow : m_SearchBar->m_Margin.right = 6; //m_ClientPanel->Children().Append(m_SearchBar); - hSearchBar = CreateWindowExW(WS_EX_CLIENTEDGE, + HWND hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Edit", NULL, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOHSCROLL, @@ -486,14 +500,14 @@ class CUiMainWindow : hInst, 0); - m_SearchBar->m_hWnd = hSearchBar; + m_SearchBar->m_hWnd = hwnd; m_SearchBar->SendMessageW(WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0); LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR)); m_SearchBar->SetWindowTextW(szBuf); - return hSearchBar != NULL; + return hwnd != NULL; } BOOL CreateLayout() @@ -527,15 +541,13 @@ class CUiMainWindow : m_StatusBar->SendMessage(WM_SIZE, 0, 0); /* Size tool bar */ - SendMessage(hToolBar, TB_AUTOSIZE, 0, 0); + m_Toolbar->AutoSize(); ::GetWindowRect(m_Toolbar->m_hWnd, &rTop); ::GetWindowRect(m_StatusBar->m_hWnd, &rBottom); - m_VSplitter->m_Margin.left = 3; - m_VSplitter->m_Margin.right = 3; - m_VSplitter->m_Margin.top = rTop.bottom - rTop.top + 3; - m_VSplitter->m_Margin.bottom = rBottom.bottom-rBottom.top + 3; + m_VSplitter->m_Margin.top = rTop.bottom - rTop.top; + m_VSplitter->m_Margin.bottom = rBottom.bottom-rBottom.top; } return b; @@ -573,7 +585,7 @@ class CUiMainWindow : m_StatusBar->SendMessage(WM_SIZE, 0, 0); /* Size tool bar */ - SendMessage(hToolBar, TB_AUTOSIZE, 0, 0); + m_Toolbar->AutoSize(); RECT r = { 0, 0, LOWORD(lParam), HIWORD(lParam) }; @@ -624,7 +636,7 @@ class CUiMainWindow : } case WM_COMMAND: - MainWndOnCommand(hwnd, wParam, lParam); + OnCommand(wParam, lParam); break; case WM_NOTIFY: @@ -635,7 +647,7 @@ class CUiMainWindow : { case TVN_SELCHANGED: { - if (data->hwndFrom == hTreeView) + if (data->hwndFrom == m_TreeView->m_hWnd) { switch (((LPNMTREEVIEW) lParam)->itemNew.lParam) { @@ -733,10 +745,10 @@ class CUiMainWindow : EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_ENABLED); EnableMenuItem(lvwMenu, ID_MODIFY, MF_ENABLED); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_REGREMOVE, TRUE); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_INSTALL, FALSE); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_UNINSTALL, TRUE); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_MODIFY, TRUE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_REGREMOVE, TRUE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_INSTALL, FALSE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_UNINSTALL, TRUE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_MODIFY, TRUE); } else { @@ -750,10 +762,10 @@ class CUiMainWindow : EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_GRAYED); EnableMenuItem(lvwMenu, ID_MODIFY, MF_GRAYED); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_REGREMOVE, FALSE); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_INSTALL, TRUE); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_UNINSTALL, FALSE); - SendMessage(hToolBar, TB_ENABLEBUTTON, ID_MODIFY, FALSE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_REGREMOVE, FALSE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_INSTALL, TRUE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_UNINSTALL, FALSE); + m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_MODIFY, FALSE); } } break; @@ -827,11 +839,11 @@ class CUiMainWindow : break; case EN_LINK: - m_RichEdit->OnLink((ENLINK*) lParam); + OnLink((ENLINK*) lParam); break; case TTN_GETDISPINFO: - ToolBarOnGetDispInfo((LPTOOLTIPTEXT) lParam); + m_Toolbar->OnGetDispInfo((LPTOOLTIPTEXT) lParam); break; } } @@ -858,24 +870,351 @@ class CUiMainWindow : { /* Forward WM_SYSCOLORCHANGE to common controls */ m_ListView->SendMessage(WM_SYSCOLORCHANGE, 0, 0); - SendMessage(hTreeView, WM_SYSCOLORCHANGE, 0, 0); - SendMessage(hToolBar, WM_SYSCOLORCHANGE, 0, 0); + m_TreeView->SendMessage(WM_SYSCOLORCHANGE, 0, 0); + m_Toolbar->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_ListView->SendMessage(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); } break; + + case WM_TIMER: + if (wParam == SEARCH_TIMER_ID) + { + ::KillTimer(hwnd, SEARCH_TIMER_ID); + UpdateApplicationsList(-1); + } + break; } return FALSE; } -public: - CUiMainWindow() : - m_ClientPanel(NULL), - hImageTreeView(NULL) + virtual VOID OnLink(ENLINK *Link) { + switch (Link->msg) + { + case WM_LBUTTONUP: + case WM_RBUTTONUP: + { + if (pLink) HeapFree(GetProcessHeap(), 0, pLink); + pLink = (PWSTR) HeapAlloc(GetProcessHeap(), 0, + (max(Link->chrg.cpMin, Link->chrg.cpMax) - + min(Link->chrg.cpMin, Link->chrg.cpMax) + 1) * sizeof(WCHAR)); + if (!pLink) + { + /* TODO: Error message */ + return; + } + + m_RichEdit->SendMessageW(EM_SETSEL, Link->chrg.cpMin, Link->chrg.cpMax); + m_RichEdit->SendMessageW(EM_GETSELTEXT, 0, (LPARAM) pLink); + + ShowPopupMenu(m_RichEdit->m_hWnd, IDR_LINKMENU, -1); + } + break; + } } + BOOL IsSelectedNodeInstalled(void) + { + HTREEITEM hSelectedItem = m_TreeView->GetSelection(); + TV_ITEM tItem; + + tItem.mask = TVIF_PARAM | TVIF_HANDLE; + tItem.hItem = hSelectedItem; + m_TreeView->GetItem(&tItem); + switch (tItem.lParam) + { + case IDS_INSTALLED: + case IDS_APPLICATIONS: + case IDS_UPDATES: + return TRUE; + default: + return FALSE; + } + } + + VOID OnCommand(WPARAM wParam, LPARAM lParam) + { + WORD wCommand = LOWORD(wParam); + + if (lParam == (LPARAM) m_SearchBar->m_hWnd) + { + WCHAR szBuf[MAX_STR_LEN]; + + switch (HIWORD(wParam)) + { + case EN_SETFOCUS: + { + WCHAR szWndText[MAX_STR_LEN]; + + LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf)); + GetWindowTextW(m_SearchBar->m_hWnd, szWndText, MAX_STR_LEN); + if (wcscmp(szBuf, szWndText) == 0) + { + SearchEnabled = FALSE; + m_SearchBar->SetWindowTextW(L""); + } + } + break; + + case EN_KILLFOCUS: + { + GetWindowTextW(m_SearchBar->m_hWnd, szBuf, MAX_STR_LEN); + if (wcslen(szBuf) < 1) + { + LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf)); + SearchEnabled = FALSE; + m_SearchBar->SetWindowTextW(szBuf); + } + } + break; + + case EN_CHANGE: + { + WCHAR szWndText[MAX_STR_LEN]; + + if (!SearchEnabled) + { + SearchEnabled = TRUE; + break; + } + + LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf)); + GetWindowTextW(m_SearchBar->m_hWnd, szWndText, MAX_STR_LEN); + if (wcscmp(szBuf, szWndText) != 0) + { + StringCbCopy(szSearchPattern, sizeof(szSearchPattern), + szWndText); + } + else + { + szSearchPattern[0] = UNICODE_NULL; + } + + DWORD dwDelay; + SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &dwDelay, 0); + SetTimer(SEARCH_TIMER_ID, dwDelay); + } + break; + } + + return; + } + + switch (wCommand) + { + case ID_OPEN_LINK: + ShellExecuteW(m_hWnd, L"open", pLink, NULL, NULL, SW_SHOWNOACTIVATE); + HeapFree(GetProcessHeap(), 0, pLink); + break; + + case ID_COPY_LINK: + CopyTextToClipboard(pLink); + HeapFree(GetProcessHeap(), 0, pLink); + break; + + case ID_SETTINGS: + CreateSettingsDlg(m_hWnd); + break; + + case ID_EXIT: + PostMessageW(m_hWnd, WM_CLOSE, 0, 0); + break; + + case ID_INSTALL: + if (DownloadApplication(-1)) + /* TODO: Implement install dialog + * if (InstallApplication(-1)) + */ + UpdateApplicationsList(-1); + break; + + case ID_UNINSTALL: + if (UninstallApplication(-1, FALSE)) + UpdateApplicationsList(-1); + break; + + case ID_MODIFY: + if (UninstallApplication(-1, TRUE)) + UpdateApplicationsList(-1); + break; + + case ID_REGREMOVE: + RemoveAppFromRegistry(-1); + break; + + case ID_REFRESH: + UpdateApplicationsList(-1); + break; + + case ID_RESETDB: + UpdateAppsDB(); + UpdateApplicationsList(-1); + break; + + case ID_HELP: + MessageBoxW(m_hWnd, L"Help not implemented yet", NULL, MB_OK); + break; + + case ID_ABOUT: + ShowAboutDialog(); + break; + } + } + + VOID FreeInstalledAppList(VOID) + { + INT Count = ListView_GetItemCount(hListView) - 1; + PINSTALLED_INFO Info; + + while (Count >= 0) + { + Info = (PINSTALLED_INFO) ListViewGetlParam(Count); + if (Info) + { + RegCloseKey(Info->hSubKey); + HeapFree(GetProcessHeap(), 0, Info); + } + Count--; + } + } + + static BOOL SearchPatternMatch(PCWSTR szHaystack, PCWSTR szNeedle) + { + if (!*szNeedle) + return TRUE; + /* TODO: Improve pattern search beyond a simple case-insensitive substring search. */ + return StrStrIW(szHaystack, szNeedle) != NULL; + } + + static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info) + { + PINSTALLED_INFO ItemInfo; + WCHAR szText[MAX_PATH]; + INT Index; + + if (!SearchPatternMatch(lpName, szSearchPattern)) + { + RegCloseKey(Info->hSubKey); + return TRUE; + } + + ItemInfo = (PINSTALLED_INFO) HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO)); + if (!ItemInfo) + { + RegCloseKey(Info->hSubKey); + return FALSE; + } + + RtlCopyMemory(ItemInfo, Info, sizeof(INSTALLED_INFO)); + + Index = ListViewAddItem(ItemIndex, 0, lpName, (LPARAM) ItemInfo); + + /* Get version info */ + GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText); + ListView_SetItemText(hListView, Index, 1, szText); + + /* Get comments */ + GetApplicationString(ItemInfo->hSubKey, L"Comments", szText); + ListView_SetItemText(hListView, Index, 2, szText); + + return TRUE; + } + + static BOOL CALLBACK s_EnumAvailableAppProc(PAPPLICATION_INFO Info) + { + INT Index; + + if (!SearchPatternMatch(Info->szName, szSearchPattern) && + !SearchPatternMatch(Info->szDesc, szSearchPattern)) + { + return TRUE; + } + + /* Only add a ListView entry if... + - no RegName was supplied (so we cannot determine whether the application is installed or not) or + - a RegName was supplied and the application is not installed + */ + if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE))) + { + Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM) Info); + + ListView_SetItemText(hListView, Index, 1, Info->szVersion); + ListView_SetItemText(hListView, Index, 2, Info->szDesc); + } + + return TRUE; + } + + VOID UpdateApplicationsList(INT EnumType) + { + WCHAR szBuffer1[MAX_STR_LEN], szBuffer2[MAX_STR_LEN]; + HICON hIcon; + HIMAGELIST hImageListView; + + m_ListView->SendMessage(WM_SETREDRAW, FALSE, 0); + + if (EnumType == -1) EnumType = SelectedEnumType; + + if (IS_INSTALLED_ENUM(SelectedEnumType)) + FreeInstalledAppList(); + + (VOID) ListView_DeleteAllItems(hListView); + + /* Create image list */ + hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE, + LISTVIEW_ICON_SIZE, + GetSystemColorDepth() | ILC_MASK, + 0, 1); + + hIcon = (HICON) LoadImage(hInst, + MAKEINTRESOURCE(IDI_MAIN), + IMAGE_ICON, + LISTVIEW_ICON_SIZE, + LISTVIEW_ICON_SIZE, + LR_CREATEDIBSECTION); + + ImageList_AddIcon(hImageListView, hIcon); + DestroyIcon(hIcon); + + if (IS_INSTALLED_ENUM(EnumType)) + { + /* Enum installed applications and updates */ + EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc); + EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc); + } + else if (IS_AVAILABLE_ENUM(EnumType)) + { + /* Enum availabled applications */ + EnumAvailableApplications(EnumType, s_EnumAvailableAppProc); + } + + /* Set image list for ListView */ + hImageListView = ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL); + + /* Destroy old image list */ + if (hImageListView) + ImageList_Destroy(hImageListView); + + SelectedEnumType = EnumType; + + LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2)); + StringCbPrintfW(szBuffer1, sizeof(szBuffer1), + szBuffer2, + ListView_GetItemCount(hListView)); + SetStatusBarText(szBuffer1); + + SetWelcomeText(); + + /* set automatic column width for program names if the list is not empty */ + if (ListView_GetItemCount(hListView) > 0) + ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE); + + SendMessage(hListView, WM_SETREDRAW, TRUE, 0); + } + +public: static ATL::CWndClassInfo& GetWndClassInfo() { DWORD csStyle = CS_VREDRAW |CS_HREDRAW; @@ -910,32 +1249,36 @@ public: return CWindowImpl::Create(NULL, r, szWindowName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); } - CUiStatusBar * GetStatusBar() + CStatusBar * GetStatusBar() { return m_StatusBar; } - CUiListView * GetListView() + CAppsListView * GetListView() { return m_ListView; } - CUiRichEdit * GetRichEdit() + CRichEdit * GetRichEdit() { return m_RichEdit; } }; -CUiMainWindow * g_MainWindow; +CMainWindow * g_MainWindow; HWND CreateMainWindow() { - g_MainWindow = new CUiMainWindow(); + g_MainWindow = new CMainWindow(); return g_MainWindow->Create(); } DWORD_PTR ListViewGetlParam(INT item) { + if (item < 0) + { + item = g_MainWindow->GetListView()->GetSelectionMark(); + } return g_MainWindow->GetListView()->GetItemData(item); } diff --git a/reactos/base/applications/rapps_new/rapps.h b/reactos/base/applications/rapps_new/rapps.h index a12309ee614..3430b314db8 100644 --- a/reactos/base/applications/rapps_new/rapps.h +++ b/reactos/base/applications/rapps_new/rapps.h @@ -175,17 +175,6 @@ UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName); /* settingsdlg.c */ VOID CreateSettingsDlg(HWND hwnd); -/* toolbar.c */ -extern HWND hToolBar; -extern HWND hSearchBar; -BOOL CreateToolBar(HWND hwnd); -VOID ToolBarOnGetDispInfo(LPTOOLTIPTEXT lpttt); - -/* treeview.c */ -extern HWND hTreeView; -BOOL CreateTreeView(HWND hwnd); -HTREEITEM TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam); - /* gui.cpp */ HWND CreateMainWindow(); DWORD_PTR ListViewGetlParam(INT item); @@ -194,6 +183,11 @@ VOID SetStatusBarText(PCWSTR szText); VOID NewRichEditText(PCWSTR szText, DWORD flags); VOID InsertRichEditText(PCWSTR szText, DWORD flags); extern HWND hListView; -extern PWSTR pLink; +extern WCHAR szSearchPattern[MAX_STR_LEN]; + +//extern HWND hTreeView; +//BOOL CreateTreeView(HWND hwnd); +//HTREEITEM TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam); + #endif /* _RAPPS_H */ diff --git a/reactos/base/applications/rapps_new/toolbar.cpp b/reactos/base/applications/rapps_new/toolbar.cpp deleted file mode 100644 index 81d567b1b02..00000000000 --- a/reactos/base/applications/rapps_new/toolbar.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* - * PROJECT: ReactOS Applications Manager - * LICENSE: GPL - See COPYING in the top level directory - * FILE: base/applications/rapps/toolbar.c - * PURPOSE: ToolBar functions - * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org) - */ - -#include "rapps.h" - -#define TOOLBAR_HEIGHT 24 - -HWND hToolBar; -HWND hSearchBar; - -static WCHAR szInstallBtn[MAX_STR_LEN]; -static WCHAR szUninstallBtn[MAX_STR_LEN]; -static WCHAR szModifyBtn[MAX_STR_LEN]; - -/* Toolbar buttons */ -static const TBBUTTON Buttons[] = -{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ - { 0, ID_INSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)szInstallBtn}, - { 1, ID_UNINSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)szUninstallBtn}, - { 2, ID_MODIFY, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)szModifyBtn}, - { 5, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, - { 3, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0}, - { 5, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, - { 4, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0}, - { 5, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0} -}; - - -VOID -ToolBarOnGetDispInfo(LPTOOLTIPTEXT lpttt) -{ - UINT idButton = (UINT)lpttt->hdr.idFrom; - - switch (idButton) - { - case ID_EXIT: - lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXIT); - break; - - case ID_INSTALL: - lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_INSTALL); - break; - - case ID_UNINSTALL: - lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_UNINSTALL); - break; - - case ID_MODIFY: - lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_MODIFY); - break; - - case ID_SETTINGS: - lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SETTINGS); - break; - - case ID_REFRESH: - lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH); - break; - } -} - -VOID -AddImageToImageList(HIMAGELIST hImageList, UINT ImageIndex) -{ - HICON hImage; - - if (!(hImage = (HICON) LoadImage(hInst, - MAKEINTRESOURCE(ImageIndex), - IMAGE_ICON, - TOOLBAR_HEIGHT, - TOOLBAR_HEIGHT, - 0))) - { - /* TODO: Error message */ - } - - ImageList_AddIcon(hImageList, hImage); - DeleteObject(hImage); -} - -HIMAGELIST -InitImageList(VOID) -{ - HIMAGELIST hImageList; - - /* Create the toolbar icon image list */ - hImageList = ImageList_Create(TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CXSMICON), - TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CYSMICON), - ILC_MASK | GetSystemColorDepth(), - 1, - 1); - if (!hImageList) - { - /* TODO: Error message */ - return NULL; - } - - AddImageToImageList(hImageList, IDI_INSTALL); - AddImageToImageList(hImageList, IDI_UNINSTALL); - AddImageToImageList(hImageList, IDI_MODIFY); - AddImageToImageList(hImageList, IDI_REFRESH); - AddImageToImageList(hImageList, IDI_SETTINGS); - AddImageToImageList(hImageList, IDI_EXIT); - - return hImageList; -} - -BOOL -CreateToolBar(HWND hwnd) -{ - INT NumButtons = sizeof(Buttons) / sizeof(Buttons[0]); - HIMAGELIST hImageList; - - LoadStringW(hInst, IDS_INSTALL, szInstallBtn, sizeof(szInstallBtn) / sizeof(WCHAR)); - LoadStringW(hInst, IDS_UNINSTALL, szUninstallBtn, sizeof(szUninstallBtn) / sizeof(WCHAR)); - LoadStringW(hInst, IDS_MODIFY, szModifyBtn, sizeof(szModifyBtn) / sizeof(WCHAR)); - - hToolBar = CreateWindowExW(0, - TOOLBARCLASSNAMEW, - NULL, - WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_LIST, - 0, 0, 0, 0, - hwnd, - 0, - hInst, - NULL); - - if (!hToolBar) - { - /* TODO: Show error message */ - return FALSE; - } - - SendMessageW(hToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); - SendMessageW(hToolBar, TB_BUTTONSTRUCTSIZE, sizeof(Buttons[0]), 0); - - hImageList = InitImageList(); - - if (!hImageList) - { - /* TODO: Show error message */ - return FALSE; - } - - ImageList_Destroy((HIMAGELIST)SendMessageW(hToolBar, - TB_SETIMAGELIST, - 0, - (LPARAM)hImageList)); - - SendMessageW(hToolBar, TB_ADDBUTTONS, NumButtons, (LPARAM)Buttons); - - return TRUE; -} diff --git a/reactos/base/applications/rapps_new/treeview.cpp b/reactos/base/applications/rapps_new/treeview.cpp deleted file mode 100644 index 211883cedb0..00000000000 --- a/reactos/base/applications/rapps_new/treeview.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * PROJECT: ReactOS Applications Manager - * LICENSE: GPL - See COPYING in the top level directory - * FILE: base/applications/rapps/treeview.c - * PURPOSE: TreeView functions - * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org) - */ - -#include "rapps.h" - -HWND hTreeView; - -HTREEITEM -TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam) -{ - TV_INSERTSTRUCTW Insert; - - ZeroMemory(&Insert, sizeof(TV_INSERTSTRUCT)); - - Insert.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; - Insert.hInsertAfter = TVI_LAST; - Insert.hParent = hParent; - Insert.item.iSelectedImage = SelectedImage; - Insert.item.iImage = Image; - Insert.item.lParam = lParam; - Insert.item.pszText = lpText; - - return TreeView_InsertItem(hTreeView, &Insert); -} - -BOOL -CreateTreeView(HWND hwnd) -{ - hTreeView = CreateWindowExW(WS_EX_CLIENTEDGE, - WC_TREEVIEWW, - L"", - WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_SHOWSELALWAYS, - 0, 28, 200, 350, - hwnd, - NULL, - hInst, - NULL); - - if (!hListView) - { - /* TODO: Show error message */ - return FALSE; - } - - SetFocus(hTreeView); - - return TRUE; -} diff --git a/reactos/base/applications/rapps_new/winmain.cpp b/reactos/base/applications/rapps_new/winmain.cpp index 8d4b8c86235..5d3bf153841 100644 --- a/reactos/base/applications/rapps_new/winmain.cpp +++ b/reactos/base/applications/rapps_new/winmain.cpp @@ -13,15 +13,12 @@ #include #include -#define SEARCH_TIMER_ID 'SR' - HWND hMainWnd; HINSTANCE hInst; INT SelectedEnumType = ENUM_ALL_COMPONENTS; SETTINGS_INFO SettingsInfo; WCHAR szSearchPattern[MAX_STR_LEN] = L""; -BOOL SearchEnabled = TRUE; class CRAppsModule : public CComModule { @@ -57,15 +54,6 @@ static VOID InitializeAtlModule(HINSTANCE hInstance, BOOL bInitialize) } } -BOOL -SearchPatternMatch(PCWSTR szHaystack, PCWSTR szNeedle) -{ - if (!*szNeedle) - return TRUE; - /* TODO: Improve pattern search beyond a simple case-insensitive substring search. */ - return StrStrIW(szHaystack, szNeedle) != NULL; -} - VOID FillDefaultSettings(PSETTINGS_INFO pSettingsInfo) { @@ -135,309 +123,6 @@ SaveSettings(HWND hwnd) } } -VOID -FreeInstalledAppList(VOID) -{ - INT Count = ListView_GetItemCount(hListView) - 1; - PINSTALLED_INFO Info; - - while (Count >= 0) - { - Info = (PINSTALLED_INFO)ListViewGetlParam(Count); - if (Info) - { - RegCloseKey(Info->hSubKey); - HeapFree(GetProcessHeap(), 0, Info); - } - Count--; - } -} - -BOOL -CALLBACK -EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info) -{ - PINSTALLED_INFO ItemInfo; - WCHAR szText[MAX_PATH]; - INT Index; - - if (!SearchPatternMatch(lpName, szSearchPattern)) - { - RegCloseKey(Info->hSubKey); - return TRUE; - } - - ItemInfo = (PINSTALLED_INFO) HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO)); - if (!ItemInfo) - { - RegCloseKey(Info->hSubKey); - return FALSE; - } - - RtlCopyMemory(ItemInfo, Info, sizeof(INSTALLED_INFO)); - - Index = ListViewAddItem(ItemIndex, 0, lpName, (LPARAM)ItemInfo); - - /* Get version info */ - GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText); - ListView_SetItemText(hListView, Index, 1, szText); - - /* Get comments */ - GetApplicationString(ItemInfo->hSubKey, L"Comments", szText); - ListView_SetItemText(hListView, Index, 2, szText); - - return TRUE; -} - -BOOL -CALLBACK -EnumAvailableAppProc(PAPPLICATION_INFO Info) -{ - INT Index; - - if (!SearchPatternMatch(Info->szName, szSearchPattern) && - !SearchPatternMatch(Info->szDesc, szSearchPattern)) - { - return TRUE; - } - - /* Only add a ListView entry if... - - no RegName was supplied (so we cannot determine whether the application is installed or not) or - - a RegName was supplied and the application is not installed - */ - if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE))) - { - Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)Info); - - ListView_SetItemText(hListView, Index, 1, Info->szVersion); - ListView_SetItemText(hListView, Index, 2, Info->szDesc); - } - - return TRUE; -} - -VOID -UpdateApplicationsList(INT EnumType) -{ - WCHAR szBuffer1[MAX_STR_LEN], szBuffer2[MAX_STR_LEN]; - HICON hIcon; - HIMAGELIST hImageListView; - - SendMessage(hListView, WM_SETREDRAW, FALSE, 0); - - if (EnumType == -1) EnumType = SelectedEnumType; - - if (IS_INSTALLED_ENUM(SelectedEnumType)) - FreeInstalledAppList(); - - (VOID) ListView_DeleteAllItems(hListView); - - /* Create image list */ - hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE, - LISTVIEW_ICON_SIZE, - GetSystemColorDepth() | ILC_MASK, - 0, 1); - - hIcon = (HICON)LoadImage(hInst, - MAKEINTRESOURCE(IDI_MAIN), - IMAGE_ICON, - LISTVIEW_ICON_SIZE, - LISTVIEW_ICON_SIZE, - LR_CREATEDIBSECTION); - - ImageList_AddIcon(hImageListView, hIcon); - DestroyIcon(hIcon); - - if (IS_INSTALLED_ENUM(EnumType)) - { - /* Enum installed applications and updates */ - EnumInstalledApplications(EnumType, TRUE, EnumInstalledAppProc); - EnumInstalledApplications(EnumType, FALSE, EnumInstalledAppProc); - } - else if (IS_AVAILABLE_ENUM(EnumType)) - { - /* Enum availabled applications */ - EnumAvailableApplications(EnumType, EnumAvailableAppProc); - } - - /* Set image list for ListView */ - hImageListView = ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL); - - /* Destroy old image list */ - if (hImageListView) - ImageList_Destroy(hImageListView); - - SelectedEnumType = EnumType; - - LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2)); - StringCbPrintfW(szBuffer1, sizeof(szBuffer1), - szBuffer2, - ListView_GetItemCount(hListView)); - SetStatusBarText(szBuffer1); - - SetWelcomeText(); - - /* set automatic column width for program names if the list is not empty */ - if (ListView_GetItemCount(hListView) > 0) - ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE); - - SendMessage(hListView, WM_SETREDRAW, TRUE, 0); -} - -VOID CALLBACK -SearchTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) -{ - KillTimer(hwnd, SEARCH_TIMER_ID); - UpdateApplicationsList(-1); -} - -VOID -MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) -{ - WORD wCommand = LOWORD(wParam); - - if (lParam == (LPARAM)hSearchBar) - { - WCHAR szBuf[MAX_STR_LEN]; - - switch (HIWORD(wParam)) - { - case EN_SETFOCUS: - { - WCHAR szWndText[MAX_STR_LEN]; - - LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf)); - GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN); - if (wcscmp(szBuf, szWndText) == 0) - { - SearchEnabled = FALSE; - SetWindowTextW(hSearchBar, L""); - } - } - break; - - case EN_KILLFOCUS: - { - GetWindowTextW(hSearchBar, szBuf, MAX_STR_LEN); - if (wcslen(szBuf) < 1) - { - LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf)); - SearchEnabled = FALSE; - SetWindowTextW(hSearchBar, szBuf); - } - } - break; - - case EN_CHANGE: - { - WCHAR szWndText[MAX_STR_LEN]; - - if (!SearchEnabled) - { - SearchEnabled = TRUE; - break; - } - - LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf)); - GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN); - if (wcscmp(szBuf, szWndText) != 0) - { - StringCbCopy(szSearchPattern, sizeof(szSearchPattern), - szWndText); - } - else - { - szSearchPattern[0] = UNICODE_NULL; - } - - SetTimer(hwnd, SEARCH_TIMER_ID, 250, SearchTimerProc); - } - break; - } - - return; - } - - switch (wCommand) - { - case ID_OPEN_LINK: - ShellExecuteW(hwnd, L"open", pLink, NULL, NULL, SW_SHOWNOACTIVATE); - HeapFree(GetProcessHeap(), 0, pLink); - break; - - case ID_COPY_LINK: - CopyTextToClipboard(pLink); - HeapFree(GetProcessHeap(), 0, pLink); - break; - - case ID_SETTINGS: - CreateSettingsDlg(hwnd); - break; - - case ID_EXIT: - PostMessageW(hwnd, WM_CLOSE, 0, 0); - break; - - case ID_INSTALL: - if (DownloadApplication(-1)) - /* TODO: Implement install dialog - * if (InstallApplication(-1)) - */ - UpdateApplicationsList(-1); - break; - - case ID_UNINSTALL: - if (UninstallApplication(-1, FALSE)) - UpdateApplicationsList(-1); - break; - - case ID_MODIFY: - if (UninstallApplication(-1, TRUE)) - UpdateApplicationsList(-1); - break; - - case ID_REGREMOVE: - RemoveAppFromRegistry(-1); - break; - - case ID_REFRESH: - UpdateApplicationsList(-1); - break; - - case ID_RESETDB: - UpdateAppsDB(); - UpdateApplicationsList(-1); - break; - - case ID_HELP: - MessageBoxW(hwnd, L"Help not implemented yet", NULL, MB_OK); - break; - - case ID_ABOUT: - ShowAboutDialog(); - break; - } -} - -BOOL IsSelectedNodeInstalled(void) -{ - HTREEITEM hSelectedItem = TreeView_GetSelection(hTreeView); - TV_ITEM tItem; - - tItem.mask = TVIF_PARAM | TVIF_HANDLE; - tItem.hItem = hSelectedItem; - TreeView_GetItem(hTreeView, &tItem); - switch (tItem.lParam) - { - case IDS_INSTALLED: - case IDS_APPLICATIONS: - case IDS_UPDATES: - return TRUE; - default: - return FALSE; - } -} - int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) { diff --git a/reactos/base/shell/explorer/taskswnd.cpp b/reactos/base/shell/explorer/taskswnd.cpp index 83413210e77..6be72cf3a2f 100644 --- a/reactos/base/shell/explorer/taskswnd.cpp +++ b/reactos/base/shell/explorer/taskswnd.cpp @@ -103,7 +103,7 @@ typedef struct _TASK_ITEM } TASK_ITEM, *PTASK_ITEM; class CTaskToolbar : - public CToolbar + public CWindowImplBaseT< CToolbar, CControlWinTraits > { public: INT UpdateTbButtonSpacing(IN BOOL bHorizontal, IN BOOL bThemed, IN UINT uiRows = 0, IN UINT uiBtnsPerLine = 0) @@ -170,7 +170,7 @@ public: TBSTYLE_TOOLTIPS | TBSTYLE_WRAPABLE | TBSTYLE_LIST | TBSTYLE_TRANSPARENT | CCS_TOP | CCS_NORESIZE | CCS_NODIVIDER; - return SubclassWindow(Create(hWndParent, styles)); + return SubclassWindow(CToolbar::Create(hWndParent, styles)); } }; diff --git a/reactos/base/shell/explorer/trayntfy.cpp b/reactos/base/shell/explorer/trayntfy.cpp index e611b9b817c..ec502cf916e 100644 --- a/reactos/base/shell/explorer/trayntfy.cpp +++ b/reactos/base/shell/explorer/trayntfy.cpp @@ -37,7 +37,7 @@ typedef struct _SYS_PAGER_COPY_DATA } SYS_PAGER_COPY_DATA, *PSYS_PAGER_COPY_DATA; class CNotifyToolbar : - public CToolbar + public CWindowImplBaseT< CToolbar, CControlWinTraits > { static const int ICON_SIZE = 16; @@ -367,7 +367,7 @@ public: TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_WRAPABLE | TBSTYLE_TRANSPARENT | CCS_TOP | CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NODIVIDER; - SubclassWindow(Create(hWndParent, styles)); + SubclassWindow(CToolbar::Create(hWndParent, styles)); SetWindowTheme(m_hWnd, L"TrayNotify", NULL); diff --git a/reactos/base/shell/rshell/CMenuToolbars.cpp b/reactos/base/shell/rshell/CMenuToolbars.cpp index d762a7f3a59..ef6db12b753 100644 --- a/reactos/base/shell/rshell/CMenuToolbars.cpp +++ b/reactos/base/shell/rshell/CMenuToolbars.cpp @@ -383,7 +383,7 @@ HRESULT CMenuToolbarBase::CreateToolbar(HWND hwndParent, DWORD dwFlags) rc.bottom = 1; } - SubclassWindow(Create(hwndParent, tbStyles, tbExStyles)); + SubclassWindow(CToolbar::Create(hwndParent, tbStyles, tbExStyles)); SetWindowTheme(m_hWnd, L"", L""); diff --git a/reactos/base/shell/rshell/CMenuToolbars.h b/reactos/base/shell/rshell/CMenuToolbars.h index 185dab94159..3e9311a1e69 100644 --- a/reactos/base/shell/rshell/CMenuToolbars.h +++ b/reactos/base/shell/rshell/CMenuToolbars.h @@ -26,7 +26,7 @@ class CMenuFocusManager; #define WM_USER_CHANGETRACKEDITEM (WM_APP+42) class CMenuToolbarBase : - public CToolbar + public CWindowImplBaseT< CToolbar, CControlWinTraits > { CContainedWindow m_pager; private: diff --git a/reactos/include/reactos/rosctrls.h b/reactos/include/reactos/rosctrls.h index e394f799dfd..666bf0e1250 100644 --- a/reactos/include/reactos/rosctrls.h +++ b/reactos/include/reactos/rosctrls.h @@ -190,9 +190,9 @@ public: DWORD_PTR GetItemData(int i) { - LVITEMW lvItem; - lvItem.iItem = i; + LVITEMW lvItem = { 0 }; lvItem.mask = LVIF_PARAM; + lvItem.iItem = i; BOOL ret = GetItem(&lvItem); return (DWORD_PTR)(ret ? lvItem.lParam : NULL); } @@ -218,7 +218,7 @@ public: template class CToolbar : - public CWindowImplBaseT + public CWindow { public: // Configuration methods @@ -415,14 +415,8 @@ public: // Utility methods }; class CStatusBar : - public CWindowImplBaseT + public CWindow { - BOOL ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT& theResult, DWORD dwMapId) - { - theResult = 0; - return FALSE; - } - public: VOID SetText(LPCWSTR lpszText) { @@ -431,7 +425,7 @@ public: HWND Create(HWND hwndParent, HMENU hMenu) { - HWND hwnd = CreateWindowExW(0, + m_hWnd = CreateWindowExW(0, STATUSCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, @@ -440,8 +434,140 @@ public: hMenu, _AtlBaseModule.GetModuleInstance(), NULL); - SubclassWindow(hwnd); - return hwnd; + + return m_hWnd; + } + +}; + +class CTreeView : + public CWindow +{ +public: + HWND Create(HWND hwndParent) + { + m_hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, + WC_TREEVIEWW, + L"", + WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_SHOWSELALWAYS, + 0, 28, 200, 350, + hwndParent, + NULL, + _AtlBaseModule.GetModuleInstance(), + NULL); + + return m_hWnd; + } + + HTREEITEM AddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam) + { + TVINSERTSTRUCTW Insert; + + ZeroMemory(&Insert, sizeof(TV_INSERTSTRUCT)); + + Insert.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; + Insert.hInsertAfter = TVI_LAST; + Insert.hParent = hParent; + Insert.item.iSelectedImage = SelectedImage; + Insert.item.iImage = Image; + Insert.item.lParam = lParam; + Insert.item.pszText = lpText; + + return InsertItem(&Insert); + } + + void SetRedraw(BOOL redraw) + { + SendMessage(WM_SETREDRAW, redraw); + } + + BOOL SetBkColor(COLORREF cr) + { + return (BOOL) SendMessage(TVM_SETBKCOLOR, 0, cr); + } + + BOOL SetTextColor(COLORREF cr) + { + return (BOOL) SendMessage(TVM_SETTEXTCOLOR, 0, cr); + } + + HIMAGELIST SetImageList(HIMAGELIST himl, int iImageList) + { + return (HIMAGELIST) SendMessage(TVM_SETIMAGELIST, iImageList, reinterpret_cast(himl)); + } + + HTREEITEM InsertItem(const TVINSERTSTRUCTW * pitem) + { + return (HTREEITEM) SendMessage(TVM_INSERTITEM, 0, reinterpret_cast(pitem)); + } + + BOOL DeleteItem(HTREEITEM i) + { + return (BOOL) SendMessage(TVM_DELETEITEM, 0, (LPARAM)i); + } + + BOOL GetItem(TV_ITEM* pitem) + { + return (BOOL) SendMessage(TVM_GETITEM, 0, reinterpret_cast(pitem)); + } + + BOOL SetItem(const TV_ITEM * pitem) + { + return (BOOL) SendMessage(TVM_SETITEM, 0, reinterpret_cast(pitem)); + } + + int GetItemCount() + { + return SendMessage(TVM_GETCOUNT); + } + + BOOL EnsureVisible(HTREEITEM i) + { + return (BOOL) SendMessage(TVM_ENSUREVISIBLE, 0, (LPARAM)i); + } + + HWND EditLabel(HTREEITEM i) + { + return (HWND) SendMessage(TVM_EDITLABEL, 0, (LPARAM)i); + } + + HTREEITEM GetNextItem(HTREEITEM i, WORD flags) + { + return (HTREEITEM)SendMessage(TVM_GETNEXTITEM, flags, (LPARAM)i); + } + + UINT GetItemState(int i, UINT mask) + { + return SendMessage(TVM_GETITEMSTATE, i, (LPARAM) mask); + } + + HTREEITEM HitTest(TVHITTESTINFO * phtInfo) + { + return (HTREEITEM) SendMessage(TVM_HITTEST, 0, reinterpret_cast(phtInfo)); + } + + DWORD_PTR GetItemData(HTREEITEM item) + { + TVITEMW lvItem; + lvItem.hItem = item; + lvItem.mask = TVIF_PARAM; + BOOL ret = GetItem(&lvItem); + return (DWORD_PTR) (ret ? lvItem.lParam : NULL); + } + + HTREEITEM GetSelection() + { + return GetNextItem(NULL, TVGN_CARET); + } + + BOOL Expand(HTREEITEM item, DWORD action) + { + return SendMessage(TVM_EXPAND, action, (LPARAM)item); + } + + BOOL SelectItem(HTREEITEM item, DWORD action = TVGN_CARET) + { + return SendMessage(TVM_SELECTITEM, action, (LPARAM) item); } };