Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

659 lines
18 KiB

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: stdbar.cpp
//
// Contents: Standard toolbar implementation.
//
// History: 10/22/1999 AnandhaG Created
//____________________________________________________________________________
//
#include "stdafx.h"
#include "stdbar.h"
#include "amcview.h"
#include "toolbar.h"
#include "util.h" // GetTBBtnTextAndStatus()
using namespace std;
/*
* These are used only to give the separators unique IDs, so automatic
* separator handling will work (see AssertSeparatorsAreValid).
*/
enum
{
ID_Separator1 = 1,
ID_Separator2,
ID_Separator3,
ID_Separator4,
ID_Separator5,
ID_Separator6,
ID_Separator7,
ID_Separator8,
ID_Separator9,
// must be last
ID_SeparatorFirst = ID_Separator1,
ID_SeparatorLast = ID_Separator9,
ID_SeparatorMax = ID_SeparatorLast,
};
static MMCBUTTON CommonButtons[] =
{
{ 0, IDS_MMC_WEB_BACK , TBSTATE_ENABLED, TBSTYLE_BUTTON, NULL, NULL },
{ 1, IDS_MMC_WEB_FORWARD , TBSTATE_ENABLED, TBSTYLE_BUTTON, NULL, NULL },
{ 0, ID_Separator1 , 0, TBSTYLE_SEP , NULL, NULL },
{ 9, IDS_MMC_GENL_UPONELEVEL , TBSTATE_ENABLED, TBSTYLE_BUTTON, NULL, NULL },
{10, IDS_MMC_GENL_SCOPE , TBSTATE_ENABLED, TBSTYLE_BUTTON, NULL, NULL },
{ 0, ID_Separator2 , 0, TBSTYLE_SEP , NULL, NULL },
{ 5, IDS_MMC_VERB_CUT , 0, TBSTYLE_BUTTON, NULL, NULL },
{ 6, IDS_MMC_VERB_COPY , 0, TBSTYLE_BUTTON, NULL, NULL },
{ 7, IDS_MMC_VERB_PASTE , 0, TBSTYLE_BUTTON, NULL, NULL },
{ 0, ID_Separator3 , 0, TBSTYLE_SEP , NULL, NULL },
{11, IDS_MMC_VERB_DELETE , 0, TBSTYLE_BUTTON, NULL, NULL },
{ 8, IDS_MMC_VERB_PROPERTIES , 0, TBSTYLE_BUTTON, NULL, NULL },
{12, IDS_MMC_VERB_PRINT , 0, TBSTYLE_BUTTON, NULL, NULL },
{13, IDS_MMC_VERB_REFRESH , 0, TBSTYLE_BUTTON, NULL, NULL },
{16, IDS_SAVE_LIST_BUTTON , 0, TBSTYLE_BUTTON, NULL, NULL },
{ 0, ID_Separator4 , 0, TBSTYLE_SEP , NULL, NULL },
{15, IDS_MMC_GENL_CONTEXTHELP , TBSTATE_ENABLED, TBSTYLE_BUTTON, NULL, NULL },
};
CStandardToolbar::CStandardToolbar()
:m_pToolbarUI(NULL), m_pAMCView(NULL)
{
/*
* Map helps in determining string id from verb & vice versa.
*/
m_MMCVerbCommandIDs[MMC_VERB_CUT] = IDS_MMC_VERB_CUT;
m_MMCVerbCommandIDs[MMC_VERB_CUT] = IDS_MMC_VERB_CUT;
m_MMCVerbCommandIDs[MMC_VERB_COPY] = IDS_MMC_VERB_COPY;
m_MMCVerbCommandIDs[MMC_VERB_PASTE] = IDS_MMC_VERB_PASTE;
m_MMCVerbCommandIDs[MMC_VERB_DELETE] = IDS_MMC_VERB_DELETE;
m_MMCVerbCommandIDs[MMC_VERB_PROPERTIES] = IDS_MMC_VERB_PROPERTIES;
m_MMCVerbCommandIDs[MMC_VERB_PRINT] = IDS_MMC_VERB_PRINT;
m_MMCVerbCommandIDs[MMC_VERB_REFRESH] = IDS_MMC_VERB_REFRESH;
}
CStandardToolbar::~CStandardToolbar()
{
DECLARE_SC(sc, TEXT("CStandardToolbar::~CStandardToolbar"));
// Ask the toolbar UI object to delete itself.
if (m_pToolbarUI)
{
sc = m_pToolbarUI->ScDelete(this);
if (sc)
sc.TraceAndClear();
}
}
//+-------------------------------------------------------------------
//
// Member: ScInitializeStdToolbar
//
// Synopsis: Initialize the standard toolbar, add bitmap & buttons.
//
// Arguments: [pAMCView] - The CAMCView (owner) of this stdbar.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScInitializeStdToolbar(CAMCView* pAMCView)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScInitializeStdToolbar"));
if (NULL == pAMCView)
return (sc = E_UNEXPECTED);
m_pAMCView = pAMCView;
SViewData* pViewData = m_pAMCView->GetViewData();
if (NULL == pViewData)
{
sc = E_UNEXPECTED;
return sc;
}
// Get the toolbars mgr from CAMCView and create the stdandrd toolbar.
CAMCViewToolbarsMgr* pAMCViewToolbarsMgr = pViewData->GetAMCViewToolbarsMgr();
if (NULL == pAMCViewToolbarsMgr)
{
sc = E_UNEXPECTED;
return sc;
}
sc = pAMCViewToolbarsMgr->ScCreateToolBar(&m_pToolbarUI);
if (sc)
return sc;
ASSERT(NULL != m_pToolbarUI);
// Add the bitmap
CBitmap cBmp;
cBmp.LoadBitmap((pAMCView->GetExStyle() & WS_EX_LAYOUTRTL) ? IDB_COMMON_16_RTL : IDB_COMMON_16);
BITMAP bm;
cBmp.GetBitmap (&bm);
int cBitmaps = (bm.bmWidth / BUTTON_BITMAP_SIZE) /*width*/;
sc = m_pToolbarUI->ScAddBitmap(this, cBitmaps, cBmp, MMC_TOOLBTN_COLORREF);
if (sc)
return sc;
// Add the buttons to the toolbar and then display toolbar
sc = ScAddToolbarButtons(countof(CommonButtons), CommonButtons);
if (sc)
return sc;
// See if Std bar is allowed or not.
bool bShowStdbar = (pViewData->m_dwToolbarsDisplayed & STD_BUTTONS);
sc = bShowStdbar ? m_pToolbarUI->ScAttach(this) : m_pToolbarUI->ScDetach(this);
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScAddToolbarButtons
//
// Synopsis: Add buttons to standard toolbar.
//
// Arguments: [nCnt] - Number of buttons to be added.
// [pButtons] - Array of nCnt MMCBUTTONS.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScAddToolbarButtons(int nCnt, MMCBUTTON* pButtons)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScAddToolbarButtons"));
// Array to store button text & tooltip text.
wstring szButtonText[countof(CommonButtons)];
wstring szTooltipText[countof(CommonButtons)];
USES_CONVERSION;
HINSTANCE hInst = GetStringModule();
// get resource strings for all buttons
for (int i = 0; i < nCnt; i++)
{
// We dont want to get text for separators.
if (pButtons[i].idCommand > ID_SeparatorMax)
{
bool bSuccess = GetTBBtnTextAndStatus(hInst,
pButtons[i].idCommand,
szButtonText[i],
szTooltipText[i]);
if (false == bSuccess)
{
return (sc = E_FAIL);
}
pButtons[i].lpButtonText = const_cast<LPOLESTR>(szButtonText[i].data());
pButtons[i].lpTooltipText = const_cast<LPOLESTR>(szTooltipText[i].data());
}
}
// Got the strings, now add buttons.
sc = m_pToolbarUI->ScAddButtons(this, nCnt, pButtons);
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScNotifyToolBarClick
//
// Synopsis: Button click handler.
//
// Arguments: [hNode] - The HNODE owner of the view.
// [bScope] - Focus on scope or result.
// [lParam] - if result the lParam of focused result item.
// [nID] - Button ID that was clicked.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScNotifyToolBarClick(HNODE hNode, bool bScope, LPARAM lParam, UINT nID)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScNotifyToolBarClick"));
if (NULL == m_pAMCView)
return (sc = E_UNEXPECTED);
switch (nID)
{
case IDS_MMC_VERB_CUT:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evCut);
break;
case IDS_MMC_VERB_COPY:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evCopy);
break;
case IDS_MMC_VERB_PASTE:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evPaste);
break;
case IDS_MMC_VERB_DELETE:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evDelete);
break;
case IDS_MMC_VERB_PROPERTIES:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evProperties);
break;
case IDS_MMC_VERB_PRINT:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evPrint);
break;
case IDS_MMC_VERB_REFRESH:
sc = m_pAMCView->ScProcessConsoleVerb (hNode, bScope, lParam, evRefresh);
break;
case IDS_MMC_GENL_CONTEXTHELP:
sc = m_pAMCView->ScContextHelp ();
break;
case IDS_MMC_GENL_UPONELEVEL:
sc = m_pAMCView->ScUpOneLevel ();
break;
case IDS_MMC_GENL_SCOPE:
sc = m_pAMCView->ScToggleScopePane ();
break;
case IDS_MMC_WEB_BACK:
sc = m_pAMCView->ScWebCommand (CConsoleView::eWeb_Back);
break;
case IDS_MMC_WEB_FORWARD:
sc = m_pAMCView->ScWebCommand (CConsoleView::eWeb_Forward);
break;
case IDS_MMC_WEB_STOP:
sc = m_pAMCView->ScWebCommand (CConsoleView::eWeb_Stop);
break;
case IDS_MMC_WEB_REFRESH:
sc = m_pAMCView->ScWebCommand (CConsoleView::eWeb_Refresh);
break;
case IDS_MMC_WEB_HOME:
sc = m_pAMCView->ScWebCommand (CConsoleView::eWeb_Home);
break;
case IDS_SAVE_LIST_BUTTON:
sc = m_pAMCView->ScSaveList ();
break;
default:
sc = E_UNEXPECTED;
TraceError(_T("Unknown Standard bar button ID"), sc);
break;
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: CStandardToolbar::ScAMCViewToolbarsBeingDestroyed
//
// Synopsis: The CAMCViewToolbars object is going away, do not
// reference that object anymore.
//
// Arguments:
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScAMCViewToolbarsBeingDestroyed ()
{
DECLARE_SC(sc, _T("CStandardToolbar::ScAMCViewToolbarsBeingDestroyed"));
m_pToolbarUI = NULL;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: ScEnableButton
//
// Synopsis: Enable/Disable given button.
//
// Arguments:
// [nID] - Button ID that should be enabled/disabled.
// [bool] - Enable or Disable.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScEnableButton(INT nID, bool bState)
{
SC sc;
if (NULL == m_pToolbarUI)
return (sc = E_UNEXPECTED);
sc = m_pToolbarUI->ScSetButtonState(this, nID, TBSTATE_ENABLED, bState);
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScEnableAndShowButton
//
// Synopsis: Enable (and show) or disable (and hide) the given button.
//
// Arguments:
// [nID] - Button ID that should be enabled/disabled.
// [bool] - If true enable else hide.
//
// Note: If the button is being disabled hide it.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScEnableAndShowButton(INT nID, bool bEnableAndShow)
{
DECLARE_SC(sc, _T("CStandardToolbar::ScEnableAndShowButton"));
sc = ScCheckPointers(m_pToolbarUI, E_UNEXPECTED);
if (sc)
return sc;
// First hide or show the button.
sc = m_pToolbarUI->ScSetButtonState(this, nID, TBSTATE_HIDDEN, !bEnableAndShow);
if (sc)
return sc;
// Now enable or disable the button.
sc = m_pToolbarUI->ScSetButtonState(this, nID, TBSTATE_ENABLED, bEnableAndShow);
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScEnableExportList
//
// Synopsis: Enable/Disable export-list button.
//
// Arguments: [bEnable] - enable/disable.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScEnableExportList(bool bEnable)
{
// If there are ANY items on the list, enable the button.
return ScEnableAndShowButton(IDS_SAVE_LIST_BUTTON, bEnable );
}
//+-------------------------------------------------------------------
//
// Member: ScEnableUpOneLevel
//
// Synopsis: Enable/Disable up-one-level button.
//
// Arguments: [bEnable] -
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScEnableUpOneLevel(bool bEnable)
{
return ScEnableAndShowButton(IDS_MMC_GENL_UPONELEVEL, bEnable);
}
//+-------------------------------------------------------------------
//
// Member: ScEnableContextHelpBtn
//
// Synopsis: Enable/Disable help button.
//
// Arguments: [bEnable] -
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScEnableContextHelpBtn(bool bEnable)
{
return ScEnableAndShowButton(IDS_MMC_GENL_CONTEXTHELP, bEnable);
}
//+-------------------------------------------------------------------
//
// Member: ScEnableScopePaneBtn
//
// Synopsis: Enable/Disable scope-pane button.
//
// Arguments: [bEnable] -
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScEnableScopePaneBtn(bool bEnable)
{
return ScEnableAndShowButton(IDS_MMC_GENL_SCOPE, bEnable);
}
//+-------------------------------------------------------------------
//
// Member: ScCheckScopePaneBtn
//
// Synopsis: Set scope button in normal or checked state.
//
// Arguments: [bChecked] - BOOL
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScCheckScopePaneBtn(bool bChecked)
{
SC sc;
if (NULL == m_pToolbarUI)
return (sc = E_UNEXPECTED);
sc = m_pToolbarUI->ScSetButtonState(this, IDS_MMC_GENL_SCOPE, TBSTATE_CHECKED, bChecked);
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScShowStdBar
//
// Synopsis: Show or Hide std bar.
//
// Arguments: [bShow] - BOOL
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScShowStdBar(bool bShow)
{
SC sc;
if (NULL == m_pToolbarUI)
return (sc = E_UNEXPECTED);
sc = bShow ? m_pToolbarUI->ScAttach(this) : m_pToolbarUI->ScDetach(this);
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScUpdateStdbarVerbs
//
// Synopsis: Update the toolbuttons of std-verbs.
//
// Arguments: [pCV] - the IConsoleVerb that has state of the verb.
//
// Returns: SC.
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScUpdateStdbarVerbs(IConsoleVerb* pCV)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScUpdateStdbarVerbs"));
for (int verb = MMC_VERB_FIRST; verb <= MMC_VERB_LAST; verb++)
{
// No toolbar buttons for following verbs.
if ( (MMC_VERB_OPEN == verb) ||
(MMC_VERB_RENAME == verb))
continue;
sc = ScUpdateStdbarVerb (static_cast<MMC_CONSOLE_VERB>(verb), pCV);
if (sc)
return sc;
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScUpdateStdbarVerb
//
// Synopsis: Update the toolbutton of given std-verbs.
//
// Arguments: [cVerb] - the verb (ie: toolbutton) to be updated.
// [pVC] - the IConsoleVerb that has state of the verb.
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScUpdateStdbarVerb(MMC_CONSOLE_VERB cVerb, IConsoleVerb* pConsoleVerb /*=NULL*/)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScUpdateStdbarVerb"));
if (NULL == m_pToolbarUI)
{
sc = E_UNEXPECTED;
return sc;
}
if (pConsoleVerb == NULL)
{
sc = E_UNEXPECTED;
return sc;
}
// No toolbuttons for these verbs.
if ( (MMC_VERB_OPEN == cVerb) ||
(MMC_VERB_RENAME == cVerb))
return sc;
MMCVerbCommandIDs::iterator it = m_MMCVerbCommandIDs.find(cVerb);
if (m_MMCVerbCommandIDs.end() == it)
{
// Could not find the verb in our map.
sc = E_UNEXPECTED;
return sc;
}
INT nCommandID = it->second;
BOOL bFlag = 0;
pConsoleVerb->GetVerbState(cVerb, HIDDEN, &bFlag);
sc = m_pToolbarUI->ScSetButtonState(this, nCommandID, TBSTATE_HIDDEN, bFlag);
if (sc)
return sc;
if (bFlag == FALSE)
{
// If verb is not hidden then enable/disable it.
pConsoleVerb->GetVerbState(cVerb, ENABLED, &bFlag);
sc = m_pToolbarUI->ScSetButtonState(this, nCommandID, TBSTATE_ENABLED, bFlag);
if (sc)
return sc;
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScUpdateStdbarVerb
//
// Synopsis: Update the toolbutton of given std-verb.
//
// Arguments: [cVerb] - the verb (ie: toolbutton) to be updated.
// [nState] - the button state to be updated.
// [bFlag] - State
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScUpdateStdbarVerb (MMC_CONSOLE_VERB cVerb, BYTE byState, BOOL bFlag)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScUpdateStdbarVerb"));
if (NULL == m_pToolbarUI)
{
sc = E_UNEXPECTED;
return sc;
}
MMCVerbCommandIDs::iterator it = m_MMCVerbCommandIDs.find(cVerb);
if (m_MMCVerbCommandIDs.end() == it)
{
// Could not find the verb in our map.
sc = E_UNEXPECTED;
return sc;
}
INT nCommandID = it->second;
sc = m_pToolbarUI->ScSetButtonState(this, nCommandID, byState, bFlag);
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScShow
//
// Synopsis: Show/Hide the toolbar.
//
// Arguments: [bShow] - show/hide.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CStandardToolbar::ScShow (BOOL bShow)
{
DECLARE_SC (sc, _T("CStandardToolbar::ScShow"));
if (NULL == m_pToolbarUI)
{
sc = E_UNEXPECTED;
return sc;
}
sc = m_pToolbarUI->ScShow(this, bShow);
if (sc)
return sc;
return sc;
}