www.pudn.com > ÍøÂç¶Ë¿Ú¼àÊÓ.rar > BCGPCalendarMenuButton.cpp
// BCGCalendarMenuButton.cpp: implementation of the CBCGPCalendarMenuButton class. // This is a part of the BCGControlBar Library // Copyright (C) 1998-2000 BCGSoft Ltd. // All rights reserved. // // This source code can be used, distributed or modified // only under terms and conditions // of the accompanying license agreement. ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #ifndef BCG_NO_CALENDAR #include "BCGPTearOffManager.h" #include "BCGCBPro.h" #include "MenuImages.h" #include "BCGPPopupMenuBar.h" #include "BCGPCalendarMenuButton.h" #include "BCGPCalendarBar.h" #include "BCGPWorkspace.h" #include "BCGPRegistry.h" #include "CalendarPopup.h" #include "BCGGlobals.h" #include "BCGPVisualManager.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif extern CBCGPWorkspace* g_pWorkspace; static const int SEPARATOR_SIZE = 2; CMapCBCGPCalendarMenuButton::m_CalendarsByID; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IMPLEMENT_SERIAL(CBCGPCalendarMenuButton, CBCGPToolbarMenuButton, VERSIONABLE_SCHEMA | 1) CBCGPCalendarMenuButton::CBCGPCalendarMenuButton() { Initialize (); } //***************************************************************************************** CBCGPCalendarMenuButton::CBCGPCalendarMenuButton (UINT uiCmdID, LPCTSTR lpszText) : CBCGPToolbarMenuButton (uiCmdID, NULL, CImageHash::GetImageOfCommand (uiCmdID, FALSE), lpszText) { Initialize (); m_Calendar = GetCalendarByCmdID (uiCmdID); } //***************************************************************************************** void CBCGPCalendarMenuButton::Initialize () { m_Calendar = COleDateTime::GetCurrentTime(); m_nColumns = -1; m_nVertDockColumns = -1; m_nHorzDockRows = -1; m_bStdCalendarDlg = FALSE; } //***************************************************************************************** CBCGPCalendarMenuButton::~CBCGPCalendarMenuButton() { } //***************************************************************************************** void CBCGPCalendarMenuButton::EnableTearOff (UINT uiID, int nVertDockColumns, int nHorzDockRows) { if (g_pTearOffMenuManager != NULL && g_pTearOffMenuManager->IsDynamicID (uiID)) { ASSERT (FALSE); // SHould be static ID! uiID = 0; } m_uiTearOffBarID = uiID; m_nVertDockColumns = nVertDockColumns; m_nHorzDockRows = nHorzDockRows; } //***************************************************************************************** void CBCGPCalendarMenuButton::OnDraw (CDC* pDC, const CRect& rect, CBCGPToolBarImages* pImages, BOOL bHorz, BOOL bCustomizeMode, BOOL bHighlight, BOOL bDrawBorder, BOOL bGrayDisabledButtons) { ASSERT_VALID (this); ASSERT_VALID (pDC); if (m_bMenuMode) { DrawMenuItem (pDC, rect, pImages, bCustomizeMode, bHighlight, bGrayDisabledButtons); return; } //---------------------- // Fill button interior: //---------------------- FillInterior (pDC, rect, bHighlight || IsDroppedDown ()); CSize sizeImage = CMenuImages::Size (); if (CBCGPToolBar::IsLargeIcons ()) { sizeImage.cx *= 2; sizeImage.cy *= 2; } CRect rectInternal = rect; CSize sizeExtra = m_bExtraSize ? CBCGPVisualManager::GetInstance ()->GetButtonExtraBorder () : CSize (0, 0); if (sizeExtra != CSize (0, 0)) { rectInternal.DeflateRect (sizeExtra.cx / 2 + 1, sizeExtra.cy / 2 + 1); } CRect rectParent = rect; CRect rectArrow = rectInternal; const int nMargin = CBCGPVisualManager::GetInstance ()->GetMenuImageMargin (); const int xMargin = bHorz ? nMargin : 0; const int yMargin = bHorz ? 0 : nMargin; rectInternal.DeflateRect (xMargin, yMargin); rectParent.DeflateRect (xMargin, yMargin); if (m_bDrawDownArrow) { if (bHorz) { rectParent.right -= sizeImage.cx + SEPARATOR_SIZE; rectArrow.left = rectParent.right - 1; rectArrow.OffsetRect (-sizeExtra.cx / 2, -sizeExtra.cy / 2); } else { rectParent.bottom -= sizeImage.cy + SEPARATOR_SIZE; rectArrow.top = rectParent.bottom - 1; } } UINT uiStyle = m_nStyle; if (CBCGPVisualManager::GetInstance ()->IsMenuFlatLook ()) { m_nStyle &= ~(TBBS_PRESSED | TBBS_CHECKED); } else { if (m_bClickedOnMenu && m_nID != 0 && m_nID != (UINT) -1 && !m_bMenuOnly) { m_nStyle &= ~TBBS_PRESSED; } else if (m_pPopupMenu != NULL) { m_nStyle |= TBBS_PRESSED; } } BOOL bDisableFill = m_bDisableFill; m_bDisableFill = TRUE; CBCGPToolbarButton::OnDraw (pDC, rectParent, pImages, bHorz, bCustomizeMode, bHighlight, bDrawBorder, bGrayDisabledButtons); m_bDisableFill = bDisableFill; if (m_bDrawDownArrow) { if ((m_nStyle & (TBBS_PRESSED | TBBS_CHECKED)) && !CBCGPVisualManager::GetInstance ()->IsMenuFlatLook ()) { rectArrow.OffsetRect (1, 1); } BOOL bDisabled = (bCustomizeMode && !IsEditable ()) || (!bCustomizeMode && (m_nStyle & TBBS_DISABLED)); int iImage; if (bHorz && !m_bMenuOnly) { iImage = CMenuImages::IdArowDown; } else { iImage = CMenuImages::IdArowRight; } if (m_pPopupMenu != NULL && (m_nStyle & (TBBS_PRESSED | TBBS_CHECKED)) == 0 && !CBCGPVisualManager::GetInstance ()->IsMenuFlatLook ()) { rectArrow.OffsetRect (1, 1); } CPoint pointImage ( rectArrow.left + (rectArrow.Width () - sizeImage.cx) / 2, rectArrow.top + (rectArrow.Height () - sizeImage.cy) / 2); CMenuImages::Draw (pDC, (CMenuImages::IMAGES_IDS) iImage, pointImage, bDisabled ? CMenuImages::ImageGray : CMenuImages::ImageBlack, sizeImage); } m_nStyle = uiStyle; if (!bCustomizeMode) { if ((m_nStyle & (TBBS_PRESSED | TBBS_CHECKED)) || m_pPopupMenu != NULL) { //----------------------- // Pressed in or checked: //----------------------- if (!CBCGPVisualManager::GetInstance ()->IsMenuFlatLook () && m_bClickedOnMenu && m_nID != 0 && m_nID != (UINT) -1 && !m_bMenuOnly) //JRG { CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (pDC, this, rectParent, CBCGPVisualManager::ButtonsIsHighlighted); rectArrow.right --; rectArrow.bottom --; CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (pDC, this, rectArrow, CBCGPVisualManager::ButtonsIsPressed); } else { CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (pDC, this, rect, CBCGPVisualManager::ButtonsIsPressed); } } else if (bHighlight && !(m_nStyle & TBBS_DISABLED) && !(m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE))) { CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (pDC, this, rect, CBCGPVisualManager::ButtonsIsHighlighted); } } } //********************************************************************************************** int CBCGPCalendarMenuButton::OnDrawOnCustomizeList (CDC* pDC, const CRect& rect, BOOL bSelected) { int nID = m_nID; m_nID = 0; // Force draw right arrow CRect rectCalendar = rect; rectCalendar.DeflateRect (1, 0); int iRes = CBCGPToolbarMenuButton::OnDrawOnCustomizeList (pDC, rect, bSelected); m_nID = nID; return iRes; } //********************************************************************************************** void CBCGPCalendarMenuButton::SetDate (const COleDateTime& date, BOOL bNotify) { m_Calendar = date; m_CalendarsByID.SetAt (m_nID, m_Calendar); if (m_pWndParent->GetSafeHwnd () != NULL) { m_pWndParent->InvalidateRect (m_rect); } if (bNotify) { CObList listButtons; if (CBCGPToolBar::GetCommandButtons (m_nID, listButtons) > 0) { for (POSITION pos = listButtons.GetHeadPosition (); pos != NULL;) { CBCGPCalendarMenuButton* pOther = DYNAMIC_DOWNCAST (CBCGPCalendarMenuButton, listButtons.GetNext (pos)); if (pOther != NULL && pOther != this) { pOther->SetDate (date, FALSE); } } } const CObList& lstToolBars = CBCGPToolBar::GetAllToolbars (); for (POSITION pos = lstToolBars.GetHeadPosition (); pos != NULL;) { CBCGPCalendarBar* pCalendarBar = DYNAMIC_DOWNCAST (CBCGPCalendarBar, lstToolBars.GetNext (pos)); if (pCalendarBar != NULL && pCalendarBar->m_nCommandID == m_nID) { pCalendarBar->SetDate (date); } } } } //**************************************************************************************** void CBCGPCalendarMenuButton::OnChangeParentWnd (CWnd* pWndParent) { CBCGPToolbarButton::OnChangeParentWnd (pWndParent); if (pWndParent != NULL) { if (pWndParent->IsKindOf (RUNTIME_CLASS (CBCGPMenuBar))) { m_bText = TRUE; } if (pWndParent->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar))) { m_bMenuMode = TRUE; m_bText = TRUE; } else { m_bMenuMode = FALSE; } } m_bDrawDownArrow = TRUE; m_pWndParent = pWndParent; } //************************************************************************************ void CBCGPCalendarMenuButton::Serialize (CArchive& ar) { CBCGPToolbarMenuButton::Serialize (ar); if (ar.IsLoading ()) { ar >> m_nColumns; ar >> m_nVertDockColumns; ar >> m_nHorzDockRows; ar >> m_bStdCalendarDlg; CObList listButtons; if (CBCGPToolBar::GetCommandButtons (m_nID, listButtons) > 0) { for (POSITION pos = listButtons.GetHeadPosition (); pos != NULL;) { CBCGPCalendarMenuButton* pOther = DYNAMIC_DOWNCAST (CBCGPCalendarMenuButton, listButtons.GetNext (pos)); if (pOther != NULL && pOther != this) { m_Calendar = pOther->m_Calendar; } } } } else { ar << m_nColumns; ar << m_nVertDockColumns; ar << m_nHorzDockRows; ar << m_bStdCalendarDlg; } } //************************************************************************************ void CBCGPCalendarMenuButton::CopyFrom (const CBCGPToolbarButton& s) { CBCGPToolbarMenuButton::CopyFrom (s); const CBCGPCalendarMenuButton& src = (const CBCGPCalendarMenuButton&) s; m_Calendar = src.m_Calendar; m_CalendarsByID.SetAt (m_nID, m_Calendar); // Just to be happy :-) m_nColumns = src.m_nColumns; m_nVertDockColumns = src.m_nVertDockColumns; m_nHorzDockRows = src.m_nHorzDockRows; m_bStdCalendarDlg = src.m_bStdCalendarDlg; } //***************************************************************************************** BOOL CBCGPCalendarMenuButton::OnClick (CWnd* pWnd, BOOL bDelay) { ASSERT_VALID (pWnd); m_bClickedOnMenu = FALSE; #if 0 if (m_bDrawDownArrow && !bDelay && !m_bMenuMode) { if (m_nID == 0 || m_nID == (UINT) -1) { m_bClickedOnMenu = TRUE; } else { CPoint ptMouse; ::GetCursorPos (&ptMouse); pWnd->ScreenToClient (&ptMouse); int nScale = CBCGPToolBar::IsLargeIcons () ? 2 : 1; CRect rectArrow = m_rect; if (m_bExtraSize) { CSize sizeExtra = CBCGPVisualManager::GetInstance ()->GetButtonExtraBorder (); if (sizeExtra != CSize (0, 0)) { rectArrow.DeflateRect (sizeExtra.cx / 2 + 1, sizeExtra.cy / 2 + 1); } } if (m_bHorz) { rectArrow.left = rectArrow.right - nScale * CMenuImages::Size ().cx - SEPARATOR_SIZE; } else { rectArrow.top = rectArrow.bottom - nScale * CMenuImages::Size ().cy - SEPARATOR_SIZE; } m_bClickedOnMenu = rectArrow.PtInRect (ptMouse); if (!m_bClickedOnMenu) { return FALSE; } } } if (!m_bClickedOnMenu && m_nID > 0 && m_nID != (UINT) -1 && !m_bDrawDownArrow && !m_bMenuOnly) { return FALSE; } #endif CBCGPMenuBar* pMenuBar = DYNAMIC_DOWNCAST (CBCGPMenuBar, m_pWndParent); if (m_pPopupMenu != NULL) { //----------------------------------------------------- // Second click to the popup menu item closes the menu: //----------------------------------------------------- ASSERT_VALID(m_pPopupMenu); m_pPopupMenu->m_bAutoDestroyParent = FALSE; m_pPopupMenu->DestroyWindow (); m_pPopupMenu = NULL; if (pMenuBar != NULL) { pMenuBar->SetHot (NULL); } } else { CBCGPPopupMenuBar* pParentMenu = DYNAMIC_DOWNCAST (CBCGPPopupMenuBar, m_pWndParent); if (bDelay && pParentMenu != NULL && !CBCGPToolBar::IsCustomizeMode ()) { pParentMenu->StartPopupMenuTimer (this); } else { if (pMenuBar != NULL) { CBCGPToolbarMenuButton* pCurrPopupMenuButton = pMenuBar->GetDroppedDownMenu(); if (pCurrPopupMenuButton != NULL) { pCurrPopupMenuButton->OnCancelMode (); } } if (!OpenPopupMenu (pWnd)) { return FALSE; } } if (pMenuBar != NULL) { pMenuBar->SetHot (this); } } if (m_pWndParent != NULL) { CRect rect = m_rect; rect.InflateRect (4, 4); m_pWndParent->InvalidateRect (rect); } return TRUE; } //************************************************************************************** CBCGPPopupMenu* CBCGPCalendarMenuButton::CreatePopupMenu () { return new CCalendarPopup (m_Calendar, m_nID); } //************************************************************************************* const COleDateTime CBCGPCalendarMenuButton::GetCalendarByCmdID (UINT uiCmdID) { COleDateTime date; m_CalendarsByID.Lookup (uiCmdID, date); return date ; } #endif // BCG_NO_CALENDAR