Files
FC1/Editor/PreferencesDialog.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

284 lines
7.9 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2003.
// -------------------------------------------------------------------------
// File name: PreferencesDialog.cpp
// Version: v1.00
// Created: 28/10/2003 by Timur.
// Compilers: Visual Studio.NET
// Description: Editor Preferences Dialog.
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PreferencesDialog.h"
#include "PreferencesPropertyPage.h"
#include "PreferencesStdPages.h"
#include "Settings.h"
#include "DisplaySettings.h"
// CPreferencesDialog dialog
IMPLEMENT_DYNAMIC(CPreferencesDialog, CXTResizeDialog)
/////////////////////////////////////////////////////////////////////////////
// CPreferencesDialog dialog
CPreferencesDialog::CPreferencesDialog(CWnd* pParent /*=NULL*/)
: CXTResizeDialog(CPreferencesDialog::IDD, pParent)
{
m_pSelected = NULL;
static bool bAlreadyRegistered = false;
if (!bAlreadyRegistered)
{
bAlreadyRegistered = true;
GetIEditor()->GetClassFactory()->RegisterClass( new CStdPreferencesClassDesc );
}
}
CPreferencesDialog::~CPreferencesDialog()
{}
void CPreferencesDialog::DoDataExchange(CDataExchange* pDX)
{
CXTResizeDialog::DoDataExchange(pDX);
DDX_Control( pDX,IDC_LIST_OPTIONS,m_wndTree );
//{{AFX_DATA_MAP(CPreferencesDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPreferencesDialog, CXTResizeDialog)
//{{AFX_MSG_MAP(CPreferencesDialog)
ON_WM_SYSCOMMAND()
ON_WM_SIZE()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(TVN_GETDISPINFO, IDC_LIST_OPTIONS, OnGetdispinfoListOptions)
ON_NOTIFY(TVN_SELCHANGED, IDC_LIST_OPTIONS, OnSelchangedListOptions)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPreferencesDialog message handlers
//////////////////////////////////////////////////////////////////////////
BOOL CPreferencesDialog::OnInitDialog()
{
CXTResizeDialog::OnInitDialog();
CRect rcWorkspace;
GetDlgItem(IDC_WORKSPACE)->GetWindowRect(rcWorkspace);
GetDlgItem(IDC_WORKSPACE)->ShowWindow( SW_HIDE );
ScreenToClient(rcWorkspace);
//m_imgList.Create(IDB_PREFERENCES, 16, 4, RGB(0, 0xFF, 0));
CMFCUtils::LoadTrueColorImageList( m_imgList,IDB_PREFERENCES,16,RGB(0xFF,0,0xFF) );
m_wndTree.SetImageList(&m_imgList, TVSIL_NORMAL);
CreatePages( rcWorkspace );
FillTree();
SetResize( IDC_WORKSPACE,SZ_RESIZE(1) );
SetResize( IDC_LIST_OPTIONS,SZ_VERRESIZE(1) );
SetResize( IDC_LINE,CXTResizeRect(0,1,1,1) );
SetResize( IDOK,SZ_REPOS(1) );
SetResize( IDCANCEL,SZ_REPOS(1) );
AutoLoadPlacement( "Dialogs\\Preferences" );
return TRUE; // return TRUE unless you set the focus to a control
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::OnSize( UINT nType,int cx,int cy )
{
CXTResizeDialog::OnSize( nType,cx,cy );
if (m_pSelected && m_pSelected->pWnd->GetSafeHwnd())
{
CRect rcWorkspace;
GetDlgItem(IDC_WORKSPACE)->GetWindowRect(rcWorkspace);
ScreenToClient(rcWorkspace);
m_pSelected->pWnd->MoveWindow( rcWorkspace );
m_pSelected->pWnd->RedrawWindow( );
}
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::OnGetdispinfoListOptions(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
if (pTVDispInfo->item.mask & (TVIF_SELECTEDIMAGE | TVIF_IMAGE))
{
if (m_wndTree.GetChildItem(pTVDispInfo->item.hItem) != NULL)
{
UINT nState = m_wndTree.GetItemState(pTVDispInfo->item.hItem, TVIF_STATE);
pTVDispInfo->item.iSelectedImage = pTVDispInfo->item.iImage = nState & TVIS_EXPANDED? 3: 2;
}
else
{
//ASSERT(m_pSelected);
pTVDispInfo->item.iSelectedImage = pTVDispInfo->item.iImage =
(m_pSelected == (PageInfo*)pTVDispInfo->item.lParam? 0: 1);
}
}
*pResult = 0;
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::OnSelchangedListOptions(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
//if (pNMTreeView->itemNew.lParam == 0)
//return;
if (pNMTreeView->itemNew.hItem)
{
PageInfo* pInfo = (PageInfo*)pNMTreeView->itemNew.lParam;
if (!pInfo)
{
// Select first child.
HTREEITEM hChildItem = m_wndTree.GetChildItem(pNMTreeView->itemNew.hItem);
if (hChildItem)
pInfo = (PageInfo*)m_wndTree.GetItemData(hChildItem);
}
if (pInfo != m_pSelected && pInfo)
{
//ASSERT(pPage);
//ASSERT(pPage->IsKindOf(RUNTIME_CLASS(CXTPPropertyGrid)));
CRect rcWorkspace;
GetDlgItem(IDC_WORKSPACE)->GetWindowRect(rcWorkspace);
ScreenToClient(rcWorkspace);
pInfo->pWnd->MoveWindow( rcWorkspace );
pInfo->pWnd->ShowWindow(SW_SHOW);
pInfo->pWnd->EnableWindow();
pInfo->pWnd->ModifyStyle(0, WS_TABSTOP);
if (m_pSelected)
{
m_pSelected->pWnd->ShowWindow(SW_HIDE);
}
m_pSelected = pInfo;
//m_pSelected = (CPropertyGridEx*)pPage;
m_wndTree.Invalidate(FALSE);
}
HTREEITEM hItemParent = m_wndTree.GetParentItem(pNMTreeView->itemNew.hItem);
if (m_pSelected != NULL && hItemParent)
{
m_wndTree.SetItemData(hItemParent, (DWORD)m_pSelected);
}
}
*pResult = 0;
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::OnOK()
{
// Call on OK for all pages.
for (int i = 0; i < m_pagesInfo.size(); i++)
{
m_pagesInfo[i]->pPage->OnOK();
}
// Save settings.
gSettings.Save();
GetIEditor()->GetDisplaySettings()->SaveRegistry();
CXTResizeDialog::OnOK();
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::OnCancel()
{
int i;
// QueryCancel for all pages.
for (i = 0; i < m_pagesInfo.size(); i++)
{
if (!m_pagesInfo[i]->pPage->OnQueryCancel())
return;
}
// Call on OK for all pages.
for (i = 0; i < m_pagesInfo.size(); i++)
{
m_pagesInfo[i]->pPage->OnCancel();
}
CXTResizeDialog::OnCancel();
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::CreatePages( const CRect &rc )
{
std::vector<IClassDesc*> classes;
GetIEditor()->GetClassFactory()->GetClassesBySystemID( ESYSTEM_CLASS_PREFERENCE_PAGE,classes );
for (int i = 0; i < classes.size(); i++)
{
IUnknown *pUnknown = classes[i];
IPreferencesPageCreator *pPageCreator = 0;
if (FAILED(pUnknown->QueryInterface( &pPageCreator )))
continue;
int numPages = pPageCreator->GetPagesCount();
for (int pindex = 0; pindex < numPages; pindex++)
{
IPreferencesPage *pPage = pPageCreator->CreatePage( pindex,rc,this );
if (!pPage)
continue;
PageInfo *pInfo = new PageInfo;
pInfo->pPage = pPage;
pInfo->pWnd = pPage->GetWindow();
assert( pInfo->pWnd );
if (!pInfo->pWnd)
continue;
pInfo->category = pPage->GetCategory();
pInfo->title = pPage->GetTitle();
m_pagesInfo.push_back( pInfo );
}
}
}
//////////////////////////////////////////////////////////////////////////
void CPreferencesDialog::FillTree()
{
m_wndTree.SetRedraw(FALSE);
m_wndTree.DeleteAllItems();
std::map<CString,HTREEITEM,stl::less_stricmp<CString> > categoryMap;
for (int i = 0; i < m_pagesInfo.size(); i++)
{
PageInfo *pInfo = m_pagesInfo[i];
HTREEITEM hCategory = stl::find_in_map( categoryMap,pInfo->category,(HTREEITEM)0 );
if (!hCategory)
{
// Make category.
hCategory = m_wndTree.InsertItem( pInfo->category,I_IMAGECALLBACK,I_IMAGECALLBACK );
categoryMap[pInfo->category] = hCategory;
m_wndTree.Expand( hCategory,TVE_EXPAND );
}
HTREEITEM hItem = m_wndTree.InsertItem( pInfo->title,I_IMAGECALLBACK,I_IMAGECALLBACK,hCategory );
m_wndTree.SetItemData( hItem,(DWORD_PTR)pInfo );
m_wndTree.Expand( hItem,TVE_EXPAND );
m_wndTree.Expand( hCategory,TVE_EXPAND );
}
m_wndTree.Expand( TVI_ROOT,TVE_EXPAND );
m_wndTree.SetRedraw(TRUE);
}