void CtrlBreakpointList::handleNotify(LPARAM lParam) { const LPNMHDR header = (LPNMHDR)lParam; if (header->code == NM_DBLCLK) { const LPNMITEMACTIVATE item = (LPNMITEMACTIVATE) lParam; gotoBreakpointAddress(item->iItem); return; } if (header->code == NM_RCLICK) { const LPNMITEMACTIVATE item = (LPNMITEMACTIVATE)lParam; showBreakpointMenu(item->iItem, item->ptAction); return; } if (header->code == LVN_GETDISPINFO) { NMLVDISPINFO *dispInfo = (NMLVDISPINFO *)lParam; bool isMemory; int index = getBreakpointIndex(dispInfo->item.iItem,isMemory); if (index == -1) return; breakpointText = L""; switch (dispInfo->item.iSubItem) { case BPL_TYPE: { if (isMemory) { switch (displayedMemChecks_[index].cond) { case MEMCHECK_READ: breakpointText = L"Read"; break; case MEMCHECK_WRITE: breakpointText = L"Write"; break; case MEMCHECK_READWRITE: breakpointText = L"Read/Write"; break; } } else { breakpointText = L"Execute"; } } break; case BPL_OFFSET: { wchar_t temp[256]; if (isMemory) { wsprintf(temp,L"0x%08X",displayedMemChecks_[index].start); } else { wsprintf(temp,L"0x%08X",displayedBreakPoints_[index].addr); } breakpointText = temp; } break; case BPL_SIZELABEL: { if (isMemory) { auto mc = displayedMemChecks_[index]; wchar_t temp[256]; if (mc.end == 0) wsprintf(temp,L"0x%08X",1); else wsprintf(temp,L"0x%08X",mc.end-mc.start); breakpointText = temp; } else { const char* sym = cpu->findSymbolForAddress(displayedBreakPoints_[index].addr); if (sym != NULL) { breakpointText = ConvertUTF8ToWString(sym); } else { breakpointText = L"-"; } } } break; case BPL_OPCODE: { if (isMemory) { breakpointText = L"-"; } else { char temp[256]; disasm->getOpcodeText(displayedBreakPoints_[index].addr, temp); breakpointText = ConvertUTF8ToWString(temp); } } break; case BPL_CONDITION: { if (isMemory || displayedBreakPoints_[index].hasCond == false) { breakpointText = L"-"; } else { breakpointText = ConvertUTF8ToWString(displayedBreakPoints_[index].cond.expressionString); } } break; case BPL_HITS: { if (isMemory) { wchar_t temp[256]; wsprintf(temp,L"%d",displayedMemChecks_[index].numHits); breakpointText = temp; } else { breakpointText = L"-"; } } break; case BPL_ENABLED: { if (isMemory) { breakpointText = displayedMemChecks_[index].result & MEMCHECK_BREAK ? L"True" : L"False"; } else { breakpointText = displayedBreakPoints_[index].enabled ? L"True" : L"False"; } } break; default: return; } if (breakpointText.empty()) breakpointText = L"Invalid"; dispInfo->item.pszText = &breakpointText[0]; } }
void CtrlBreakpointList::OnRightClick(int itemIndex, int column, const POINT& point) { showBreakpointMenu(itemIndex,point); }