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.
479 lines
13 KiB
C++
479 lines
13 KiB
C++
// XTPCustomizeKeyboardPage.cpp : implementation of the CXTPCustomizeKeyboardPage 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/XTPColorManager.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 "XTPShortcutManager.h"
|
|
#include "XTPPaintManager.h"
|
|
#include "XTPControls.h"
|
|
#include "XTPControl.h"
|
|
#include "XTPControlButton.h"
|
|
#include "XTPControlPopup.h"
|
|
#include "XTPCommandBar.h"
|
|
#include "XTPCommandBars.h"
|
|
#include "XTPCustomizeSheet.h"
|
|
#include "XTPCustomizeCommandsPage.h"
|
|
#include "XTPCustomizeKeyboardPage.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPCustomizeKeyboardPage property page
|
|
|
|
CXTPCustomizeKeyboardPage::CXTPCustomizeKeyboardPage(CXTPCustomizeSheet* pSheet)
|
|
: CXTPPropertyPage(CXTPCustomizeKeyboardPage::IDD)
|
|
, m_editShortcutKey(pSheet->GetCommandBars()->GetShortcutManager())
|
|
{
|
|
//{{AFX_DATA_INIT(CXTPCustomizeKeyboardPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
m_pSheet = pSheet;
|
|
m_strDesc = _T("");
|
|
m_iCategory = 0;
|
|
|
|
ASSERT(pSheet->GetCommandBars()->GetShortcutManager()->GetOriginalAccelerator());
|
|
}
|
|
|
|
CXTPCustomizeKeyboardPage::~CXTPCustomizeKeyboardPage()
|
|
{
|
|
for (int i = 0; i < m_arrCategories.GetSize(); i++)
|
|
{
|
|
delete m_arrCategories[i];
|
|
}
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CXTPPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CXTPCustomizeKeyboardPage)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
DDX_Control(pDX, XTP_IDC_EDIT_SHORTCUTKEY, m_editShortcutKey);
|
|
DDX_Control(pDX, XTP_IDC_LBOX_KEYS, m_lboxKeys);
|
|
DDX_Control(pDX, XTP_IDC_LBOX_ACCEL_COMMANDS, m_lboxCommands);
|
|
DDX_Control(pDX, XTP_IDC_COMBO_CATEGORY, m_comboCategory);
|
|
DDX_Text(pDX, XTP_IDC_TXT_DESC_OVERVIEW, m_strDesc);
|
|
DDX_CBIndex(pDX, XTP_IDC_COMBO_CATEGORY, m_iCategory);}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPCustomizeKeyboardPage, CXTPPropertyPage)
|
|
//{{AFX_MSG_MAP(CXTPCustomizeKeyboardPage)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
ON_CBN_SELCHANGE(XTP_IDC_COMBO_CATEGORY, OnSelchangeCategory)
|
|
ON_LBN_SELCHANGE(XTP_IDC_LBOX_ACCEL_COMMANDS, OnSelchangeCommands)
|
|
ON_LBN_SELCHANGE(XTP_IDC_LBOX_KEYS, OnSelchangeCurKeys)
|
|
ON_BN_CLICKED(XTP_IDC_BTN_ASSIGN, OnAssign)
|
|
ON_BN_CLICKED(XTP_IDC_BTN_ACCEL_RESET, OnResetAll)
|
|
ON_BN_CLICKED(XTP_IDC_BTN_REMOVE, OnRemove)
|
|
ON_EN_CHANGE(XTP_IDC_EDIT_SHORTCUTKEY, OnChangeShortcutKey)
|
|
END_MESSAGE_MAP()
|
|
|
|
XTP_COMMANDBARS_CATEGORYINFO* CXTPCustomizeKeyboardPage::FindCategory(LPCTSTR strCategory) const
|
|
{
|
|
for (int i = 0; i < m_arrCategories.GetSize(); i++)
|
|
{
|
|
if (m_arrCategories[i]->strCategory.Compare(strCategory) == 0)
|
|
return m_arrCategories[i];
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
XTP_COMMANDBARS_CATEGORYINFO* CXTPCustomizeKeyboardPage::GetCategoryInfo(int nIndex) const
|
|
{
|
|
if (nIndex >= 0 && nIndex < m_arrCategories.GetSize())
|
|
return m_arrCategories[nIndex];
|
|
return NULL;
|
|
}
|
|
|
|
CXTPControls* CXTPCustomizeKeyboardPage::InsertCategory(LPCTSTR strCategory, int nIndex)
|
|
{
|
|
XTP_COMMANDBARS_CATEGORYINFO* pInfo = FindCategory(strCategory);
|
|
if (!pInfo)
|
|
{
|
|
pInfo = new XTP_COMMANDBARS_CATEGORYINFO(strCategory, m_pSheet->GetCommandBars());
|
|
m_arrCategories.InsertAt(nIndex == -1 ? m_arrCategories.GetSize() : nIndex, pInfo);
|
|
}
|
|
return pInfo->pControls;
|
|
}
|
|
|
|
BOOL CXTPCustomizeKeyboardPage::AddCategory(LPCTSTR strCategory, CMenu* pMenu, BOOL bListSubItems)
|
|
{
|
|
CXTPControls* pCategoryControls = InsertCategory(strCategory);
|
|
|
|
int nCount = pMenu->GetMenuItemCount();
|
|
|
|
for (int i = 0; i < nCount; i++)
|
|
{
|
|
if (pMenu->GetMenuItemID(i) > 0)
|
|
{
|
|
CXTPControlPopup* pControl = DYNAMIC_DOWNCAST(CXTPControlPopup,
|
|
pCategoryControls->AddMenuItem(pMenu, i));
|
|
|
|
if (pControl && bListSubItems)
|
|
{
|
|
CString strSubCategory = pControl->GetCaption() + _T(" | ");
|
|
|
|
CXTPControls* pControls = pControl->GetCommandBar()->GetControls();
|
|
for (int j = 0; j < pControls->GetCount(); j++)
|
|
{
|
|
CXTPControl* pSubControl = pCategoryControls->AddClone(pControls->GetAt(j));
|
|
pSubControl->SetCaption(strSubCategory + pSubControl->GetCaption());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CXTPCustomizeKeyboardPage::AddCategories(UINT nIDResource, BOOL bListSubItems)
|
|
{
|
|
CMenu menu;
|
|
if (!XTPResourceManager()->LoadMenu(&menu, nIDResource))
|
|
return FALSE;
|
|
|
|
int nCount = menu.GetMenuItemCount();
|
|
|
|
for (int i = 0; i < nCount; i++)
|
|
{
|
|
CString strCategory;
|
|
if (XTPResourceManager()->GetMenuLocaleString(&menu, i, strCategory, MF_BYPOSITION) > 0)
|
|
{
|
|
CMenu* pMenu = menu.GetSubMenu(i);
|
|
if (pMenu)
|
|
{
|
|
CXTPPaintManager::StripMnemonics(strCategory);
|
|
|
|
int iPos = strCategory.Find(_T('\t'));
|
|
if (iPos > 0)
|
|
{
|
|
strCategory.ReleaseBuffer(iPos);
|
|
}
|
|
|
|
if (!AddCategory(strCategory, pMenu, bListSubItems))
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CXTPCustomizeKeyboardPage::AddCategories(CXTPControls* pControls)
|
|
{
|
|
for (int i = 0; i < pControls->GetCount(); i++)
|
|
{
|
|
CXTPControl* pControl = pControls->GetAt(i);
|
|
CString strCategory = pControl->GetCategory();
|
|
|
|
if (!strCategory.IsEmpty() && pControl->GetID() > 0 &&
|
|
pControl->GetType() == xtpControlButton)
|
|
{
|
|
CXTPControls* pCategoryControls = InsertCategory(strCategory);
|
|
pCategoryControls->AddClone(pControl);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPCustomizeKeyboardPage message handlers
|
|
|
|
BOOL CXTPCustomizeKeyboardPage::OnInitDialog()
|
|
{
|
|
CXTPPropertyPage::OnInitDialog();
|
|
|
|
for (int i = 0; i < m_arrCategories.GetSize(); i++)
|
|
{
|
|
int nIndex = m_comboCategory.AddString(m_arrCategories[i]->strCategory);
|
|
m_comboCategory.SetItemDataPtr(nIndex, m_arrCategories[i]->pControls);
|
|
|
|
if (i == 0) m_comboCategory.SetCurSel(0);
|
|
}
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
|
|
if (pCommandBars->IsLayoutRTL())
|
|
{
|
|
m_lboxCommands.ModifyStyleEx(0, WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR | WS_EX_RTLREADING);
|
|
m_comboCategory.ModifyStyleEx(0, WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR | WS_EX_RTLREADING);
|
|
}
|
|
|
|
OnSelchangeCategory();
|
|
|
|
SetResize(XTP_IDC_COMBO_CATEGORY, XTP_ANCHOR_TOPLEFT, XTP_ANCHOR_TOPCENTER);
|
|
SetResize(XTP_IDC_LBOX_ACCEL_COMMANDS, XTP_ANCHOR_TOPLEFT, XTP_ANCHOR_BOTTOMCENTER);
|
|
|
|
SetResize(XTP_IDC_TXT_ASSIGNMENTS, XTP_ANCHOR_TOPCENTER, XTP_ANCHOR_TOPRIGHT);
|
|
SetResize(XTP_IDC_LBOX_KEYS, XTP_ANCHOR_TOPCENTER, XTP_ANCHOR_BOTTOMRIGHT);
|
|
|
|
SetResize(XTP_IDC_TXT_NEWKEY, XTP_ANCHOR_BOTTOMCENTER, XTP_ANCHOR_BOTTOMRIGHT);
|
|
SetResize(XTP_IDC_EDIT_SHORTCUTKEY, XTP_ANCHOR_BOTTOMCENTER, XTP_ANCHOR_BOTTOMRIGHT);
|
|
|
|
SetResize(XTP_IDC_BTN_ASSIGN, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
SetResize(XTP_IDC_BTN_ACCEL_RESET, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
SetResize(XTP_IDC_BTN_REMOVE, XTP_ANCHOR_TOPRIGHT, XTP_ANCHOR_TOPRIGHT);
|
|
|
|
SetResize(XTP_IDC_TXT_DESC_TITLE, XTP_ANCHOR_BOTTOMLEFT, XTP_ANCHOR_BOTTOMRIGHT);
|
|
SetResize(XTP_IDC_TXT_DESC_OVERVIEW, XTP_ANCHOR_BOTTOMLEFT, XTP_ANCHOR_BOTTOMRIGHT);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::ReloadList()
|
|
{
|
|
int iIndex = m_comboCategory.GetCurSel();
|
|
if (iIndex == LB_ERR)
|
|
return;
|
|
|
|
CXTPControls* pControls = (CXTPControls*)m_comboCategory.GetItemDataPtr(iIndex);
|
|
if (pControls == NULL)
|
|
return;
|
|
|
|
m_lboxCommands.ResetContent();
|
|
|
|
int iItem;
|
|
for (iItem = 0; iItem < pControls->GetCount(); ++iItem)
|
|
{
|
|
CXTPControl* pControl = pControls->GetAt(iItem);
|
|
UINT nID = pControl->GetID();
|
|
|
|
if (nID != 0 && pControl->GetType() != xtpControlPopup
|
|
&& pControl->GetType() != xtpControlButtonPopup)
|
|
{
|
|
if ((nID < ID_FILE_MRU_FIRST) || (nID > ID_FILE_MRU_LAST))
|
|
{
|
|
CString str = pControl->GetCaption();
|
|
CXTPPaintManager::StripMnemonics(str);
|
|
iIndex = m_lboxCommands.AddString(str);
|
|
m_lboxCommands.SetItemDataPtr(iIndex, pControl);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (m_lboxCommands.GetCount())
|
|
m_lboxCommands.SetCurSel(0);
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::OnChangeShortcutKey()
|
|
{
|
|
EnableControls();
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::OnSelchangeCurKeys()
|
|
{
|
|
EnableControls();
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::OnSelchangeCategory()
|
|
{
|
|
UpdateData();
|
|
ReloadList();
|
|
OnSelchangeCommands();
|
|
EnableControls();
|
|
}
|
|
|
|
CXTPShortcutManagerAccelTable* CXTPCustomizeKeyboardPage::GetFrameAccelerator() const
|
|
{
|
|
return m_pSheet->GetCommandBars()->GetShortcutManager()->GetDefaultAccelerator();
|
|
}
|
|
|
|
|
|
void CXTPCustomizeKeyboardPage::OnSelchangeCommands()
|
|
{
|
|
ASSERT(m_pSheet);
|
|
if (!m_pSheet)
|
|
return;
|
|
|
|
m_lboxKeys.ResetContent();
|
|
|
|
int iIndex = m_lboxCommands.GetCurSel();
|
|
if (iIndex == -1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars();
|
|
|
|
CXTPControl* pControl = (CXTPControl*)m_lboxCommands.GetItemDataPtr(iIndex);
|
|
ASSERT(pControl);
|
|
if (!pControl)
|
|
return;
|
|
|
|
CXTPShortcutManagerAccelTable* pAccelTable = GetFrameAccelerator();
|
|
if (pAccelTable)
|
|
{
|
|
for (int i = 0; i < pAccelTable->GetCount(); i++)
|
|
{
|
|
CXTPShortcutManagerAccel* accel = pAccelTable->GetAt(i);
|
|
if (accel->cmd == pControl->GetID())
|
|
{
|
|
CString str = pCommandBars->GetShortcutManager()->Format(accel, NULL);
|
|
|
|
int nIndex = m_lboxKeys.AddString(str);
|
|
m_lboxKeys.SetItemData(nIndex, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
m_strDesc = pControl->GetDescription();
|
|
|
|
UpdateData(FALSE);
|
|
EnableControls();
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::UpdateAcellTable(LPACCEL lpAccel, int nSize)
|
|
{
|
|
m_pSheet->GetCommandBars()->GetShortcutManager()->UpdateAcellTable(lpAccel, nSize);
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::OnAssign()
|
|
{
|
|
int iIndex = m_lboxCommands.GetCurSel();
|
|
if (iIndex == -1)
|
|
return;
|
|
|
|
CXTPControl* pControl = (CXTPControl*)m_lboxCommands.GetItemDataPtr(iIndex);
|
|
if (!pControl)
|
|
return;
|
|
|
|
CXTPShortcutManagerAccel* pAccel = m_editShortcutKey.GetAccel();
|
|
ASSERT(pAccel);
|
|
if (!pAccel)
|
|
return;
|
|
|
|
pAccel->cmd = (WORD)pControl->GetID();
|
|
|
|
if (m_pSheet->GetCommandBars()->GetShortcutManager()->OnBeforeAdd(pAccel))
|
|
return;
|
|
|
|
CXTPShortcutManagerAccelTable* pAccelTable = GetFrameAccelerator();
|
|
|
|
for (int i = 0; i < pAccelTable->GetCount(); i++)
|
|
{
|
|
CXTPShortcutManagerAccel* accel = pAccelTable->GetAt(i);
|
|
if (CXTPShortcutManager::CKeyHelper::EqualAccels(accel, pAccel))
|
|
{
|
|
if (XTPResourceManager()->ShowMessageBox(XTP_IDS_CONFIRM_REASSIGN, MB_ICONWARNING | MB_YESNO) != IDYES)
|
|
{
|
|
return;
|
|
}
|
|
|
|
pAccelTable->RemoveAt(i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
pAccelTable->Add(*pAccel);
|
|
|
|
OnSelchangeCommands();
|
|
m_editShortcutKey.ResetKey();
|
|
EnableControls();
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::EnableControls()
|
|
{
|
|
CString strText;
|
|
m_editShortcutKey.GetWindowText(strText);
|
|
|
|
CWnd* pWnd = GetDlgItem(XTP_IDC_BTN_ASSIGN);
|
|
if (pWnd)
|
|
{
|
|
pWnd->EnableWindow(!strText.IsEmpty() && m_editShortcutKey.IsKeyDefined());
|
|
}
|
|
|
|
int iSel = m_lboxKeys.GetCurSel();
|
|
|
|
pWnd = GetDlgItem(XTP_IDC_BTN_REMOVE);
|
|
if (pWnd)
|
|
{
|
|
pWnd->EnableWindow(iSel != LB_ERR);
|
|
}
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::OnResetAll()
|
|
{
|
|
CXTPShortcutManager* pShortcutManager = m_pSheet->GetCommandBars()->GetShortcutManager();
|
|
|
|
CString strPrompt;
|
|
CXTPResourceManager::AssertValid(XTPResourceManager()->LoadString(&strPrompt, XTP_IDS_CONFIRM_KEYBOARD));
|
|
|
|
if (m_pSheet->MessageBox(strPrompt, MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2) == IDYES)
|
|
{
|
|
pShortcutManager->Reset();
|
|
|
|
OnSelchangeCommands();
|
|
EnableControls();
|
|
}
|
|
}
|
|
|
|
void CXTPCustomizeKeyboardPage::OnRemove()
|
|
{
|
|
int iIndex = m_lboxKeys.GetCurSel();
|
|
if (iIndex == LB_ERR)
|
|
return;
|
|
|
|
CXTPShortcutManagerAccelTable* pAccelTable = GetFrameAccelerator();
|
|
if (!pAccelTable)
|
|
return;
|
|
|
|
int j = (int)m_lboxKeys.GetItemData(iIndex);
|
|
ASSERT(j >= 0 && j < pAccelTable->GetCount());
|
|
|
|
if (j >= 0 && j < pAccelTable->GetCount())
|
|
{
|
|
if (m_pSheet->GetCommandBars()->GetShortcutManager()->OnBeforeRemove(pAccelTable->GetAt(j)) == FALSE)
|
|
{
|
|
pAccelTable->RemoveAt(j);
|
|
}
|
|
}
|
|
|
|
OnSelchangeCommands();
|
|
EnableControls();
|
|
}
|
|
|
|
BOOL CXTPCustomizeKeyboardPage::OnSetActive()
|
|
{
|
|
UpdateData(FALSE);
|
|
ReloadList();
|
|
EnableControls();
|
|
|
|
return CXTPPropertyPage::OnSetActive();
|
|
}
|