You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

452 lines
10 KiB
C++

2 years ago
// XTPControlPopup.cpp : implementation of the CXTPControlPopup class.
//
// This file is a part of the XTREME COMMANDBARS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Common/XTPHookManager.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPColorManager.h"
#include "XTPCommandBarsDefines.h"
#include "XTPControl.h"
#include "XTPControlButton.h"
#include "XTPControlPopup.h"
#include "XTPCommandBar.h"
#include "XTPControls.h"
#include "XTPPopupBar.h"
#include "XTPPaintManager.h"
#include "XTPCommandBars.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_XTP_CONTROL(CXTPControlPopup, CXTPControlButton)
CXTPControlPopup::CXTPControlPopup()
{
EnableAutomation();
m_controlType = xtpControlPopup;
m_bPopup = FALSE;
m_pCommandBar = NULL;
m_dwCommandBarID = 0;
m_bShowShadow = TRUE;
}
CXTPControlPopup::~CXTPControlPopup()
{
if (m_pCommandBar)
m_pCommandBar->InternalRelease();
}
CXTPControlPopup* CXTPControlPopup::CreateControlPopup(XTPControlType controlType)
{
ASSERT(IsPopupControlType(controlType));
CXTPControlPopup* pControl = (CXTPControlPopup*)CXTPControlPopup::CreateObject();
pControl->m_controlType = controlType;
return pControl;
}
void CXTPControlPopup::OnUnderlineActivate()
{
if (m_pCommandBar)
m_pParent->SetPopuped(m_nIndex, TRUE);
else
CXTPControlButton::OnUnderlineActivate();
}
void CXTPControlPopup::OnClick(BOOL bKeyboard, CPoint pt)
{
if (!GetEnabled())
return;
if (IsCustomizeMode())
{
ASSERT(m_pParent);
if (!m_pParent)
return;
CXTPCommandBars* pCommandBars = m_pParent->GetCommandBars();
ASSERT(pCommandBars);
if (!pCommandBars)
return;
pCommandBars->SetDragControl(this);
}
if (m_bPopup && (GetParent()->GetPosition() != xtpBarPopup))
m_pParent->SetTrackingMode(FALSE, FALSE);
else
{
if (!IsCustomizeMode() && (m_controlType == xtpControlSplitButtonPopup))
{
if (bKeyboard)
{
if (GetEnabled() != TRUE_SPLITDROPDOWN)
OnExecute();
else
m_pParent->SetPopuped(m_nIndex);
return;
}
CRect rcCommandRect = GetPaintManager()->GetSplitButtonCommandRect(this);
if ((m_pParent->GetType() == xtpBarTypePopup) && rcCommandRect.PtInRect(pt))
{
m_pParent->KillTimer(XTP_TID_HOVER);
return;
}
if ((m_pParent->GetType() != xtpBarTypePopup) && rcCommandRect.PtInRect(pt))
{
if (GetEnabled() != TRUE_SPLITDROPDOWN)
ClickToolBarButton(rcCommandRect);
return;
}
if (GetEnabled() == TRUE_SPLITCOMMAND)
return;
}
if (!(IsCustomizeMode() && m_pCommandBar && !m_pCommandBar->IsCustomizable()))
{
if (!m_pParent->SetPopuped(m_nIndex))
return;
}
}
if (IsCustomizeMode())
{
CustomizeStartDrag(pt);
}
}
void CXTPControlPopup::OnLButtonUp(CPoint point)
{
if (!m_pCommandBar)
{
CXTPControlButton::OnLButtonUp(point);
return;
}
if (GetEnabled() && GetType() == xtpControlSplitButtonPopup && m_pParent->GetType() == xtpBarTypePopup)
{
if (m_rcControl.right > point.x + GetPaintManager()->m_nSplitButtonPopupWidth && GetEnabled() != TRUE_SPLITDROPDOWN)
OnExecute();
}
}
void CXTPControlPopup::OnMouseMove(CPoint point)
{
if (!m_pCommandBar)
{
CXTPControlButton::OnMouseMove(point);
return;
}
if (GetEnabled() && GetType() == xtpControlSplitButtonPopup && m_bSelected)
{
CRect rcCommandRect = GetPaintManager()->GetSplitButtonCommandRect(this);
if (rcCommandRect.PtInRect(point) && m_bSelected != TRUE_SPLITCOMMAND)
{
m_bSelected = TRUE_SPLITCOMMAND;
RedrawParent(FALSE);
}
else if (!rcCommandRect.PtInRect(point) && m_bSelected != TRUE_SPLITDROPDOWN)
{
m_bSelected = TRUE_SPLITDROPDOWN;
RedrawParent(FALSE);
}
}
}
BOOL CXTPControlPopup::OnSetSelected(int bSelected)
{
if (!CXTPControlButton::OnSetSelected(bSelected))
return FALSE;
if (!m_pCommandBar)
return TRUE;
if (bSelected == 1 && m_pParent->GetSafeHwnd() && GetEnabled() && GetType() == xtpControlSplitButtonPopup)
{
CPoint point;
GetCursorPos(&point);
m_pParent->ScreenToClient(&point);
if (GetRect().PtInRect(point))
OnMouseMove(point);
}
if (m_controlType == xtpControlPopup || m_pParent->GetType() == xtpBarTypePopup)
{
if (GetEnabled() && bSelected && m_pParent->IsTrackingMode() == TRUE_POPUP && GetParent()->GetPosition() != xtpBarPopup)
{
m_pParent->SetPopuped(m_nIndex);
}
else if (!bSelected && m_bPopup && GetParent()->GetPosition() != xtpBarPopup)
{
m_pParent->SetPopuped(-1);
}
}
else
{
if (GetEnabled() && IsKeyboardSelected(bSelected) && m_pParent->IsTrackingMode() == TRUE_POPUP)
{
m_pParent->SetPopuped(m_nIndex);
}
}
return TRUE;
}
void CXTPControlPopup::UpdateShadow()
{
if (m_pCommandBar && m_pParent->GetPosition() != xtpBarPopup && IsPopupControlType(m_controlType))
{
if (m_pParent->GetPosition() == xtpBarFloating && m_pParent->GetType() == xtpBarTypePopup)
return;
CXTPPaintManager* pPaintManager = GetPaintManager();
CXTPPopupBar* pPopupBar = DYNAMIC_DOWNCAST(CXTPPopupBar, m_pCommandBar);
if (pPaintManager && pPopupBar && pPopupBar->m_bShowShadow && m_bShowShadow && pPaintManager->m_bShowShadow && !m_pParent->IsCustomizeMode())
{
CRect rc = GetRect();
GetParent()->ClientToScreen(&rc);
pPaintManager->GetShadowManager()->SetShadow(rc, m_pCommandBar);
}
}
}
BOOL CXTPControlPopup::OnSetPopup(BOOL bPopup)
{
if (!m_pCommandBar)
return FALSE;
if (GetType() == xtpControlSplitButtonPopup && GetEnabled() == TRUE_SPLITCOMMAND)
return FALSE;
if (m_pParent->GetSafeHwnd() == NULL)
return FALSE;
m_bPopup = bPopup;
if (bPopup)
{
RedrawParent(FALSE);
m_pParent->GetSite()->UpdateWindow();
m_pParent->UpdateWindow();
if (!m_pCommandBar->IsTrackingMode())
{
if (!m_pCommandBar->Popup(this, IsKeyboardSelected(GetSelected())))
return FALSE;
UpdateShadow();
}
}
else
{
m_pCommandBar->SetTrackingMode(FALSE);
RedrawParent();
}
return TRUE;
}
void CXTPControlPopup::ExpandCommandBar()
{
CXTPPopupBar* pPopupBar = DYNAMIC_DOWNCAST(CXTPPopupBar, m_pCommandBar);
if (m_bPopup && pPopupBar && m_controlType == xtpControlPopup)
{
pPopupBar->ExpandBar();
}
}
void CXTPControlPopup::OnMouseHover()
{
if (m_pCommandBar && GetEnabled() && (m_pParent->IsTrackingMode() == TRUE_POPUP || GetParent()->GetPosition() == xtpBarPopup))
GetParent()->SetPopuped(m_nIndex);
else CXTPControlButton::OnMouseHover();
}
BOOL CXTPControlPopup::OnLButtonDblClk(CPoint point)
{
CXTPPopupBar* pPopupBar = DYNAMIC_DOWNCAST(CXTPPopupBar, m_pCommandBar);
if (pPopupBar && (m_controlType == xtpControlPopup || m_controlType == xtpControlButtonPopup))
{
if (!m_bPopup)
m_pParent->OnLButtonDown(0, point);
if (m_pCommandBar != pPopupBar)
return FALSE;
if (m_bPopup && pPopupBar->GetDefaultItem(0, TRUE) != (UINT)-1)
{
CXTPControl* pControl = pPopupBar->GetControl(pPopupBar->GetDefaultItem(0, TRUE));
pControl->OnExecute();
return TRUE;
}
if (m_bPopup && pPopupBar->m_bCollapsed)
{
pPopupBar->ExpandBar();
return TRUE;
}
}
else
{
return CXTPControlButton::OnLButtonDblClk(point);
}
return FALSE;
}
void CXTPControlPopup::Copy(CXTPControl* pControl, BOOL bRecursive)
{
ASSERT(DYNAMIC_DOWNCAST(CXTPControlPopup, pControl));
CXTPControlButton::Copy(pControl, bRecursive);
if (bRecursive && ((CXTPControlPopup*)pControl)->m_pCommandBar)
{
CXTPCommandBar* pCommandBar = ((CXTPControlPopup*)pControl)->m_pCommandBar->Clone(bRecursive);
SetCommandBar(pCommandBar);
pCommandBar->InternalRelease();
}
else
{
SetCommandBar(((CXTPControlPopup*)pControl)->m_pCommandBar);
}
}
void CXTPControlPopup::SetCommandBar(CXTPCommandBar* pBar)
{
if (m_pCommandBar)
m_pCommandBar->InternalRelease();
m_pCommandBar = pBar;
if (m_pCommandBar)
m_pCommandBar->InternalAddRef();
}
void CXTPControlPopup::SetCommandBar(CMenu* pMenu)
{
if (!m_pCommandBar)
m_pCommandBar = CXTPPopupBar::CreatePopupBar(m_pParent ? m_pParent->GetCommandBars() : NULL);
m_pCommandBar->LoadMenu(pMenu);
}
BOOL CXTPControlPopup::IsContainPopup(CXTPControlPopup* pControlPopup)
{
if (!m_pCommandBar || !pControlPopup->GetCommandBar())
return FALSE;
if (m_pCommandBar == pControlPopup->GetCommandBar()) return TRUE;
for (int i = 0; i < m_pCommandBar->GetControlCount(); i++)
{
CXTPControlPopup* pControlChild = DYNAMIC_DOWNCAST(CXTPControlPopup, m_pCommandBar->GetControl(i));
if (pControlChild)
{
if (pControlPopup->IsContainPopup(pControlChild))
return TRUE;
if (pControlChild->IsContainPopup(pControlPopup))
return TRUE;
}
}
return FALSE;
}
BOOL CXTPControlPopup::Compare(CXTPControl* pOther)
{
if (!CXTPControlButton::Compare(pOther))
return FALSE;
CXTPControlPopup* pPopup = DYNAMIC_DOWNCAST(CXTPControlPopup, pOther);
if (!pPopup)
return FALSE;
if (m_pCommandBar != NULL && pPopup->m_pCommandBar != NULL)
{
if (!m_pCommandBar->GetControls()->Compare(pPopup->m_pCommandBar->GetControls()))
return FALSE;
}
return TRUE;
}
BOOL CXTPControlPopup::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& /*dropEffect*/)
{
while (pCommandBar != NULL)
{
if (pCommandBar == m_pCommandBar)
return FALSE;
pCommandBar = pCommandBar->GetParentCommandBar();
}
return TRUE;
}
void CXTPControlPopup::OnCustomizeDragOver(CXTPControl* pDataObject, CPoint /*point*/, DROPEFFECT& /*dropEffect*/)
{
if (m_pCommandBar && m_pCommandBar->IsCustomizable())
{
CXTPControlPopup* pControlPopup = DYNAMIC_DOWNCAST(CXTPControlPopup, pDataObject);
if (!(pControlPopup && pControlPopup->IsContainPopup(this)))
{
m_pParent->SetPopuped(m_nIndex);
}
else
{
m_pParent->SetPopuped(-1);
m_pParent->SetSelected(-1);
}
}
}
void CXTPControlPopup::AdjustExcludeRect(CRect& rc, BOOL bVertical)
{
GetPaintManager()->AdjustExcludeRect(rc, this, bVertical);
}