windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/toolbar.cpp
2020-09-26 16:20:57 +08:00

457 lines
11 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: toolbar.cpp
//
//--------------------------------------------------------------------------
#include "stdafx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////////
// IToolbar implementation
DEBUG_DECLARE_INSTANCE_COUNTER(CToolbar);
CToolbar::CToolbar()
{
m_pControlbar = NULL;
m_pToolbarIntf = NULL;
DEBUG_INCREMENT_INSTANCE_COUNTER(CToolbar);
}
CToolbar::~CToolbar()
{
DECLARE_SC(sc, _T("CToolbar::~CToolbar"));
// Destroy the toolbar UI.
if (m_pToolbarIntf)
{
sc = m_pToolbarIntf->ScDelete(this);
if (sc)
sc.TraceAndClear();
m_pToolbarIntf = NULL;
}
// Controlbar has a reference to this object, ask it
// to stop referencing this object.
if (m_pControlbar)
{
m_pControlbar->DeleteFromToolbarsList(this);
m_pControlbar = NULL;
}
DEBUG_DECREMENT_INSTANCE_COUNTER(CToolbar);
}
//+-------------------------------------------------------------------
//
// Member: AddBitmap
//
// Synopsis: Add bitmaps for given toolbar.
//
// Arguments:
// [nImages] - Number of bitmap images.
// [hbmp] - Handle to the bitmap.
// [cxSize] - Size of the bitmap.
// [cySize] - Size of the bitmap.
// [crMask] - color mask.
//
// Returns: HRESULT
//
// Note: We support only 16x16 bitmaps for toolbars.
//
//--------------------------------------------------------------------
STDMETHODIMP CToolbar::AddBitmap(int nImages, HBITMAP hbmp, int cxSize,
int cySize, COLORREF crMask)
{
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IToolbar::AddBitmap"));
if (hbmp == NULL || nImages < 1 || cxSize < 1 || cySize < 1)
{
sc = E_INVALIDARG;
TraceSnapinError(_T("Invalid Arguments"), sc);
return sc.ToHr();
}
// Note: We support only 16x16 bitmaps for toolbars.
if (cxSize != BUTTON_BITMAP_SIZE || cySize != BUTTON_BITMAP_SIZE)
{
sc = E_INVALIDARG;
TraceSnapinError(_T("Invalid Bitmap size"), sc);
return sc.ToHr();
}
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScAddBitmap(this, nImages, hbmp, crMask);
if (sc)
return sc.ToHr();
return sc.ToHr();
}
//+-------------------------------------------------------------------
//
// Member: AddButtons
//
// Synopsis: Add buttons for given toolbar.
//
// Arguments:
// [nButtons] - Number of buttons.
// [lpButtons] - Array of MMCBUTTONS to be added.
//
// Returns: HRESULT
//
//--------------------------------------------------------------------
STDMETHODIMP CToolbar::AddButtons(int nButtons, LPMMCBUTTON lpButtons)
{
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IToolbar::AddButtons"));
if ( (lpButtons == NULL) || (nButtons < 1) )
{
sc = E_INVALIDARG;
TraceSnapinError(_T("Invalid Args"), sc);
return sc.ToHr();
}
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScAddButtons(this, nButtons, lpButtons);
if (sc)
return sc.ToHr();
return sc.ToHr();
}
//+-------------------------------------------------------------------
//
// Member: InsertButton
//
// Synopsis: Add buttons for given toolbar at given index.
//
// Arguments:
// [nButtons] - Index at which this button is to be added.
// [lpButton] - Ptr to MMCBUTTON to be added.
//
// Returns: HRESULT
//
//--------------------------------------------------------------------
STDMETHODIMP CToolbar::InsertButton(int nIndex, LPMMCBUTTON lpButton)
{
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IToolbar::InsertButton"));
if ( (lpButton == NULL) || (nIndex < 0) )
{
sc = E_INVALIDARG;
TraceSnapinError(_T("Invalid Args"), sc);
return sc.ToHr();
}
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScInsertButton(this, nIndex, lpButton);
if (sc)
return sc.ToHr();
return sc.ToHr();
}
//+-------------------------------------------------------------------
//
// Member: DeleteButton
//
// Synopsis: Delete the button at given index.
//
// Arguments:
// [nIndex] - Index of the button to be deleted.
//
// Returns: HRESULT
//
//--------------------------------------------------------------------
STDMETHODIMP CToolbar::DeleteButton(int nIndex)
{
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IToolbar::DeleteButton"));
if (nIndex < 0)
{
sc = E_INVALIDARG;
TraceSnapinError(_T("Invalid index"), sc);
return sc.ToHr();
}
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScDeleteButton(this, nIndex);
if (sc)
return sc.ToHr();
return sc.ToHr();
}
//+-------------------------------------------------------------------
//
// Member: GetTBStateFromMMCButtonState
//
// Synopsis: We use MMC_BUTTON_STATE for Set/Get Button States &
// use TBSTATE for Insert/Add Buttons.
// This method helps Get/Set ButtonState methods to translate
// the MMC_BUTTON_STATEs to TBSTATE so that conui deals only
// with TBSTATE.
//
// Arguments: [nState] - MMC_BUTTON_STATE to be transformed.
//
// Returns: TBSTATE value.
//
//--------------------------------------------------------------------
BYTE CToolbar::GetTBStateFromMMCButtonState(MMC_BUTTON_STATE nState)
{
switch (nState)
{
case ENABLED:
return TBSTATE_ENABLED;
break;
case CHECKED:
return TBSTATE_CHECKED;
break;
case HIDDEN:
return TBSTATE_HIDDEN;
break;
case INDETERMINATE:
return TBSTATE_INDETERMINATE;
break;
case BUTTONPRESSED:
return TBSTATE_PRESSED;
break;
default:
ASSERT(FALSE); // Invalid option
return 0;
}
}
//+-------------------------------------------------------------------
//
// Member: GetButtonState
//
// Synopsis: Is the given state of a button set or not.
//
// Arguments:
// [idCommand] - Command id of the button.
// [nState] - State needed.
// [pbState] - Is the above state set or reset.
//
// Returns: HRESULT
//
//--------------------------------------------------------------------
STDMETHODIMP CToolbar::GetButtonState(int idCommand, MMC_BUTTON_STATE nState,
BOOL* pbState)
{
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IToolbar::GetButtonState"));
if (pbState == NULL)
{
sc = E_INVALIDARG;
TraceSnapinError(_T("NULL pointer"), sc);
return sc.ToHr();
}
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScGetButtonState(this, idCommand,
GetTBStateFromMMCButtonState(nState),
pbState);
if (sc)
return sc.ToHr();
return sc.ToHr();
}
//+-------------------------------------------------------------------
//
// Member: SetButtonState
//
// Synopsis: Modify the given state of a button.
//
// Arguments:
// [idCommand] - Command id of the button.
// [nState] - State to be modified.
// [bState] - Set or Reset the state.
//
// Returns: HRESULT
//
//--------------------------------------------------------------------
STDMETHODIMP CToolbar::SetButtonState(int idCommand, MMC_BUTTON_STATE nState,
BOOL bState)
{
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IToolbar::SetButtonState"));
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScSetButtonState(this, idCommand,
GetTBStateFromMMCButtonState(nState),
bState);
if (sc)
return sc.ToHr();
return (sc.ToHr());
}
//+-------------------------------------------------------------------
//
// Member: ScAttach
//
// Synopsis: Attach this toolbar to UI.
//
// Arguments: None.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CToolbar::ScAttach()
{
DECLARE_SC(sc, _T("CToolbar::ScAttach"));
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScAttach(this);
if (sc)
return sc.ToHr();
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: ScDetach
//
// Synopsis: Detach this toolbar from the UI.
//
// Arguments: None.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CToolbar::ScDetach()
{
DECLARE_SC(sc, _T("CToolbar::ScDetach"));
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = m_pToolbarIntf->ScDetach(this);
if (sc)
return sc.ToHr();
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: ScShow
//
// Synopsis: Show/Hide this toolbar.
//
// Arguments:
// [bShow] - Show or Hide.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CToolbar::ScShow(BOOL bShow)
{
DECLARE_SC(sc, _T("CToolbar::ScShow"));
sc = ScCheckPointers(m_pToolbarIntf, E_UNEXPECTED);
if (sc)
return sc.ToHr();
sc = (bShow ? m_pToolbarIntf->ScAttach(this) : m_pToolbarIntf->ScDetach(this));
if (sc)
return sc.ToHr();
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: ScNotifyToolBarClick
//
// Synopsis: Notify the snapin about a tool button is click.
//
// Arguments: [pNode] - CNode* that owns result pane.
// [bScope] - Scope or Result.
// [lResultItemCookie] - If Result pane is selected the item param.
// [nID] - Command ID of the tool button clicked.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CToolbar::ScNotifyToolBarClick(HNODE hNode, bool bScope,
LPARAM lResultItemCookie, UINT nID)
{
DECLARE_SC(sc, _T("CToolbar::ScNotifyToolbarClick"));
if (NULL == m_pControlbar)
return (sc = E_UNEXPECTED);
sc = m_pControlbar->ScNotifySnapinOfToolBtnClick(hNode, bScope, lResultItemCookie, nID);
if (sc)
return sc;
return(sc);
}
//+-------------------------------------------------------------------
//
// Member: CToolbar::ScAMCViewToolbarsBeingDestroyed
//
// Synopsis: The CAMCViewToolbars object is going away, do not
// reference that object anymore.
//
// Arguments:
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CToolbar::ScAMCViewToolbarsBeingDestroyed ()
{
DECLARE_SC(sc, _T("CToolbar::ScAMCViewToolbarsBeingDestroyed"));
m_pToolbarIntf = NULL;
return (sc);
}