Skip to content

Commit

Permalink
More UI interactions implemented (#213)
Browse files Browse the repository at this point in the history
  • Loading branch information
uxmal committed Sep 19, 2016
1 parent 163a3be commit 5b40ede
Show file tree
Hide file tree
Showing 6 changed files with 662 additions and 815 deletions.
1 change: 0 additions & 1 deletion src/Decompiler/Scanning/VectorBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,6 @@ private List<Address> PostError(string err, Address addrInstr, Address addrTable
return new List<Address>();
}


public bool IsValidAddress(Address addr)
{
return program.SegmentMap.IsValidAddress(addr);
Expand Down
2 changes: 2 additions & 0 deletions src/Gui/Controls/IRadioButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ namespace Reko.Gui.Controls
{
public interface IRadioButton : IControl
{
event EventHandler CheckedChanged;

bool Checked { get; set; }
}
}
54 changes: 42 additions & 12 deletions src/Gui/Windows/Forms/JumpTableInteractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ public void Attach(JumpTableDialog dlg)
dlg.FormClosing += Dlg_FormClosing;
dlg.EntryCount.ValueChanged += EntryCount_ValueChanged;
dlg.Entries.SelectedIndexChanged += Entries_SelectedIndexChanged;
dlg.FarAddress.CheckedChanged += FarAddress_CheckedChanged;
dlg.RelativeAddress.CheckedChanged += RelativeAddress_CheckedChanged;
dlg.Offsets.CheckedChanged += Offsets_CheckedChanged;
}

private void EnableControls()
Expand All @@ -52,6 +55,22 @@ private void EnableControls()
dlg.IndirectLabel.Enabled = dlg.IsIndirectTable.Checked;
}

private void BuildAddressTable()
{
var vectorBuilder = new VectorBuilder(null, dlg.Program, null);
var addresses = new List<Address>();
Address addrTable;
if (dlg.Program.Platform.TryParseAddress(dlg.JumpTableStartAddress.Text, out addrTable))
{
var stride = TableStride();
var state = dlg.Program.Architecture.CreateProcessorState();
state.SetInstructionPointer(dlg.Instruction.Address);
addresses = vectorBuilder.BuildTable(addrTable, stride * (int)dlg.EntryCount.Value, null, stride, state);
}
dlg.Entries.DataSource = addresses;
dlg.Entries.SelectedIndex = addresses.Count - 1;
}

private void EnableSegmentedPanel(bool hasValue)
{
//foreach (Control control in dlg.SegmentedAddressPanel.Controls)
Expand Down Expand Up @@ -106,6 +125,8 @@ private void Dlg_Load(object sender, EventArgs e)
.Select(s => s.Name)
.OrderBy(s => s)
.ToList();
BuildAddressTable();
EnableControls();
}

private void Dlg_FormClosing(object sender, FormClosingEventArgs e)
Expand All @@ -121,20 +142,11 @@ private void Dlg_FormClosing(object sender, FormClosingEventArgs e)

private void EntryCount_ValueChanged(object sender, EventArgs e)
{
var vectorBuilder = new VectorBuilder(null, dlg.Program, null);
var addresses = new List<Address>();
Address addrTable;
if (dlg.Program.Platform.TryParseAddress(dlg.JumpTableStartAddress.Text, out addrTable))
{
var stride = TableStride();
var state = dlg.Program.Architecture.CreateProcessorState();
state.SetInstructionPointer(dlg.Instruction.Address);
addresses = vectorBuilder.BuildTable(addrTable, stride * (int) dlg.EntryCount.Value, null, stride, state);
}
dlg.Entries.DataSource = addresses;
dlg.Entries.SelectedIndex = addresses.Count - 1;
BuildAddressTable();
}



private void Entries_SelectedIndexChanged(object sender, EventArgs e)
{
var addr = (Address)dlg.Entries.SelectedItem;
Expand All @@ -156,6 +168,24 @@ private void Entries_SelectedIndexChanged(object sender, EventArgs e)

private void IsIndirectTable_CheckedChanged(object sender, EventArgs e)
{
BuildAddressTable();
EnableControls();
}

private void FarAddress_CheckedChanged(object sender, EventArgs e)
{
BuildAddressTable();
EnableControls();
}
private void RelativeAddress_CheckedChanged(object sender, EventArgs e)
{
BuildAddressTable();
EnableControls();
}

private void Offsets_CheckedChanged(object sender, EventArgs e)
{
BuildAddressTable();
EnableControls();
}
}
Expand Down
6 changes: 6 additions & 0 deletions src/Gui/Windows/RadioButtonWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ public RadioButtonWrapper(RadioButton rdb)
this.rdb = rdb;
}

public event EventHandler CheckedChanged
{
add { rdb.CheckedChanged += value; }
remove { rdb.CheckedChanged -= value; }
}

public bool Checked { get { return rdb.Checked; } set { rdb.Checked = value; } }
}
}
16 changes: 16 additions & 0 deletions src/UnitTests/Gui/Windows/Forms/JumpTableInteractorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,22 @@ private void Given_Table_UInt32(Address address, params uint[] entries)
}
}

private void Given_IndirectTable_UInt32(Address address, Address addrIndirect, params uint[] entries)
{
ImageSegment seg;
program.SegmentMap.Segments.TryGetValue(address, out seg);
var writer = new LeImageWriter(seg.MemoryArea, address);
foreach (uint entry in entries)
{
writer.WriteLeUInt32(entry);
}
writer = new LeImageWriter(seg.MemoryArea, addrIndirect);
for (int i = 0; i< entries.Length; ++i)
{
writer.WriteByte((byte)i);
}
}

private void Given_Disassembly(Address addr)
{
arch.Test_DisassemblyStream = new List<MachineInstruction>
Expand Down
Loading

0 comments on commit 5b40ede

Please sign in to comment.