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.
 
 
 
 
 
 

336 lines
9.0 KiB

//
// sysbtn.cpp
//
#include "private.h"
#include "globals.h"
#include "immxutil.h"
#include "sapilayr.h"
#include "xstring.h"
#include "sysbtn.h"
#include "nui.h"
//////////////////////////////////////////////////////////////////////////////
//
// CLBarItemSystemButtonBase
//
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// IUnknown
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::QueryInterface(REFIID riid, void **ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_ITfLangBarItem))
{
*ppvObj = SAFECAST(this, ITfLangBarItem *);
}
else if (IsEqualIID(riid, IID_ITfLangBarItemButton))
{
*ppvObj = SAFECAST(this, ITfLangBarItemButton *);
}
else if (IsEqualIID(riid, IID_ITfSource))
{
*ppvObj = SAFECAST(this, ITfSource *);
}
else if (IsEqualIID(riid, IID_ITfSystemLangBarItem))
{
*ppvObj = SAFECAST(this, ITfSystemLangBarItem *);
}
if (*ppvObj)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDAPI_(ULONG) CLBarItemSystemButtonBase::AddRef()
{
return CLBarItemButtonBase::AddRef();
}
STDAPI_(ULONG) CLBarItemSystemButtonBase::Release()
{
return CLBarItemButtonBase::Release();
}
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CLBarItemSystemButtonBase::CLBarItemSystemButtonBase()
{
}
//----------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CLBarItemSystemButtonBase::~CLBarItemSystemButtonBase()
{
if (_pMenuMap)
delete _pMenuMap;
}
//+---------------------------------------------------------------------------
//
// AdviseSink
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie)
{
HRESULT hr;
hr = CLBarItemButtonBase::AdviseSink(riid, punk, pdwCookie);
if( S_OK != hr)
{
const IID *rgiid = &IID_ITfSystemLangBarItemSink;
hr = GenericAdviseSink(riid, punk, &rgiid, &_rgEventSinks, 1, pdwCookie);
if (hr == S_OK)
{
// adjust the cookie so we don't overlap with idle detector sinks
*pdwCookie = GenericChainToCookie(*pdwCookie, 1);
}
}
return hr;
}
//+---------------------------------------------------------------------------
//
// UnadviseSink
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::UnadviseSink(DWORD dwCookie)
{
HRESULT hr = CLBarItemButtonBase::UnadviseSink(dwCookie);
if (hr == S_OK)
return hr;
dwCookie = GenericUnchainToCookie(dwCookie, 1);
return GenericUnadviseSink(&_rgEventSinks, 1, dwCookie);
}
//+---------------------------------------------------------------------------
//
// GetInfo
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::GetInfo(TF_LANGBARITEMINFO *pInfo)
{
return CLBarItemButtonBase::GetInfo(pInfo);
}
//+---------------------------------------------------------------------------
//
// Show
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::Show(BOOL fShow)
{
return CLBarItemButtonBase::Show(fShow);
}
//----------------------------------------------------------------------------
//
// SetIcon
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::SetIcon(HICON hIcon)
{
CLBarItemButtonBase::SetIcon(hIcon);
return S_OK;
}
//----------------------------------------------------------------------------
//
// SetTooltipString
//
//----------------------------------------------------------------------------
STDAPI CLBarItemSystemButtonBase::SetTooltipString(WCHAR *pchToolTip, ULONG cch)
{
SetToolTip(pchToolTip);
return S_OK;
}
//+---------------------------------------------------------------------------
//
// _InsertCustomMenus
//
//----------------------------------------------------------------------------
BOOL CLBarItemSystemButtonBase::_InsertCustomMenus(ITfMenu *pMenu, UINT *pnTipCurMenuID)
{
int nCntEventSink;
int i;
BOOL bRet = FALSE;
//
// Insert Custom item to menu
//
ClearMenuMap();
nCntEventSink = _rgEventSinks.Count();
for (i = 0; i < nCntEventSink; i++)
{
CCicLibMenu *pMenuTmp;
GENERICSINK *pSink;
ITfSystemLangBarItemSink *plbSink;
if (!_pMenuMap)
_pMenuMap = new CStructArray<TIPMENUITEMMAP>;
if (!_pMenuMap)
{
Assert(0);
goto Exit;
}
pMenuTmp = new CCicLibMenu;
if (!pMenuTmp)
{
goto Exit;
}
pSink = _rgEventSinks.GetPtr(i);
if (SUCCEEDED(pSink->pSink->QueryInterface(
IID_ITfSystemLangBarItemSink,
(void **)&plbSink)))
{
if (SUCCEEDED(plbSink->InitMenu(pMenuTmp)))
{
if (*pnTipCurMenuID > IDM_CUSTOM_MENU_START)
LangBarInsertSeparator(pMenu);
*pnTipCurMenuID = _MergeMenu(pMenu,
pMenuTmp,
plbSink,
_pMenuMap,
*pnTipCurMenuID);
}
plbSink->Release();
}
else
{
Assert(0);
}
pMenuTmp->Release();
}
bRet = TRUE;
Exit:
return bRet;
}
//+---------------------------------------------------------------------------
//
// _MergeMenu
//
//----------------------------------------------------------------------------
#define MIIM_ALL ( MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE )
UINT CLBarItemSystemButtonBase::_MergeMenu(ITfMenu *pMenu,
CCicLibMenu *pMenuTip,
ITfSystemLangBarItemSink *plbSink,
CStructArray<TIPMENUITEMMAP> *pMenuMap,
UINT &nCurID)
{
int i;
int nMenuCnt = pMenuTip->GetItemCount();
if (nMenuCnt <= 0)
return nCurID;
for (i = 0; i < nMenuCnt; i++)
{
CCicLibMenuItem *pItem = pMenuTip->GetItem(i);
TIPMENUITEMMAP *ptmm;
int nCnt;
nCnt = pMenuMap->Count();
if (!pMenuMap->Insert(nCnt, 1))
return nCurID;
ptmm = pMenuMap->GetPtr(nCnt);
ptmm->plbSink = plbSink;
ptmm->nOrgID = pItem->GetId();
ptmm->nTmpID = nCurID++;
if (pItem->GetSubMenu())
{
ITfMenu *pSubMenu = NULL;
if (SUCCEEDED(pMenu->AddMenuItem((UINT)-1,
pItem->GetFlags(),
pItem->GetBitmap(),
pItem->GetBitmapMask(),
pItem->GetText(),
wcslen(pItem->GetText()),
&pSubMenu)))
{
_MergeMenu(pSubMenu,
pItem->GetSubMenu(),
plbSink,
pMenuMap,
nCurID);
pSubMenu->Release();
}
}
else
{
pMenu->AddMenuItem(ptmm->nTmpID,
pItem->GetFlags(),
pItem->GetBitmap(),
pItem->GetBitmapMask(),
pItem->GetText(),
wcslen(pItem->GetText()),
NULL);
}
}
return nCurID;
}
STDAPI CLBarItemSystemButtonBase::OnMenuSelect(UINT wID)
{
HRESULT hr = S_OK;
int nMenuMapoCnt = _pMenuMap->Count();
for (int i = 0; i < nMenuMapoCnt; i++)
{
TIPMENUITEMMAP *ptmm;
ptmm = _pMenuMap->GetPtr(i);
if (ptmm->nTmpID == (UINT)wID)
{
hr = ptmm->plbSink->OnMenuSelect(ptmm->nOrgID);
break;
}
}
return hr;
}