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++
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);
|
||
|
}
|
||
|
|
||
|
|