static void RegModify( a_window *wnd, int row, int piece ) { int i; item_mach value; reg_window *reg = WndReg( wnd ); bool ok; mad_radix old_radix; reg_display_piece disp; mad_type_info tinfo; mad_modify_list const *possible; int num_possible; if( row < 0 ) return; piece >>= 1; i = GetRegIdx( reg, row, piece ); if( i == -1 ) return; if( !GetDisplayPiece( &disp, reg, DbgRegs, i ) ) return; if( disp.reginfo == NULL ) return; if( MADRegSetDisplayModify( reg->data, disp.reginfo, &possible, &num_possible ) != MS_OK ) return; old_radix = NewCurrRadix( MADTypePreferredRadix( disp.disp_type ) ); MADRegFullName( disp.reginfo, ".", TxtBuff, TXT_LEN ); RegValue( &value, disp.reginfo, DbgRegs ); if( num_possible == 1 ) { ok = DlgMadTypeExpr( TxtBuff, &value, disp.disp_type ); if( ok ) { RegNewValue( disp.reginfo, &value, possible->type ); } } else { for( i = 0; i < num_possible; ++i ) { MADTypeInfo( possible[i].type, &tinfo ); if( memcmp( &value, possible[i].data, tinfo.b.bits / BITS_PER_BYTE ) == 0 ) { break; } } if( num_possible == 2 ) { if( i == 0 ) { i = 1; } else { i = 0; } } else { //MJC const cast i = DlgPickWithRtn( TxtBuff, possible, i, RegValueName, num_possible ); } if( i != -1 ) { RegNewValue( disp.reginfo, possible[i].data, possible[i].type ); } } NewCurrRadix( old_radix ); }
static void InitChangeRegisterDialog(HWND hwnd,LPARAM lparam) { RegModifyData *data; char *name; unsigned len; mad_radix radix; mad_type_info mti; mad_type_info cmp; char s[255]; RECT p_rect; RECT c_rect; HWND field; int i; unsigned max_len; HDC dc; TEXTMETRIC tm; HWND cancel; SetWindowLong( hwnd, DWL_USER, (LONG)lparam); data = (RegModifyData *)lparam; len = MADRegFullName( data->curr_info, ".", NULL, 0 ); if( len > 0 ) { name = alloca( ( len + 1 ) * sizeof( char ) ); MADRegFullName( data->curr_info, ".", name, len ); SetWindowText( hwnd, name ); } else { SetWindowText( hwnd, "" ); } if( data->num_possible == 1 ) { field = GetDlgItem( hwnd, REG_EDIT_FIELD ); } else { field = GetDlgItem( hwnd, CH_REG_COMBO_LIST ); } SetMonoFont( field ); GetChildPos( hwnd, field, &c_rect); dc = GetDC( field ); GetTextMetrics( dc, &tm ); MADTypeInfo( data->th, &mti ); radix = MADTypePreferredRadix( data->th ); if( data->num_possible == 1 ) { if( data->maxv == 0 ) { len = 255; } else { len = data->maxv; } MADTypeToString( radix, &mti, data->curr_value, s, &len ); if( data->maxv == 0 ) { max_len = strlen( s ); } else { max_len = data->maxv; } SetDlgItemText(hwnd,REG_EDIT_FIELD,s); } else { MADTypeInfo( data->curr_info->type, &cmp ); max_len = 0; for( i = 0; i < data->num_possible; i++ ) { if( data->m_list[i].name == MAD_MSTR_NIL ) { len = sizeof( s ); MADTypeToString( radix, &mti, data->m_list[i].data, s, &len ); } else { MADCliString( data->m_list[i].name, s, sizeof( s ) ); } if( max_len < strlen( s ) ) max_len = strlen( s ); SendDlgItemMessage( hwnd, CH_REG_COMBO_LIST, CB_ADDSTRING, 0, (LPARAM)s ); if( memcmp( data->curr_value, data->m_list[i].data, cmp.b.bits / BITS_PER_BYTE ) == 0 ){ SendDlgItemMessage( hwnd, CH_REG_COMBO_LIST, CB_SETCURSEL, (WPARAM)i, 0 ); } } c_rect.bottom += SendMessage( field, CB_GETITEMHEIGHT, 0, 0 ) * (i + 1); } max_len *= tm.tmMaxCharWidth; if( max_len > c_rect.right ) { max_len -= max_len%2; GetWindowRect( hwnd, &p_rect ); p_rect.right -= p_rect.left; p_rect.bottom -= p_rect.top; p_rect.left -= ( max_len - c_rect.right )/2; p_rect.right += ( max_len - c_rect.right ); MoveWindow( hwnd, p_rect.left, p_rect.top, p_rect.right, p_rect.bottom, FALSE ); cancel = GetDlgItem( hwnd, IDCANCEL ); GetChildPos( hwnd, cancel, &p_rect ); p_rect.left += ( max_len - c_rect.right ); MoveWindow( cancel, p_rect.left, p_rect.top, p_rect.right, p_rect.bottom, FALSE ); c_rect.right = max_len; } ReleaseDC( field, dc ); MoveWindow( field, c_rect.left, c_rect.top, c_rect.right, c_rect.bottom, FALSE ); }