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.
 
 
 
 
 
 

1517 lines
38 KiB

//
// candext.cpp
//
#include "private.h"
#include "globals.h"
#include "mscandui.h"
#include "candext.h"
#include "candui.h"
/*============================================================================*/
/* */
/* C C A N D U I E X T E N S I O N */
/* */
/*============================================================================*/
/* C C A N D U I E X T E N S I O N */
/*------------------------------------------------------------------------------
Constructor of CCandUIExtension
------------------------------------------------------------------------------*/
CCandUIExtension::CCandUIExtension( CCandUIExtensionMgr *pExtensionMgr, LONG id )
{
m_pExtensionMgr = pExtensionMgr;
m_flags.fAllowEnable = FALSE;
m_flags.fAllowDisable = FALSE;
m_flags.fAllowIsEnabled = FALSE;
m_flags.fAllowShow = FALSE;
m_flags.fAllowHide = FALSE;
m_flags.fAllowIsVisible = FALSE;
m_flags.fAllowSetPosition = FALSE;
m_flags.fAllowGetPosition = FALSE;
m_flags.fAllowGetSize = FALSE;
m_flags.fAllowSetSize = FALSE;
m_flags.fAllowGetSize = FALSE;
m_flags.fAllowSetFont = FALSE;
m_flags.fAllowGetFont = FALSE;
m_flags.fAllowSetText = FALSE;
m_flags.fAllowGetText = FALSE;
m_flags.fAllowSetToolTip = FALSE;
m_flags.fAllowGetToolTip = FALSE;
m_propID.Set( id );
m_propEnabled.Set( TRUE );
m_propVisible.Set( TRUE );
m_propFont.Set( NULL );
m_propText.Set( NULL );
m_propToolTip.Set( NULL );
}
/* ~ C C A N D U I E X T E N S I O N */
/*------------------------------------------------------------------------------
Denstructor of CCandUIExtension
------------------------------------------------------------------------------*/
CCandUIExtension::~CCandUIExtension( void )
{
}
/* G E T I D */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::GetID( LONG *pid )
{
return m_propID.Get( pid );
}
/* E N A B L E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::Enable( void )
{
HRESULT hr;
if (!m_flags.fAllowEnable) {
return E_FAIL;
}
hr = m_propEnabled.Set( TRUE );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* D I S A B L E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::Disable( void )
{
HRESULT hr;
if (!m_flags.fAllowDisable) {
return E_FAIL;
}
hr = m_propEnabled.Set( FALSE );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* I S E N A B L E D */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::IsEnabled( BOOL *pfEnabled )
{
if (!m_flags.fAllowIsEnabled) {
return E_FAIL;
}
return m_propEnabled.Get( pfEnabled );
}
/* S E T P O S I T I O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::SetPosition( POINT *pptPos )
{
HRESULT hr;
if (!m_flags.fAllowSetPosition) {
return E_FAIL;
}
hr = m_propPos.Set( pptPos );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* G E T P O S I T I O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::GetPosition( POINT *pptPos )
{
if (!m_flags.fAllowGetPosition) {
return E_FAIL;
}
return m_propPos.Get( pptPos );
}
/* S E T S I Z E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::SetSize( SIZE *psize )
{
HRESULT hr;
if (!m_flags.fAllowSetSize) {
return E_FAIL;
}
hr = m_propSize.Set( psize );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* G E T S I Z E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::GetSize( SIZE *psize )
{
if (!m_flags.fAllowGetSize) {
return E_FAIL;
}
return m_propSize.Get( psize );
}
/* S H O W */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::Show( void )
{
HRESULT hr;
if (!m_flags.fAllowShow) {
return E_FAIL;
}
hr = m_propVisible.Set( TRUE );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* H I D E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::Hide( void )
{
HRESULT hr;
if (!m_flags.fAllowHide) {
return E_FAIL;
}
hr = m_propVisible.Set( FALSE );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* I S V I S I B L E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::IsVisible( BOOL *pfVisible )
{
if (!m_flags.fAllowIsVisible) {
return E_FAIL;
}
return m_propVisible.Get( pfVisible );
}
/* S E T F O N T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::SetFont( LOGFONTW *plf )
{
HRESULT hr;
if (!m_flags.fAllowSetFont) {
return E_FAIL;
}
hr = m_propFont.Set( plf );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* G E T F O N T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::GetFont( LOGFONTW *plf )
{
if (!m_flags.fAllowGetFont) {
return E_FAIL;
}
return m_propFont.Get( plf );
}
/* S E T T E X T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::SetText( BSTR bstr )
{
HRESULT hr;
if (!m_flags.fAllowSetText) {
return E_FAIL;
}
hr = m_propText.Set( bstr );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* G E T T E X T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::GetText( BSTR *pbstr )
{
if (!m_flags.fAllowGetText) {
return E_FAIL;
}
return m_propText.Get( pbstr );
}
/* S E T T O O L T I P S T R I N G */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::SetToolTipString( BSTR bstr )
{
HRESULT hr;
if (!m_flags.fAllowSetToolTip) {
return E_FAIL;
}
hr = m_propToolTip.Set( bstr );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* G E T T O O L T I P S T R I N G */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtension::GetToolTipString( BSTR *pbstr )
{
if (!m_flags.fAllowGetToolTip) {
return E_FAIL;
}
return m_propToolTip.Get( pbstr );
}
/* G E T I D */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
LONG CCandUIExtension::GetID( void )
{
return m_propID.Get();
}
/* I S E N A B L E D */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
BOOL CCandUIExtension::IsEnabled( void )
{
return m_propEnabled.Get();
}
/* I S V I S I B L E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
BOOL CCandUIExtension::IsVisible( void )
{
return m_propVisible.Get();
}
/* G E T F O N T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HFONT CCandUIExtension::GetFont( void )
{
return m_propFont.Get();
}
/* G E T T E X T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
LPCWSTR CCandUIExtension::GetText( void )
{
return m_propText.Get();
}
/* G E T T O O L T I P S T R I N G */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
LPCWSTR CCandUIExtension::GetToolTipString( void )
{
return m_propToolTip.Get();
}
/*============================================================================*/
/* */
/* C E X T E N S I O N B U T T O N */
/* */
/*============================================================================*/
/* C E X T E N S I O N B U T T O N */
/*------------------------------------------------------------------------------
Constructor of CExtensionButton
------------------------------------------------------------------------------*/
CExtensionButton::CExtensionButton( CCandUIExtensionMgr *pExtMgr, LONG id ) : CCandUIExtension( pExtMgr, id )
{
SIZE size;
m_flags.fAllowEnable = TRUE;
m_flags.fAllowDisable = TRUE;
m_flags.fAllowIsEnabled = TRUE;
m_flags.fAllowShow = FALSE;
m_flags.fAllowHide = FALSE;
m_flags.fAllowIsVisible = FALSE;
m_flags.fAllowSetPosition = FALSE;
m_flags.fAllowGetPosition = FALSE;
m_flags.fAllowSetSize = FALSE;
m_flags.fAllowGetSize = TRUE;
m_flags.fAllowSetFont = FALSE;
m_flags.fAllowGetFont = FALSE;
m_flags.fAllowSetText = FALSE;
m_flags.fAllowGetText = FALSE;
m_flags.fAllowSetToolTip = TRUE;
m_flags.fAllowGetToolTip = TRUE;
size.cx = 16 + 2;
size.cy = 16 + 2;
m_propEnabled.Set( TRUE );
m_propVisible.Set( TRUE );
m_propFont.Set( NULL );
m_propText.Set( NULL );
m_propToolTip.Set( NULL );
m_propSize.Set( &size );
m_flagsEx.fAllowSetToggleState = FALSE;
m_flagsEx.fAllowGetToggleState = FALSE;
m_flagsEx.fAllowSetIcon = TRUE;
m_flagsEx.fAllowSetBitmap = TRUE;
m_propToggled.Set( FALSE );
m_hIcon = NULL;
m_hBitmap = NULL;
m_pSink = NULL;
}
/* ~ C E X T E N S I O N B U T T O N */
/*------------------------------------------------------------------------------
Destructor of CExtensionButton
------------------------------------------------------------------------------*/
CExtensionButton::~CExtensionButton( void )
{
if (m_pSink != NULL) {
m_pSink->Release();
}
}
/* S E T I C O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionButton::SetIcon( HICON hIcon )
{
if (!m_flagsEx.fAllowSetIcon) {
return E_FAIL;
}
if (hIcon == NULL) {
return E_INVALIDARG;
}
m_hBitmap = NULL;
m_hIcon = hIcon;
GetExtensionMgr()->NotifyExtensionUpdate( this );
return S_OK;
}
/* S E T B I T M A P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionButton::SetBitmap( HBITMAP hBitmap )
{
if (!m_flagsEx.fAllowSetBitmap) {
return E_FAIL;
}
if (hBitmap == NULL) {
return E_INVALIDARG;
}
m_hIcon = NULL;
m_hBitmap = hBitmap;
GetExtensionMgr()->NotifyExtensionUpdate( this );
return S_OK;
}
/* G E T T O G G L E S T A T E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionButton::GetToggleState( BOOL *pfToggled )
{
if (!m_flagsEx.fAllowGetToggleState) {
return E_FAIL;
}
return m_propToggled.Get( pfToggled );
}
/* S E T T O G G L E S T A T E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionButton::SetToggleState( BOOL fToggle )
{
HRESULT hr;
if (!m_flagsEx.fAllowSetToggleState) {
return E_FAIL;
}
hr = m_propToggled.Set( fToggle );
if (hr == S_OK) {
GetExtensionMgr()->NotifyExtensionUpdate( this );
}
return (SUCCEEDED(hr) ? S_OK : hr);
}
/* G E T I C O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HICON CExtensionButton::GetIcon( void )
{
return m_hIcon;
}
/* G E T B I T M A P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HBITMAP CExtensionButton::GetBitmap( void )
{
return m_hBitmap;
}
/* I S T O G G L E D */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
BOOL CExtensionButton::IsToggled( void )
{
return m_propToggled.Get();
}
/*============================================================================*/
/* */
/* C E X T E N S I O N S P A C E */
/* */
/*============================================================================*/
/* C E X T E N S I O N S P A C E */
/*------------------------------------------------------------------------------
Constructor of CExtensionSpace
------------------------------------------------------------------------------*/
CExtensionSpace::CExtensionSpace( CCandUIExtensionMgr *pExtMgr, LONG id ) : CCandUIExtension( pExtMgr, id )
{
m_flags.fAllowEnable = FALSE;
m_flags.fAllowDisable = FALSE;
m_flags.fAllowIsEnabled = FALSE;
m_flags.fAllowShow = FALSE;
m_flags.fAllowHide = FALSE;
m_flags.fAllowIsVisible = FALSE;
m_flags.fAllowSetPosition = FALSE;
m_flags.fAllowGetPosition = FALSE;
m_flags.fAllowSetSize = TRUE;
m_flags.fAllowGetSize = TRUE;
m_flags.fAllowSetFont = FALSE;
m_flags.fAllowGetFont = FALSE;
m_flags.fAllowSetText = FALSE;
m_flags.fAllowGetText = FALSE;
m_flags.fAllowSetToolTip = FALSE;
m_flags.fAllowGetToolTip = FALSE;
m_propEnabled.Set( TRUE );
m_propVisible.Set( TRUE );
m_propFont.Set( NULL );
m_propText.Set( NULL );
m_propToolTip.Set( NULL );
}
/* ~ C E X T E N S I O N S P A C E */
/*------------------------------------------------------------------------------
Destructor of CExtensionSpace
------------------------------------------------------------------------------*/
CExtensionSpace::~CExtensionSpace( void )
{
}
/* C R E A T E I N T E R F A C E O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionSpace::CreateInterfaceObject( REFIID riid, void **ppvObj )
{
CCandUIExtSpace *pObject;
HRESULT hr;
pObject = new CCandUIExtSpace( GetExtensionMgr()->GetCandidateUI(), this );
if (pObject == NULL) {
return E_OUTOFMEMORY;
}
hr = pObject->QueryInterface( riid, ppvObj );
pObject->Release();
return hr;
}
/* N O T I F Y E X T E N S I O N E V E N T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionSpace::NotifyExtensionEvent( DWORD dwCommand, LPARAM lParam )
{
return S_OK;
}
/* C R E A T E U I O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CUIFObject *CExtensionSpace::CreateUIObject( CUIFObject *pParent, DWORD dwID, const RECT *prc )
{
return NULL;
}
/* U P D A T E O B J P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CExtensionSpace::UpdateObjProp( CUIFObject *pUIObject )
{
}
/* U P D A T E E X T P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CExtensionSpace::UpdateExtProp( CUIFObject *pUIObject )
{
}
/*============================================================================*/
/* */
/* C E X T E N S I O N P U S H B U T T O N */
/* */
/*============================================================================*/
/* C E X T E N S I O N P U S H B U T T O N */
/*------------------------------------------------------------------------------
Constructor of CExtensionPushButton
------------------------------------------------------------------------------*/
CExtensionPushButton::CExtensionPushButton( CCandUIExtensionMgr *pExtMgr, LONG id ) : CExtensionButton( pExtMgr, id )
{
m_flagsEx.fAllowSetToggleState = FALSE;
m_flagsEx.fAllowGetToggleState = FALSE;
m_flagsEx.fAllowSetIcon = TRUE;
m_flagsEx.fAllowSetBitmap = TRUE;
}
/* ~ C E X T E N S I O N P U S H B U T T O N */
/*------------------------------------------------------------------------------
Destructor of CExtensionPushButton
------------------------------------------------------------------------------*/
CExtensionPushButton::~CExtensionPushButton( void )
{
}
/* C R E A T E I N T E R F A C E O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionPushButton::CreateInterfaceObject( REFIID riid, void **ppvObj )
{
CCandUIExtPushButton *pObject;
HRESULT hr;
pObject = new CCandUIExtPushButton( GetExtensionMgr()->GetCandidateUI(), this );
if (pObject == NULL) {
return E_OUTOFMEMORY;
}
hr = pObject->QueryInterface( riid, ppvObj );
pObject->Release();
return hr;
}
/* N O T I F Y E X T E N S I O N E V E N T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionPushButton::NotifyExtensionEvent( DWORD dwCommand, LPARAM lParam )
{
if (m_pSink != NULL) {
m_pSink->OnButtonPushed( GetID() );
}
return S_OK;
}
/* C R E A T E U I O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CUIFObject *CExtensionPushButton::CreateUIObject( CUIFObject *pParent, DWORD dwID, const RECT *prc )
{
Assert( pParent != NULL );
Assert( prc != NULL );
return new CUIFButton2( pParent, dwID, prc, UIBUTTON_PUSH );
}
/* U P D A T E O B J P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CExtensionPushButton::UpdateObjProp( CUIFObject *pUIObject )
{
CUIFButton *pButton = (CUIFButton *)pUIObject;
Assert( pButton != NULL );
// button face
if (GetIcon() != NULL) {
pButton->SetIcon( GetIcon() );
}
else if (GetBitmap() != NULL) {
pButton->SetBitmap( GetBitmap() );
}
// tooltip
pButton->SetToolTip( GetToolTipString() );
}
/* U P D A T E E X T P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CExtensionPushButton::UpdateExtProp( CUIFObject *pUIObject )
{
}
/*============================================================================*/
/* */
/* C E X T E N S I O N T O G G L E B U T T O N */
/* */
/*============================================================================*/
/* C E X T E N S I O N T O G G L E B U T T O N */
/*------------------------------------------------------------------------------
Constructor of CExtensionToggleButton
------------------------------------------------------------------------------*/
CExtensionToggleButton::CExtensionToggleButton( CCandUIExtensionMgr *pExtMgr, LONG id ) : CExtensionButton( pExtMgr, id )
{
m_flagsEx.fAllowSetToggleState = TRUE;
m_flagsEx.fAllowGetToggleState = TRUE;
m_flagsEx.fAllowSetIcon = TRUE;
m_flagsEx.fAllowSetBitmap = TRUE;
}
/* ~ C E X T E N S I O N T O G G L E B U T T O N */
/*------------------------------------------------------------------------------
Destructor of CExtensionToggleButton
------------------------------------------------------------------------------*/
CExtensionToggleButton::~CExtensionToggleButton( void )
{
}
/* C R E A T E I N T E R F A C E O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionToggleButton::CreateInterfaceObject( REFIID riid, void **ppvObj )
{
CCandUIExtToggleButton *pObject;
HRESULT hr;
pObject = new CCandUIExtToggleButton( GetExtensionMgr()->GetCandidateUI(), this );
if (pObject == NULL) {
return E_OUTOFMEMORY;
}
hr = pObject->QueryInterface( riid, ppvObj );
pObject->Release();
return hr;
}
/* N O T I F Y E X T E N S I O N E V E N T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CExtensionToggleButton::NotifyExtensionEvent( DWORD dwCommand, LPARAM lParam )
{
if (m_pSink != NULL) {
m_pSink->OnButtonPushed( GetID() );
}
return S_OK;
}
/* C R E A T E U I O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CUIFObject *CExtensionToggleButton::CreateUIObject( CUIFObject *pParent, DWORD dwID, const RECT *prc )
{
Assert( pParent != NULL );
Assert( prc != NULL );
return new CUIFButton2( pParent, dwID, prc, UIBUTTON_TOGGLE );
}
/* U P D A T E O B J P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CExtensionToggleButton::UpdateObjProp( CUIFObject *pUIObject )
{
CUIFButton *pButton = (CUIFButton *)pUIObject;
Assert( pButton != NULL );
// button face
if (GetIcon() != NULL) {
pButton->SetIcon( GetIcon() );
}
else if (GetBitmap() != NULL) {
pButton->SetBitmap( GetBitmap() );
}
// toggle state
pButton->SetToggleState( IsToggled() );
// tooltip
pButton->SetToolTip( GetToolTipString() );
}
/* U P D A T E E X T P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CExtensionToggleButton::UpdateExtProp( CUIFObject *pUIObject )
{
CUIFButton *pButton = (CUIFButton *)pUIObject;
Assert( pButton != NULL );
// toggle state
m_propToggled.Set( pButton->GetToggleState() );
}
/*============================================================================*/
/* */
/* C C A N D U I E X T E N S I O N M G R */
/* */
/*============================================================================*/
/* C C A N D U I E X T E N S I O N M G R */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CCandUIExtensionMgr::CCandUIExtensionMgr( void )
{
int i;
m_pCandUI = NULL;
for (i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
m_rgSink[i] = NULL;
}
}
/* ~ C C A N D U I E X T E N S I O N M G R */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CCandUIExtensionMgr::~CCandUIExtensionMgr( void )
{
Uninitialize();
}
/* I N I T I A L I Z E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::Initialize( CCandidateUI *pCandUI )
{
m_pCandUI = pCandUI;
#if defined(DEBUG) || defined(_DEBUG)
// check all reference object are unregistered
for (int i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
Assert( m_rgSink[i] == NULL );
}
#endif
return S_OK;
}
/* U N I N I T I A L I Z E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::Uninitialize( void )
{
CCandUIExtension *pExtension;
while (pExtension = m_pExtensionList.GetFirst()) {
m_pExtensionList.Remove( pExtension );
delete pExtension;
}
#if defined(DEBUG) || defined(_DEBUG)
// check all reference object are unregistered
for (int i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
Assert( m_rgSink[i] == NULL );
}
#endif
return S_OK;
}
/* A D V I S E E V E N T S I N K */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::AdviseEventSink( CCandUIExtensionEventSink *pSink )
{
int i;
for (i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
if (m_rgSink[i] == NULL) {
m_rgSink[i] = pSink;
return S_OK;
}
}
Assert( FALSE );
return E_FAIL;
}
/* U N A D V I S E E V E N T S I N K */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::UnadviseEventSink( CCandUIExtensionEventSink *pSink )
{
int i;
for (i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
if (m_rgSink[i] == pSink) {
m_rgSink[i] = NULL;
return S_OK;
}
}
Assert( FALSE );
return E_FAIL;
}
/* N O T I F Y E X T E N S I O N A D D */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CCandUIExtensionMgr::NotifyExtensionAdd( LONG iExtension )
{
int i;
for (i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
if (m_rgSink[i] != NULL) {
m_rgSink[i]->OnExtensionAdd( iExtension );
}
}
}
/* N O T I F Y E X T E N S I O N D E L E T E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CCandUIExtensionMgr::NotifyExtensionDelete( LONG iExtension )
{
int i;
for (i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
if (m_rgSink[i] != NULL) {
m_rgSink[i]->OnExtensionDeleted( iExtension );
}
}
}
/* N O T I F Y E X T E N S I O N U P D A T E */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CCandUIExtensionMgr::NotifyExtensionUpdate( CCandUIExtension *pExtension )
{
LONG i;
LONG iExtension;
iExtension = IndexOfExtension( pExtension );
if (iExtension == -1) {
// extension has not been added yet.
// do not send notify
return;
}
for (i = 0; i < CANDUIEXTENSIONSINK_MAX; i++) {
if (m_rgSink[i] != NULL) {
m_rgSink[i]->OnExtensionUpdated( iExtension );
}
}
}
/* G E T E X T E N S I O N N U M */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
LONG CCandUIExtensionMgr::GetExtensionNum( void )
{
return m_pExtensionList.GetCount();
}
/* G E T E X T E N S I O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CCandUIExtension *CCandUIExtensionMgr::GetExtension( LONG iExtension )
{
return m_pExtensionList.Get( iExtension );
}
/* F I N D E X T E N S I O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CCandUIExtension *CCandUIExtensionMgr::FindExtension( LONG id )
{
int nExt;
int i;
CCandUIExtension *pExtension;
nExt = m_pExtensionList.GetCount();
for (i = 0; i < nExt; i++) {
pExtension = m_pExtensionList.Get( i );
if (pExtension->GetID() == id) {
return pExtension;
}
}
return NULL;
}
/* A D D E X T O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::AddExtObject( LONG id, REFIID riid, void **ppvObj )
{
CCandUIExtension *pExtension;
if (ppvObj == NULL) {
return E_INVALIDARG;
}
// create extension
pExtension = NULL;
if (IsEqualGUID( riid, IID_ITfCandUIExtSpace )) {
pExtension = new CExtensionSpace( this, id );
}
else if (IsEqualGUID( riid, IID_ITfCandUIExtPushButton )) {
pExtension = new CExtensionPushButton( this, id );
}
else if (IsEqualGUID( riid, IID_ITfCandUIExtToggleButton )) {
pExtension = new CExtensionToggleButton( this, id );
}
else {
return E_INVALIDARG;
}
if (pExtension == NULL) {
return E_OUTOFMEMORY;
}
// create interface object
if (FAILED(pExtension->CreateInterfaceObject( riid, ppvObj ))) {
delete pExtension;
return E_FAIL;
}
// add extension to list
m_pExtensionList.Add( pExtension );
NotifyExtensionAdd( IndexOfExtension( pExtension ) );
return S_OK;
}
/* G E T E X T O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::GetExtObject( LONG id, REFIID riid, void **ppvObj )
{
CCandUIExtension *pExtension;
if (ppvObj == NULL) {
return E_INVALIDARG;
}
// find extension
pExtension = FindExtension( id );
if (pExtension == NULL) {
return E_FAIL;
}
// create interface object
return pExtension->CreateInterfaceObject( riid, ppvObj );
}
/* D E L E T E E X T O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionMgr::DeleteExtObject( LONG id )
{
CCandUIExtension *pExtension;
LONG iExtension;
// find extension
pExtension = FindExtension( id );
if (pExtension == NULL) {
return E_FAIL;
}
// remove from list and delete
iExtension = IndexOfExtension( pExtension );
m_pExtensionList.Remove( pExtension );
delete pExtension;
// send notify
NotifyExtensionDelete( iExtension );
return S_OK;
}
/* C R E A T E U I O B J E C T */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CUIFObject *CCandUIExtensionMgr::CreateUIObject( LONG iExtension, CUIFObject *pParent, DWORD dwID, const RECT *prc )
{
CCandUIExtension *pExtension = GetExtension( iExtension );
if (pExtension != NULL) {
return pExtension->CreateUIObject( pParent, dwID, prc );
}
else {
return NULL;
}
}
/* U P D A T E O B J P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CCandUIExtensionMgr::UpdateObjProp( LONG iExtension, CUIFObject *pUIObject )
{
CCandUIExtension *pExtension = GetExtension( iExtension );
if (pExtension != NULL) {
pExtension->UpdateObjProp( pUIObject );
}
}
/* U P D A T E E X T P R O P */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CCandUIExtensionMgr::UpdateExtProp( LONG iExtension, CUIFObject *pUIObject )
{
CCandUIExtension *pExtension = GetExtension( iExtension );
if (pExtension != NULL) {
pExtension->UpdateExtProp( pUIObject );
}
}
/* I N D E X O F E X T E N S I O N */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
LONG CCandUIExtensionMgr::IndexOfExtension( CCandUIExtension *pExtension )
{
return m_pExtensionList.Find( pExtension );
}
/*============================================================================*/
/* */
/* C C A N D U I E X T E N S I O N E V E N T S I N K */
/* */
/*============================================================================*/
/* C C A N D U I E X T E N S I O N E V E N T S I N K */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CCandUIExtensionEventSink::CCandUIExtensionEventSink( void )
{
m_pExtensionMgr = NULL;
}
/* ~ C C A N D U I E X T E N S I O N E V E N T S I N K */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
CCandUIExtensionEventSink::~CCandUIExtensionEventSink( void )
{
Assert( m_pExtensionMgr == NULL );
if (m_pExtensionMgr != NULL) {
DoneEventSink();
}
}
/* I N I T E V E N T S I N K */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionEventSink::InitEventSink( CCandUIExtensionMgr *pExtensionMgr )
{
Assert( pExtensionMgr != NULL );
Assert( m_pExtensionMgr == NULL );
if (pExtensionMgr == NULL) {
return E_INVALIDARG;
}
m_pExtensionMgr = pExtensionMgr;
return m_pExtensionMgr->AdviseEventSink( this );
}
/* D O N E E V E N T S I N K */
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
HRESULT CCandUIExtensionEventSink::DoneEventSink( void )
{
HRESULT hr;
Assert( m_pExtensionMgr != NULL );
if (m_pExtensionMgr == NULL) {
return E_FAIL;
}
hr = m_pExtensionMgr->UnadviseEventSink( this );
m_pExtensionMgr = NULL;
return hr;
}