DragonNest/Third/XTToolkitPro/Samples/Utilities/ResourceEditor/ResourceEditorView.cpp

451 lines
13 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// ResourceEditorView.cpp : implementation of the CResourceEditorView class
//
// 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 "ResourceEditor.h"
#include "ResourceEditorDoc.h"
#include "ResourceEditorView.h"
#include "ChildFrm.h"
#include "ResourceViewRecord.h"
#include "MainFrm.h"
#include "ResourceExport.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResourceEditorView
IMPLEMENT_DYNCREATE(CResourceEditorView, CXTPReportView)
BEGIN_MESSAGE_MAP(CResourceEditorView, CXTPReportView)
//{{AFX_MSG_MAP(CResourceEditorView)
ON_WM_CREATE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_NOTIFY(XTP_NM_REPORT_VALUECHANGED, XTP_ID_REPORT_CONTROL, OnReportValueChanged)
ON_NOTIFY(XTP_NM_REPORT_SELCHANGED, XTP_ID_REPORT_CONTROL, OnReportSelectionChanged)
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResourceEditorView construction/destruction
CResourceEditorView::CResourceEditorView()
{
// TODO: add construction code here
}
CResourceEditorView::~CResourceEditorView()
{
}
BOOL CResourceEditorView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
//cs.style &= ~WS_BORDER;
return CXTPReportView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CResourceEditorView diagnostics
#ifdef _DEBUG
void CResourceEditorView::AssertValid() const
{
CXTPReportView::AssertValid();
}
void CResourceEditorView::Dump(CDumpContext& dc) const
{
CXTPReportView::Dump(dc);
}
CResourceEditorDoc* CResourceEditorView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CResourceEditorDoc)));
return (CResourceEditorDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CResourceEditorView message handlers
int CResourceEditorView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CXTPReportView::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CResourceEditorView::LoadXMLString(CXTPPropExchange* pPX, LPCTSTR pszPropName, CString& strValue)
{
#ifdef _UNICODE
PX_String(pPX, pszPropName, strValue);
#else
BSTR bstrValue = 0;
PX_Bstr(pPX, pszPropName, bstrValue, 0);
ASSERT(!bstrValue || wcslen(bstrValue) < 1024);
if (bstrValue)
{
WideCharToMultiByte(GetDocument()->m_pLanguageInfo->nCodePage, 0, bstrValue, -1, strValue.GetBuffer(1024), 1024, 0, 0);
strValue.ReleaseBuffer();
SysFreeString(bstrValue);
}
#endif
CXTPPropExchangeXMLNode::PreformatString(strValue, FALSE);
}
void CResourceEditorView::PopulateStringResources(CTreeCtrl& wndResourceTree, CXTPPropExchange* pResources, HTREEITEM hItemStrings)
{
CXTPReportControl& wndReport = GetReportCtrl();
CXTPPropExchangeEnumeratorPtr ptrEnumeratorStrings(pResources->GetEnumerator(_T("string")));
POSITION pos = ptrEnumeratorStrings->GetPosition();
while (pos)
{
CXTPPropExchangeXMLNode* ptrSectionString = (CXTPPropExchangeXMLNode*)ptrEnumeratorStrings->GetNext(pos);
CString strValue;
DWORD dwId = 0;
PX_DWord(ptrSectionString, _T("id"), dwId);
LoadXMLString(ptrSectionString, _T("value"), strValue);
CResourceViewRecord* pRecord = new CResourceViewRecord(_T("String"), resString, dwId, strValue);
wndReport.GetRecords()->Add(pRecord);
pRecord->m_pSection = ptrSectionString;
HTREEITEM hItemString = wndResourceTree.InsertItem(GetResourceName(dwId), 6, 6, hItemStrings);
wndResourceTree.SetItemData(hItemString, (DWORD_PTR)pRecord);
}
}
void CResourceEditorView::PopulateMenuItemsResources(CXTPReportRecord* pMenuBase, CXTPReportRecord* pMenuRecord, CXTPPropExchange* pResourceMenu)
{
CXTPPropExchangeEnumeratorPtr ptrEnumeratorStrings(pResourceMenu->GetEnumerator(_T("menuitem")));
POSITION pos = ptrEnumeratorStrings->GetPosition();
while (pos)
{
CXTPPropExchangeXMLNode* ptrSectionMenuItem = (CXTPPropExchangeXMLNode*)ptrEnumeratorStrings->GetNext(pos);
CString strValue;
DWORD dwId = 0;
PX_DWord(ptrSectionMenuItem, _T("id"), dwId);
LoadXMLString(ptrSectionMenuItem, _T("caption"), strValue);
CResourceViewRecord* pRecord = new CResourceViewRecord(_T("Menuitem"), resMenu, dwId, strValue);
pMenuRecord->GetChilds()->Add(pRecord);
pRecord->m_pSection = ptrSectionMenuItem;
PopulateMenuItemsResources(pMenuBase, pRecord, ptrSectionMenuItem);
}
}
void CResourceEditorView::PopulateDialogControlsResources(CResourceViewRecord* pDialogRecord, CXTPPropExchange* pResourceDialog)
{
CXTPPropExchangeEnumeratorPtr ptrEnumeratorStrings(pResourceDialog->GetEnumerator(_T("control")));
POSITION pos = ptrEnumeratorStrings->GetPosition();
while (pos)
{
CXTPPropExchangeXMLNode* ptrSectionDialogControl = (CXTPPropExchangeXMLNode*)ptrEnumeratorStrings->GetNext(pos);
CString strValue;
DWORD dwId = 0;
PX_DWord(ptrSectionDialogControl, _T("id"), dwId);
LoadXMLString(ptrSectionDialogControl, _T("caption"), strValue);
CResourceViewRecord* pRecord = new CResourceViewRecord(_T("Control"), resDialog, dwId, strValue);
pDialogRecord->GetChilds()->Add(pRecord);
pRecord->m_pSection = ptrSectionDialogControl;
pRecord->m_pBaseRecord = pDialogRecord;
}
}
void CResourceEditorView::PopulateDialogResources(CTreeCtrl& wndResourceTree, CXTPPropExchange* pResources, HTREEITEM hItemDialogs)
{
CXTPReportControl& wndReport = GetReportCtrl();
CXTPPropExchangeEnumeratorPtr ptrEnumeratorStrings(pResources->GetEnumerator(_T("dialog")));
POSITION pos = ptrEnumeratorStrings->GetPosition();
while (pos)
{
CXTPPropExchangeXMLNode* ptrSectionDialog = (CXTPPropExchangeXMLNode*)ptrEnumeratorStrings->GetNext(pos);
DWORD dwId = 0;
CString strValue;
PX_DWord(ptrSectionDialog, _T("id"), dwId);
LoadXMLString(ptrSectionDialog, _T("caption"), strValue);
CResourceViewRecord* pRecord = new CResourceViewRecord(_T("Dialog"), resDialog, dwId, strValue);
wndReport.GetRecords()->Add(pRecord);
pRecord->m_pSection = ptrSectionDialog;
HTREEITEM hItemDialog = wndResourceTree.InsertItem(GetResourceName(dwId), 3, 3, hItemDialogs);
wndResourceTree.SetItemData(hItemDialog, (DWORD_PTR)pRecord);
PopulateDialogControlsResources(pRecord, ptrSectionDialog);
}
}
void CResourceEditorView::PopulateMenuResources(CTreeCtrl& wndResourceTree, CXTPPropExchange* pResources, HTREEITEM hItemMenus)
{
CXTPReportControl& wndReport = GetReportCtrl();
CXTPPropExchangeEnumeratorPtr ptrEnumeratorStrings(pResources->GetEnumerator(_T("menu")));
POSITION pos = ptrEnumeratorStrings->GetPosition();
while (pos)
{
CXTPPropExchangeXMLNode* ptrSectionMenu = (CXTPPropExchangeXMLNode*)ptrEnumeratorStrings->GetNext(pos);
DWORD dwId = 0;
PX_DWord(ptrSectionMenu, _T("id"), dwId);
CResourceViewRecord* pRecord = new CResourceViewRecord(_T("Menu"), resMenu, dwId, _T(""));
wndReport.GetRecords()->Add(pRecord);
pRecord->m_pSection = ptrSectionMenu;
pRecord->SetEditable(FALSE);
HTREEITEM hItemMenu = wndResourceTree.InsertItem(GetResourceName(dwId), 5, 5, hItemMenus);
wndResourceTree.SetItemData(hItemMenu, (DWORD_PTR)pRecord);
PopulateMenuItemsResources(pRecord, pRecord, ptrSectionMenu);
}
}
void CResourceEditorView::PopulateResources()
{
CXTPReportControl& wndReport = GetReportCtrl();
wndReport.GetRecords()->RemoveAll();
CResourceEditorDoc* pDocument = GetDocument();
CXTPPropExchangeXMLNode* pResources = pDocument->m_pResources;
CTreeCtrl& wndResourceTree = ((CChildFrame*)GetParentFrame())->m_wndResourceTree;
wndResourceTree.DeleteAllItems();
HTREEITEM hItemResources = wndResourceTree.InsertItem(_T("Resources"));
HTREEITEM hItemStrings = wndResourceTree.InsertItem(_T("String Table"), 6, 6, hItemResources);
HTREEITEM hItemMenus = wndResourceTree.InsertItem(_T("Menus"), 5, 5, hItemResources);
HTREEITEM hItemDialogs = wndResourceTree.InsertItem(_T("Dialogs"), 3, 3, hItemResources);
if (pResources)
{
CString strLanguage;
PX_String(pResources, _T("Language"), strLanguage);
wndReport.GetColumns()->Find(3)->SetCaption(strLanguage);
PopulateStringResources(wndResourceTree, pResources, hItemStrings);
PopulateMenuResources(wndResourceTree, pResources, hItemMenus);
PopulateDialogResources(wndResourceTree, pResources, hItemDialogs);
}
wndResourceTree.Expand(hItemResources, TVE_EXPAND);
wndReport.Populate();
}
void CResourceEditorView::OnInitialUpdate()
{
CXTPReportView::OnInitialUpdate();
XTP_RESOURCEMANAGER_LANGINFO* pLanguageInfo = GetDocument()->m_pLanguageInfo;
ASSERT(pLanguageInfo);
CXTPReportControl& wndReport = GetReportCtrl();
wndReport.GetImageManager()->SetIcons(IDB_RESTREE, 0, 10, 0);
wndReport.GetPaintManager()->m_treeStructureStyle = xtpReportTreeStructureDots;
CXTPReportColumn* pColumn;
pColumn = new CXTPReportColumn(4, _T("Resource"), 180, TRUE);
pColumn->SetEditable(FALSE);
wndReport.GetColumns()->Add(pColumn);
wndReport.GetColumns()->GetGroupsOrder()->Add(pColumn, FALSE);
pColumn->SetTreeColumn(TRUE);
pColumn = new CXTPReportColumn(0, _T("Module"), 130, TRUE);
pColumn->SetEditable(FALSE);
wndReport.GetColumns()->Add(pColumn);
wndReport.GetColumns()->GetGroupsOrder()->Add(pColumn);
pColumn->SetVisible(FALSE);
pColumn = new CXTPReportColumn(1, _T("ID"), 40, FALSE);
pColumn->SetEditable(FALSE);
wndReport.GetColumns()->Add(pColumn);
pColumn = new CXTPReportColumn(2, _T("English US (Original Resources)"), 300, TRUE);
pColumn->SetEditable(FALSE);
wndReport.GetColumns()->Add(pColumn);
pColumn = new CXTPReportColumn(3, _T("Tranlated"), 300, TRUE);
pColumn->SetAlignment(pLanguageInfo->nCodePage == 1256 || pLanguageInfo->nCodePage == 1255 ? DT_RIGHT : DT_LEFT);
wndReport.GetColumns()->Add(pColumn);
wndReport.GetPaintManager()->SetColumnStyle(xtpReportColumnExplorer);
wndReport.GetReportHeader()->AllowColumnRemove(FALSE);
wndReport.AllowEdit(TRUE);
wndReport.EditOnClick(FALSE);
wndReport.ShowGroupBy();
LOGFONT lfIcon;
VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfIcon), &lfIcon, 0));
lfIcon.lfCharSet = pLanguageInfo->nFontCharSet;
GetReportCtrl().GetPaintManager()->SetTextFont(lfIcon);
PopulateResources();
}
void CResourceEditorView::OnReportValueChanged(NMHDR * pNotifyStruct, LRESULT * /*result*/)
{
XTP_NM_REPORTRECORDITEM* pItemNotify = (XTP_NM_REPORTRECORDITEM*) pNotifyStruct;
ASSERT(pItemNotify->pItem);
CResourceEditorDoc* pDocument = GetDocument();
CXTPPropExchangeXMLNode* pResources = pDocument->m_pResources;
if (pItemNotify->pItem && pResources)
{
CResourceViewRecord* pRecord = (CResourceViewRecord*)pItemNotify->pItem->GetRecord();
CXTPPropExchangeXMLNode* ptrSectionString = pRecord->m_pSection;
if (ptrSectionString)
{
ptrSectionString->SetLoading(FALSE);
CString strValue = pItemNotify->pItem->GetCaption(0);
CString strSection = pRecord->m_resType == resString ? _T("value"): _T("caption");
#ifdef _UNICODE
CXTPPropExchangeXMLNode::PreformatString(strValue, TRUE);
PX_String(ptrSectionString, strSection, strValue);
#else
WCHAR lpszValue[1024];
lpszValue[0] = 0;
MultiByteToWideChar(GetDocument()->m_pLanguageInfo->nCodePage, 0,
strValue, -1, lpszValue, 1024);
BSTR bstrVal = (BSTR)&lpszValue;
PX_Bstr(ptrSectionString, strSection, bstrVal, NULL);
#endif
}
}
GetDocument()->SetModifiedFlag();
}
void CResourceEditorView::OnReportSelectionChanged(NMHDR * /*pNotifyStruct*/, LRESULT * /*result*/)
{
CXTPReportControl& wndReport = GetReportCtrl();
CXTPReportRow* pRow = wndReport.GetFocusedRow();
CResourceEditorDoc* pDocument = GetDocument();
CXTPPropExchangeXMLNode* pResources = pDocument->m_pResources;
if (pRow && pRow->GetRecord() && pResources)
{
CResourceViewRecord* pRecord = (CResourceViewRecord*)pRow->GetRecord();
if (pRecord->m_pBaseRecord) pRecord = pRecord->m_pBaseRecord;
DWORD dwId = pRecord->GetId();
if (pRecord->m_resType == resMenu && dwId)
{
((CMainFrame*)AfxGetMainWnd())->ShowMenuPreview(pResources, dwId, pDocument->m_pLanguageInfo);
}
else if (pRecord->m_resType == resDialog && dwId)
{
((CMainFrame*)AfxGetMainWnd())->ShowDialogPreview(pResources, dwId);
}
else
{
((CMainFrame*)AfxGetMainWnd())->ClearPreview();
}
}
else
{
((CMainFrame*)AfxGetMainWnd())->ClearPreview();
}
}
void CResourceEditorView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
if (!bActivate)
{
((CMainFrame*)AfxGetMainWnd())->ClearPreview();
}
CXTPReportView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}