improved debugger - some meaningful icons would be nice :)

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@79 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
fires.gc 2008-07-24 09:39:56 +00:00
parent dc631ab91f
commit 6c4573932b
5 changed files with 213 additions and 119 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Version="8,00"
Name="DebuggerWX"
ProjectGUID="{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}"
RootNamespace="DebuggerWX"
@ -446,6 +446,22 @@
>
</File>
</Filter>
<Filter
Name="Resources"
>
<File
RelativePath=".\resources\toolbar_add_breakpoint.c"
>
</File>
<File
RelativePath=".\resources\toolbar_add_memorycheck.c"
>
</File>
<File
RelativePath=".\resources\toolbar_delete.c"
>
</File>
</Filter>
<File
RelativePath=".\src\BreakPointDlg.cpp"
>

View File

@ -24,7 +24,6 @@
BEGIN_EVENT_TABLE(CBreakPointView, wxListCtrl)
END_EVENT_TABLE()
CBreakPointView::CBreakPointView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style)

View File

@ -35,14 +35,14 @@ enum
BEGIN_EVENT_TABLE(CCodeView, wxControl)
EVT_ERASE_BACKGROUND(CCodeView::OnErase)
EVT_PAINT(CCodeView::OnPaint)
EVT_LEFT_DOWN(CCodeView::OnMouseDown)
EVT_LEFT_UP(CCodeView::OnMouseUpL)
EVT_MOTION(CCodeView::OnMouseMove)
EVT_RIGHT_DOWN(CCodeView::OnMouseDown)
EVT_RIGHT_UP(CCodeView::OnMouseUpR)
EVT_MENU(-1, CCodeView::OnPopupMenu)
EVT_ERASE_BACKGROUND(CCodeView::OnErase)
EVT_PAINT(CCodeView::OnPaint)
EVT_LEFT_DOWN(CCodeView::OnMouseDown)
EVT_LEFT_UP(CCodeView::OnMouseUpL)
EVT_MOTION(CCodeView::OnMouseMove)
EVT_RIGHT_DOWN(CCodeView::OnMouseDown)
EVT_RIGHT_UP(CCodeView::OnMouseUpR)
EVT_MENU(-1, CCodeView::OnPopupMenu)
END_EVENT_TABLE()
CCodeView::CCodeView(DebugInterface* debuginterface, wxWindow* parent, wxWindowID Id, const wxSize& Size)

View File

@ -28,12 +28,15 @@
#include "wx/listctrl.h"
#include "wx/thread.h"
#include "wx/listctrl.h"
#include "wx/mstream.h"
#include "CodeWindow.h"
#include "CodeView.h"
#include "HW/CPU.h"
#include "PowerPC/PowerPC.h"
#include "Host.h"
#include "Debugger/PPCDebugInterface.h"
#include "Debugger/Debugger_SymbolMap.h"
@ -43,42 +46,15 @@
// ugly that this lib included code from the main
#include "../../DolphinWX/src/Globals.h"
class SymbolList
: public wxListCtrl
{
wxString OnGetItemText(long item, long column)
{
return(_T("hello"));
}
};
extern "C" {
#include "../resources/toolbar_add_breakpoint.c"
#include "../resources/toolbar_add_memorycheck.c"
#include "../resources/toolbar_delete.c"
}
enum
{
IDM_DEBUG_GO = 350,
IDM_STEP,
IDM_STEPOVER,
IDM_SKIP,
IDM_SETPC,
IDM_GOTOPC,
IDM_ADDRBOX,
IDM_CALLSTACKLIST,
IDM_SYMBOLLIST,
IDM_INTERPRETER,
IDM_DUALCORE,
IDM_LOGWINDOW,
IDM_REGISTERWINDOW,
IDM_BREAKPOINTWINDOW,
IDM_MEMORYWINDOW,
};
static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
BEGIN_EVENT_TABLE(CCodeWindow, wxFrame)
EVT_BUTTON(IDM_DEBUG_GO, CCodeWindow::OnCodeStep)
EVT_BUTTON(IDM_STEP, CCodeWindow::OnCodeStep)
EVT_BUTTON(IDM_STEPOVER, CCodeWindow::OnCodeStep)
EVT_BUTTON(IDM_SKIP, CCodeWindow::OnCodeStep)
EVT_BUTTON(IDM_SETPC, CCodeWindow::OnCodeStep)
EVT_BUTTON(IDM_GOTOPC, CCodeWindow::OnCodeStep)
EVT_TEXT(IDM_ADDRBOX, CCodeWindow::OnAddrBoxChange)
BEGIN_EVENT_TABLE(CCodeWindow, wxFrame)
EVT_LISTBOX(IDM_SYMBOLLIST, CCodeWindow::OnSymbolListChange)
EVT_LISTBOX(IDM_CALLSTACKLIST, CCodeWindow::OnCallstackListChange)
EVT_HOST_COMMAND(wxID_ANY, CCodeWindow::OnHostMessage)
@ -86,8 +62,23 @@ BEGIN_EVENT_TABLE(CCodeWindow, wxFrame)
EVT_MENU(IDM_REGISTERWINDOW, CCodeWindow::OnToggleRegisterWindow)
EVT_MENU(IDM_BREAKPOINTWINDOW, CCodeWindow::OnToggleBreakPointWindow)
EVT_MENU(IDM_MEMORYWINDOW, CCodeWindow::OnToggleMemoryWindow)
// toolbar
EVT_MENU(IDM_DEBUG_GO, CCodeWindow::OnCodeStep)
EVT_MENU(IDM_STEP, CCodeWindow::OnCodeStep)
EVT_MENU(IDM_STEPOVER, CCodeWindow::OnCodeStep)
EVT_MENU(IDM_SKIP, CCodeWindow::OnCodeStep)
EVT_MENU(IDM_SETPC, CCodeWindow::OnCodeStep)
EVT_MENU(IDM_GOTOPC, CCodeWindow::OnCodeStep)
EVT_TEXT(IDM_ADDRBOX, CCodeWindow::OnAddrBoxChange)
END_EVENT_TABLE()
#define wxGetBitmapFromMemory(name) _wxGetBitmapFromMemory(name, sizeof(name))
inline wxBitmap _wxGetBitmapFromMemory(const unsigned char* data, int length)
{
wxMemoryInputStream is(data, length);
return(wxBitmap(wxImage(is, wxBITMAP_TYPE_ANY, -1), -1));
}
CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter, wxWindow* parent, wxWindowID id,
const wxString& title, const wxPoint& pos, const wxSize& size, long style)
@ -95,67 +86,26 @@ CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter
, m_RegisterWindow(NULL)
, m_logwindow(NULL)
{
CreateMenu(_LocalCoreStartupParameter);
InitBitmaps();
wxBoxSizer* sizerBig = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL);
CreateGUIControls(_LocalCoreStartupParameter);
DebugInterface* di = new PPCDebugInterface();
sizerLeft->Add(callstack = new wxListBox(this, IDM_CALLSTACKLIST, wxDefaultPosition, wxSize(90, 100)), 0, wxEXPAND);
sizerLeft->Add(symbols = new wxListBox(this, IDM_SYMBOLLIST, wxDefaultPosition, wxSize(90, 100), 0, NULL, wxLB_SORT), 1, wxEXPAND);
codeview = new CCodeView(di, this, wxID_ANY);
sizerBig->Add(sizerLeft, 2, wxEXPAND);
sizerBig->Add(codeview, 5, wxEXPAND);
sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3);
sizerRight->Add(buttonGo = new wxButton(this, IDM_DEBUG_GO, _T("&Go")));
sizerRight->Add(buttonStep = new wxButton(this, IDM_STEP, _T("&Step")));
sizerRight->Add(buttonStepOver = new wxButton(this, IDM_STEPOVER, _T("Step &Over")));
sizerRight->Add(buttonSkip = new wxButton(this, IDM_SKIP, _T("Ski&p")));
sizerRight->Add(buttonGotoPC = new wxButton(this, IDM_GOTOPC, _T("G&oto PC")));
sizerRight->Add(addrbox = new wxTextCtrl(this, IDM_ADDRBOX, _T("")));
sizerRight->Add(new wxButton(this, IDM_SETPC, _T("S&et PC")));
SetSizer(sizerBig);
sizerLeft->SetSizeHints(this);
sizerLeft->Fit(this);
sizerRight->SetSizeHints(this);
sizerRight->Fit(this);
sizerBig->SetSizeHints(this);
sizerBig->Fit(this);
sync_event.Init();
// additional dialogs
if (IsLoggingActivated())
{
m_logwindow = new CLogWindow(this);
m_logwindow->Show(true);
}
m_RegisterWindow = new CRegisterWindow(this);
m_RegisterWindow->Show(true);
m_BreakpointWindow = new CBreakPointWindow(this, this);
m_BreakpointWindow->Show(true);
m_MemoryWindow = new CMemoryWindow(this);
m_MemoryWindow->Show(true);
// Create the toolbar
RecreateToolbar();
UpdateButtonStates();
int x,y,w,h;
// load ini...
int x,y,w,h;
IniFile file;
file.Load("Debugger.ini");
IniFile file;
file.Load("Debugger.ini");
file.Get("Code", "x", &x, GetPosition().x);
file.Get("Code", "y", &y, GetPosition().y);
file.Get("Code", "w", &w, GetSize().GetWidth());
file.Get("Code", "h", &h, GetSize().GetHeight());
this->SetSize(x, y, w, h);
file.Get("Code", "x", &x, GetPosition().x);
file.Get("Code", "y", &y, GetPosition().y);
file.Get("Code", "w", &w, GetSize().GetWidth());
file.Get("Code", "h", &h, GetSize().GetHeight());
this->SetSize(x, y, w, h);
// These really should be in the respective constructors.
if (m_BreakpointWindow) {
@ -192,6 +142,48 @@ CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter
}
void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStartupParameter)
{
CreateMenu(_LocalCoreStartupParameter);
wxBoxSizer* sizerBig = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL);
DebugInterface* di = new PPCDebugInterface();
sizerLeft->Add(callstack = new wxListBox(this, IDM_CALLSTACKLIST, wxDefaultPosition, wxSize(90, 100)), 0, wxEXPAND);
sizerLeft->Add(symbols = new wxListBox(this, IDM_SYMBOLLIST, wxDefaultPosition, wxSize(90, 100), 0, NULL, wxLB_SORT), 1, wxEXPAND);
codeview = new CCodeView(di, this, wxID_ANY);
sizerBig->Add(sizerLeft, 2, wxEXPAND);
sizerBig->Add(codeview, 5, wxEXPAND);
SetSizer(sizerBig);
sizerLeft->SetSizeHints(this);
sizerLeft->Fit(this);
sizerBig->SetSizeHints(this);
sizerBig->Fit(this);
sync_event.Init();
// additional dialogs
if (IsLoggingActivated())
{
m_logwindow = new CLogWindow(this);
m_logwindow->Show(true);
}
m_RegisterWindow = new CRegisterWindow(this);
m_RegisterWindow->Show(true);
m_BreakpointWindow = new CBreakPointWindow(this, this);
m_BreakpointWindow->Show(true);
m_MemoryWindow = new CMemoryWindow(this);
m_MemoryWindow->Show(true);
}
CCodeWindow::~CCodeWindow()
{
IniFile file;
@ -352,7 +344,8 @@ void CCodeWindow::OnCodeStep(wxCommandEvent& event)
void CCodeWindow::OnAddrBoxChange(wxCommandEvent& event)
{
wxString txt = addrbox->GetValue();
wxTextCtrl* pAddrCtrl = (wxTextCtrl*)GetToolBar()->FindControl(IDM_ADDRBOX);
wxString txt = pAddrCtrl->GetValue();
if (txt.size() == 8)
{
@ -417,30 +410,31 @@ void CCodeWindow::NotifyMapLoaded()
void CCodeWindow::UpdateButtonStates()
{
wxToolBarBase* toolBar = GetToolBar();
if (Core::GetState() == Core::CORE_UNINITIALIZED)
{
buttonGo->Enable(false);
buttonStep->Enable(false);
buttonStepOver->Enable(false);
buttonSkip->Enable(false);
toolBar->EnableTool(IDM_DEBUG_GO, false);
toolBar->EnableTool(IDM_STEP, false);
toolBar->EnableTool(IDM_STEPOVER, false);
toolBar->EnableTool(IDM_SKIP, false);
}
else
{
if (!CCPU::IsStepping())
{
buttonGo->SetLabel(_T("&Pause"));
buttonGo->Enable(true);
buttonStep->Enable(false);
buttonStepOver->Enable(false);
buttonSkip->Enable(false);
toolBar->SetToolShortHelp(IDM_DEBUG_GO, _T("&Pause"));
toolBar->EnableTool(IDM_DEBUG_GO, true);
toolBar->EnableTool(IDM_STEP, false);
toolBar->EnableTool(IDM_STEPOVER, false);
toolBar->EnableTool(IDM_SKIP, false);
}
else
{
buttonGo->SetLabel(_T("&Go"));
buttonGo->Enable(true);
buttonStep->Enable(true);
buttonStepOver->Enable(true);
buttonSkip->Enable(true);
toolBar->SetToolShortHelp(IDM_DEBUG_GO, _T("&Go"));
toolBar->EnableTool(IDM_DEBUG_GO, true);
toolBar->EnableTool(IDM_STEP, true);
toolBar->EnableTool(IDM_STEPOVER, true);
toolBar->EnableTool(IDM_SKIP, true);
}
}
}
@ -624,4 +618,58 @@ void CCodeWindow::OnHostMessage(wxCommandEvent& event)
}
}
void CCodeWindow::PopulateToolbar(wxToolBar* toolBar)
{
int w = m_Bitmaps[Toolbar_DebugGo].GetWidth(),
h = m_Bitmaps[Toolbar_DebugGo].GetHeight();
toolBar->SetToolBitmapSize(wxSize(w, h));
toolBar->AddTool(IDM_DEBUG_GO, _T("Go"), m_Bitmaps[Toolbar_DebugGo], _T("Delete the selected BreakPoint or MemoryCheck"));
toolBar->AddTool(IDM_STEP, _T("Step"), m_Bitmaps[Toolbar_Step], _T("Add BreakPoint..."));
toolBar->AddTool(IDM_STEPOVER, _T("Step Over"), m_Bitmaps[Toolbar_StepOver], _T("Add BreakPoint..."));
toolBar->AddTool(IDM_SKIP, _T("Skip"), m_Bitmaps[Toolbar_Skip], _T("Add BreakPoint..."));
toolBar->AddSeparator();
toolBar->AddTool(IDM_GOTOPC, _T("Goto PC"), m_Bitmaps[Toolbar_GotoPC], _T("Add BreakPoint..."));
toolBar->AddTool(IDM_SETPC, _T("Set PC"), m_Bitmaps[Toolbar_SetPC], _T("Add BreakPoint..."));
toolBar->AddSeparator();
toolBar->AddControl(new wxTextCtrl(toolBar, IDM_ADDRBOX, _T("")));
// after adding the buttons to the toolbar, must call Realize() to reflect
// the changes
toolBar->Realize();
}
void CCodeWindow::RecreateToolbar()
{
// delete and recreate the toolbar
wxToolBarBase* toolBar = GetToolBar();
delete toolBar;
SetToolBar(NULL);
long style = TOOLBAR_STYLE;
style &= ~(wxTB_HORIZONTAL | wxTB_VERTICAL | wxTB_BOTTOM | wxTB_RIGHT | wxTB_HORZ_LAYOUT | wxTB_TOP);
wxToolBar* theToolBar = CreateToolBar(style, ID_TOOLBAR);
PopulateToolbar(theToolBar);
SetToolBar(theToolBar);
}
void CCodeWindow::InitBitmaps()
{
// load original size 48x48
m_Bitmaps[Toolbar_DebugGo] = wxGetBitmapFromMemory(toolbar_delete_png);
m_Bitmaps[Toolbar_Step] = wxGetBitmapFromMemory(toolbar_add_breakpoint_png);
m_Bitmaps[Toolbar_StepOver] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
m_Bitmaps[Toolbar_Skip] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
m_Bitmaps[Toolbar_GotoPC] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
m_Bitmaps[Toolbar_SetPC] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
// scale to 16x16 for toolbar
for (size_t n = Toolbar_DebugGo; n < Bitmaps_max; n++)
{
m_Bitmaps[n] = wxBitmap(m_Bitmaps[n].ConvertToImage().Scale(16, 16));
}
}

View File

@ -56,6 +56,37 @@ class CCodeWindow
private:
enum
{
ID_TOOLBAR = 500,
IDM_DEBUG_GO,
IDM_STEP,
IDM_STEPOVER,
IDM_SKIP,
IDM_SETPC,
IDM_GOTOPC,
IDM_ADDRBOX,
IDM_CALLSTACKLIST,
IDM_SYMBOLLIST,
IDM_INTERPRETER,
IDM_DUALCORE,
IDM_LOGWINDOW,
IDM_REGISTERWINDOW,
IDM_BREAKPOINTWINDOW,
IDM_MEMORYWINDOW,
};
enum
{
Toolbar_DebugGo,
Toolbar_Step,
Toolbar_StepOver,
Toolbar_Skip,
Toolbar_GotoPC,
Toolbar_SetPC,
Bitmaps_max
};
// sub dialogs
CLogWindow* m_logwindow;
CRegisterWindow* m_RegisterWindow;
@ -67,13 +98,8 @@ class CCodeWindow
wxListBox* symbols;
Common::Event sync_event;
wxButton* buttonGo;
wxButton* buttonStep;
wxButton* buttonStepOver;
wxButton* buttonSkip;
wxButton* buttonGotoPC;
wxBitmap m_Bitmaps[Bitmaps_max];
wxTextCtrl* addrbox;
DECLARE_EVENT_TABLE()
void OnSymbolListChange(wxCommandEvent& event);
@ -90,6 +116,11 @@ class CCodeWindow
void CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter);
void UpdateButtonStates();
void RecreateToolbar();
void PopulateToolbar(wxToolBar* toolBar);
void InitBitmaps();
void CreateGUIControls(const SCoreStartupParameter& _LocalCoreStartupParameter);
};
#endif /*CODEWINDOW_*/