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
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;
|
|
}
|
|
|