private void CreateNestedTextModel()
{
this.nestedTextModel = new NestedTextModel();
var mixedCodeDataModel = combinedCodeView.MixedCodeDataView.Model as MixedCodeDataModel;
if (mixedCodeDataModel == null)
return;
var dataItemNodes = mixedCodeDataModel.GetDataItemNodes();
this.nodeByAddress = new SortedList<Address, MixedCodeDataModel.DataItemNode>();
foreach (var dataItemNode in dataItemNodes)
{
var curAddr = dataItemNode.StartAddress;
bool nodeCreated = false;
ImageMapItem item;
Procedure proc = dataItemNode.Proc;
if (ShowItem(dataItemNode))
{
if (proc != null)
{
var tsf = new TextSpanFormatter();
var fmt = new AbsynCodeFormatter(tsf);
fmt.InnerFormatter.UseTabs = false;
fmt.Write(proc);
//$TODO: make spacing between globals / procedures user adjustable
tsf.WriteLine("");
tsf.WriteLine("");
nestedTextModel.Nodes.Add(tsf.GetModel());
nodeCreated = true;
}
else if (program.ImageMap.TryFindItem(curAddr, out item) &&
item.DataType != null &&
!(item.DataType is UnknownType))
{
var dt = item.DataType;
var name = item.Name ?? "<unnamed>";
var tsf = new TextSpanFormatter();
var fmt = new AbsynCodeFormatter(tsf);
fmt.InnerFormatter.UseTabs = false;
var gdw = new GlobalDataWriter(program, services);
gdw.WriteGlobalVariable(curAddr, dt, name, tsf);
//$TODO: make spacing between globals / procedures user adjustable
tsf.WriteLine("");
nestedTextModel.Nodes.Add(tsf.GetModel());
nodeCreated = true;
}
}
if (nodeCreated)
{
dataItemNode.ModelNode = nestedTextModel.Nodes.Last();
this.nodeByAddress[curAddr] = dataItemNode;
}
}
combinedCodeView.CodeView.Model = nestedTextModel;
}