📄 options.cpp
字号:
/*-----------------------------------------------------------------------------
6502 Macroassembler and Simulator
Copyright (C) 1995-2003 Michal Kowalski
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-----------------------------------------------------------------------------*/
// Options.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "Options.h"
#include "ConfigSettings.h"
static const char *HELP_FILE_6502= "6502.hlp";
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern void AFX_CDECL DDX_HexDec(CDataExchange* pDX, int nIDC, unsigned int &num, bool bWord= true);
/////////////////////////////////////////////////////////////////////////////
// COptions
IMPLEMENT_DYNAMIC(COptions, CPropertySheet)
/*
COptions::COptions(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
: CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
}
COptions::COptions(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
: CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
}
*/
COptions::COptions(CWnd* pParentWnd, UINT iSelectPage)
: CPropertySheet(ID, pParentWnd, iSelectPage)
{
m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_HASHELP | PSH_USECALLBACK;
m_psh.pfnCallback = &PropSheetProc;
AddPage(&m_SymPage);
AddPage(&m_AsmPage);
AddPage(&m_EditPage);
AddPage(&m_DeasmPage);
AddPage(&m_MarksPage);
AddPage(&m_ViewPage);
m_nLastActivePageIndex = iSelectPage;
}
COptions::~COptions()
{
}
int CALLBACK COptions::PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
{
if (uMsg == PSCB_INITIALIZED && ::IsWindow(hwndDlg))
CWnd::FromHandle(hwndDlg)->ModifyStyleEx(0, WS_EX_CONTEXTHELP); // w彻czenie pomocy kontekstowej
return 0;
}
int COptions::GetLastActivePage()
{
return m_nLastActivePageIndex;
}
BEGIN_MESSAGE_MAP(COptions, CPropertySheet)
//{{AFX_MSG_MAP(COptions)
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COptions message handlers
BOOL COptions::OnCommand(WPARAM wParam, LPARAM lParam)
{
m_nLastActivePageIndex = GetActiveIndex();
return CPropertySheet::OnCommand(wParam, lParam);
}
/////////////////////////////////////////////////////////////////////////////
// COptionsSymPage property page
IMPLEMENT_DYNCREATE(COptionsSymPage, CPropertyPage)
COptionsSymPage::COptionsSymPage() : CPropertyPage(COptionsSymPage::IDD)
{
//{{AFX_DATA_INIT(COptionsSymPage)
m_nIOAddress = 0;
m_bIOEnable = FALSE;
m_nFinish = -1;
m_nWndWidth = 0;
m_nWndHeight = 0;
m_bProtectMemory = FALSE;
m_nProtFromAddr = 0;
m_nProtToAddr = 0;
//}}AFX_DATA_INIT
}
COptionsSymPage::~COptionsSymPage()
{
}
/*
static void AFX_CDECL DDX_Hex(CDataExchange* pDX, int nIDC, unsigned int &hex)
{
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
TCHAR szT[32];
if (pDX->m_bSaveAndValidate)
{
::GetWindowText(hWndCtrl, szT, sizeof(szT)/sizeof(szT[0]));
if (sscanf(szT, _T("%X"),&hex) <= 0)
{
AfxMessageBox(IDS_MSG_HEX_STR);
pDX->Fail(); // throws exception
}
}
else
{
wsprintf(szT,_T("%04X"),hex);
::SetWindowText(hWndCtrl, szT);
}
}
*/
void COptionsSymPage::DoDataExchange(CDataExchange* pDX)
{
if (!pDX->m_bSaveAndValidate)
{
CSpinButtonCtrl *pCols;
pCols = (CSpinButtonCtrl *) GetDlgItem(IDC_OPT_SYM_W_SPIN);
ASSERT(pCols != NULL);
pCols->SetRange(1, 255); // ilo滄 kolumn terminala
CSpinButtonCtrl *pRows;
pRows = (CSpinButtonCtrl *) GetDlgItem(IDC_OPT_SYM_H_SPIN);
ASSERT(pRows != NULL);
pRows->SetRange(1, 255); // ilo滄 wierszy terminala
}
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COptionsSymPage)
DDX_Check(pDX, IDC_OPT_SYM_IO_ENABLE, m_bIOEnable);
DDX_Radio(pDX, IDC_OPT_SYM_FIN_BRK, m_nFinish);
DDX_Text(pDX, IDC_OPT_SYM_IO_WND_W, m_nWndWidth);
DDX_Text(pDX, IDC_OPT_SYM_IO_WND_H, m_nWndHeight);
DDX_Check(pDX, IDC_OPT_SYM_PROTECT_MEM, m_bProtectMemory);
//}}AFX_DATA_MAP
DDX_HexDec(pDX, IDC_OPT_SYM_IO_ADDR, m_nIOAddress);
DDV_MinMaxUInt(pDX, m_nIOAddress, 0, 65535);
DDX_HexDec(pDX, IDC_OPT_SYM_PROT_FROM, m_nProtFromAddr);
DDV_MinMaxUInt(pDX, m_nProtFromAddr, 0, 0xffff);
DDX_HexDec(pDX, IDC_OPT_SYM_PROT_TO, m_nProtToAddr);
DDV_MinMaxUInt(pDX, m_nProtToAddr, 0, 0xffff);
}
BEGIN_MESSAGE_MAP(COptionsSymPage, CPropertyPage)
//{{AFX_MSG_MAP(COptionsSymPage)
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COptionsSymPage message handlers
/////////////////////////////////////////////////////////////////////////////
// COptionsEditPage property page
IMPLEMENT_DYNCREATE(COptionsEditPage, CPropertyPage)
COptionsEditPage::COptionsEditPage() : CPropertyPage(COptionsEditPage::IDD)
{
//{{AFX_DATA_INIT(COptionsEditPage)
m_bAutoIndent = FALSE;
m_nTabStep = 0;
m_bAutoSyntax = FALSE;
m_bAutoUppercase = FALSE;
m_bFileNew = FALSE;
m_nElement = 0;
//}}AFX_DATA_INIT
m_bColorChanged = false;
}
COptionsEditPage::~COptionsEditPage()
{
}
void COptionsEditPage::DoDataExchange(CDataExchange* pDX)
{
if (!pDX->m_bSaveAndValidate)
{
CSpinButtonCtrl *pTab;
pTab = (CSpinButtonCtrl *) GetDlgItem(IDC_OPT_ED_TAB_SPIN);
ASSERT(pTab != NULL);
pTab->SetRange(2,32); // krok tabulatora z zakresu 2..32
}
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COptionsEditPage)
DDX_Control(pDX, IDC_OPT_ED_BOLD_FONT, m_btnBold);
DDX_Control(pDX, IDC_OPT_ED_COLOR, m_btnColor);
DDX_Control(pDX, IDC_OPT_ED_ELEMENT, m_wndElement);
DDX_Control(pDX, IDC_OPT_ED_EXAMPLE, m_wndExample);
DDX_Check(pDX, IDC_OPT_ED_AUTO_INDENT, m_bAutoIndent);
DDX_Text(pDX, IDC_OPT_ED_TAB_STEP, m_nTabStep);
DDV_MinMaxInt(pDX, m_nTabStep, 2, 32);
DDX_Check(pDX, IDC_OPT_ED_AUTO_SYNTAX, m_bAutoSyntax);
DDX_Check(pDX, IDC_OPT_ED_AUTO_UPPER_CASE, m_bAutoUppercase);
DDX_Check(pDX, IDC_OPT_ED_NEW_FILE, m_bFileNew);
DDX_CBIndex(pDX, IDC_OPT_ED_ELEMENT, m_nElement);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COptionsEditPage, CPropertyPage)
//{{AFX_MSG_MAP(COptionsEditPage)
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
ON_EN_CHANGE(IDC_OPT_ED_TAB_STEP, OnChangeTabStep)
ON_BN_CLICKED(IDC_OPT_ED_COLOR_SYNTAX, OnColorSyntax)
ON_CBN_SELCHANGE(IDC_OPT_ED_ELEMENT, OnSelChangeElement)
ON_BN_CLICKED(IDC_OPT_ED_COLOR, OnEditColor)
ON_BN_CLICKED(IDC_OPT_ED_BOLD_FONT, OnBoldFont)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COptionsEditPage message handlers
BOOL COptionsEditPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// copy color settings
m_wndExample.m_rgbInstruction = *CConfigSettings::color_syntax[0];
m_wndExample.m_rgbDirective = *CConfigSettings::color_syntax[1];
m_wndExample.m_rgbComment = *CConfigSettings::color_syntax[2];
m_wndExample.m_rgbNumber = *CConfigSettings::color_syntax[3];
m_wndExample.m_rgbString = *CConfigSettings::color_syntax[4];
m_wndExample.m_rgbSelection = *CConfigSettings::color_syntax[5];
m_wndExample.m_vbBold[0] = *CConfigSettings::syntax_font_style[0];
m_wndExample.m_vbBold[1] = *CConfigSettings::syntax_font_style[1];
m_wndExample.m_vbBold[2] = *CConfigSettings::syntax_font_style[2];
m_wndExample.m_vbBold[3] = *CConfigSettings::syntax_font_style[3];
m_wndExample.m_vbBold[4] = *CConfigSettings::syntax_font_style[4];
OnSelChangeElement();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL COptionsEditPage::OnSetActive()
{
// copy font settings
m_wndExample.m_hEditorFont = COptionsViewPage::m_Text[0].font;
m_wndExample.m_rgbBackground = COptionsViewPage::m_Text[0].bkgnd;
m_wndExample.m_rgbText = COptionsViewPage::m_Text[0].text;
return CPropertyPage::OnSetActive();
}
void COptionsEditPage::OnChangeTabStep()
{
}
void COptionsEditPage::OnColorSyntax()
{
}
void COptionsEditPage::OnBoldFont()
{
if (bool* pBold= GetFontStyle())
{
*pBold = m_btnBold.GetCheck() > 0;
m_wndExample.Invalidate();
m_bColorChanged = true;
}
}
bool* COptionsEditPage::GetFontStyle(int nIndex)
{
if (nIndex >= 0 && nIndex < 5)
return &m_wndExample.m_vbBold[nIndex];
return 0;
}
bool* COptionsEditPage::GetFontStyle()
{
return GetFontStyle(m_wndElement.GetCurSel());
}
void COptionsEditPage::OnEditColor()
{
if (COLORREF* pColor= COptionsEditPage::GetColorElement())
{
CColorDialog dlg(*pColor, CC_FULLOPEN);
if (dlg.DoModal() == IDOK && *pColor != dlg.GetColor())
{
*pColor = dlg.GetColor();
m_btnColor.Invalidate();
m_wndExample.Invalidate();
m_bColorChanged = true;
}
}
}
void COptionsEditPage::OnSelChangeElement()
{
if (COLORREF* p= GetColorElement())
m_btnColor.SetColorRef(p);
if (bool* pBold= GetFontStyle())
{
m_btnBold.EnableWindow();
m_btnBold.SetCheck(*pBold ? 1 : 0);
}
else
{
m_btnBold.EnableWindow(false);
m_btnBold.SetCheck(0);
}
}
COLORREF* COptionsEditPage::GetColorElement(int nIndex)
{
switch (nIndex)
{
case 0:
return &m_wndExample.m_rgbInstruction;
case 1:
return &m_wndExample.m_rgbDirective;
case 2:
return &m_wndExample.m_rgbComment;
case 3:
return &m_wndExample.m_rgbNumber;
case 4:
return &m_wndExample.m_rgbString;
case 5:
return &m_wndExample.m_rgbSelection;
default:
return 0;
}
}
COLORREF* COptionsEditPage::GetColorElement()
{
return GetColorElement(m_wndElement.GetCurSel());
}
/////////////////////////////////////////////////////////////////////////////
// COptionsAsmPage property page
IMPLEMENT_DYNCREATE(COptionsAsmPage, CPropertyPage)
COptionsAsmPage::COptionsAsmPage() : CPropertyPage(COptionsAsmPage::IDD)
{
//{{AFX_DATA_INIT(COptionsAsmPage)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -