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.
919 lines
22 KiB
C++
919 lines
22 KiB
C++
2 years ago
|
// XTPControlExt.cpp : implementation file.
|
||
|
//
|
||
|
// 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 "Resource.h"
|
||
|
|
||
|
#include "Common/XTPIntel80Helpers.h"
|
||
|
#include "Common/XTPColorManager.h"
|
||
|
#include "Common/XTPPropExchange.h"
|
||
|
#include "Common/XTPMarkupRender.h"
|
||
|
#include "Common/XTPImageManager.h"
|
||
|
#include "Common/XTPSystemHelpers.h"
|
||
|
#include "Common/XTPHookManager.h"
|
||
|
#include "Common/XTPDrawHelpers.h"
|
||
|
|
||
|
#include "TabManager/XTPTabManager.h"
|
||
|
|
||
|
#include "XTPCommandBarsDefines.h"
|
||
|
#include "XTPControl.h"
|
||
|
#include "XTPControlButton.h"
|
||
|
#include "XTPControlExt.h"
|
||
|
#include "XTPControls.h"
|
||
|
#include "XTPCommandBar.h"
|
||
|
#include "XTPToolBar.h"
|
||
|
#include "XTPPopupBar.h"
|
||
|
#include "XTPControlPopup.h"
|
||
|
#include "XTPCommandBars.h"
|
||
|
#include "XTPTabClientWnd.h"
|
||
|
#include "XTPPaintManager.h"
|
||
|
#include "XTPRecentFileList.h"
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
UINT CXTPControlWindowList::m_nFistMDIChild = AFX_IDM_FIRST_MDICHILD;
|
||
|
UINT CXTPControlWindowList::m_nItemCount = 9;
|
||
|
BOOL CXTPControlWindowList::m_bShowRadioButtons = FALSE;
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlWindowList
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlWindowList, CXTPControlButton)
|
||
|
|
||
|
|
||
|
CString CXTPControlWindowList::ConstructCaption(const CString& lpszTitle, int nIndex)
|
||
|
{
|
||
|
CString strTemp;
|
||
|
|
||
|
// double up any '&' characters so they are not underlined
|
||
|
LPCTSTR lpszSrc = lpszTitle;
|
||
|
LPTSTR lpszDest = strTemp.GetBuffer(lpszTitle.GetLength() * 2);
|
||
|
|
||
|
while (*lpszSrc != 0)
|
||
|
{
|
||
|
if (*lpszSrc == '&')
|
||
|
*lpszDest++ = '&';
|
||
|
|
||
|
if (_istlead(*lpszSrc))
|
||
|
*lpszDest++ = *lpszSrc++;
|
||
|
*lpszDest++ = *lpszSrc++;
|
||
|
}
|
||
|
|
||
|
*lpszDest = 0;
|
||
|
strTemp.ReleaseBuffer();
|
||
|
|
||
|
CString strTitle;
|
||
|
|
||
|
if (nIndex == 0)
|
||
|
return strTemp;
|
||
|
|
||
|
if (nIndex < 10)
|
||
|
{
|
||
|
strTitle.Format(_T("&%i %s"), nIndex, (LPCTSTR)strTemp);
|
||
|
}
|
||
|
else if (nIndex == 10)
|
||
|
{
|
||
|
strTitle.Format(_T("1&0 %s"), (LPCTSTR)strTemp);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strTitle.Format(_T("%i %s"), nIndex, (LPCTSTR)strTemp);
|
||
|
}
|
||
|
|
||
|
return strTitle;
|
||
|
}
|
||
|
|
||
|
void CXTPControlWindowList::OnCalcDynamicSize(DWORD /*dwMode*/)
|
||
|
{
|
||
|
ASSERT(m_pControls->GetAt(m_nIndex) == this);
|
||
|
|
||
|
while (m_nIndex + 1 < m_pControls->GetCount())
|
||
|
{
|
||
|
CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
|
||
|
if (pControl->GetID() >= (int)m_nFistMDIChild)
|
||
|
{
|
||
|
m_pControls->Remove(pControl);
|
||
|
}
|
||
|
else break;
|
||
|
}
|
||
|
|
||
|
CMDIFrameWnd* pFrame = DYNAMIC_DOWNCAST(CMDIFrameWnd, m_pParent->GetSite());
|
||
|
HWND hWndClient = pFrame ? pFrame->m_hWndMDIClient : NULL;
|
||
|
|
||
|
if (m_pParent->IsCustomizeMode() || hWndClient == NULL)
|
||
|
{
|
||
|
m_dwHideFlags = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_dwHideFlags |= xtpHideGeneric;
|
||
|
|
||
|
int nIndex = m_nIndex + 1;
|
||
|
|
||
|
CString strTitle;
|
||
|
HWND hWndActive = (HWND)::SendMessage(hWndClient, WM_MDIGETACTIVE, 0, 0);
|
||
|
|
||
|
if (hWndActive)
|
||
|
{
|
||
|
int nID = GetDlgCtrlID(hWndActive);
|
||
|
|
||
|
if (nID < 0x802F && nID >= 0x8000)
|
||
|
m_nFistMDIChild = 0x8000;
|
||
|
|
||
|
if (nID < 0x2F && nID >= 1)
|
||
|
m_nFistMDIChild = 1;
|
||
|
}
|
||
|
|
||
|
int nID = m_nFistMDIChild;
|
||
|
|
||
|
HWND hWndChild = ::GetDlgItem(hWndClient, nID);
|
||
|
while (hWndChild)
|
||
|
{
|
||
|
if (::IsWindowVisible(hWndChild))
|
||
|
{
|
||
|
CXTPDrawHelpers::GetWindowCaption(hWndChild, strTitle);
|
||
|
|
||
|
CXTPControl* pControl = m_pControls->Add(m_bShowRadioButtons ? xtpControlRadioButton : xtpControlButton,
|
||
|
nID, _T(""), nIndex, TRUE);
|
||
|
|
||
|
pControl->SetCaption(ConstructCaption(strTitle, nIndex - m_nIndex));
|
||
|
pControl->SetBeginGroup(nIndex == m_nIndex + 1);
|
||
|
pControl->SetChecked(hWndActive == hWndChild);
|
||
|
pControl->SetFlags(xtpFlagManualUpdate);
|
||
|
pControl->SetHelpId(AFX_IDS_MDICHILD);
|
||
|
|
||
|
if ((GetFlags() & xtpFlagWrapRow) && nIndex == m_nIndex + 1)
|
||
|
pControl->SetFlags(pControl->GetFlags() | xtpFlagWrapRow);
|
||
|
|
||
|
CString strPrompt;
|
||
|
VERIFY(strPrompt.LoadString(AFX_IDS_MDICHILD));
|
||
|
pControl->SetPrompt(strPrompt);
|
||
|
|
||
|
nIndex++;
|
||
|
|
||
|
if (nIndex - m_nIndex > (int)m_nItemCount)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
hWndChild = ::GetDlgItem(hWndClient, ++nID);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlWindowList::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
|
||
|
{
|
||
|
if (pCommandBar->GetType() != xtpBarTypePopup)
|
||
|
{
|
||
|
dropEffect = DROPEFFECT_NONE;
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlToolbars
|
||
|
|
||
|
void CXTPControlToolbars::CXTPControlToolbar::OnExecute()
|
||
|
{
|
||
|
CXTPCommandBars* pCommandBars = GetParent()->GetCommandBars();
|
||
|
pCommandBars->ClosePopups();
|
||
|
|
||
|
if (pCommandBars) pCommandBars->ToggleVisible((int)GetTag());
|
||
|
}
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlToolbars, CXTPControlButton)
|
||
|
|
||
|
CXTPControlToolbars::CXTPControlToolbars()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CXTPControlToolbars::CreateToolbarMenu(CXTPCommandBar* pPopupBar, int nInsert, int nID, BOOL bAddCustomizeButton, BOOL bBeginGroup)
|
||
|
{
|
||
|
CXTPCommandBars* pCommandBars = pPopupBar->GetCommandBars();
|
||
|
if (!pCommandBars)
|
||
|
return;
|
||
|
|
||
|
int nIndex = 0;
|
||
|
|
||
|
int nCount = pCommandBars->GetCount();
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
CXTPToolBar* pBar = pCommandBars->GetAt(i);
|
||
|
|
||
|
if (pBar->IsContextMenuPresent() && pBar->IsCloseable())
|
||
|
{
|
||
|
CXTPControl* pButton = pPopupBar->GetControls()->Add(new CXTPControlToolbar(), nID, _T("CXTPControlToolbar"), nInsert, TRUE);
|
||
|
pButton->SetTag(nIndex);
|
||
|
pButton->SetBeginGroup(bBeginGroup);
|
||
|
|
||
|
pButton->SetCaption(CXTPControlWindowList::ConstructCaption(pBar->GetTitle(), 0));
|
||
|
pButton->SetFlags(xtpFlagManualUpdate);
|
||
|
pButton->SetChecked(pBar->IsVisible());
|
||
|
nInsert++;
|
||
|
bBeginGroup = FALSE;
|
||
|
}
|
||
|
nIndex++;
|
||
|
}
|
||
|
|
||
|
if (bAddCustomizeButton && pCommandBars->m_bCustomizeAvail)
|
||
|
{
|
||
|
CXTPControl* pControlCustomize = pPopupBar->GetControls()->Add(xtpControlButton, XTP_ID_CUSTOMIZE);
|
||
|
pControlCustomize->SetBeginGroup(TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPControlToolbars::OnCalcDynamicSize(DWORD /*dwMode*/)
|
||
|
{
|
||
|
while (m_nIndex + 1 < m_pControls->GetCount())
|
||
|
{
|
||
|
CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
|
||
|
if (pControl->GetParameter() == _T("CXTPControlToolbar"))
|
||
|
{
|
||
|
m_pControls->Remove(pControl);
|
||
|
}
|
||
|
else break;
|
||
|
}
|
||
|
|
||
|
if (m_pParent->IsCustomizeMode())
|
||
|
{
|
||
|
m_dwHideFlags = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_dwHideFlags |= xtpHideGeneric;
|
||
|
|
||
|
CreateToolbarMenu(m_pParent, m_nIndex + 1, GetID(), FALSE, GetBeginGroup());
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlToolbars::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
|
||
|
{
|
||
|
if (pCommandBar->GetType() != xtpBarTypePopup)
|
||
|
{
|
||
|
dropEffect = DROPEFFECT_NONE;
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlOleItems
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlOleItems, CXTPControlButton)
|
||
|
|
||
|
|
||
|
void CXTPControlOleItems::OnCalcDynamicSize(DWORD /*dwMode*/)
|
||
|
{
|
||
|
|
||
|
ASSERT(m_pControls->GetAt(m_nIndex) == this);
|
||
|
|
||
|
if (m_nIndex + 1 < m_pControls->GetCount())
|
||
|
{
|
||
|
CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
|
||
|
if (pControl->GetParameter() == _T("OLEMENUPOPUP"))
|
||
|
{
|
||
|
m_pControls->Remove(pControl);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_pParent->IsCustomizeMode())
|
||
|
{
|
||
|
m_dwHideFlags = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_dwHideFlags |= xtpHideGeneric;
|
||
|
|
||
|
|
||
|
CFrameWnd* pActiveFrame = m_pParent->GetFrameSite();
|
||
|
if (!pActiveFrame)
|
||
|
return;
|
||
|
|
||
|
CFrameWnd* pFrame = pActiveFrame->GetActiveFrame();
|
||
|
|
||
|
if (pFrame == NULL || pFrame->GetActiveView() == NULL)
|
||
|
return;
|
||
|
|
||
|
CView* pView = pFrame->GetActiveView();
|
||
|
|
||
|
CDocument* pDocument = pView->GetDocument();
|
||
|
if (pDocument == NULL || DYNAMIC_DOWNCAST(COleDocument, pDocument) == NULL)
|
||
|
return;
|
||
|
|
||
|
// check for single selection
|
||
|
COleClientItem* pItem = ((COleDocument*)pDocument)->GetPrimarySelectedItem(pView);
|
||
|
if (pItem == NULL || pItem->GetType() == OT_STATIC)
|
||
|
{
|
||
|
// no selection, or is 'static' item
|
||
|
return;
|
||
|
}
|
||
|
int nConvertID = 0;
|
||
|
|
||
|
|
||
|
CMenu mnuOlePopup;
|
||
|
mnuOlePopup.CreatePopupMenu();
|
||
|
// update the menu
|
||
|
AfxOleSetEditMenu(pItem, &mnuOlePopup, 0,
|
||
|
ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, nConvertID);
|
||
|
|
||
|
if (mnuOlePopup.GetMenuItemCount() != 1)
|
||
|
return;
|
||
|
|
||
|
CMenu* pMenu = mnuOlePopup.GetSubMenu(0);
|
||
|
if (pMenu == NULL)
|
||
|
return;
|
||
|
|
||
|
CXTPPopupBar* pBar = CXTPPopupBar::CreatePopupBar(m_pParent->GetCommandBars());
|
||
|
pBar->LoadMenu(pMenu);
|
||
|
|
||
|
CXTPControlPopup* pPopup = (CXTPControlPopup*)m_pControls->Add(xtpControlPopup, 0, _T("OLEMENUPOPUP"), m_nIndex + 1, TRUE);
|
||
|
|
||
|
pPopup->SetCommandBar(pBar);
|
||
|
pBar->InternalRelease();
|
||
|
|
||
|
CString strTitle;
|
||
|
mnuOlePopup.GetMenuString(0, strTitle, MF_BYPOSITION);
|
||
|
pPopup->SetCaption(strTitle);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlOleItems::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
|
||
|
{
|
||
|
if (pCommandBar->GetType() != xtpBarTypePopup)
|
||
|
{
|
||
|
dropEffect = DROPEFFECT_NONE;
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlRecentFileList
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlRecentFileList, CXTPControlButton)
|
||
|
|
||
|
|
||
|
CRecentFileList* CXTPControlRecentFileList::GetRecentFileList()
|
||
|
{
|
||
|
USES_PROTECTED_ACCESS(CXTPControlRecentFileList, CWinApp, CRecentFileList*, m_pRecentFileList)
|
||
|
|
||
|
return PROTECTED_ACCESS(CWinApp, AfxGetApp(), m_pRecentFileList);
|
||
|
}
|
||
|
|
||
|
int CXTPControlRecentFileList::GetFirstMruID()
|
||
|
{
|
||
|
return ID_FILE_MRU_FILE1;
|
||
|
}
|
||
|
|
||
|
void CXTPControlRecentFileList::OnCalcDynamicSize(DWORD /*dwMode*/)
|
||
|
{
|
||
|
CRecentFileList* pRecentFileList = GetRecentFileList();
|
||
|
|
||
|
if (!pRecentFileList)
|
||
|
return;
|
||
|
|
||
|
ASSERT(pRecentFileList->m_arrNames != NULL);
|
||
|
if (!pRecentFileList->m_arrNames)
|
||
|
return;
|
||
|
|
||
|
while (m_nIndex + 1 < m_pControls->GetCount())
|
||
|
{
|
||
|
CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
|
||
|
if (pControl->GetID() >= GetFirstMruID() && pControl->GetID() <= GetFirstMruID() + pRecentFileList->m_nSize)
|
||
|
{
|
||
|
m_pControls->Remove(pControl);
|
||
|
}
|
||
|
else break;
|
||
|
}
|
||
|
|
||
|
if (m_pParent->IsCustomizeMode())
|
||
|
{
|
||
|
m_dwHideFlags = 0;
|
||
|
SetEnabled(TRUE);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pRecentFileList->m_arrNames[0].IsEmpty())
|
||
|
{
|
||
|
m_dwHideFlags = 0;
|
||
|
SetEnabled(FALSE);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
m_dwHideFlags |= xtpHideGeneric;
|
||
|
|
||
|
TCHAR szCurDir[_MAX_PATH + 1];
|
||
|
GetCurrentDirectory(_MAX_PATH, szCurDir);
|
||
|
int nCurDir = lstrlen(szCurDir);
|
||
|
|
||
|
szCurDir[nCurDir] = '\\';
|
||
|
szCurDir[++nCurDir] = '\0';
|
||
|
|
||
|
BOOL bExtendedRecentFileList = pRecentFileList->m_strOriginal == _T("PinableRecentFileList");
|
||
|
|
||
|
CString strName;
|
||
|
CString strTemp;
|
||
|
for (int iMRU = 0; iMRU < pRecentFileList->m_nSize; iMRU++)
|
||
|
{
|
||
|
if (!pRecentFileList->GetDisplayName(strName, iMRU, szCurDir, nCurDir))
|
||
|
break;
|
||
|
|
||
|
CXTPRecentFileListItem* pItem = bExtendedRecentFileList ? ((CXTPRecentFileList*)pRecentFileList)->GetItem(iMRU) : NULL;
|
||
|
if (pItem)
|
||
|
{
|
||
|
if (!pItem->GetCaption().IsEmpty())
|
||
|
strName = pItem->GetCaption();
|
||
|
}
|
||
|
|
||
|
int nId = iMRU + GetFirstMruID();
|
||
|
|
||
|
CXTPControl* pControl = m_pControls->Add(xtpControlButton, nId, _T(""), m_nIndex + iMRU + 1 , TRUE);
|
||
|
|
||
|
pControl->SetCaption(CXTPControlWindowList::ConstructCaption(strName, iMRU + 1));
|
||
|
pControl->SetFlags(xtpFlagManualUpdate);
|
||
|
pControl->SetBeginGroup(iMRU == 0 && m_nIndex != 0);
|
||
|
pControl->SetParameter(pRecentFileList->m_arrNames[iMRU]);
|
||
|
|
||
|
if (pItem)
|
||
|
{
|
||
|
pControl->SetIconId(pItem->GetIconId());
|
||
|
}
|
||
|
|
||
|
if ((GetFlags() & xtpFlagWrapRow) && iMRU == 0)
|
||
|
pControl->SetFlags(pControl->GetFlags() | xtpFlagWrapRow);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL CXTPControlRecentFileList::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
|
||
|
{
|
||
|
if (pCommandBar->GetType() != xtpBarTypePopup)
|
||
|
{
|
||
|
dropEffect = DROPEFFECT_NONE;
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlSelector
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlSelector, CXTPControl)
|
||
|
|
||
|
CXTPControlSelector::CXTPControlSelector()
|
||
|
{
|
||
|
m_bLockUpdate = FALSE;
|
||
|
|
||
|
m_szItemsCount = CSize(5, 4);
|
||
|
m_szItemsMax = CSize(12, 12);
|
||
|
m_szItem = CSize(28, 28);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPControlSelector::OnDrawItem(CDC* /*pDC*/, CRect /*rcItem*/, COLORREF /*clrText*/)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPControlSelector::Draw(CDC* pDC)
|
||
|
{
|
||
|
CXTPPaintManager* pPaintManager = GetPaintManager();
|
||
|
|
||
|
CRect rcControl = GetRect();
|
||
|
|
||
|
for (int x = 0; x < m_szItemsVisible.cx; x++)
|
||
|
for (int y = 0; y < m_szItemsVisible.cy; y++)
|
||
|
{
|
||
|
CRect rcItem(rcControl.left + x * m_szItem.cx, rcControl.top + y * m_szItem.cy, rcControl.left + (x + 1)* m_szItem.cx, rcControl.top + (y + 1) * m_szItem.cy);
|
||
|
rcItem.DeflateRect(1, 1, 1, 1);
|
||
|
|
||
|
COLORREF clrText = pPaintManager->GetXtremeColor(XPCOLOR_TOOLBAR_TEXT);
|
||
|
|
||
|
if (x < m_szItemsActive.cx && y < m_szItemsActive.cy)
|
||
|
{
|
||
|
pDC->FillSolidRect(rcItem, GetXtremeColor(COLOR_HIGHLIGHT));
|
||
|
clrText = GetXtremeColor(COLOR_HIGHLIGHTTEXT);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDC->FillSolidRect(rcItem, GetXtremeColor(COLOR_WINDOW));
|
||
|
}
|
||
|
|
||
|
pDC->Draw3dRect(rcItem, pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_BORDER), pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_BORDER));
|
||
|
|
||
|
OnDrawItem(pDC, rcItem, clrText);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
CSize CXTPControlSelector::GetSize(CDC* /*pDC*/)
|
||
|
{
|
||
|
return CSize (m_szItem.cx * m_szItemsVisible.cx, m_szItem.cy * m_szItemsVisible.cy);
|
||
|
}
|
||
|
|
||
|
void CXTPControlSelector::OnLButtonUp(CPoint /*point*/)
|
||
|
{
|
||
|
if (m_szItemsActive != CSize(0))
|
||
|
{
|
||
|
m_szResult = m_szItemsActive;
|
||
|
OnExecute();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlSelector::OnSetSelected(int bSelected)
|
||
|
{
|
||
|
if (!bSelected)
|
||
|
{
|
||
|
CPoint point;
|
||
|
GetCursorPos(&point);
|
||
|
GetParent()->ScreenToClient(&point);
|
||
|
|
||
|
CRect rcControl = GetRect();
|
||
|
CSize szItemsVisible = m_szItemsVisible;
|
||
|
|
||
|
if (GetKeyState(VK_LBUTTON) < 0)
|
||
|
{
|
||
|
if (point.x >= rcControl.right)
|
||
|
{
|
||
|
szItemsVisible.cx = min(m_szItemsMax.cx, (point.x - rcControl.left) / m_szItem.cx + 1);
|
||
|
}
|
||
|
if (point.y >= rcControl.bottom)
|
||
|
{
|
||
|
szItemsVisible.cy = min(m_szItemsMax.cy, (point.y - rcControl.top) / m_szItem.cy + 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (szItemsVisible != m_szItemsVisible)
|
||
|
{
|
||
|
m_szItemsVisible = szItemsVisible;
|
||
|
SetItemsActive(m_szItemsActive, TRUE);
|
||
|
|
||
|
m_bLockUpdate = TRUE;
|
||
|
GetParent()->OnRecalcLayout();
|
||
|
m_bLockUpdate = FALSE;
|
||
|
OnMouseMove(point);
|
||
|
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetItemsActive(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return CXTPControl::OnSetSelected(bSelected);
|
||
|
}
|
||
|
|
||
|
void CXTPControlSelector::OnCalcDynamicSize(DWORD dwMode)
|
||
|
{
|
||
|
CXTPControl::OnCalcDynamicSize(dwMode);
|
||
|
|
||
|
if (!m_bLockUpdate)
|
||
|
{
|
||
|
m_szItemsActive = CSize(0);
|
||
|
m_szItemsVisible = m_szItemsCount;
|
||
|
}
|
||
|
SetItemsActive(m_szItemsActive, TRUE);
|
||
|
}
|
||
|
|
||
|
void CXTPControlSelector::SetItemsActive(CSize szActive, BOOL bNotify)
|
||
|
{
|
||
|
if (szActive != m_szItemsActive || bNotify)
|
||
|
{
|
||
|
m_szItemsActive = szActive;
|
||
|
RedrawParent();
|
||
|
|
||
|
NotifySite(XTP_SLN_SELCHANGE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlSelector::OnMouseMove(CPoint point)
|
||
|
{
|
||
|
CSize szActive(0);
|
||
|
|
||
|
CRect rcControl = GetRect();
|
||
|
|
||
|
for (int x = 0; x < m_szItemsVisible.cx; x++)
|
||
|
{
|
||
|
if (point.x > rcControl.left + x * m_szItem.cx)
|
||
|
szActive.cx = x + 1;
|
||
|
}
|
||
|
for (int y = 0; y < m_szItemsVisible.cy; y++)
|
||
|
{
|
||
|
if (point.y > rcControl.top + y * m_szItem.cy)
|
||
|
szActive.cy = y + 1;
|
||
|
}
|
||
|
|
||
|
SetItemsActive(szActive);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPControlSelector::Copy(CXTPControl* pControl, BOOL bRecursive)
|
||
|
{
|
||
|
ASSERT_KINDOF(CXTPControlSelector, pControl);
|
||
|
|
||
|
CXTPControl::Copy(pControl, bRecursive);
|
||
|
|
||
|
m_szItemsCount = ((CXTPControlSelector*)pControl)->m_szItemsCount;
|
||
|
m_szItemsMax = ((CXTPControlSelector*)pControl)->m_szItemsMax;
|
||
|
m_szItem = ((CXTPControlSelector*)pControl)->m_szItem;
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPControlSelector::DoPropExchange(CXTPPropExchange* pPX)
|
||
|
{
|
||
|
CXTPControl::DoPropExchange(pPX);
|
||
|
|
||
|
PX_Size(pPX, _T("ItemsCount"), m_szItemsCount, CSize(0, 0));
|
||
|
PX_Size(pPX, _T("ItemsMax"), m_szItemsMax, CSize(0, 0));
|
||
|
PX_Size(pPX, _T("ItemSize"), m_szItem, CSize(0, 0));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlWorkspaceActions
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlWorkspaceActions, CXTPControlButton)
|
||
|
|
||
|
void CXTPControlWorkspaceActions::AddCommand(CXTPTabClientWnd* pClient, UINT nID, int& nIndex)
|
||
|
{
|
||
|
if (pClient->IsWorkspaceCommandEnabled(nID))
|
||
|
{
|
||
|
m_pControls->Add(xtpControlButton, nID, _T(""), nIndex++, TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlWorkspaceActions::OnCalcDynamicSize(DWORD /*dwMode*/)
|
||
|
{
|
||
|
ASSERT(m_pControls->GetAt(m_nIndex) == this);
|
||
|
|
||
|
if (!m_pParent)
|
||
|
return;
|
||
|
|
||
|
while (m_nIndex + 1 < m_pControls->GetCount())
|
||
|
{
|
||
|
CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
|
||
|
if (pControl->GetID() >= XTP_ID_WORKSPACE_MOVEPREVIOUS && pControl->GetID() <= XTP_ID_WORKSPACE_NEWVERTICAL)
|
||
|
{
|
||
|
m_pControls->Remove(pControl);
|
||
|
}
|
||
|
else break;
|
||
|
}
|
||
|
|
||
|
CMDIFrameWnd* pFrame = DYNAMIC_DOWNCAST(CMDIFrameWnd, m_pParent->GetSite());
|
||
|
HWND hWndClient = pFrame ? pFrame->m_hWndMDIClient : NULL;
|
||
|
|
||
|
CXTPTabClientWnd* pClient = DYNAMIC_DOWNCAST(CXTPTabClientWnd, CWnd::FromHandlePermanent(hWndClient));
|
||
|
|
||
|
if (pClient == NULL)
|
||
|
return;
|
||
|
|
||
|
m_dwHideFlags |= xtpHideGeneric;
|
||
|
|
||
|
int nIndex = m_nIndex + 1;
|
||
|
|
||
|
AddCommand(pClient, XTP_ID_WORKSPACE_NEWHORIZONTAL, nIndex);
|
||
|
AddCommand(pClient, XTP_ID_WORKSPACE_NEWVERTICAL, nIndex);
|
||
|
AddCommand(pClient, XTP_ID_WORKSPACE_MOVEPREVIOUS, nIndex);
|
||
|
AddCommand(pClient, XTP_ID_WORKSPACE_MOVENEXT, nIndex);
|
||
|
|
||
|
if (nIndex != m_nIndex + 1)
|
||
|
m_pControls->GetAt(m_nIndex + 1)->SetBeginGroup(GetBeginGroup());
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlLabel, CXTPControl)
|
||
|
|
||
|
void CXTPControlLabel::OnClick(BOOL bKeyboard, CPoint pt)
|
||
|
{
|
||
|
if (!bKeyboard && IsCustomizeMode() && IsCustomizeMovable())
|
||
|
{
|
||
|
CustomizeStartDrag(pt);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlCheckBox
|
||
|
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlCheckBox, CXTPControlButton)
|
||
|
|
||
|
CXTPControlCheckBox::CXTPControlCheckBox()
|
||
|
{
|
||
|
m_controlType = xtpControlCheckBox;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlCheckBox::IsFocused() const
|
||
|
{
|
||
|
return GetSelected();
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlCheckBox::OnHookKeyDown(UINT nChar, LPARAM lParam)
|
||
|
{
|
||
|
if (nChar == VK_SPACE)
|
||
|
{
|
||
|
OnClick(TRUE);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return CXTPControlButton::OnHookKeyDown(nChar, lParam);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlRadioButton
|
||
|
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlRadioButton, CXTPControlButton)
|
||
|
|
||
|
CXTPControlRadioButton::CXTPControlRadioButton()
|
||
|
{
|
||
|
m_controlType = xtpControlRadioButton;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlRadioButton::IsFocused() const
|
||
|
{
|
||
|
return GetSelected();
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlRadioButton::OnHookKeyDown(UINT nChar, LPARAM lParam)
|
||
|
{
|
||
|
if (nChar == VK_SPACE)
|
||
|
{
|
||
|
OnClick(TRUE);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return CXTPControlButton::OnHookKeyDown(nChar, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlMarkupLabel
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlMarkupLabel, CXTPControlLabel)
|
||
|
|
||
|
CXTPControlMarkupLabel::CXTPControlMarkupLabel()
|
||
|
{
|
||
|
m_pMarkupUIElement = NULL;
|
||
|
}
|
||
|
|
||
|
CXTPControlMarkupLabel::~CXTPControlMarkupLabel()
|
||
|
{
|
||
|
XTPMarkupReleaseElement(m_pMarkupUIElement);
|
||
|
}
|
||
|
|
||
|
void CXTPControlMarkupLabel::OnCaptionChanged()
|
||
|
{
|
||
|
XTPMarkupReleaseElement(m_pMarkupUIElement);
|
||
|
|
||
|
CXTPMarkupContext* pContext = XTPMarkupCreateContext(0);
|
||
|
|
||
|
m_pMarkupUIElement = XTPMarkupParseText(pContext, m_strCaption);
|
||
|
|
||
|
XTPMarkupReleaseContext(pContext);
|
||
|
}
|
||
|
|
||
|
|
||
|
CSize CXTPControlMarkupLabel::GetSize(CDC* pDC)
|
||
|
{
|
||
|
if (!m_pMarkupUIElement)
|
||
|
{
|
||
|
return CXTPControlLabel::GetSize(pDC);
|
||
|
}
|
||
|
|
||
|
CFont* pFont = GetPaintManager()->GetRegularFont();
|
||
|
XTPMarkupSetDefaultFont(XTPMarkupElementContext(m_pMarkupUIElement), (HFONT)pFont->GetSafeHandle(), COLORREF_NULL);
|
||
|
|
||
|
return XTPMarkupMeasureElement(m_pMarkupUIElement, INT_MAX, INT_MAX);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPControlMarkupLabel::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!m_pMarkupUIElement)
|
||
|
{
|
||
|
CXTPControlLabel::Draw(pDC);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CFont* pFont = GetPaintManager()->GetRegularFont();
|
||
|
COLORREF clrText = GetPaintManager()->GetRectangleTextColor(FALSE, FALSE, GetEnabled(), FALSE, FALSE, GetParent()->GetType(), GetParent()->GetPosition());
|
||
|
|
||
|
XTPMarkupSetDefaultFont(XTPMarkupElementContext(m_pMarkupUIElement), (HFONT)pFont->GetSafeHandle(), clrText);
|
||
|
XTPMarkupRenderElement(m_pMarkupUIElement, pDC->GetSafeHdc(), GetRect());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlBitmap
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlBitmap, CXTPControlLabel)
|
||
|
|
||
|
CXTPControlBitmap::CXTPControlBitmap()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
CSize CXTPControlBitmap::GetSize(CDC* /*pDC*/)
|
||
|
{
|
||
|
CXTPImageManagerIcon* pIcon = GetImageManager()->GetImage(m_nId, ICON_BIG);
|
||
|
if (!pIcon)
|
||
|
return CSize(0, 0);
|
||
|
|
||
|
return pIcon->GetExtent();
|
||
|
}
|
||
|
|
||
|
void CXTPControlBitmap::Draw(CDC* pDC)
|
||
|
{
|
||
|
CXTPImageManagerIcon* pIcon = GetImageManager()->GetImage(m_nId, ICON_BIG);
|
||
|
if (pIcon)
|
||
|
{
|
||
|
pIcon->Draw(pDC, GetRect().TopLeft());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPControlHyperlink
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlHyperlink, CXTPControl)
|
||
|
|
||
|
CXTPControlHyperlink::CXTPControlHyperlink()
|
||
|
{
|
||
|
m_hCursor = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649));
|
||
|
}
|
||
|
|
||
|
CSize CXTPControlHyperlink::GetSize(CDC* pDC)
|
||
|
{
|
||
|
CFont* pFont = GetPaintManager()->GetRegularFont();
|
||
|
CXTPFontDC font(pDC, pFont);
|
||
|
|
||
|
CSize sz = pDC->GetTextExtent(GetCaption());
|
||
|
|
||
|
return sz;
|
||
|
}
|
||
|
|
||
|
void CXTPControlHyperlink::Draw(CDC* pDC)
|
||
|
{
|
||
|
CFont* pFont = GetPaintManager()->GetRegularFont();
|
||
|
CXTPFontDC font(pDC, pFont);
|
||
|
|
||
|
pDC->SetTextColor(!GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : GetSelected() ? RGB(255, 0, 0) : RGB(0, 0, 255));
|
||
|
|
||
|
CXTPPaintManager::DrawTextApi(pDC, GetCaption(), GetRect(), DT_SINGLELINE | DT_NOPREFIX, HasDwmCompositedRect());
|
||
|
}
|
||
|
|
||
|
void CXTPControlHyperlink::OnClick(BOOL bKeyboard, CPoint pt)
|
||
|
{
|
||
|
if (!bKeyboard && IsCustomizeMode() && IsCustomizeMovable())
|
||
|
{
|
||
|
CustomizeStartDrag(pt);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
OnExecute();
|
||
|
}
|
||
|
|
||
|
void CXTPControlHyperlink::OnExecute()
|
||
|
{
|
||
|
::ShellExecute(NULL, _T("open"), m_strTooltipText, NULL, NULL, SW_SHOW);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPControlHyperlink::OnMouseMove(CPoint /*point*/)
|
||
|
{
|
||
|
SetCursor(m_hCursor);
|
||
|
}
|
||
|
|
||
|
|
||
|
|