mirror of https://github.com/tongzx/nt5src
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.
456 lines
11 KiB
456 lines
11 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
|