public static void ColorizeSchema(BinaryFileSchema schema, RichTextBox richTextBox)
{
textBox = richTextBox;
richTextBox.SelectAll();
richTextBox.SelectionColor = Color.Black;
richTextBox.SelectionFont = normalfont;
//Colorize the byte-order
if ( schema.ByteOrder != null && schema.ByteOrder.ByteOrder != BfsByteOrderEnum.LanguageDefault)
{
richTextBox.Select(schema.ByteOrder.SourceRange.Begin, schema.ByteOrder.SourceRange.Length);
richTextBox.SelectionColor = keywordcolor;
}
foreach (IBfsDataBlock block in schema.DatablockList)
{
ColorRange(block.SourceRange, normalcolor, boldfont);
ColorRange(block.BlockTypeSourceRange, keywordcolor, boldfont);
if (block.IsFormat)
ColorRange(block.FormatSourceRange, keywordcolor, boldfont);
if (block is IBfsConsumptionType)
{
IBfsConsumptionType special = block as IBfsConsumptionType;
ColorRange(special.PrimitiveType.SourceRange, typecolor);
}
foreach (BfsLocalField lfield in block.LocalFields.Values)
{
ColorRange(lfield.SourceRange, 5, keywordcolor);
ColorRange(lfield.PrimitiveType.SourceRange, typecolor);
if (lfield.AssignmentExpression != null)
ColorExpression(lfield.AssignmentExpression.ExpressionGroup);
}
if (block is IBfsStructType)
{
IBfsStructType structtype = block as IBfsStructType;
if (structtype.CompressionMethod != null)
ColorRange(structtype.CompressionRange, compressioncolor);
foreach (BfsStructField field in structtype.StructFields.Values)
{
ColorRange(field.FieldType.SourceRange, typecolor);
if (field.FieldType is BfsFunctionType)
ColorRange((field.FieldType as BfsFunctionType).ArgumentSourceRange, stringcolor);
if (field.Conditional != null)
{
ColorRange(field.ConditionalSourceRange, 2, keywordcolor);
ColorExpression(field.Conditional.ExpressionGroup);
}
if (field.Skip)
ColorRange(field.SkipSourceRange, skipcolor);
if (field.FieldType.ArrayExtension != null && field.FieldType.ArrayExtension is BfsKnownArray)
ColorExpression((field.FieldType.ArrayExtension as BfsKnownArray).Expression.ExpressionGroup);
else if (field.FieldType.ArrayExtension != null && field.FieldType.ArrayExtension is BfsUnknownArray)
{
BfsUnknownArray array = field.FieldType.ArrayExtension as BfsUnknownArray;
ColorRange(array.UntilSourceRange, keywordcolor);
foreach (BfsSourceRange range in array.OrWords)
ColorRange(range, keywordcolor);
foreach (IBfsStopCase stopcase in array.StopCases)
{
if (stopcase is BfsStopCaseString)
ColorRange(stopcase.SourceRange, stringcolor);
else if (stopcase is BfsStopCaseEndOfFile)
ColorRange(stopcase.SourceRange, enumaliascolor);
else if (stopcase is BfsStopCaseHex)
ColorRange(stopcase.SourceRange, numbercolor);
BfsSourceRange zerorange = new BfsSourceRange();
if (stopcase.InclusionSourceRange != zerorange)
ColorRange(stopcase.InclusionSourceRange, keywordcolor);
}
}
}
}
else if (block is BfsEnum)
foreach (BfsEnumField field in (block as BfsEnum).EnumFields)
{
if (field.Alias != null)
ColorRange(field.AliasSourceRange, enumaliascolor);
if (field.EnumMatch is BfsEnumValue)
ColorRange(field.EnumMatch.SourceRange, numbercolor);
else if (field.EnumMatch is BfsEnumRange)
ColorRange(field.EnumMatch.SourceRange.Begin + 1, field.EnumMatch.SourceRange.Length - 2, numbercolor);
else if (field.EnumMatch is BfsEnumElse)
ColorRange(field.EnumMatch.SourceRange, keywordcolor);
ColorActionList(field.Actions);
}
else if (block is BfsBitfield)
{
foreach (BfsBitfieldField field in (block as BfsBitfield).BitFieldFields)
{
ColorRange(field.SourceRange, numbercolor);
ColorActionList(field.Actions);
}
}
}
}