Ejemplo n.º 1
0
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];
	}
}
Ejemplo n.º 2
0
void CtrlBreakpointList::OnRightClick(int itemIndex, int column, const POINT& point)
{
	showBreakpointMenu(itemIndex,point);
}