DragonNest/Third/XTToolkitPro/Samples/SkinFramework/SkinMDISample/SkinPropertyPageThemes.cpp
2024-12-19 09:48:26 +08:00

396 lines
9.6 KiB
C++

// SkinPropertyPageThemes.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "SkinPropertyPageThemes.h"
#include "SkinPropertySheet.h"
#include "MainFrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSkinPropertyPageThemes property page
CSkinPropertyPageThemes::CSkinPropertyPageThemes() : CPropertyPage(CSkinPropertyPageThemes::IDD)
{
//{{AFX_DATA_INIT(CSkinPropertyPageThemes)
m_nSchema = 3;
m_nLocalSkins = 0;
m_bApplyMetrics = TRUE;
m_bApplyColors = TRUE;
m_bApplyFrame = TRUE;
m_nTheme = xtpThemeNativeWinXP;
//}}AFX_DATA_INIT
}
CSkinPropertyPageThemes::~CSkinPropertyPageThemes()
{
}
void CSkinPropertyPageThemes::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSkinPropertyPageThemes)
DDX_Control(pDX, IDC_LIST_THEMES, m_lboxSkins);
DDX_Control(pDX, IDC_COMBO_FONTS, m_cmbFonts);
DDX_Control(pDX, IDC_COMBO_COLORS, m_cmbColors);
DDX_Radio(pDX, IDC_RADIO_OFFICE2000, m_nTheme);
DDX_Radio(pDX, IDC_RADIO_OFFICE2007, m_nSchema);
DDX_Radio(pDX, IDC_RADIO_SKINPATH, m_nLocalSkins);
DDX_Check(pDX, IDC_CHECK_APPLYMETRICS, m_bApplyMetrics);
DDX_Check(pDX, IDC_CHECK_APPLYFRAME, m_bApplyFrame);
DDX_Check(pDX, IDC_CHECK_APPLYCOLORS, m_bApplyColors);
//}}AFX_DATA_MAP
}
IMPLEMENT_DYNCREATE(CSkinPropertyPageThemes, CPropertyPage)
BEGIN_MESSAGE_MAP(CSkinPropertyPageThemes, CPropertyPage)
//{{AFX_MSG_MAP(CSkinPropertyPageThemes)
ON_BN_CLICKED(IDC_RADIO_OFFICE2007, OnRadioSchema)
ON_BN_CLICKED(IDC_RADIO_LUNA, OnRadioSchema)
ON_BN_CLICKED(IDC_RADIO_ROYALE, OnRadioSchema)
ON_BN_CLICKED(IDC_RADIO_VISTA, OnRadioSchema)
ON_BN_CLICKED(IDC_RADIO_DEFAULT, OnRadioSchema)
ON_BN_CLICKED(IDC_RADIO_SKINPATH, ReloadThemes)
ON_LBN_SELCHANGE(IDC_LIST_THEMES, OnSelChangeListThemes)
ON_CBN_SELCHANGE(IDC_COMBO_COLORS, OnSelChangeComboColors)
ON_CBN_SELCHANGE(IDC_COMBO_FONTS, OnSelChangeComboFonts)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CHECK_APPLYMETRICS, OnCheckApplyMetrics)
ON_BN_CLICKED(IDC_CHECK_APPLYFRAME, OnCheckApplyFrame)
ON_BN_CLICKED(IDC_CHECK_APPLYCOLORS, OnCheckApplyColors)
ON_BN_CLICKED(IDC_RADIO_SKINPATH2, ReloadThemes)
ON_BN_CLICKED(IDC_RADIO_OFFICE2000, OnThemeChanged)
ON_BN_CLICKED(IDC_RADIO_OFFICE2003, OnThemeChanged)
ON_BN_CLICKED(IDC_RADIO_OFFICEXP, OnThemeChanged)
ON_BN_CLICKED(IDC_RADIO_WINTHEME, OnThemeChanged)
ON_BN_CLICKED(IDC_RADIO_OFFICE2003_BLUE, OnThemeChangedLuna)
ON_BN_CLICKED(IDC_RADIO_OFFICE2003_OLIVE, OnThemeChangedLuna)
ON_BN_CLICKED(IDC_RADIO_OFFICE2003_METALLIC, OnThemeChangedLuna)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CSkinPropertyPageThemes::OnRadioSchema()
{
UpdateData();
((CMainFrame*)AfxGetMainWnd())->OnShemaChanged(m_nSchema);
}
void CSkinPropertyPageThemes::EnumerateThemeColors(CXTPSkinManagerResourceFile* pFile, LPCTSTR lpszResourcePath, LPCTSTR lpszThemeName)
{
THEME* pTheme= new THEME;
pTheme->strResourcePath = lpszResourcePath;
CString str;
CString strIniFile;
CString csColorSchemes;
CString csSizes;
while(pFile->ReadString(str))
{
str.TrimLeft();
if (str.IsEmpty())
continue;
if (str[1] == _T(';'))
continue;
if (str.Left(5).CompareNoCase(_T("[file")) == 0)
{
strIniFile = str.Mid(6, str.GetLength() - 7) + _T(".ini");
csColorSchemes.Empty();
csSizes.Empty();
}
else if (str[1] == _T('['))
{
strIniFile.Empty();
csColorSchemes.Empty();
csSizes.Empty();
}
else if (!strIniFile.IsEmpty())
{
int nPos = str.Find(_T('='));
if (nPos > 0 && str.Left(12).CompareNoCase(_T("ColorSchemes")) == 0)
{
csColorSchemes = str.Mid(nPos + 1);
csColorSchemes.TrimLeft();
}
if (nPos > 0 && str.Left(5).CompareNoCase(_T("Sizes")) == 0)
{
csSizes = str.Mid(nPos + 1);
csSizes.TrimLeft();
}
if (!csSizes.IsEmpty() && !csColorSchemes.IsEmpty())
{
THEMEINFO* pThemeInfo = new THEMEINFO();
pThemeInfo->csIniFileName = strIniFile;
pThemeInfo->csColorSchemes = csColorSchemes;
pThemeInfo->csSizes = csSizes;
pThemeInfo->pTheme = pTheme;
pTheme->m_arrThemes.Add(pThemeInfo);
strIniFile.Empty();
}
}
}
if (pTheme->m_arrThemes.GetSize() == 0)
{
delete pTheme;
return;
}
int nIndex = m_lboxSkins.AddString(lpszThemeName);
m_lboxSkins.SetItemDataPtr(nIndex, pTheme);
}
void CSkinPropertyPageThemes::EnumerateThemes(CString strResourcePath)
{
CXTPSkinManagerResourceFile f;
if (!f.Open(strResourcePath, _T("Themes.ini")))
return;
TCHAR szSkinName[256];
if (::LoadString(f.GetModuleHandle(), 5000, szSkinName, 256))
{
EnumerateThemeColors(&f, strResourcePath, szSkinName);
return;
}
}
void CSkinPropertyPageThemes::FindThemes(CString strPath, BOOL bRecurse)
{
CFileFind f;
BOOL bNext = f.FindFile(strPath + _T("*.*"));
while(bNext)
{
bNext = f.FindNextFile();
if (f.IsDots())
continue;
if (f.IsDirectory())
{
if (bRecurse)
{
FindThemes(f.GetFilePath() + "\\", TRUE);
}
}
else
{
CString strExtension = f.GetFileName().Right(9);
if ((strExtension.CompareNoCase(_T(".msstyles")) == 0) || (strExtension.CompareNoCase(_T(".cjstyles")) == 0))
{
EnumerateThemes(f.GetFilePath());
}
}
}
m_lboxSkins.SetCurSel(-1);
}
BOOL CSkinPropertyPageThemes::OnInitDialog()
{
CPropertyPage::OnInitDialog();
ReloadThemes();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CSkinPropertyPageThemes::ReleaseThemes()
{
for (int i = 0; i < m_lboxSkins.GetCount(); i++)
{
THEME* pTheme = (THEME*)m_lboxSkins.GetItemDataPtr(i);
for (int j = 0; j < pTheme->m_arrThemes.GetSize(); j++)
{
delete pTheme->m_arrThemes[j];
}
delete pTheme;
}
m_lboxSkins.ResetContent();
m_cmbFonts.ResetContent();
m_cmbColors.ResetContent();
}
void CSkinPropertyPageThemes::ReloadThemes()
{
UpdateData();
ReleaseThemes();
if (m_nLocalSkins == 0)
{
CString csStylesPath = CMainFrame::GetStylesPath();
FindThemes(csStylesPath, FALSE);
}
else
{
CString csStylesPath;
GetWindowsDirectory(csStylesPath.GetBuffer(MAX_PATH), MAX_PATH);
csStylesPath.ReleaseBuffer();
FindThemes(csStylesPath + _T("\\Resources\\Themes\\"), TRUE);
}
}
void CSkinPropertyPageThemes::OnSelChangeListThemes()
{
m_cmbColors.ResetContent();
m_cmbFonts.ResetContent();
int nCurSel = m_lboxSkins.GetCurSel();
if (nCurSel == LB_ERR)
return;
THEME* pTheme = (THEME*)m_lboxSkins.GetItemDataPtr(nCurSel);
for (int i = 0; i < pTheme->m_arrThemes.GetSize(); i++)
{
THEMEINFO* pThemeInfo = pTheme->m_arrThemes[i];
if (m_cmbColors.FindStringExact(-1, pThemeInfo->csColorSchemes) == LB_ERR)
{
int nIndex = m_cmbColors.AddString(pThemeInfo->csColorSchemes);
m_cmbColors.SetItemDataPtr(nIndex, pThemeInfo);
}
if (m_cmbFonts.FindStringExact(-1, pThemeInfo->csSizes) == LB_ERR)
{
int nIndex = m_cmbFonts.AddString(pThemeInfo->csSizes);
m_cmbFonts.SetItemDataPtr(nIndex, pThemeInfo);
}
}
m_cmbColors.SetCurSel(0);
m_cmbFonts.SetCurSel(0);
OnSelChangeComboColors();
}
void CSkinPropertyPageThemes::SetTheme(int nColor, int nFont)
{
UpdateData();
if (nColor == LB_ERR)
return;
THEMEINFO* pThemeInfo = (THEMEINFO*)m_cmbColors.GetItemDataPtr(nColor);
CString csColorSchemes = pThemeInfo->csColorSchemes;
CString csSizes;
if (nFont != LB_ERR && m_bApplyMetrics)
{
THEMEINFO* pThemeInfo = (THEMEINFO*)m_cmbFonts.GetItemDataPtr(nFont);
csSizes = pThemeInfo->csSizes;
}
THEME* pTheme = pThemeInfo->pTheme;
for (int i = 0; i < pTheme->m_arrThemes.GetSize(); i++)
{
THEMEINFO* pThemeInfo = pTheme->m_arrThemes[i];
if (pThemeInfo->csColorSchemes == csColorSchemes &&
(csSizes.IsEmpty() || pThemeInfo->csSizes == csSizes))
{
XTPSkinManager()->LoadSkin(pTheme->strResourcePath, pThemeInfo->csIniFileName);
break;
}
}
CMainFrame* pWnd = (CMainFrame*)AfxGetMainWnd();
pWnd->OnSkinChanged();
pWnd->RedrawFrame(this);
}
void CSkinPropertyPageThemes::OnSelChangeComboColors()
{
SetTheme(m_cmbColors.GetCurSel(), m_cmbFonts.GetCurSel());
}
void CSkinPropertyPageThemes::OnSelChangeComboFonts()
{
SetTheme(m_cmbColors.GetCurSel(), m_cmbFonts.GetCurSel());
}
void CSkinPropertyPageThemes::OnDestroy()
{
ReleaseThemes();
CPropertyPage::OnDestroy();
}
void CSkinPropertyPageThemes::OnCheckApplyMetrics()
{
UpdateData();
DWORD dwApplyOptions = XTPSkinManager()->GetApplyOptions();
if (m_bApplyMetrics)
XTPSkinManager()->SetApplyOptions(dwApplyOptions | xtpSkinApplyMetrics);
else
XTPSkinManager()->SetApplyOptions(dwApplyOptions & ~xtpSkinApplyMetrics);
m_cmbFonts.EnableWindow(m_bApplyMetrics);
}
void CSkinPropertyPageThemes::OnCheckApplyFrame()
{
UpdateData();
DWORD dwApplyOptions = XTPSkinManager()->GetApplyOptions();
if (m_bApplyFrame)
XTPSkinManager()->SetApplyOptions(dwApplyOptions | xtpSkinApplyFrame);
else
XTPSkinManager()->SetApplyOptions(dwApplyOptions & ~xtpSkinApplyFrame);
}
void CSkinPropertyPageThemes::OnCheckApplyColors()
{
UpdateData();
DWORD dwApplyOptions = XTPSkinManager()->GetApplyOptions();
if (m_bApplyColors)
XTPSkinManager()->SetApplyOptions(dwApplyOptions | xtpSkinApplyColors);
else
XTPSkinManager()->SetApplyOptions(dwApplyOptions & ~xtpSkinApplyColors);
}
void CSkinPropertyPageThemes::OnThemeChanged()
{
XTPColorManager()->SetLunaTheme(xtpSystemThemeAuto);
UpdateData();
CMainFrame* pWnd = (CMainFrame*)AfxGetMainWnd();
pWnd->SetTheme(m_nTheme);
}
void CSkinPropertyPageThemes::OnThemeChangedLuna()
{
UpdateData();
XTPColorManager()->SetLunaTheme(XTPCurrentSystemTheme(xtpSystemThemeBlue + m_nTheme - 4));
CMainFrame* pWnd = (CMainFrame*)AfxGetMainWnd();
pWnd->SetTheme(xtpThemeOffice2003);
}