HexViewer.HighLight[] GetHighLights(Table table)
        {
            HexViewer.HighLight[] ret;
            if (hls.TryGetValue(table, out ret))
            {
                return(ret);
            }

            var tbls    = Model.Stream;
            var mdTable = tbls.Get(table);

            ret = new HexViewer.HighLight[mdTable.Rows + 1];

            var rowCountOffset = CalculateTableRowsOffset(table);
            var rowOffset      = (uint)mdTable.StartOffset - (uint)tbls.StartOffset;

            using (var colorSeq = Utils.GetAlternateColorSequence(Color.Green, Color.Orange).GetEnumerator()) {
                ret[0] = new HexViewer.HighLight(Color.Brown, rowCountOffset, rowCountOffset + 4);
                for (int i = 1; i < ret.Length && colorSeq.MoveNext(); i++)
                {
                    ret[i]     = new HexViewer.HighLight(colorSeq.Current, rowOffset, rowOffset + mdTable.RowSize);
                    rowOffset += mdTable.RowSize;
                }
            }
            hls[table] = ret;
            return(ret);
        }
        void OnNodeSelected(object sender, TreeViewEventArgs e)
        {
            gridView.Clear();

            var node = (DataTreeNodeX)treeView.SelectedNode;

            if (node.Model is MDTableModel)
            {
                var mdTable = ((MDTableModel)node.Model).MDTable;
                hexView.SetHighLights(GetHighLights(mdTable.Table));

                if (followInHex)
                {
                    var tbls  = Model.Stream;
                    var begin = mdTable.StartOffset - tbls.StartOffset;
                    var end   = mdTable.EndOffset - tbls.StartOffset;
                    hexView.Select(begin, end);
                }
            }
            else if (node.Model is MDRowModel)
            {
                var rowModel = (MDRowModel)node.Model;
                var mdTable  = rowModel.Parent.MDTable;
                var rid      = rowModel.Rid;

                var rowHL = GetHighLights(mdTable.Table);
                rowHL = (HexViewer.HighLight[])rowHL.Clone();

                var row = rowHL[rid];
                row        = new HexViewer.HighLight(Color.Blue, row.Start, row.End);
                rowHL[rid] = row;

                hexView.SetHighLights(rowHL);
                RowInfoPopulator.PopulateGridView(this, gridView, rowModel);

                if (followInHex)
                {
                    hexView.Select(row.Start, row.End);
                }
            }
            else
            {
                hexView.ClearHighLight();
            }
        }