[RAPPS_NEW]

Continue the work converting the UI to using ATL-wrapped windows. CORE-9593

[RSHELL]
[EXPLORER]
Fixup two class declarations to work with the rosctrls.h changes.

svn path=/trunk/; revision=67474
This commit is contained in:
David Quintana 2015-04-29 00:07:54 +00:00
parent 4d59b2ba82
commit 38af0226a1
12 changed files with 769 additions and 736 deletions

View file

@ -13,8 +13,6 @@ list(APPEND SOURCE
loaddlg.cpp
misc.cpp
settingsdlg.cpp
toolbar.cpp
treeview.cpp
winmain.cpp
rapps.h)

View file

@ -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)
{
}
};

View file

@ -17,155 +17,167 @@
#include <rosctrls.h>
#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<CWindow> >
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<CListView>
{
struct SortContext
{
CUiListView * lvw;
CAppsListView * lvw;
int iSubItem;
};
public:
BOOL bAscending;
CUiListView()
CAppsListView()
{
bAscending = TRUE;
}
@ -281,27 +293,39 @@ public:
};
class CUiStatusBar :
public CUiWindow<CStatusBar>
{
};
class CUiMainWindow :
public CWindowImpl<CUiMainWindow, CWindow, CFrameWinTraits>
class CMainWindow :
public CWindowImpl<CMainWindow, CWindow, CFrameWinTraits>
{
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<CTreeView> * m_TreeView;
CUiWindow<CStatusBar> * m_StatusBar;
CUiWindow<CRichEdit> * 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<CStatusBar>();
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<CTreeView>();
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<CRichEdit>();
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);
}

View file

@ -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 */

View file

@ -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;
}

View file

@ -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;
}

View file

@ -13,15 +13,12 @@
#include <atlcom.h>
#include <shellapi.h>
#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)
{

View file

@ -103,7 +103,7 @@ typedef struct _TASK_ITEM
} TASK_ITEM, *PTASK_ITEM;
class CTaskToolbar :
public CToolbar<TASK_ITEM>
public CWindowImplBaseT< CToolbar<TASK_ITEM>, 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));
}
};

View file

@ -37,7 +37,7 @@ typedef struct _SYS_PAGER_COPY_DATA
} SYS_PAGER_COPY_DATA, *PSYS_PAGER_COPY_DATA;
class CNotifyToolbar :
public CToolbar<NOTIFYICONDATA>
public CWindowImplBaseT< CToolbar<NOTIFYICONDATA>, 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);

View file

@ -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"");

View file

@ -26,7 +26,7 @@ class CMenuFocusManager;
#define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
class CMenuToolbarBase :
public CToolbar<DWORD_PTR>
public CWindowImplBaseT< CToolbar<DWORD_PTR>, CControlWinTraits >
{
CContainedWindow m_pager;
private:

View file

@ -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<typename TItemData = DWORD_PTR>
class CToolbar :
public CWindowImplBaseT<CWindow>
public CWindow
{
public: // Configuration methods
@ -415,14 +415,8 @@ public: // Utility methods
};
class CStatusBar :
public CWindowImplBaseT<CWindow>
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<LPARAM>(himl));
}
HTREEITEM InsertItem(const TVINSERTSTRUCTW * pitem)
{
return (HTREEITEM) SendMessage(TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>(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<LPARAM>(pitem));
}
BOOL SetItem(const TV_ITEM * pitem)
{
return (BOOL) SendMessage(TVM_SETITEM, 0, reinterpret_cast<LPARAM>(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<LPARAM>(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);
}
};