object GetToolTip(MultiResourceDataHeaderData resDataHdr, HexPosition position)
        {
            var toolTipCreator = toolTipCreatorFactory.Create();
            var contentCreator = toolTipCreator.ToolTipContentCreator;

            contentCreator.Image = ImageReferenceUtils.GetImageReference(resDataHdr.ResourceInfo.Name) ??
                                   ImageReferenceUtils.GetImageReference(resDataHdr.ResourceInfo.TypeCode);

            contentCreator.Writer.WriteFilename(resDataHdr.ResourceInfo.Name);
            if (string.IsNullOrEmpty(resDataHdr.ResourceInfo.UserTypeName))
            {
                contentCreator.Writer.WriteSpace();
                contentCreator.Writer.Write("(", PredefinedClassifiedTextTags.Punctuation);
                var typeCode = resDataHdr.ResourceInfo.TypeCode;
                if (typeCode < ResourceTypeCode.UserTypes)
                {
                    contentCreator.Writer.Write(typeCode.ToString(), PredefinedClassifiedTextTags.EnumField);
                }
                else
                {
                    contentCreator.Writer.Write("UserType" + (typeCode - ResourceTypeCode.UserTypes).ToString(), PredefinedClassifiedTextTags.EnumField);
                }
                contentCreator.Writer.Write(")", PredefinedClassifiedTextTags.Punctuation);
                contentCreator.CreateNewWriter();
            }
            else
            {
                contentCreator.CreateNewWriter();
                contentCreator.Writer.Write(resDataHdr.ResourceInfo.UserTypeName, PredefinedClassifiedTextTags.Text);
                contentCreator.Writer.WriteLine();
            }
            contentCreator.Writer.WriteFieldAndValue(resDataHdr, position);

            return(toolTipCreator.Create());
        }
        object GetToolTip(TableRecordData tableRecord, HexPosition position)
        {
            var tablesHeap = tableRecord.TablesHeap;

            Debug.Assert((uint)tableRecord.Token.Table < (uint)tablesHeap.MDTables.Count);
            if ((uint)tableRecord.Token.Table >= (uint)tablesHeap.MDTables.Count)
            {
                return(null);
            }
            var mdTable = tablesHeap.MDTables[(int)tableRecord.Token.Table];
            int offset  = (int)(position - tableRecord.Span.Span.Start).ToUInt64();
            var column  = mdTable.Columns.FirstOrDefault(a => a.Offset <= offset && offset < a.Offset + a.Size);

            Debug.Assert(column != null);
            if (column == null)
            {
                return(null);
            }
            var mdHeaders = tablesHeap.Metadata;

            var toolTipCreator = toolTipCreatorFactory.Create();
            var contentCreator = toolTipCreator.ToolTipContentCreator;

            contentCreator.Image = ImageReferenceUtils.GetImageReference(tableRecord.Token.Table);
            contentCreator.Writer.WriteFieldAndValue(tableRecord, position);

            var pos = tableRecord.Span.Span.Start + column.Offset;

            switch (column.ColumnSize)
            {
            case ColumnSize.Strings:
                var s = GetString(mdHeaders.StringsStream, column, pos);
                if (s == null)
                {
                    break;
                }
                contentCreator.Writer.WriteSpace();
                contentCreator.Writer.Write("(", PredefinedClassifiedTextTags.Punctuation);
                contentCreator.Writer.WriteString(s);
                contentCreator.Writer.Write(")", PredefinedClassifiedTextTags.Punctuation);
                break;

            case ColumnSize.GUID:
                var g = GetGuid(mdHeaders.GUIDStream, column, pos);
                if (g == null)
                {
                    break;
                }
                contentCreator.Writer.WriteSpace();
                contentCreator.Writer.Write("(", PredefinedClassifiedTextTags.Punctuation);
                contentCreator.Writer.Write(g.Value.ToString(), PredefinedClassifiedTextTags.Text);
                contentCreator.Writer.Write(")", PredefinedClassifiedTextTags.Punctuation);
                break;
            }

            return(toolTipCreator.Create());
        }
        ImageReference GetResourceImage(DotNetEmbeddedResource resource, string filename)
        {
            var span = resource.Content.Data.Span;

            // Check if it's a multi-file resource
            if (span.Length >= 4 && span.Buffer.ReadUInt32(span.Start) == 0xBEEFCACE)
            {
                return(DsImages.SourceFileGroup);
            }
            return(ImageReferenceUtils.GetImageReference(filename) ?? DsImages.Dialog);
        }
        ImageReference?GetImageReference(MultiResourceUnicodeNameAndOffsetData nameOffset)
        {
            var name = nameOffset.ResourceName.Data.String.Data.ReadValue();

            return(ImageReferenceUtils.GetImageReference(name));
        }