rudimentary serch function added for the memory dialog

fixed the memory addressing bug in search

the search box almost works

search now works, however the strings in search window neeed a fix

fixed the address display in search results

search works

fixed review comments, except .rc

preadjust the button placement

fixed rc
This commit is contained in:
Nikita Filippov authored and Henrik Rydgård committed 2020-06-06 14:23:26 +02:00
1 parent c739d4e164
commit 021e783b4a
7 files changed
+197 -107

No files matched your search

+116 -84
View File
@@ -13,11 +13,15 @@
#include "Debugger_MemoryDlg.h"
#include "CtrlMemView.h"
#include "DebuggerShared.h"
#include "LogManager.h"
#include "winnt.h"
#include <WindowsX.h>
#include <algorithm>
RECT CMemoryDlg::slRect;
RECT CMemoryDlg::slRect; //sym list rect
FAR WNDPROC DefAddressEditProc;
FAR WNDPROC DefAddressEditProc;
HWND AddressEditParentHwnd = 0;
LRESULT CALLBACK AddressEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
@@ -58,22 +62,30 @@ CMemoryDlg::CMemoryDlg(HINSTANCE _hInstance, HWND _hParent, DebugInterface *_cpu
SetWindowText(m_hDlg,temp);
ShowWindow(m_hDlg,SW_HIDE);
CtrlMemView *ptr = CtrlMemView::getFrom(GetDlgItem(m_hDlg,IDC_MEMVIEW));
ptr->setDebugger(_cpu);
memViewHdl = GetDlgItem(m_hDlg, IDC_MEMVIEW);
symListHdl = GetDlgItem(m_hDlg, IDC_SYMBOLS);
searchBoxHdl = GetDlgItem(m_hDlg, IDC_SEARCH_BOX);
srcListHdl = GetDlgItem(m_hDlg, IDC_SEARCH_RESULTS);
memView = CtrlMemView::getFrom(memViewHdl);
memView->setDebugger(_cpu);
Button_SetCheck(GetDlgItem(m_hDlg,IDC_RAM), TRUE);
Button_SetCheck(GetDlgItem(m_hDlg,IDC_MODESYMBOLS), TRUE);
GetWindowRect(GetDlgItem(m_hDlg,IDC_SYMBOLS),&slRect);
GetWindowRect(symListHdl, &slRect);
GetWindowRect(srcListHdl, &srRect);
// subclass the edit box
HWND editWnd = GetDlgItem(m_hDlg,IDC_ADDRESS);
editWnd = GetDlgItem(m_hDlg,IDC_ADDRESS);
DefAddressEditProc = (WNDPROC)GetWindowLongPtr(editWnd,GWLP_WNDPROC);
SetWindowLongPtr(editWnd,GWLP_WNDPROC,(LONG_PTR)AddressEditProc);
AddressEditParentHwnd = m_hDlg;
Size();
}
}
CMemoryDlg::~CMemoryDlg(void)
@@ -84,22 +96,33 @@ void CMemoryDlg::Update(void)
{
if (m_hDlg != NULL)
{
CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(m_hDlg,IDC_MEMVIEW));
if (mv != NULL)
mv->redraw();
if (memView != NULL)
memView->redraw();
}
}
void CMemoryDlg::searchBoxRedraw(std::vector<u32> results) {
int index;
wchar_t temp[256];
SendMessage(srcListHdl, WM_SETREDRAW, FALSE, 0);
ListBox_ResetContent(srcListHdl);
for (int i = 0; i < results.size(); i++) {
wsprintf(temp, L"0x%08X", results[i]);
index = (int)ListBox_AddString(srcListHdl,temp);
ListBox_SetItemData(srcListHdl, index, results[i]);
}
SendMessage(srcListHdl, WM_SETREDRAW, TRUE, 0);
RedrawWindow(srcListHdl, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
void CMemoryDlg::NotifyMapLoaded()
{
if (m_hDlg)
{
HWND list = GetDlgItem(m_hDlg,IDC_SYMBOLS);
if (g_symbolMap)
g_symbolMap->FillSymbolListBox(list, ST_DATA);
HWND lb = GetDlgItem(m_hDlg,IDC_REGIONS);
int sel = ComboBox_GetCurSel(lb);
ComboBox_ResetContent(lb);
g_symbolMap->FillSymbolListBox(symListHdl,ST_DATA);
int sel = ComboBox_GetCurSel(memViewHdl);
ComboBox_ResetContent(memViewHdl);
/*
for (int i = 0; i < cpu->getMemMap()->numRegions; i++)
{
@@ -107,84 +130,91 @@ void CMemoryDlg::NotifyMapLoaded()
int n = ComboBox_AddString(lb,cpu->getMemMap()->regions[i].name);
ComboBox_SetItemData(lb,n,cpu->getMemMap()->regions[i].start);
}*/
ComboBox_SetCurSel(lb,sel>=0?sel:0);
ComboBox_SetCurSel(memViewHdl,sel>=0?sel:0);
}
Update();
}
BOOL CMemoryDlg::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
{
CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(m_hDlg,IDC_MEMVIEW));
switch (LOWORD(wParam))
switch(message){
case WM_COMMAND:{
HWND lb = GetDlgItem(m_hDlg, LOWORD(wParam));
switch (LOWORD(wParam)){
case IDC_REGIONS:
switch (HIWORD(wParam)) {
case LBN_DBLCLK:{
int n = ComboBox_GetCurSel(lb);
if (n!=-1){
unsigned int addr = (unsigned int)ComboBox_GetItemData(lb,n);
memView->gotoAddr(addr);
}
}
break;
};
break;
case IDC_SYMBOLS:
switch (HIWORD(wParam)) {
case LBN_DBLCLK:{
int n = ListBox_GetCurSel(lb);
if (n!=-1) {
unsigned int addr = (unsigned int)ListBox_GetItemData(lb,n);
memView->gotoAddr(addr);
}
}
break;
};
case IDC_SEARCH_RESULTS:
switch (HIWORD(wParam)) {
case LBN_DBLCLK: {
int n = ListBox_GetCurSel(lb);
if (n != -1) {
unsigned int addr = (unsigned int)ListBox_GetItemData(lb, n);
memView->gotoAddr(addr);
}
}
break;
};
break;
case IDC_SHOWOFFSETS:
switch (HIWORD(wParam))
{
case IDC_REGIONS:
switch (HIWORD(wParam))
{
case LBN_DBLCLK:
{
HWND lb = GetDlgItem(m_hDlg,LOWORD(wParam));
int n = ComboBox_GetCurSel(lb);
if (n!=-1)
{
unsigned int addr = (unsigned int)ComboBox_GetItemData(lb,n);
mv->gotoAddr(addr);
}
}
break;
};
case BN_CLICKED:
if (SendDlgItemMessage(m_hDlg, IDC_SHOWOFFSETS, BM_GETCHECK, 0, 0))
memView->toggleOffsetScale(On);
else
memView->toggleOffsetScale(Off);
break;
case IDC_SYMBOLS:
switch (HIWORD(wParam))
{
case LBN_DBLCLK:
{
HWND lb = GetDlgItem(m_hDlg,LOWORD(wParam));
int n = ListBox_GetCurSel(lb);
if (n!=-1)
{
unsigned int addr = (unsigned int)ListBox_GetItemData(lb,n);
mv->gotoAddr(addr);
}
}
break;
};
break;
case IDC_SHOWOFFSETS:
switch (HIWORD(wParam))
{
case BN_CLICKED:
if (SendDlgItemMessage(m_hDlg, IDC_SHOWOFFSETS, BM_GETCHECK, 0, 0))
mv->toggleOffsetScale(On);
else
mv->toggleOffsetScale(Off);
break;
}
break;
case IDC_BUTTON_SEARCH:
switch (HIWORD(wParam))
{
case BN_CLICKED:
wchar_t temp[256];
GetWindowText(searchBoxHdl, temp, 255);
std::vector<u32> results = memView->searchString(ConvertWStringToUTF8(temp).c_str());
if (results.size() > 0){
searchBoxRedraw(results);
}
break;
}
}
}
break;
case WM_DEB_MAPLOADED:
NotifyMapLoaded();
break;
case WM_DEB_GOTOADDRESSEDIT:
{
CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(m_hDlg,IDC_MEMVIEW));
case WM_DEB_GOTOADDRESSEDIT:{
wchar_t temp[256];
u32 addr;
GetWindowText(GetDlgItem(m_hDlg,IDC_ADDRESS),temp,255);
GetWindowText(editWnd,temp,255);
if (parseExpression(ConvertWStringToUTF8(temp).c_str(),cpu,addr) == false) {
displayExpressionError(m_hDlg);
} else {
mv->gotoAddr(addr);
SetFocus(GetDlgItem(m_hDlg,IDC_MEMVIEW));
memView->gotoAddr(addr);
SetFocus(memViewHdl);
}
break;
}
@@ -198,6 +228,7 @@ BOOL CMemoryDlg::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
return TRUE;
}
break;
case WM_SIZE:
Size();
break;
@@ -212,9 +243,8 @@ BOOL CMemoryDlg::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
void CMemoryDlg::Goto(u32 addr)
{
Show(true);
CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(CMemoryDlg::m_hDlg,IDC_MEMVIEW));
mv->gotoAddr(addr);
SetFocus(GetDlgItem(CMemoryDlg::m_hDlg,IDC_MEMVIEW));
memView->gotoAddr(addr);
SetFocus(memViewHdl);
}
@@ -222,15 +252,17 @@ void CMemoryDlg::Size()
{
const float fontScale = 1.0f / g_dpi_scale_real_y;
RECT rc;
GetClientRect(m_hDlg,&rc);
int dw=rc.right-rc.left;
int dh=rc.bottom-rc.top;
HWND memView = GetDlgItem(m_hDlg, IDC_MEMVIEW);
HWND symList = GetDlgItem(m_hDlg, IDC_SYMBOLS);
GetClientRect(m_hDlg,&winRect);
int dlg_w = winRect.right - winRect.left;
int dlg_h = winRect.bottom - winRect.top;
int wf = slRect.right-slRect.left;
int w = dw - 3 * fontScale - wf;
int w = dlg_w - 3 * fontScale - wf*2;
int top = 48 * fontScale;
MoveWindow(symList,0,top,wf,dh-top,TRUE);
MoveWindow(memView,wf+4,top,w,dh-top,TRUE);
int height = dlg_h - top;
//HWND, X, Y, width, height, repaint
MoveWindow(symListHdl, 0 ,top, wf, height, TRUE);
MoveWindow(memViewHdl, wf+4 ,top, w, height, TRUE);
MoveWindow(srcListHdl, wf + 4 + w+ 4, top, wf-4, height, TRUE);
}