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.
475 lines
13 KiB
C++
475 lines
13 KiB
C++
// XTPCustomizeToolbarsPage.cpp : implementation of the CXTPCustomizeToolbarsPage 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 "Resource.h"
|
|
|
|
#include "Common/XTPResourceManager.h"
|
|
#include "Common/XTPWinThemeWrapper.h"
|
|
#include "Common/XTPSystemHelpers.h"
|
|
#include "Common/XTPHookManager.h"
|
|
|
|
#include "Controls/Resize/XTPResizeRect.h"
|
|
#include "Controls/Resize/XTPResizePoint.h"
|
|
#include "Controls/Resize/XTPResize.h"
|
|
#include "Controls/Dialog/XTPPropertyPage.h"
|
|
#include "Controls/Dialog/XTPPropertySheet.h"
|
|
|
|
#include "XTPCommandBarsDefines.h"
|
|
#include "XTPCustomizeToolbarsPage.h"
|
|
#include "XTPCustomizeSheet.h"
|
|
#include "XTPCommandBar.h"
|
|
#include "XTPToolBar.h"
|
|
#include "XTPCommandBars.h"
|
|
#include "XTPCustomizeTools.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPCustomizeToolbarsPageCheckListBox
|
|
CXTPCustomizeToolbarsPageCheckListBox::CXTPCustomizeToolbarsPageCheckListBox()
|
|
{
|
|
m_themeHelper = new CXTPWinThemeWrapper();
|
|
m_themeHelper->OpenThemeData(NULL, L"BUTTON");
|
|
|
|
SIZE size;
|
|
if (m_themeHelper->IsAppThemeReady() && SUCCEEDED(m_themeHelper->GetThemePartSize(NULL, BP_CHECKBOX, 0, NULL, TS_TRUE, &size)))
|
|
{
|
|
m_sizeCheck = size;
|
|
}
|
|
else
|
|
{
|
|
m_sizeCheck = CSize(13, 13);
|
|
m_themeHelper->CloseThemeData();
|
|
}
|
|
}
|
|
|
|
CXTPCustomizeToolbarsPageCheckListBox::~CXTPCustomizeToolbarsPageCheckListBox()
|
|
{
|
|
SAFE_DELETE(m_themeHelper);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPCustomizeToolbarsPageCheckListBox, CCheckListBox)
|
|
ON_MESSAGE(WM_SETFONT, OnSetFont)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
void CXTPCustomizeToolbarsPageCheckListBox::PreSubclassWindow()
|
|
{
|
|
CCheckListBox::PreSubclassWindow();
|
|
|
|
if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
|
|
== (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
|
|
{
|
|
SetItemHeight(0, max(m_sizeCheck.cy + 3, CalcMinimumItemHeight()));
|
|
}
|
|
}
|
|
|
|
LRESULT CXTPCustomizeToolbarsPageCheckListBox::OnSetFont(WPARAM, LPARAM)
|
|
{
|
|
Default();
|
|
|
|
if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
|
|
== (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS))
|
|
{
|
|
SetItemHeight(0, max(m_sizeCheck.cy + 3, CalcMinimumItemHeight()));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPageCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
// You must override DrawItem and MeasureItem for LBS_OWNERDRAWVARIABLE
|
|
ASSERT((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
|
|
(LBS_OWNERDRAWFIXED | LBS_HASSTRINGS));
|
|
|
|
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
|
|
|
|
if (((LONG)(lpDrawItemStruct->itemID) >= 0) &&
|
|
(lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
|
|
{
|
|
int cyItem = GetItemHeight(lpDrawItemStruct->itemID);
|
|
BOOL fDisabled = !IsWindowEnabled() || !IsEnabled(lpDrawItemStruct->itemID);
|
|
|
|
COLORREF newTextColor = fDisabled ?
|
|
RGB(0x80, 0x80, 0x80) : GetSysColor(COLOR_WINDOWTEXT); // light gray
|
|
COLORREF oldTextColor = pDC->SetTextColor(newTextColor);
|
|
|
|
COLORREF newBkColor = GetSysColor(COLOR_WINDOW);
|
|
COLORREF oldBkColor = pDC->SetBkColor(newBkColor);
|
|
|
|
if (!fDisabled && ((lpDrawItemStruct->itemState & ODS_SELECTED) != 0))
|
|
{
|
|
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
|
|
pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
|
|
}
|
|
|
|
if (m_cyText == 0)
|
|
VERIFY(cyItem >= CalcMinimumItemHeight());
|
|
|
|
CString strText;
|
|
GetText(lpDrawItemStruct->itemID, strText);
|
|
|
|
pDC->ExtTextOut(lpDrawItemStruct->rcItem.left + 2,
|
|
lpDrawItemStruct->rcItem.top + max(0, (cyItem - m_cyText) / 2),
|
|
ETO_OPAQUE, &(lpDrawItemStruct->rcItem), strText, (int)strText.GetLength(), NULL);
|
|
|
|
pDC->SetTextColor(oldTextColor);
|
|
pDC->SetBkColor(oldBkColor);
|
|
}
|
|
|
|
if ((lpDrawItemStruct->itemAction & ODA_FOCUS) != 0)
|
|
pDC->DrawFocusRect(&(lpDrawItemStruct->rcItem));
|
|
}
|
|
|
|
|
|
void CXTPCustomizeToolbarsPageCheckListBox::PreDrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
DRAWITEMSTRUCT drawItem;
|
|
memcpy(&drawItem, lpDrawItemStruct, sizeof(DRAWITEMSTRUCT));
|
|
|
|
if ((((LONG)drawItem.itemID) >= 0) &&
|
|
((drawItem.itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) != 0))
|
|
{
|
|
int cyItem = GetItemHeight(drawItem.itemID);
|
|
|
|
CDC* pDC = CDC::FromHandle(drawItem.hDC);
|
|
|
|
int nCheck = GetCheck(drawItem.itemID);
|
|
|
|
CRect rectCheck = drawItem.rcItem;
|
|
rectCheck.left += 1;
|
|
rectCheck.top += 1 + max(0, (cyItem - m_sizeCheck.cy) / 2);
|
|
rectCheck.right = rectCheck.left + m_sizeCheck.cx;
|
|
rectCheck.bottom = rectCheck.top + m_sizeCheck.cy;
|
|
|
|
CRect rectItem = drawItem.rcItem;
|
|
rectItem.right = rectItem.left + m_sizeCheck.cx + 2;
|
|
CRect rectCheckBox = OnGetCheckPosition(rectItem, rectCheck);
|
|
|
|
if (m_themeHelper->IsAppThemeReady())
|
|
{
|
|
m_themeHelper->DrawThemeBackground(pDC->m_hDC, BP_CHECKBOX,
|
|
nCheck ? CBS_CHECKEDNORMAL : CBS_UNCHECKEDNORMAL, &rectCheckBox, NULL);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(rectCheck.IntersectRect(rectItem, rectCheckBox));
|
|
ASSERT((rectCheck == rectCheckBox) && (rectCheckBox.Size() == m_sizeCheck));
|
|
|
|
pDC->DrawFrameControl(rectCheckBox, DFC_BUTTON, DFCS_BUTTONCHECK | (nCheck ? DFCS_CHECKED : 0));
|
|
}
|
|
}
|
|
|
|
drawItem.rcItem.left = drawItem.rcItem.left + m_sizeCheck.cx + 3;
|
|
|
|
DrawItem(&drawItem);
|
|
}
|
|
|
|
BOOL CXTPCustomizeToolbarsPageCheckListBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam,
|
|
LRESULT* pResult)
|
|
{
|
|
if (message == WM_DRAWITEM)
|
|
{
|
|
ASSERT(pResult == NULL); // no return value expected
|
|
PreDrawItem((LPDRAWITEMSTRUCT)lParam);
|
|
return TRUE;
|
|
}
|
|
|
|
return CCheckListBox::OnChildNotify(message, wParam, lParam, pResult);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPCustomizeToolbarsPage property page
|
|
|
|
IMPLEMENT_DYNCREATE(CXTPCustomizeToolbarsPage, CXTPPropertyPage)
|
|
|
|
CXTPCustomizeToolbarsPage::CXTPCustomizeToolbarsPage(CXTPCustomizeSheet* pSheet)
|
|
: CXTPPropertyPage(CXTPCustomizeToolbarsPage::IDD), m_pSheet(pSheet)
|
|
{
|
|
//{{AFX_DATA_INIT(CXTPCustomizeToolbarsPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
m_bAllowNewToolbars = TRUE;
|
|
}
|
|
|
|
CXTPCustomizeToolbarsPage::~CXTPCustomizeToolbarsPage()
|
|
{
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CXTPPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CXTPCustomizeToolbarsPage)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
DDX_Control(pDX, XTP_IDC_LIST_TOOLBARS, m_checkList);
|
|
DDX_Control(pDX, XTP_IDC_BUTTON_RENAME, m_btnRename);
|
|
DDX_Control(pDX, XTP_IDC_BUTTON_NEW, m_btnNew);
|
|
DDX_Control(pDX, XTP_IDC_BUTTON_DELETE, m_btnDelete);
|
|
DDX_Control(pDX, XTP_IDC_BUTTON_RESET, m_btnReset);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BOOL CXTPCustomizeToolbarsPage::OnInitDialog()
|
|
{
|
|
CXTPPropertyPage::OnInitDialog();
|
|
|
|
if (m_pSheet->GetCommandBars()->IsLayoutRTL())
|
|
{
|
|
m_checkList.ModifyStyleEx(0, WS_EX_LAYOUTRTL);
|
|
}
|
|
|
|
RefreshToolbarsList();
|
|
|
|
m_btnNew.EnableWindow(m_bAllowNewToolbars);
|
|
|
|
SetResize(XTP_IDC_LIST_TOOLBARS, XTP_ANCHOR_TOPLEFT, XTP_ANCHOR_BOTTOMRIGHT);
|
|
SetResize(XTP_IDC_BUTTON_RENAME, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
SetResize(XTP_IDC_BUTTON_NEW, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
SetResize(XTP_IDC_BUTTON_DELETE, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
SetResize(XTP_IDC_BUTTON_RESET, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPage::RefreshToolbarsList()
|
|
{
|
|
int nIndexSel = 0;
|
|
int nIndex = m_checkList.GetCurSel();
|
|
if (nIndex != LB_ERR)
|
|
{
|
|
nIndexSel = (int)m_checkList.GetItemData(nIndex);
|
|
}
|
|
int nTopIndex = m_checkList.GetTopIndex();
|
|
|
|
m_checkList.ResetContent();
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
int nCount = pCommandBars->GetCount();
|
|
for (int i = 0; i < nCount; i++)
|
|
{
|
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
|
|
|
if (!pToolBar->IsCustomizeDialogPresent())
|
|
continue;
|
|
|
|
if (!pToolBar->IsCloseable() && !pToolBar->IsVisible())
|
|
continue;
|
|
|
|
nIndex = m_checkList.AddString(pToolBar->GetTitle());
|
|
m_checkList.SetCheck(nIndex, pToolBar->IsVisible());
|
|
m_checkList.SetItemData(nIndex, i);
|
|
|
|
if (i == nIndexSel) m_checkList.SetCurSel(nIndex);
|
|
}
|
|
|
|
if (m_checkList.GetTopIndex() != nTopIndex)
|
|
m_checkList.SetTopIndex(nTopIndex);
|
|
|
|
OnSelectionChanged();
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPCustomizeToolbarsPage, CXTPPropertyPage)
|
|
//{{AFX_MSG_MAP(CXTPCustomizeToolbarsPage)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
ON_LBN_SELCHANGE(XTP_IDC_LIST_TOOLBARS, OnSelectionChanged)
|
|
ON_CLBN_CHKCHANGE(XTP_IDC_LIST_TOOLBARS, OnChkChange)
|
|
ON_BN_CLICKED(XTP_IDC_BUTTON_NEW, OnNewToolbar)
|
|
ON_BN_CLICKED(XTP_IDC_BUTTON_RENAME, OnRenameToolbar)
|
|
ON_BN_CLICKED(XTP_IDC_BUTTON_DELETE, OnDeleteToolbar)
|
|
ON_BN_CLICKED(XTP_IDC_BUTTON_RESET, OnResetToolbar)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPCustomizeToolbarsPage message handlers
|
|
|
|
|
|
void CXTPCustomizeToolbarsPage::OnSelectionChanged()
|
|
{
|
|
int nIndex = m_checkList.GetCurSel();
|
|
|
|
if (nIndex != LB_ERR)
|
|
{
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
int i = (int)m_checkList.GetItemData(nIndex);
|
|
|
|
if (i >= 0 && i < pCommandBars->GetCount())
|
|
{
|
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
|
|
|
BOOL bBuiltIn = pToolBar->IsBuiltIn();
|
|
m_btnReset.EnableWindow(bBuiltIn);
|
|
m_btnRename.EnableWindow(!bBuiltIn);
|
|
m_btnDelete.EnableWindow(!bBuiltIn);
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_btnReset.EnableWindow(FALSE);
|
|
m_btnRename.EnableWindow(FALSE);
|
|
m_btnDelete.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPage::OnChkChange()
|
|
{
|
|
int nIndex = m_checkList.GetCurSel();
|
|
if (nIndex == LB_ERR)
|
|
return;
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
int i = (int)m_checkList.GetItemData(nIndex);
|
|
if (i >= 0 && i < pCommandBars->GetCount())
|
|
{
|
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
|
if (!pToolBar->IsCloseable())
|
|
{
|
|
m_checkList.SetCheck(nIndex, 1);
|
|
MessageBeep(0);
|
|
|
|
}
|
|
else
|
|
{
|
|
BOOL bVisible = m_checkList.GetCheck(nIndex);
|
|
pToolBar->SetVisible(bVisible);
|
|
}
|
|
}
|
|
RefreshToolbarsList();
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPage::OnNewToolbar()
|
|
{
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
|
|
CXTPNewToolbarDlg dlg(m_pSheet, pCommandBars);
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
CXTPToolBar* pToolBar = pCommandBars->AddCustomBar(dlg.m_strToolbar, dlg.m_nNewID);
|
|
|
|
RefreshToolbarsList();
|
|
|
|
pCommandBars->GetSite()->SendMessage(WM_XTP_CUSTOMIZATION_ADDTOOLBAR, 0, (LPARAM)pToolBar);
|
|
}
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPage::OnRenameToolbar()
|
|
{
|
|
int nIndex = m_checkList.GetCurSel();
|
|
if (nIndex == LB_ERR)
|
|
return;
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
|
|
int i = (int)m_checkList.GetItemData(nIndex);
|
|
if (i < 0 || i >= pCommandBars->GetCount())
|
|
return;
|
|
|
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
|
|
|
if (pToolBar->IsBuiltIn())
|
|
return;
|
|
|
|
|
|
CXTPNewToolbarDlg dlg(m_pSheet, pCommandBars, pToolBar);
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
pToolBar->SetTitle(dlg.m_strToolbar);
|
|
|
|
m_checkList.DeleteString(nIndex);
|
|
nIndex = m_checkList.InsertString(nIndex, pToolBar->GetTitle());
|
|
m_checkList.SetCheck(nIndex, pToolBar->IsVisible());
|
|
m_checkList.SetItemData(nIndex, i);
|
|
m_checkList.SetCurSel(nIndex);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPCustomizeToolbarsPage::OnDeleteToolbar()
|
|
{
|
|
int nIndex = m_checkList.GetCurSel();
|
|
if (nIndex == LB_ERR)
|
|
return;
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
|
|
int i = (int)m_checkList.GetItemData(nIndex);
|
|
if (i < 0 || i >= pCommandBars->GetCount())
|
|
return;
|
|
|
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
|
|
|
if (pToolBar->IsBuiltIn())
|
|
return;
|
|
|
|
CString strMessage;
|
|
|
|
CString strDelete;
|
|
CXTPResourceManager::AssertValid(XTPResourceManager()->LoadString(&strDelete, XTP_IDS_CONFIRM_DELETE));
|
|
strMessage.Format(strDelete, (LPCTSTR)pToolBar->GetTitle());
|
|
|
|
if (m_pSheet->MessageBox(strMessage, MB_ICONWARNING | MB_OKCANCEL) == IDOK)
|
|
{
|
|
pCommandBars->GetSite()->SendMessage(WM_XTP_CUSTOMIZATION_DELETETOOLBAR, 0, (LPARAM)pToolBar);
|
|
|
|
pCommandBars->Remove(pToolBar);
|
|
RefreshToolbarsList();
|
|
}
|
|
}
|
|
|
|
void CXTPCustomizeToolbarsPage::OnResetToolbar()
|
|
{
|
|
int nIndex = m_checkList.GetCurSel();
|
|
if (nIndex == LB_ERR)
|
|
return;
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
|
|
int i = (int)m_checkList.GetItemData(nIndex);
|
|
if (i < 0 || i >= pCommandBars->GetCount())
|
|
return;
|
|
|
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
|
|
|
if (!pToolBar->IsBuiltIn())
|
|
return;
|
|
|
|
CString strMessage, strTitle = pToolBar->GetTitle(), strReset;
|
|
|
|
CXTPResourceManager::AssertValid(XTPResourceManager()->LoadString(&strReset, XTP_IDS_CONFIRM_RESET));
|
|
strMessage.Format(strReset, (LPCTSTR)strTitle);
|
|
|
|
if (m_pSheet->MessageBox(strMessage, MB_ICONWARNING | MB_OKCANCEL) != IDOK)
|
|
return;
|
|
|
|
pToolBar->Reset(FALSE);
|
|
RefreshToolbarsList();
|
|
}
|