windows-nt/Source/XPSP1/NT/shell/shell32/duilist.cpp

137 lines
3.4 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "shellprv.h"
#include "duiview.h"
#include "duilist.h"
// DUIListView
DUIListView::~DUIListView()
{
DetachListview();
}
void DUIListView::DetachListview()
{
if (m_hwndListview)
{
// Unhook DUI from the HWND before doing this
HWNDHost::Detach();
if (m_bClientEdge)
SetWindowBits(m_hwndListview, GWL_EXSTYLE, WS_EX_CLIENTEDGE, WS_EX_CLIENTEDGE);
ShowWindow(m_hwndListview, SW_HIDE); // HIDE IT SO IT doesn't flash before switching.
SHSetParentHwnd(m_hwndListview, m_hwndLVOrgParent);
}
}
HRESULT DUIListView::Create(UINT nActive, HWND hwndListView, OUT Element** ppElement)
{
*ppElement = NULL;
DUIListView* pDUIListView = HNewAndZero<DUIListView>();
if (!pDUIListView)
return E_OUTOFMEMORY;
HRESULT hr = pDUIListView->Initialize(nActive, hwndListView);
if (FAILED(hr))
{
pDUIListView->Destroy();
return E_OUTOFMEMORY;
}
pDUIListView->SetAccessible(true);
*ppElement = pDUIListView;
return S_OK;
}
HWND DUIListView::CreateHWND(HWND hwndParent)
{
m_hwndParent = hwndParent;
// Save the original parent window handle
m_hwndLVOrgParent = ::GetParent(m_hwndListview);
SHSetParentHwnd(m_hwndListview, hwndParent);
LONG lExStyle = GetWindowLong(m_hwndListview, GWL_EXSTYLE);
m_bClientEdge = lExStyle & WS_EX_CLIENTEDGE ? TRUE : FALSE;
if (m_bClientEdge)
{
lExStyle &= ~WS_EX_CLIENTEDGE;
SetWindowLong(m_hwndListview, GWL_EXSTYLE, lExStyle);
}
return m_hwndListview;
}
// Global action callback
UINT DUIListView::MessageCallback(GMSG* pGMsg)
{
return HWNDHost::MessageCallback(pGMsg);
}
// Pointer is only guaranteed good for the lifetime of the call
void DUIListView::OnInput(InputEvent* pie)
{
// Bypass HWNDHost::OnInput for tab input events so they aren't forwarded
// to the HWND control. Element::OnInput will handle the events (keyboard nav)
if (pie->nStage == GMF_DIRECT)
{
if (pie->nDevice == GINPUT_KEYBOARD)
{
KeyboardEvent* pke = (KeyboardEvent*)pie;
if (pke->nCode == GKEY_DOWN || pke->nCode == GKEY_UP) // Virtual keys
{
if (pke->ch == VK_TAB)
{
Element::OnInput(pie);
return;
}
}
else if (pke->nCode == GKEY_CHAR) // Characters
{
if (pke->ch == 9)
{
Element::OnInput(pie);
return;
}
}
}
}
HWNDHost::OnInput(pie);
}
////////////////////////////////////////////////////////
// Property definitions
/** Property template (replace !!!), also update private PropertyInfo* parray and class header (element.h)
// !!! property
static int vv!!![] = { V_INT, -1 }; StaticValue(svDefault!!!, V_INT, 0);
static PropertyInfo imp!!!Prop = { L"!!!", PF_Normal, 0, vv!!!, (Value*)&svDefault!!! };
PropertyInfo* Element::!!!Prop = &imp!!!Prop;
**/
////////////////////////////////////////////////////////
// ClassInfo (must appear after property definitions)
// Class properties
// Define class info with type and base type, set static class pointer
IClassInfo* DUIListView::Class = NULL;
HRESULT DUIListView::Register()
{
return ClassInfo<DUIListView,HWNDHost>::Register(L"DUIListView", NULL, 0);
}