📄 sectiongeneralpage.cpp
字号:
//####COPYRIGHTBEGIN####// // ----------------------------------------------------------------------------// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.//// This program is part of the eCos host tools.//// 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.//// ----------------------------------------------------------------------------// //####COPYRIGHTEND####//=================================================================//// SectionGeneralPage.cpp//// Memory Layout Tool section general property page class////=================================================================//#####DESCRIPTIONBEGIN####//// Author(s): John Dallaway// Contact(s): jld// Date: 1998/07/29 $RcsDate$ {or whatever}// Version: 0.00+ $RcsVersion$ {or whatever}// Purpose: Provides a derivation of the MFC CeCosPropertyPage class for// general section property selection// See also: SectionGeneralPage.h// Known bugs: <UPDATE_ME_AT_RELEASE_TIME>////####DESCRIPTIONEND#####include "stdafx.h"#include "ConfigtoolDoc.h"#include "SectionGeneralPage.h"#include "ConfigTool.h"#include "CTUtils.h"#include "memmap.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CSectionGeneralPage property pageIMPLEMENT_DYNCREATE(CSectionGeneralPage, CeCosPropertyPage)CSectionGeneralPage::CSectionGeneralPage() : CeCosPropertyPage(CSectionGeneralPage::IDD){ //{{AFX_DATA_INIT(CSectionGeneralPage) m_strFinalRelativeName = _T(""); m_strNameUser = _T(""); m_strNameLinker = _T(""); m_nAlignment = 0; m_strFinalAddress = _T(""); m_strSectionSize = _T(""); //}}AFX_DATA_INIT m_bFinalAbsolute = TRUE;}CSectionGeneralPage::~CSectionGeneralPage(){}void CSectionGeneralPage::DoDataExchange(CDataExchange* pDX){ CeCosPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSectionGeneralPage) DDX_Control(pDX, IDC_SECTION_GENERAL_ALIGNMENT, m_cboAlignment); DDX_Control(pDX, IDC_SECTION_GENERAL_NAME_USER, m_edtNameUser); DDX_Control(pDX, IDC_SECTION_GENERAL_NAME_LINKER, m_cboNameLinker); DDX_Control(pDX, IDC_SECTION_GENERAL_FINAL_ABSOLUTE_ADDRESS, m_edtFinalAddress); DDX_Control(pDX, IDC_SECTION_GENERAL_FINAL_RELATIVE_NAME, m_cboFinalRelativeName); DDX_Control(pDX, IDC_SECTION_GENERAL_KNOWN_SIZE, m_btnSectionSizeKnown); DDX_Control(pDX, IDC_SECTION_GENERAL_SIZE, m_edtSectionSize); DDX_Control(pDX, IDC_SECTION_GENERAL_FINAL_RELATIVE, m_btnFinalRelative); DDX_Control(pDX, IDC_SECTION_GENERAL_FINAL_ABSOLUTE, m_btnFinalAbsolute); DDX_Control(pDX, IDC_SECTION_GENERAL_NAME_LINKER_DEFINED, m_btnNameLinkerDefined); DDX_Control(pDX, IDC_SECTION_GENERAL_NAME_USER_DEFINED, m_btnNameUserDefined); DDX_CBString(pDX, IDC_SECTION_GENERAL_FINAL_RELATIVE_NAME, m_strFinalRelativeName); DDX_Text(pDX, IDC_SECTION_GENERAL_NAME_USER, m_strNameUser); DDX_CBString(pDX, IDC_SECTION_GENERAL_NAME_LINKER, m_strNameLinker); DDX_CBIndex(pDX, IDC_SECTION_GENERAL_ALIGNMENT, m_nAlignment); DDX_Text(pDX, IDC_SECTION_GENERAL_FINAL_ABSOLUTE_ADDRESS, m_strFinalAddress); DDX_Text(pDX, IDC_SECTION_GENERAL_SIZE, m_strSectionSize); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSectionGeneralPage, CeCosPropertyPage) //{{AFX_MSG_MAP(CSectionGeneralPage) ON_BN_CLICKED(IDC_SECTION_GENERAL_KNOWN_SIZE, OnSectionSizeKnown) ON_BN_CLICKED(IDC_SECTION_GENERAL_FINAL_RELATIVE, OnSectionGeneralFinalType) ON_BN_CLICKED(IDC_SECTION_GENERAL_NAME_LINKER_DEFINED, OnSectionGeneralNameType) ON_BN_CLICKED(IDC_SECTION_GENERAL_FINAL_ABSOLUTE, OnSectionGeneralFinalType) ON_BN_CLICKED(IDC_SECTION_GENERAL_NAME_USER_DEFINED, OnSectionGeneralNameType) //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSectionGeneralPage message handlersvoid CSectionGeneralPage::OnSectionSizeKnown() { // enable size edit box according to 'size known' check box m_edtSectionSize.EnableWindow (m_btnSectionSizeKnown.GetCheck () && (! m_bNameLinkerDefined));}void CSectionGeneralPage::OnSectionGeneralFinalType() { // enable/disable dialog controls according to absolute/relative radio button state m_bFinalAbsolute = m_btnFinalAbsolute.GetCheck(); m_edtFinalAddress.EnableWindow (m_bFinalAbsolute); m_cboFinalRelativeName.EnableWindow (! m_bFinalAbsolute); // m_cboFinalRelativeVMA.EnableWindow (! m_bFinalAbsolute); FIXME disabled for now (remove ?) if (m_cboAlignment.IsWindowEnabled () && m_bFinalAbsolute) m_cboAlignment.SetCurSel (0); // reset to 1 byte alignment m_cboAlignment.EnableWindow (! m_bFinalAbsolute);}BOOL CSectionGeneralPage::OnInitDialog() { using namespace std; CeCosPropertyPage::OnInitDialog(); mem_map * lpMemoryMap = & CConfigTool::GetConfigToolDoc()->MemoryMap; // copy current and unused section names into the linker-defined section names combo box for (list <string>::iterator name = lpMemoryMap->linker_defined_section_list.begin (); name != lpMemoryMap->linker_defined_section_list.end (); ++name) if (! lpMemoryMap->section_exists (name->c_str ()) || // section name is unused (m_bNameLinkerDefined && (m_strNameLinker == name->c_str ()))) // or section name is that of the current section m_cboNameLinker.AddString (CString(name->c_str ())); // select the initial name in the combo box if (m_bNameLinkerDefined && (m_strNameLinker != _T(""))) // the current selection is linker defined m_cboNameLinker.SetCurSel (m_cboNameLinker.FindString (-1, m_strNameLinker)); else if (m_cboNameLinker.GetCount () > 0) // there are names in the combo box m_cboNameLinker.SetCurSel (0); // select the first name else // there are no names in the combo m_btnNameLinkerDefined.EnableWindow (FALSE); // disable the linker-defined section radio button // select the initial section name type radio button if ((! m_bNameLinkerDefined) || (m_cboNameLinker.GetCount () == 0)) { m_btnNameUserDefined.SetCheck (1); // user-defined section if (m_bNameLinkerDefined) m_dwSectionSize = 0; // default section size for new sections m_btnSectionSizeKnown.SetCheck (m_dwSectionSize > 0); // of known size } else m_btnNameLinkerDefined.SetCheck (1); // linker-defined section OnSectionGeneralNameType (); // refresh the state of other controls // copy section names into the relative name combo box for (list <mem_section>::iterator section = lpMemoryMap->section_list.begin (); section != lpMemoryMap->section_list.end (); ++section) if ((((section->size !=0) || (section->linker_defined)) && // eliminate user-defined sections of unknown size ((m_bNameLinkerDefined && (m_strNameLinker == _T(""))) || // if not a new section ((section->final_location->following_section == NULL) && // eliminate sections with used anchors ((section->relocates) || (section->initial_location->following_section == NULL)))) && // eliminate sections already used as final anchors unless a new section (section->name.c_str () != m_strNameLinker) && // eliminate the current section (section->name.c_str () != m_strNameUser)) || // eliminate the current section ((!m_bFinalAbsolute) && (m_strFinalRelativeName == section->name.c_str()))) // or section name is the current final relative name m_cboFinalRelativeName.AddString (CString(section->name.c_str ())); // select the initial name in the combo box if ((! m_bFinalAbsolute) && (m_strFinalRelativeName != _T(""))) m_cboFinalRelativeName.SetCurSel (m_cboFinalRelativeName.FindString (-1, m_strFinalRelativeName)); else if (m_cboFinalRelativeName.GetCount () > 0) // there are names in the combo box m_cboFinalRelativeName.SetCurSel (0); // select the first name else m_btnFinalRelative.EnableWindow (FALSE); // disable the relative type radio button // select the initial final location type radio button if (m_bFinalAbsolute) m_btnFinalAbsolute.SetCheck (1); else m_btnFinalRelative.SetCheck (1); OnSectionGeneralFinalType (); // refresh the state of the other controls return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE}void CSectionGeneralPage::OnSectionGeneralNameType() { // enable/disable dialog controls according to linker/user defined radio button state m_bNameLinkerDefined = m_btnNameLinkerDefined.GetCheck (); m_cboNameLinker.EnableWindow (m_bNameLinkerDefined); m_edtNameUser.EnableWindow (! m_bNameLinkerDefined); m_btnSectionSizeKnown.EnableWindow (! m_bNameLinkerDefined); OnSectionSizeKnown (); // update state of section size edit box}BOOL CSectionGeneralPage::OnKillActive() { using namespace std; if (! UpdateData (TRUE)) return FALSE; if (! m_bNameLinkerDefined) { if ((m_strNameUser == _T("")) || (m_strNameUser.FindOneOf (LD_ILLEGAL_CHARS) != -1)) { AfxMessageBox (IDS_VALIDATE_SECTION_NAME); m_edtNameUser.SetFocus (); return FALSE; } mem_map * lpMemoryMap = & CConfigTool::GetConfigToolDoc()->MemoryMap; for (list <string>::iterator name = lpMemoryMap->linker_defined_section_list.begin (); name != lpMemoryMap->linker_defined_section_list.end (); ++name) if (m_strNameUser == name->c_str ()) // the user-defined name clashes with a linker-defined name { AfxMessageBox (IDS_VALIDATE_SECTION_NAME_CLASH); m_edtNameUser.SetFocus (); m_edtNameUser.SetSel (0, -1); // select all text return FALSE; } } // convert address and alignment information to a DWORD representation CString strAlignment; m_cboAlignment.GetLBText (m_nAlignment, strAlignment); _stscanf (strAlignment, _T("%lx"), &m_dwAlignment); if (m_bFinalAbsolute) { TCHAR lpszDummy [2]; if (_stscanf (m_strFinalAddress, _T("%lx%1s"), &m_dwFinalAddress, lpszDummy) != 1) { AfxMessageBox (IDS_VALIDATE_SECTION_START_ADDRESS); m_edtFinalAddress.SetFocus (); m_edtFinalAddress.SetSel (0, -1); // select all text return FALSE; } } // convert section size to a DWORD representation if ((! m_bNameLinkerDefined) && m_btnSectionSizeKnown.GetCheck ()) { TCHAR lpszDummy [2]; if (_stscanf (m_strSectionSize, _T("%lx%1s"), &m_dwSectionSize, lpszDummy) != 1) { AfxMessageBox (IDS_VALIDATE_SECTION_SIZE); m_edtSectionSize.SetFocus (); m_edtSectionSize.SetSel (0, -1); // select all text return FALSE; } } else m_dwSectionSize = 0; return CeCosPropertyPage::OnKillActive();}BOOL CSectionGeneralPage::OnSetActive() { // generate hex strings for display if ((m_bNameLinkerDefined && (m_strNameLinker == _T(""))) || ((! m_bNameLinkerDefined) && (m_strNameUser == _T("")))) // a new section { m_strFinalAddress = _T(""); m_strSectionSize = _T(""); } else if (m_bFinalAbsolute) m_strFinalAddress.Format (_T("%08lX"), m_dwFinalAddress); if (m_bNameLinkerDefined || (m_dwSectionSize == 0)) m_strSectionSize == _T(""); else m_strSectionSize.Format (_T("%lX"), m_dwSectionSize); if (m_bFinalAbsolute) m_nAlignment = 0; else { CString strAlignment; strAlignment.Format (_T("%08lX"), m_dwAlignment); m_nAlignment = m_cboAlignment.FindString (-1, strAlignment); } if (! UpdateData (FALSE)) return FALSE; return CeCosPropertyPage::OnSetActive();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -