Erich Hoover : hhctrl.ocx: Add widgets for the Search tab.
Alexandre Julliard
julliard at winehq.org
Mon Feb 8 11:06:08 CST 2010
Module: wine
Branch: master
Commit: 796c4dec7ff09c063e574bc9183df52a40ea6a17
URL: http://source.winehq.org/git/wine.git/?a=commit;h=796c4dec7ff09c063e574bc9183df52a40ea6a17
Author: Erich Hoover <ehoover at mines.edu>
Date: Sun Feb 7 10:09:04 2010 -0700
hhctrl.ocx: Add widgets for the Search tab.
---
dlls/hhctrl.ocx/help.c | 125 +++++++++++++++++++++++++++++++++++++++++++--
dlls/hhctrl.ocx/hhctrl.h | 7 +++
2 files changed, 126 insertions(+), 6 deletions(-)
diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c
index e115da1..7eca538 100644
--- a/dlls/hhctrl.ocx/help.c
+++ b/dlls/hhctrl.ocx/help.c
@@ -44,6 +44,7 @@ static LRESULT Help_OnSize(HWND hWnd);
#define TAB_TOP_PADDING 8
#define TAB_RIGHT_PADDING 4
#define TAB_MARGIN 8
+#define EDIT_HEIGHT 20
static const WCHAR szEmpty[] = {0};
@@ -341,9 +342,6 @@ static void ResizeTabChild(HHInfo *info, int tab)
SetWindowPos(hwnd, NULL, rect.left, rect.top, width, height,
SWP_NOZORDER | SWP_NOACTIVATE);
- /* Resize the tab widget column to perfectly fit the tab window and
- * leave sufficient space for the scroll widget.
- */
switch (tab)
{
case TAB_INDEX: {
@@ -351,11 +349,33 @@ static void ResizeTabChild(HHInfo *info, int tab)
int border_width = GetSystemMetrics(SM_CXBORDER);
int edge_width = GetSystemMetrics(SM_CXEDGE);
+ /* Resize the tab widget column to perfectly fit the tab window and
+ * leave sufficient space for the scroll widget.
+ */
SendMessageW(info->tabs[TAB_INDEX].hwnd, LVM_SETCOLUMNWIDTH, 0,
width-scroll_width-2*border_width-2*edge_width);
break;
}
+ case TAB_SEARCH: {
+ int scroll_width = GetSystemMetrics(SM_CXVSCROLL);
+ int border_width = GetSystemMetrics(SM_CXBORDER);
+ int edge_width = GetSystemMetrics(SM_CXEDGE);
+ int top_pos = 0;
+
+ SetWindowPos(info->search.hwndEdit, NULL, 0, top_pos, width,
+ EDIT_HEIGHT, SWP_NOZORDER | SWP_NOACTIVATE);
+ top_pos += EDIT_HEIGHT + TAB_MARGIN;
+ SetWindowPos(info->search.hwndList, NULL, 0, top_pos, width,
+ height-top_pos, SWP_NOZORDER | SWP_NOACTIVATE);
+ /* Resize the tab widget column to perfectly fit the tab window and
+ * leave sufficient space for the scroll widget.
+ */
+ SendMessageW(info->search.hwndList, LVM_SETCOLUMNWIDTH, 0,
+ width-scroll_width-2*border_width-2*edge_width);
+
+ break;
+ }
}
}
@@ -469,6 +489,22 @@ static LRESULT OnTopicChange(HHInfo *info, void *user_data)
return 0;
}
+/* Capture the Enter/Return key and send it up to Child_WndProc as an NM_RETURN message */
+static LRESULT CALLBACK EditChild_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ WNDPROC editWndProc = (WNDPROC)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
+
+ if(message == WM_KEYUP && wParam == VK_RETURN)
+ {
+ NMHDR nmhdr;
+
+ nmhdr.hwndFrom = hWnd;
+ nmhdr.code = NM_RETURN;
+ SendMessageW(GetParent(GetParent(hWnd)), WM_NOTIFY, wParam, (LPARAM)&nmhdr);
+ }
+ return editWndProc(hWnd, message, wParam, lParam);
+}
+
static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
@@ -490,8 +526,10 @@ static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LP
if(info && info->current_tab == TAB_INDEX)
return OnTopicChange(info, (void*)((NMITEMACTIVATE *)lParam)->lParam);
case NM_RETURN:
- if(info && info->current_tab == TAB_INDEX)
- {
+ if(!info)
+ return 0;
+ switch(info->current_tab) {
+ case TAB_INDEX: {
HWND hwndList = info->tabs[TAB_INDEX].hwnd;
LVITEMW lvItem;
@@ -499,8 +537,17 @@ static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LP
lvItem.mask = TVIF_PARAM;
ListView_GetItemW(hwndList, &lvItem);
OnTopicChange(info, (void*) lvItem.lParam);
+ return 0;
}
- return 0;
+ case TAB_SEARCH: {
+ WCHAR needle[100];
+
+ GetWindowTextW(info->search.hwndEdit, needle, sizeof(needle)/sizeof(WCHAR));
+ FIXME("Search for text: %s\n", debugstr_w(needle));
+ return 0;
+ }
+ }
+ break;
}
break;
}
@@ -862,6 +909,69 @@ static BOOL AddIndexTab(HHInfo *info)
return TRUE;
}
+static BOOL AddSearchTab(HHInfo *info)
+{
+ HWND hwndList, hwndEdit, hwndContainer;
+ char hidden_column[] = "Column";
+ WNDPROC editWndProc;
+ LVCOLUMNA lvc;
+
+ if(info->tabs[TAB_SEARCH].id == -1)
+ return TRUE; /* No "Search" tab */
+ hwndContainer = CreateWindowExW(WS_EX_CONTROLPARENT, szChildClass, szEmpty,
+ WS_CHILD, 0, 0, 0, 0, info->WinType.hwndNavigation,
+ NULL, hhctrl_hinstance, NULL);
+ if(!hwndContainer) {
+ ERR("Could not create search window container control.\n");
+ return FALSE;
+ }
+ hwndEdit = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDITW, szEmpty, WS_CHILD
+ | WS_VISIBLE | ES_LEFT | SS_NOTIFY, 0, 0, 0, 0,
+ hwndContainer, NULL, hhctrl_hinstance, NULL);
+ if(!hwndEdit) {
+ ERR("Could not create search ListView control.\n");
+ return FALSE;
+ }
+ if(SendMessageW(hwndEdit, WM_SETFONT, (WPARAM) info->hFont, (LPARAM) FALSE) == -1)
+ {
+ ERR("Could not set font for edit control.\n");
+ return FALSE;
+ }
+ editWndProc = (WNDPROC) SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC, (LONG_PTR)EditChild_WndProc);
+ if(!editWndProc) {
+ ERR("Could not redirect messages for edit control.\n");
+ return FALSE;
+ }
+ SetWindowLongPtrW(hwndEdit, GWLP_USERDATA, (LONG_PTR)editWndProc);
+ hwndList = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW, szEmpty,
+ WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_SINGLESEL
+ | LVS_REPORT | LVS_NOCOLUMNHEADER, 0, 0, 0, 0,
+ hwndContainer, NULL, hhctrl_hinstance, NULL);
+ if(!hwndList) {
+ ERR("Could not create search ListView control.\n");
+ return FALSE;
+ }
+ memset(&lvc, 0, sizeof(lvc));
+ lvc.mask = LVCF_TEXT;
+ lvc.pszText = hidden_column;
+ if(SendMessageW(hwndList, LVM_INSERTCOLUMNA, 0, (LPARAM) &lvc) == -1)
+ {
+ ERR("Could not create ListView column\n");
+ return FALSE;
+ }
+
+ info->search.hwndEdit = hwndEdit;
+ info->search.hwndList = hwndList;
+ info->search.hwndContainer = hwndContainer;
+ info->tabs[TAB_SEARCH].hwnd = hwndContainer;
+
+ SetWindowLongPtrW(hwndContainer, GWLP_USERDATA, (LONG_PTR)info);
+
+ ResizeTabChild(info, TAB_SEARCH);
+
+ return TRUE;
+}
+
/* The Index tab's sub-topic popup */
static void ResizePopupChild(HHInfo *info)
@@ -1232,6 +1342,9 @@ static BOOL CreateViewer(HHInfo *pHHInfo)
if (!AddIndexPopup(pHHInfo))
return FALSE;
+ if (!AddSearchTab(pHHInfo))
+ return FALSE;
+
InitContent(pHHInfo);
InitIndex(pHHInfo);
diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h
index adff42d..dfc80b7 100644
--- a/dlls/hhctrl.ocx/hhctrl.h
+++ b/dlls/hhctrl.ocx/hhctrl.h
@@ -115,6 +115,12 @@ typedef struct {
} IndexPopup;
typedef struct {
+ HWND hwndEdit;
+ HWND hwndList;
+ HWND hwndContainer;
+} SearchTab;
+
+typedef struct {
IOleClientSite *client_site;
IWebBrowser2 *web_browser;
IOleObject *wb_object;
@@ -137,6 +143,7 @@ typedef struct {
ContentItem *content;
IndexItem *index;
IndexPopup popup;
+ SearchTab search;
HWND hwndTabCtrl;
HWND hwndSizeBar;
HFONT hFont;
More information about the wine-cvs
mailing list