1
0
mirror of https://github.com/fadden/6502bench.git synced 2025-02-20 06:29:04 +00:00

Wire up References panel

Output to DataGrid is working.  Don't yet handle double-clicks or
preserve column widths.
This commit is contained in:
Andy McFadden 2019-06-09 18:09:00 -07:00
parent 814ab97c4d
commit 0c682e9cff
4 changed files with 158 additions and 26 deletions

View File

@ -42,7 +42,7 @@ namespace SourceGenWPF {
/// LineListGen object. /// LineListGen object.
/// ///
/// NOTE: it may or may not be possible to implement this trivially with an /// NOTE: it may or may not be possible to implement this trivially with an
/// ObservedCollection. At an earlier iteration it wasn't, and I'd like to keep this /// ObservableCollection. At an earlier iteration it wasn't, and I'd like to keep this
/// around even if it is now possible, in case the pendulum swings back the other way. /// around even if it is now possible, in case the pendulum swings back the other way.
/// </remarks> /// </remarks>
public class DisplayList : IList<DisplayList.FormattedParts>, IList, public class DisplayList : IList<DisplayList.FormattedParts>, IList,
@ -156,6 +156,9 @@ namespace SourceGenWPF {
OnPropertyChanged(CountString); OnPropertyChanged(CountString);
OnPropertyChanged(IndexerName); OnPropertyChanged(IndexerName);
OnCollectionReset(); OnCollectionReset();
// Not strictly necessary, but does free up the memory sooner.
SelectedIndices = new DisplayListSelection();
} }
public bool Contains(FormattedParts item) { public bool Contains(FormattedParts item) {

View File

@ -992,13 +992,11 @@ namespace SourceGenWPF {
mProjectPathName = null; mProjectPathName = null;
#if false #if false
mSymbolSubset = new SymbolTableSubset(new SymbolTable()); mSymbolSubset = new SymbolTableSubset(new SymbolTable());
mCodeViewSelection = new VirtualListViewSelection();
mDisplayList = null;
codeListView.VirtualListSize = 0;
//codeListView.Items.Clear();
ShowNoProject();
InvalidateControls(null);
#endif #endif
// Clear this to release the memory.
mMainWin.CodeDisplayList.Clear();
mMainWin.InfoPanelContents = String.Empty;
mMainWin.ShowCodeListView = false; mMainWin.ShowCodeListView = false;
mGenerationLog = null; mGenerationLog = null;
@ -1017,6 +1015,7 @@ namespace SourceGenWPF {
public void SelectionChanged(out SelectionState newState) { public void SelectionChanged(out SelectionState newState) {
newState = UpdateSelectionState(); newState = UpdateSelectionState();
UpdateReferencesPanel();
UpdateInfoPanel(); UpdateInfoPanel();
} }
@ -1290,12 +1289,107 @@ namespace SourceGenWPF {
#endregion Main window UI event handlers #endregion Main window UI event handlers
#region References panel
/// <summary>
/// Updates the "references" panel to reflect the current selection.
///
/// The number of references to any given address should be relatively small, and
/// won't change without a data refresh, so recreating the list every time shouldn't
/// be a problem.
/// </summary>
private void UpdateReferencesPanel() {
mMainWin.ReferencesList.Clear();
if (mMainWin.GetSelectionCount() != 1) {
// Nothing selected, or multiple lines selected.
return;
}
int lineIndex = mMainWin.GetFirstSelectedIndex();
LineListGen.Line.Type type = CodeListGen[lineIndex].LineType;
if (type != LineListGen.Line.Type.Code &&
type != LineListGen.Line.Type.Data &&
type != LineListGen.Line.Type.EquDirective) {
// Code, data, and platform symbol EQUs have xrefs.
return;
}
// Find the appropriate xref set.
int offset = CodeListGen[lineIndex].FileOffset;
XrefSet xrefs;
if (offset < 0) {
int index = LineListGen.DefSymIndexFromOffset(offset);
DefSymbol defSym = mProject.ActiveDefSymbolList[index];
xrefs = defSym.Xrefs;
} else {
xrefs = mProject.GetXrefSet(offset);
}
if (xrefs == null || xrefs.Count == 0) {
return;
}
// TODO(someday): localization
Asm65.Formatter formatter = mOutputFormatter;
bool showBank = !mProject.CpuDef.HasAddr16;
for (int i = 0; i < xrefs.Count; i++) {
XrefSet.Xref xr = xrefs[i];
string typeStr;
switch (xr.Type) {
case XrefSet.XrefType.SubCallOp:
typeStr = "call ";
break;
case XrefSet.XrefType.BranchOp:
typeStr = "branch ";
break;
case XrefSet.XrefType.RefFromData:
typeStr = "data ";
break;
case XrefSet.XrefType.MemAccessOp:
switch (xr.AccType) {
case OpDef.MemoryEffect.Read:
typeStr = "read ";
break;
case OpDef.MemoryEffect.Write:
typeStr = "write ";
break;
case OpDef.MemoryEffect.ReadModifyWrite:
typeStr = "rmw ";
break;
case OpDef.MemoryEffect.None: // e.g. LDA #<symbol, PEA addr
typeStr = "ref ";
break;
case OpDef.MemoryEffect.Unknown:
default:
Debug.Assert(false);
typeStr = "??! ";
break;
}
break;
default:
Debug.Assert(false);
typeStr = "??? ";
break;
}
MainWindow.ReferencesListItem rli = new MainWindow.ReferencesListItem(
formatter.FormatOffset24(xr.Offset),
formatter.FormatAddress(mProject.GetAnattrib(xr.Offset).Address, showBank),
(xr.IsSymbolic ? "Sym " : "Num ") + typeStr +
formatter.FormatAdjustment(-xr.Adjustment));
mMainWin.ReferencesList.Add(rli);
}
}
#endregion References panel
#region Info panel #region Info panel
private void UpdateInfoPanel() { private void UpdateInfoPanel() {
if (mMainWin.GetSelectionCount() != 1) { if (mMainWin.GetSelectionCount() != 1) {
// Nothing selected, or multiple lines selected. // Nothing selected, or multiple lines selected.
mMainWin.InfoBoxContents = string.Empty; mMainWin.InfoPanelContents = string.Empty;
return; return;
} }
int lineIndex = mMainWin.GetFirstSelectedIndex(); int lineIndex = mMainWin.GetFirstSelectedIndex();
@ -1364,7 +1458,7 @@ namespace SourceGenWPF {
sb.Append("\r\n\r\n"); sb.Append("\r\n\r\n");
sb.Append(extraStr); sb.Append(extraStr);
} }
mMainWin.InfoBoxContents = sb.ToString(); mMainWin.InfoPanelContents = sb.ToString();
return; return;
} }
Debug.Assert(line.IsCodeOrData); Debug.Assert(line.IsCodeOrData);
@ -1508,7 +1602,7 @@ namespace SourceGenWPF {
// Publish // Publish
mMainWin.InfoBoxContents = sb.ToString(); mMainWin.InfoPanelContents = sb.ToString();
} }
#endregion Info panel #endregion Info panel

View File

@ -189,7 +189,11 @@ limitations under the License.
<GroupBox Grid.Row="0" Header="References"> <GroupBox Grid.Row="0" Header="References">
<DataGrid Name="referencesList" IsReadOnly="True" <DataGrid Name="referencesList" IsReadOnly="True"
FontFamily="{StaticResource GeneralMonoFont}"> FontFamily="{StaticResource GeneralMonoFont}"
SnapsToDevicePixels="True"
ItemsSource="{Binding ReferencesList}"
AutoGenerateColumns="False"
GridLinesVisibility="Vertical" VerticalGridLinesBrush="#FF7F7F7F">
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="Offset" Binding="{Binding Offset}"/> <DataGridTextColumn Header="Offset" Binding="{Binding Offset}"/>
<DataGridTextColumn Header="Addr" Binding="{Binding Addr}"/> <DataGridTextColumn Header="Addr" Binding="{Binding Addr}"/>
@ -314,7 +318,7 @@ limitations under the License.
</GroupBox> </GroupBox>
<GroupBox Grid.Row="2" Header="Info"> <GroupBox Grid.Row="2" Header="Info">
<TextBox Text="{Binding InfoBoxContents}" <TextBox Text="{Binding InfoPanelContents}"
FontFamily="{StaticResource GeneralMonoFont}" FontFamily="{StaticResource GeneralMonoFont}"
TextWrapping="Wrap"/> TextWrapping="Wrap"/>
</GroupBox> </GroupBox>

View File

@ -15,6 +15,7 @@
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -208,20 +209,6 @@ namespace SourceGenWPF.ProjWin {
get { return mShowCodeListView ? Visibility.Visible : Visibility.Hidden; } get { return mShowCodeListView ? Visibility.Visible : Visibility.Hidden; }
} }
/// <summary>
/// Text to display in the Info panel. This is a simple TextBox.
/// </summary>
public string InfoBoxContents {
get {
return mInfoBoxContents;
}
set {
mInfoBoxContents = value;
OnPropertyChanged();
}
}
private string mInfoBoxContents;
private void CodeListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { private void CodeListView_SelectionChanged(object sender, SelectionChangedEventArgs e) {
//DateTime startWhen = DateTime.Now; //DateTime startWhen = DateTime.Now;
@ -408,5 +395,49 @@ namespace SourceGenWPF.ProjWin {
} }
#endregion Command handlers #endregion Command handlers
#region Info panel
/// <summary>
/// Text to display in the Info panel. This is a simple TextBox.
/// </summary>
public string InfoPanelContents {
get {
return mInfoBoxContents;
}
set {
mInfoBoxContents = value;
OnPropertyChanged();
}
}
private string mInfoBoxContents;
#endregion Info panel
#region References panel
public class ReferencesListItem {
public string Offset { get; private set; }
public string Addr { get; private set; }
public string Type { get; private set; }
public ReferencesListItem(string offset, string addr, string type) {
Offset = offset;
Addr = addr;
Type = type;
}
public override string ToString() {
return "[ReferencesListItem: off=" + Offset + " addr=" + Addr + " type=" +
Type + "]";
}
}
public ObservableCollection<ReferencesListItem> ReferencesList { get; private set; } =
new ObservableCollection<ReferencesListItem>();
#endregion References panel
} }
} }