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.
431 lines
10 KiB
431 lines
10 KiB
//
|
|
// lbmenu.cpp
|
|
//
|
|
|
|
#include "private.h"
|
|
#include "globals.h"
|
|
#include "utbmenu.h"
|
|
#include "cuimenu.h"
|
|
#include "xstring.h"
|
|
#include "tipbar.h"
|
|
#include "helpers.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CUTBMenuWnd
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Initialize
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CUIFObject *CUTBMenuWnd::Initialize()
|
|
{
|
|
Assert(!_pTipbarAcc);
|
|
|
|
_pTipbarAcc = new CTipbarAccessible(this);
|
|
|
|
return CUIFObject::Initialize();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnCreate
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CUTBMenuWnd::OnCreate(HWND hWnd)
|
|
{
|
|
if (_pTipbarAcc)
|
|
{
|
|
_pTipbarAcc->SetWindow(hWnd);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnDestroy
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CUTBMenuWnd::OnDestroy(HWND hWnd)
|
|
{
|
|
//
|
|
// MSAA support
|
|
//
|
|
if (_pTipbarAcc)
|
|
{
|
|
_pTipbarAcc->NotifyWinEvent( EVENT_OBJECT_DESTROY, this);
|
|
_pTipbarAcc->ClearAccItems();
|
|
_pTipbarAcc->Release();
|
|
_pTipbarAcc = NULL;
|
|
}
|
|
|
|
CoUninit();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnShowWindow
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
LRESULT CUTBMenuWnd::OnShowWindow( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
//
|
|
// MSAA support
|
|
//
|
|
if (_pTipbarAcc)
|
|
{
|
|
if (wParam)
|
|
{
|
|
_pTipbarAcc->NotifyWinEvent( EVENT_OBJECT_SHOW ,this);
|
|
|
|
//
|
|
// MSCANDUI does this.
|
|
//
|
|
// REVIEW: KOJIW: Unless we send notify EVENT_OBJECT_FOCUS,
|
|
// we never receive WM_GETOBJECT message. Why???
|
|
//
|
|
|
|
_pTipbarAcc->NotifyWinEvent( EVENT_OBJECT_FOCUS ,this);
|
|
}
|
|
else
|
|
{
|
|
_pTipbarAcc->NotifyWinEvent( EVENT_OBJECT_HIDE ,this);
|
|
}
|
|
}
|
|
|
|
return CUIFMenu::OnShowWindow( hWnd, uMsg, wParam, lParam );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CTipbarWnd::OnTimer
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CUTBMenuWnd::OnTimer(UINT uId)
|
|
{
|
|
|
|
switch (uId)
|
|
{
|
|
case TIPWND_TIMER_DOACCDEFAULTACTION:
|
|
//
|
|
// MSAA support
|
|
//
|
|
::KillTimer(GetWnd(), TIPWND_TIMER_DOACCDEFAULTACTION);
|
|
if (_pTipbarAcc && _nDoAccDefaultActionItemId)
|
|
{
|
|
_pTipbarAcc->DoDefaultActionReal(_nDoAccDefaultActionItemId);
|
|
_nDoAccDefaultActionItemId = 0;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnGetObject
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
LRESULT CUTBMenuWnd::OnGetObject( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LRESULT lResult = (LRESULT)0;
|
|
|
|
switch (lParam)
|
|
{
|
|
//
|
|
// We process the OBJID_CLIENT object identifier;
|
|
// this is the client area of our application
|
|
// window.
|
|
//
|
|
|
|
case OBJID_CLIENT:
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (_pTipbarAcc == NULL)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
|
|
if (!_pTipbarAcc->IsInitialized())
|
|
{
|
|
//
|
|
//
|
|
//
|
|
hr = EnsureCoInit();
|
|
if (FAILED(hr))
|
|
{
|
|
break;
|
|
}
|
|
|
|
|
|
//
|
|
// Initialize our Accessible object. If the
|
|
// initialization fails, delete the Accessible
|
|
// object and return the failure code.
|
|
//
|
|
|
|
hr = _pTipbarAcc->Initialize();
|
|
if (FAILED(hr))
|
|
{
|
|
_pTipbarAcc->Release();
|
|
_pTipbarAcc = NULL;
|
|
|
|
lResult = (LRESULT)hr;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Send an EVENT_OBJECT_CREATE WinEvent for the
|
|
// creation of the Accessible object for the
|
|
// client area.
|
|
//
|
|
|
|
_pTipbarAcc->NotifyWinEvent( EVENT_OBJECT_CREATE , this);
|
|
}
|
|
|
|
//
|
|
// Call LresultFromObject() to create reference to
|
|
// our Accessible object that MSAA will marshal to
|
|
// the client.
|
|
//
|
|
|
|
lResult = _pTipbarAcc->CreateRefToAccObj( wParam );
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
return lResult;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// StartDoDefaultActionTimer
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CUTBMenuWnd::StartDoAccDefaultActionTimer(CUTBMenuItem *pItem)
|
|
{
|
|
if (!_pTipbarAcc)
|
|
return FALSE;
|
|
|
|
_nDoAccDefaultActionItemId = _pTipbarAcc->GetIDOfItem(pItem);
|
|
if ((_nDoAccDefaultActionItemId == 0) || (_nDoAccDefaultActionItemId == -1))
|
|
return FALSE;
|
|
|
|
if (IsWindow(GetWnd()))
|
|
{
|
|
::KillTimer(GetWnd(), TIPWND_TIMER_DOACCDEFAULTACTION);
|
|
::SetTimer(GetWnd(),
|
|
TIPWND_TIMER_DOACCDEFAULTACTION,
|
|
g_uTimerElapseDOACCDEFAULTACTION,
|
|
NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CUIModalMenu
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CancelMenu
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CModalMenu::CancelMenu()
|
|
{
|
|
if (_pCuiMenu)
|
|
_pCuiMenu->CancelMenu();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CreateMenu
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CModalMenu::PostKey(BOOL fUp, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
Assert(_pCuiMenu);
|
|
_pCuiMenu->PostKey(fUp, wParam, lParam);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CUTBLBarMenuItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL CUTBLBarMenuItem::InsertToUI(CUTBMenuWnd *pCuiMenu)
|
|
{
|
|
UINT uFlags = MF_BYPOSITION;
|
|
if (_dwFlags & TF_LBMENUF_SEPARATOR)
|
|
{
|
|
uFlags |= MF_SEPARATOR;
|
|
pCuiMenu->InsertSeparator();
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if (_dwFlags & TF_LBMENUF_SUBMENU)
|
|
{
|
|
Assert(_pUTBMenu);
|
|
CUTBMenuWnd *pCuiMenuSub;
|
|
CUTBMenuItem *pCuiItem;
|
|
|
|
pCuiMenuSub = ((CUTBLBarMenu *)_pSubMenu)->CreateMenuUI();
|
|
if (!pCuiMenuSub)
|
|
return FALSE;
|
|
|
|
pCuiItem = new CUTBMenuItem(pCuiMenu);
|
|
if (!pCuiItem)
|
|
{
|
|
delete pCuiMenuSub;
|
|
return FALSE;
|
|
}
|
|
|
|
pCuiItem->Initialize();
|
|
pCuiItem->Init((UINT)-1, _bstr);
|
|
pCuiItem->SetSub(pCuiMenuSub);
|
|
|
|
if (_hbmp)
|
|
pCuiItem->SetBitmap(_hbmp);
|
|
|
|
if (_hbmpMask)
|
|
pCuiItem->SetBitmapMask(_hbmpMask);
|
|
|
|
pCuiMenu->InsertItem(pCuiItem);
|
|
|
|
if (pCuiMenu->GetAccessible())
|
|
pCuiMenu->GetAccessible()->AddAccItem(pCuiItem);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
CUTBMenuItem *pCuiItem = new CUTBMenuItem(pCuiMenu);
|
|
if (!pCuiItem)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pCuiItem->Initialize();
|
|
pCuiItem->Init(_uId, _bstr);
|
|
|
|
if (_dwFlags & TF_LBMENUF_GRAYED)
|
|
pCuiItem->Gray(TRUE);
|
|
|
|
if (_dwFlags & TF_LBMENUF_CHECKED)
|
|
pCuiItem->Check(TRUE);
|
|
else if (_dwFlags & TF_LBMENUF_RADIOCHECKED)
|
|
pCuiItem->RadioCheck(TRUE);
|
|
|
|
if (_hbmp)
|
|
pCuiItem->SetBitmap(_hbmp);
|
|
|
|
if (_hbmpMask)
|
|
pCuiItem->SetBitmapMask(_hbmpMask);
|
|
|
|
pCuiMenu->InsertItem(pCuiItem);
|
|
|
|
if (pCuiMenu->GetAccessible())
|
|
pCuiMenu->GetAccessible()->AddAccItem(pCuiItem);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CUTBLBarMenu
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CUTBLBarMenu::CUTBLBarMenu(HINSTANCE hInst)
|
|
{
|
|
_hInst = hInst;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CUTBLBarMenu::~CUTBLBarMenu()
|
|
{
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ShowPopup
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
UINT CUTBLBarMenu::ShowPopup(CUIFWindow *pcuiWndParent, const POINT pt, const RECT *prcArea)
|
|
{
|
|
if (_pCuiMenu)
|
|
return 0;
|
|
|
|
_pCuiMenu = CreateMenuUI();
|
|
if (!_pCuiMenu)
|
|
return CUI_MENU_UNSELECTED;
|
|
|
|
UINT uRet = _pCuiMenu->ShowModalPopup(pcuiWndParent, prcArea, TRUE);
|
|
|
|
delete _pCuiMenu;
|
|
_pCuiMenu = NULL;
|
|
return uRet;
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CreateMenu
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CUTBMenuWnd *CUTBLBarMenu::CreateMenuUI()
|
|
{
|
|
CUTBMenuWnd *pCuiMenu = new CUTBMenuWnd(_hInst, g_dwMenuStyle, 0);
|
|
|
|
if (!pCuiMenu)
|
|
return pCuiMenu;
|
|
|
|
pCuiMenu->Initialize();
|
|
|
|
int i;
|
|
for (i = 0; i < _rgItem.Count(); i++)
|
|
{
|
|
CUTBLBarMenuItem *pItem = (CUTBLBarMenuItem *)_rgItem.Get(i);
|
|
pItem->InsertToUI(pCuiMenu);
|
|
}
|
|
|
|
return pCuiMenu;
|
|
}
|