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.
 
 
 
 
 
 

264 lines
8.8 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: listpad.h
//
//--------------------------------------------------------------------------
// ListPad.h : Declaration of the CListPad
#ifndef __LISTPAD_H_
#define __LISTPAD_H_
#include "resource.h" // main symbols
#include "amcmsgid.h"
#include "commctrl.h"
/////////////////////////////////////////////////////////////////////////////
// CListPad
class ATL_NO_VTABLE CListPad :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CListPad, &CLSID_ListPad>,
public CComControl<CListPad>,
public IDispatchImpl<IListPad, &IID_IListPad, &LIBID_CICLib>,
public IProvideClassInfo2Impl<&CLSID_ListPad, NULL, &LIBID_CICLib>,
public IPersistStreamInitImpl<CListPad>,
public IPersistStorageImpl<CListPad>,
public IQuickActivateImpl<CListPad>,
public IOleControlImpl<CListPad>,
public IOleObjectImpl<CListPad>,
public IOleInPlaceActiveObjectImpl<CListPad>,
public IObjectSafetyImpl<CListPad, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
public IViewObjectExImpl<CListPad>,
public IOleInPlaceObjectWindowlessImpl<CListPad>,
public IDataObjectImpl<CListPad>,
public ISpecifyPropertyPagesImpl<CListPad>
{
public:
CListPad()
{
m_MMChWnd = m_ListViewHWND = NULL;
m_bWindowOnly = TRUE;
}
~CListPad()
{
if (m_MMChWnd)
::SendMessage (m_MMChWnd, MMC_MSG_CONNECT_TO_TPLV, (WPARAM)m_MMChWnd, (LPARAM)NULL);
}
/*+-------------------------------------------------------------------------*
*
* GetWndClassInfo
*
* PURPOSE: Need to override this to remove the CS_HREDRAW and CS_VREDRAW
* styles, which were causing lots of flicker. See the SDK
* docs under GetWndClassInfo for more details.
*
* RETURNS:
* static CWndClassInfo&
*
*+-------------------------------------------------------------------------*/
static CWndClassInfo& GetWndClassInfo()
{
static CWndClassInfo wc =
{
{ sizeof(WNDCLASSEX), CS_DBLCLKS, StartWindowProc,
0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, NULL, NULL },
NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
};
return wc;
}
DECLARE_MMC_CONTROL_REGISTRATION(
g_szCicDll,
CLSID_ListPad,
_T("ListPad class"),
_T("ListPad.ListPad.1"),
_T("ListPad.ListPad"),
LIBID_CICLib,
_T("1"),
_T("1.0"))
BEGIN_COM_MAP(CListPad)
COM_INTERFACE_ENTRY(IListPad)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectSafety)
COM_INTERFACE_ENTRY_IMPL(IViewObjectEx)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx)
COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY_IMPL(IOleControl)
COM_INTERFACE_ENTRY_IMPL(IOleObject)
COM_INTERFACE_ENTRY_IMPL(IQuickActivate)
COM_INTERFACE_ENTRY_IMPL(IPersistStorage)
COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit)
COM_INTERFACE_ENTRY_IMPL(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY_IMPL(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()
BEGIN_PROPERTY_MAP(CListPad)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROPERTY_MAP()
BEGIN_MSG_MAP(CListPad)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
MESSAGE_HANDLER(WM_NOTIFYFORMAT, OnNotifyFormat)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
END_MSG_MAP()
// IViewObjectEx
STDMETHOD(GetViewStatus)(DWORD* pdwStatus)
{
ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n"));
*pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE;
return S_OK;
}
STDMETHOD(TranslateAccelerator)(MSG *pMsg)
{
// If the list view has the focus process the keys the list view can use
// use because IE will take them before they become normal key events
// to the focused window.
if (::GetFocus() == m_ListViewHWND && pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
case VK_HOME:
case VK_END:
case VK_PRIOR:
case VK_NEXT:
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return S_OK;
}
}
CComQIPtr<IOleControlSite,&IID_IOleControlSite> spCtrlSite (m_spClientSite);
if (spCtrlSite)
return spCtrlSite->TranslateAccelerator (pMsg,0);
return S_FALSE;
}
public:
LRESULT OnSetFocus(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lr = CComControlBase::OnSetFocus (nMsg, wParam, lParam, bHandled);
if (m_ListViewHWND)
{
::SetFocus (m_ListViewHWND);
return TRUE;
}
return lr;
}
LRESULT OnNotify (UINT nMsg, WPARAM w, LPARAM l, BOOL& bHandled)
{
NMHDR* pnmhdr = reinterpret_cast<NMHDR*>(l);
// Must handle focus changes here for active control tracking.
// Don't forward it to the MMC window.
if (pnmhdr->code == NM_SETFOCUS)
{
// if we're not UI active, request it now
if (m_bInPlaceActive && !m_bUIActive)
UIActivateWithNoGrab();
return CComControlBase::OnSetFocus (WM_SETFOCUS, NULL, NULL, bHandled);
}
else if (pnmhdr->code == NM_KILLFOCUS)
{
return CComControlBase::OnKillFocus (WM_KILLFOCUS, NULL, NULL, bHandled);
}
if (m_MMChWnd != NULL)
return(BOOL)::SendMessage (m_MMChWnd, nMsg, w, l);
return bHandled = 0;
}
LRESULT OnNotifyFormat (UINT nMsg, WPARAM w, LPARAM l, BOOL& lResult)
{ return OnNotify (nMsg, w, l, lResult);}
LRESULT OnDestroy (UINT nMsg, WPARAM w, LPARAM l, BOOL& lResult)
{
if (m_MMChWnd != NULL)
{ // detach
::SendMessage (m_MMChWnd, MMC_MSG_CONNECT_TO_TPLV, (WPARAM)m_hWnd, (LPARAM)NULL);
m_MMChWnd = NULL;
}
return lResult = 1;
}
LRESULT OnSize (UINT nMsg, WPARAM w, LPARAM l, BOOL& lResult)
{
::SetWindowPos (m_ListViewHWND, NULL, 0, 0, LOWORD(l), HIWORD(l), SWP_NOZORDER | SWP_NOACTIVATE);
return 1;
}
HRESULT OnPostVerbInPlaceActivate();
// UIActivation code taken from CComControlBase::InPlaceActivate.
// Can't call InPlaceActivate because it always forces the focus to the
// outer window and we don't want to steal focus from the list view control.
void UIActivateWithNoGrab()
{
OLEINPLACEFRAMEINFO frameInfo;
RECT rcPos, rcClip;
CComPtr<IOleInPlaceFrame> spInPlaceFrame;
CComPtr<IOleInPlaceUIWindow> spInPlaceUIWindow;
frameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
m_spInPlaceSite->GetWindowContext(&spInPlaceFrame,
&spInPlaceUIWindow, &rcPos, &rcClip, &frameInfo);
CComPtr<IOleInPlaceActiveObject> spActiveObject;
ControlQueryInterface(IID_IOleInPlaceActiveObject, (void**)&spActiveObject);
m_bUIActive = TRUE;
HRESULT hr = m_spInPlaceSite->OnUIActivate();
if (FAILED(hr))
return;
// set ourselves up in the host.
//
if (spActiveObject)
{
if (spInPlaceFrame)
spInPlaceFrame->SetActiveObject(spActiveObject, NULL);
if (spInPlaceUIWindow)
spInPlaceUIWindow->SetActiveObject(spActiveObject, NULL);
}
if (spInPlaceFrame)
spInPlaceFrame->SetBorderSpace(NULL);
if (spInPlaceUIWindow)
spInPlaceUIWindow->SetBorderSpace(NULL);
}
private:
HWND m_MMChWnd;
HWND m_ListViewHWND;
};
#endif //__LISTPAD_H_