//____________________________________________________________________________ // // 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(szButtonText[i].data()); pButtons[i].lpTooltipText = const_cast(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(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; }