DragonNest/Third/XTToolkitPro/Samples/Utilities/CommandBarsDesigner/PaneAccelerators.cpp
2024-12-19 09:48:26 +08:00

329 lines
7.7 KiB
C++

// PaneAccelerators.cpp : implementation file
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 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 "commandbarsdesigner.h"
#include "PaneAccelerators.h"
#include "DialogAccelProperties.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPaneAccelerators
LRESULT CPaneAccelerators::CAcceleratorsList::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_NCPAINT:
{
CListCtrl::WindowProc(message, wParam, lParam);
CRect rc;
GetWindowRect(&rc);
CWindowDC dc(this);
rc.OffsetRect(-rc.TopLeft());
COLORREF clr = GetStaticFrameColor();
dc.Draw3dRect(rc, clr, clr);
return TRUE;
}
}
return CListCtrl::WindowProc(message, wParam, lParam);
}
CPaneAccelerators::CPaneAccelerators()
{
m_pActiveFrame = 0;
m_pAccelTable = NULL;
}
CPaneAccelerators::~CPaneAccelerators()
{
}
BEGIN_MESSAGE_MAP(CPaneAccelerators, CWnd)
//{{AFX_MSG_MAP(CPaneAccelerators)
ON_WM_CREATE()
ON_WM_SIZE()
ON_COMMAND(ID_PANEACELLERATORS_NEW, OnPaneacelleratorsNew)
ON_UPDATE_COMMAND_UI(ID_PANEACELLERATORS_NEW, OnUpdatePaneacelleratorsNew)
ON_COMMAND(ID_PANEACELLERATORS_DELETE, OnPaneacelleratorsDelete)
ON_UPDATE_COMMAND_UI(ID_PANEACELLERATORS_DELETE, OnUpdatePaneacelleratorsDelete)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_DBLCLK, AFX_IDW_PANE_FIRST, OnDblClick)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPaneAccelerators message handlers
int CPaneAccelerators::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
VERIFY(m_wndToolBar.CreateToolBar(WS_VISIBLE|WS_CHILD|CBRS_TOOLTIPS, this));
VERIFY(m_wndToolBar.LoadToolBar(IDR_PANE_ACCELERATORS));
m_wndToolBar.GetControl(0)->SetStyle(xtpButtonIconAndCaption);
m_wndToolBar.GetControl(1)->SetStyle(xtpButtonIconAndCaption);
if (!m_wndListCtrl.CWnd::CreateEx(WS_EX_STATICEDGE, WC_LISTVIEW, NULL,
WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_VSCROLL|LVS_SINGLESEL|LVS_SHOWSELALWAYS,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST))
{
TRACE0("Failed to create tree control.\n");
return -1;
}
m_wndListCtrl.ModifyStyleEx(0, WS_EX_STATICEDGE);
m_wndListCtrl.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 105);
m_wndListCtrl.InsertColumn(1, _T("Key"), LVCFMT_LEFT, 84);
ListView_SetExtendedListViewStyleEx(m_wndListCtrl.m_hWnd,
LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
return 0;
}
void CPaneAccelerators::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
int nTop = 0;
if (m_wndToolBar.GetSafeHwnd())
{
CSize sz = m_wndToolBar.CalcDockingLayout(cx, /*LM_HIDEWRAP|*/ LM_HORZDOCK|LM_HORZ | LM_COMMIT);
m_wndToolBar.MoveWindow(0, nTop, cx, sz.cy);
m_wndToolBar.Invalidate(FALSE);
nTop += sz.cy;
}
if (m_wndListCtrl.GetSafeHwnd())
{
m_wndListCtrl.MoveWindow(0, nTop, cx, cy - nTop);
}
}
void CPaneAccelerators::RefreshAccels(CXTPShortcutManagerAccelTable* pAccelTable)
{
CResourceManager* pResourceManager = ((CEmbeddedFrame*)m_pActiveFrame)->ResourceManager();
m_pAccelTable = pAccelTable;
m_wndListCtrl.DeleteAllItems();
if (!pAccelTable)
return;
int nAccelSize = m_pAccelTable->GetCount();
CString strFirst = _T("");
for (int i = 0; i < nAccelSize; i ++)
{
CXTPShortcutManagerAccel* accel = m_pAccelTable->GetAt(i);
CString strID = pResourceManager->GetStringID(accel->cmd);
ASSERT(!strID.IsEmpty());
CString strKey = GetMainFrame()->GetCommandBars()->GetShortcutManager()->Format(accel, NULL);
int nIndex = m_wndListCtrl.InsertItem(m_wndListCtrl.GetItemCount(), strID, 0);
m_wndListCtrl.SetItemText(nIndex, 1, strKey);
m_wndListCtrl.SetItemData(nIndex, i);
}
}
void CPaneAccelerators::Refresh(BOOL bForceAll /*= FALSE*/)
{
if (bForceAll || (m_pActiveFrame != GetMainFrame()->GetActiveEmbeddedFrame()))
{
m_pActiveFrame = GetMainFrame()->GetActiveEmbeddedFrame();
if (m_pActiveFrame)
{
CXTPShortcutManagerAccelTable* pAccel = GetActiveAccelTable();
RefreshAccels(pAccel);
}
else
{
m_wndListCtrl.DeleteAllItems();
m_pAccelTable = NULL;
}
}
}
BOOL CPaneAccelerators::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_CHAR || pMsg->message == WM_KEYUP)
{
if (pMsg->wParam == VK_INSERT) Insert();
if (pMsg->wParam == VK_RETURN)
{
int nItem = m_wndListCtrl.GetNextItem(-1, LVNI_SELECTED);
if (nItem != -1)
{
int nIndex = (int)m_wndListCtrl.GetItemData(nItem);
Edit(nIndex);
}
}
if (pMsg->wParam == VK_DELETE)
{
int nItem = m_wndListCtrl.GetNextItem(-1, LVNI_SELECTED);
if (nItem != -1)
{
int nIndex = (int)m_wndListCtrl.GetItemData(nItem);
Delete(nIndex);
}
}
m_wndListCtrl.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
return TRUE;
}
return CWnd::PreTranslateMessage(pMsg);
}
void CPaneAccelerators::Edit(int nIndex)
{
if (!m_pAccelTable)
return;
CResourceManager* pResourceManager = ((CEmbeddedFrame*)m_pActiveFrame)->ResourceManager();
CXTPShortcutManagerAccel* accel = m_pAccelTable->GetAt(nIndex);
CDialogAccelProperties ap;
ap.m_strId = pResourceManager->GetStringID(accel->cmd);
ap.m_lpAccel = accel;
if (ap.DoModal() == IDOK)
{
*accel = *ap.m_wndAccel.GetAccel();
accel->cmd = (WORD)pResourceManager->GetStringID(ap.m_strId);
RefreshAccels(GetActiveAccelTable());
}
}
CXTPShortcutManagerAccelTable* CPaneAccelerators::GetActiveAccelTable()
{
ASSERT(m_pActiveFrame);
return m_pActiveFrame->GetCommandBars()->GetShortcutManager()->GetDefaultAccelerator();
}
void CPaneAccelerators::Delete(int nIndex)
{
if (!m_pAccelTable)
return;
if (nIndex < m_pAccelTable->GetCount())
{
m_pAccelTable->RemoveAt(nIndex);
}
RefreshAccels(GetActiveAccelTable());
}
void CPaneAccelerators::Insert()
{
if (!m_pAccelTable)
return;
CResourceManager* pResourceManager = ((CEmbeddedFrame*)m_pActiveFrame)->ResourceManager();
CDialogAccelProperties ap;
if (ap.DoModal() == IDOK)
{
if (!m_pAccelTable)
return;
CXTPShortcutManagerAccel accel = *ap.m_wndAccel.GetAccel();
accel.cmd = pResourceManager->GetStringID(ap.m_strId);
m_pAccelTable->Add(accel);
RefreshAccels(GetActiveAccelTable());
}
}
void CPaneAccelerators::OnDblClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NMITEMACTIVATE * pNMItemActivate = (NMITEMACTIVATE *)pNMHDR;
if (!m_pActiveFrame)
return;
if (pNMItemActivate->iItem >= 0)
{
int nIndex = (int)m_wndListCtrl.GetItemData(pNMItemActivate->iItem);
Edit(nIndex);
}
*pResult = 0;
}
void CPaneAccelerators::OnPaneacelleratorsNew()
{
Insert();
}
void CPaneAccelerators::OnUpdatePaneacelleratorsNew(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pActiveFrame != NULL);
}
void CPaneAccelerators::OnPaneacelleratorsDelete()
{
int nItem = m_wndListCtrl.GetNextItem(-1, LVNI_SELECTED);
if (nItem != -1)
{
int nIndex = (int)m_wndListCtrl.GetItemData(nItem);
Delete(nIndex);
}
}
void CPaneAccelerators::OnUpdatePaneacelleratorsDelete(CCmdUI* pCmdUI)
{
int nItem = m_wndListCtrl.GetNextItem(-1, LVNI_SELECTED);
pCmdUI->Enable(nItem != -1);
}