Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

380 lines
8.8 KiB

/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1993-1998 Microsoft Corporation. All Rights Reserved.
//
// MODULE: find.cpp
//
// PURPOSE:
//
#include "pch.hxx"
#include "find.h"
#include "findres.h"
#include "menures.h"
#include "instance.h"
#include "msgview.h"
#include "menuutil.h"
#include "finder.h"
#include "shlwapip.h"
// These will be handy
inline _width(RECT rc) { return (rc.right - rc.left); }
inline _height(RECT rc) { return (rc.bottom - rc.top); }
inline UINT _GetTextLength(HWND hwnd, DWORD id) { return (UINT) SendDlgItemMessage(hwnd, id, WM_GETTEXTLENGTH, 0, 0); }
/////////////////////////////////////////////////////////////////////////////
// CFindNext
//
CFindNext::CFindNext()
{
m_cRef = 1;
m_hwnd = NULL;
m_hwndParent = NULL;
}
CFindNext::~CFindNext()
{
Assert(!IsWindow(m_hwnd));
SetDwOption(OPT_SEARCH_BODIES, m_fBodies, 0, 0);
}
//
// FUNCTION: CFindNext::QueryInterface()
//
// PURPOSE: Allows caller to retrieve the various interfaces supported by
// this class.
//
HRESULT CFindNext::QueryInterface(REFIID riid, LPVOID *ppvObj)
{
TraceCall("CFindNext::QueryInterface");
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown))
*ppvObj = (LPVOID) (IUnknown *) this;
else if (IsEqualIID(riid, IID_IOleCommandTarget))
*ppvObj = (LPVOID) (IOleCommandTarget *) this;
if (*ppvObj)
{
AddRef();
return (S_OK);
}
return (E_NOINTERFACE);
}
//
// FUNCTION: CFindNext::AddRef()
//
// PURPOSE: Adds a reference count to this object.
//
ULONG CFindNext::AddRef(void)
{
TraceCall("CFindNext::AddRef");
return ((ULONG) InterlockedIncrement((LONG *) &m_cRef));
}
//
// FUNCTION: CFindNext::Release()
//
// PURPOSE: Releases a reference on this object.
//
ULONG CFindNext::Release(void)
{
TraceCall("CFindNext::Release");
if (0 == InterlockedDecrement((LONG *) &m_cRef))
{
delete this;
return 0;
}
return (m_cRef);
}
//
// FUNCTION: CFindNext::Show()
//
// PURPOSE: Causes the dialog to be created and displayed
//
// PARAMETERS:
// [in] hwndParent - Handle of the parent for the dialog
// [out] phWnd - Returns the handle of the new dialog window
//
// RETURN VALUE:
// HRESULT
//
HRESULT CFindNext::Show(HWND hwndParent, HWND *phWnd)
{
int iReturn;
TraceCall("CFindNext::Show");
if (!IsWindow(hwndParent))
return (E_INVALIDARG);
// Create the dialog box
iReturn = (int) DialogBoxParamWrapW(g_hLocRes, MAKEINTRESOURCEW(IDD_FIND_NEXT), hwndParent,
FindDlgProc, (LPARAM) this);
return (iReturn ? S_OK : E_FAIL);
}
//
// FUNCTION: CFindNext::Close()
//
// PURPOSE: Causes the find dialog to be closed.
//
HRESULT CFindNext::Close(void)
{
TraceCall("CFindNext::Close");
if (IsWindow(m_hwnd))
{
EndDialog(m_hwnd, 0);
m_hwnd = NULL;
}
return (S_OK);
}
//
// FUNCTION: CFindNext::TranslateAccelerator()
//
// PURPOSE: Called by the parent to allow us to translate our own
// messages.
//
// PARAMETERS:
// LPMSG pMsg
//
// RETURN VALUE:
// HRESULT
//
HRESULT CFindNext::TranslateAccelerator(LPMSG pMsg)
{
if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_F3))
OnFindNow();
else if (IsDialogMessageWrapW(m_hwnd, pMsg))
return (S_OK);
return (S_FALSE);
}
//
// FUNCTION: CFindNext::GetFindString()
//
// PURPOSE: Get's the current search string from the dialog
//
// PARAMETERS:
// [in, out] psz - Buffer to copy the string into
// [in] cchMax - Size of psz.
//
HRESULT CFindNext::GetFindString(LPTSTR psz, DWORD cchMax, BOOL *pfBodies)
{
TraceCall("CFindNext::GetFindString");
if (!psz || !cchMax || !pfBodies)
return (E_INVALIDARG);
// Get the current contents of the combo box
m_cMRUList.EnumList(0, psz, cchMax);
if (pfBodies)
*pfBodies = m_fBodies;
return (S_OK);
}
//
// FUNCTION: CFindNext::FindDlgProc()
//
// PURPOSE: Static callback for the dialog proc. Does the work of finding
// the correct this pointer and sending the messages to that
// callback.
//
INT_PTR CALLBACK CFindNext::FindDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CFindNext *pThis;
if (uMsg == WM_INITDIALOG)
{
SetWindowLongPtr(hwnd, DWLP_USER, lParam);
pThis = (CFindNext *) lParam;
}
else
pThis = (CFindNext *) GetWindowLongPtr(hwnd, DWLP_USER);
if (pThis)
return (pThis->DlgProc(hwnd, uMsg, wParam, lParam));
return (FALSE);
}
static const HELPMAP g_rgCtxMapFindNext[] = {
{IDC_FIND_HISTORY, 50300},
{IDC_ALL_TEXT, 50310},
{IDC_FIND_NOW, 50305},
{IDC_ADVANCED, 50315},
{0, 0}
};
INT_PTR CALLBACK CFindNext::DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult;
switch (uMsg)
{
case WM_INITDIALOG:
return (BOOL) HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, OnInitDialog);
case WM_COMMAND:
return (BOOL) HANDLE_WM_COMMAND(hwnd, wParam, lParam, OnCommand);
case WM_HELP:
case WM_CONTEXTMENU:
return OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapFindNext);
}
return (FALSE);
}
//
// FUNCTION: CFindNext::OnInitDialog()
//
// PURPOSE: Initializes the UI for the dialog.
//
// PARAMETERS:
// [in] hwnd - Handle of the dialog being created
// [in] hwndFocus - Handle of the control that should have focus
// [in] lParam - Initialization data.
//
// RETURN VALUE:
// Returns TRUE to let windows set the focus
//
BOOL CFindNext::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
TCHAR sz[256];
UINT nItem = 0;
TraceCall("CFindNext::OnInitDialog");
m_hwnd = hwnd;
SendDlgItemMessage(hwnd, IDC_FIND_HISTORY, CB_LIMITTEXT, CCHMAX_FIND, 0);
SetIntlFont(GetDlgItem(hwnd, IDC_FIND_HISTORY));
m_fBodies = DwGetOption(OPT_SEARCH_BODIES);
if (m_fBodies)
SendDlgItemMessage(hwnd, IDC_ALL_TEXT, BM_SETCHECK, 1, 0);
// Got's to load the find history
m_cMRUList.CreateList(10, 0, c_szRegFindHistory);
while (-1 != m_cMRUList.EnumList(nItem++, sz, ARRAYSIZE(sz)))
{
SendDlgItemMessage(hwnd, IDC_FIND_HISTORY, CB_ADDSTRING, 0, (LPARAM) sz);
}
// Disable the Find button
EnableWindow(GetDlgItem(hwnd, IDC_FIND_NOW), FALSE);
CenterDialog(m_hwnd);
return (TRUE);
}
//
// FUNCTION: CFindNext::OnCommand()
//
// PURPOSE: Handles command messages that are sent from the various
// controls in the dialog.
//
void CFindNext::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
TraceCall("CFindNext::OnCommand");
switch (id)
{
case IDC_FIND_HISTORY:
{
switch (codeNotify)
{
case CBN_EDITCHANGE:
EnableWindow(GetDlgItem(m_hwnd, IDC_FIND_NOW),
_GetTextLength(m_hwnd, IDC_FIND_HISTORY));
break;
case CBN_SELCHANGE:
EnableWindow(GetDlgItem(m_hwnd, IDC_FIND_NOW), TRUE);
break;
}
break;
}
case IDC_ALL_TEXT:
{
m_fBodies = (BST_CHECKED == IsDlgButtonChecked(m_hwnd, IDC_ALL_TEXT));
break;
}
case IDC_FIND_NOW:
{
if (codeNotify == BN_CLICKED)
{
OnFindNow();
}
break;
}
case IDC_ADVANCED:
{
if (codeNotify == BN_CLICKED)
{
DoFindMsg(FOLDERID_ROOT, 0);
}
break;
}
case IDCANCEL:
case IDCLOSE:
EndDialog(hwnd, 0);
break;
}
}
void CFindNext::OnFindNow(void)
{
TCHAR sz[CCHMAX_STRINGRES];
int i;
// Get the current string
GetWindowText(GetDlgItem(m_hwnd, IDC_FIND_HISTORY), sz, ARRAYSIZE(sz));
// Add this string to our history
i = m_cMRUList.AddString(sz);
// Reload the combo box
UINT nItem = 0;
HWND hwndCombo = GetDlgItem(m_hwnd, IDC_FIND_HISTORY);
SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);
while (-1 != m_cMRUList.EnumList(nItem++, sz, ARRAYSIZE(sz)))
{
SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) sz);
}
SendMessage(hwndCombo, CB_SETCURSEL, 0, 0);
EndDialog(m_hwnd, 1);
}