public void AddMyTableToMetaGrid(StateTableViewModel myTable, int column, int row, int isWork)
        {
            Grid grid = LabelGrid(myTable, isWork);

            DependencyDiagram.AddChildren(grid, column, row, myTable.Count, 1, default(Color), false);

            if (myTable.Childrens.Any())
            {
                AddMyTableToMetaGrid(myTable.Childrens[0], column, row + 1, 0);
                AddMyTableToMetaGrid(myTable.Childrens[1], column + myTable.Childrens[0].Count, row + 1, 1);
            }
        }
        private void MenuDependencyTable_OnClick(object sender, RoutedEventArgs e)
        {
            var dependencyTableViewModel = new StateTableViewModel(ViewModel);
            var dependencyTableView      = new StateTableView(dependencyTableViewModel);

            DiagramGrid.IsEnabled = false;

            dependencyTableView.Closed += (o, args) =>
            {
                DiagramGrid.IsEnabled = true;
            };
            dependencyTableView.Show();
        }
        public StateTableView(StateTableViewModel viewModel)
        {
            ViewModel = viewModel;
            InitializeComponent();
            for (int i = 0, count = viewModel.Count; i < count; i++)
            {
                DependencyDiagram.ColumnDefinitions.Add(new ColumnDefinition {
                    Width = GridLength.Auto
                });
            }
            for (int i = 0, count = viewModel.TableDepth + 1; i < count; i++)
            {
                DependencyDiagram.RowDefinitions.Add(new RowDefinition {
                    Height = GridLength.Auto
                });
            }

            AddMyTableToMetaGrid(viewModel, 0, 0, 2);
            CreateDependencyTable(ViewModel);
        }
        public Grid LabelGrid(StateTableViewModel myTable, int isWork)
        {
            Grid myGrid = new Grid();

            myGrid.RowDefinitions.Add(new RowDefinition()
            {
                Height = new GridLength(20)
            });
            myGrid.RowDefinitions.Add(new RowDefinition()
            {
                Height = GridLength.Auto
            });

            myGrid.ColumnDefinitions.Add(new ColumnDefinition()
            {
                Width = new GridLength(1, GridUnitType.Star)
            });
            myGrid.ColumnDefinitions.Add(new ColumnDefinition()
            {
                Width = new GridLength(1, GridUnitType.Star)
            });

            var    minW   = myTable.W.IndexOfMin();
            Button button = new Button
            {
                Content             = $"Z{myTable.Nodes[minW].Zindex + 1}",
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                MinWidth            = 28,
                Margin              = new Thickness(2, 0, 2, 0),
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment   = VerticalAlignment.Center,
            };

            button.MouseEnter += (o, e) =>
            {
                myTable.Nodes[minW].ParentMode = true;
                myTable.Nodes[minW].ChildMode  = true;
            };
            button.MouseLeave += (o, e) =>
            {
                myTable.Nodes[minW].ParentMode = false;
                myTable.Nodes[minW].ChildMode  = false;
            };

            if (myTable.Count > 1)
            {
                button.Click += (o, e) =>
                {
                    CreateDependencyTable(myTable);
                };
            }

            myGrid.AddChildren(button, 0, 1, 2, 1, default(Color), false);

            if (isWork < 2)
            {
                Path path = new Path
                {
                    Data = new PathGeometry(new[]
                    {
                        new PathFigure(new Point(7, 0), new[]
                        {
                            new LineSegment(new Point(7, 20), true),
                            new LineSegment(new Point(14, 10), false),
                            new LineSegment(new Point(7, 20), true),
                            new LineSegment(new Point(0, 10), true),
                        }, false),
                    }),
                    Stroke          = Brushes.Black,
                    StrokeThickness = 2,
                };
                TextBlock textBlock = new TextBlock()
                {
                    Text       = isWork.ToString(),
                    Margin     = new Thickness(5, 0, 5, 0),
                    FontFamily = TimesNewRoman,
                    FontSize   = 14,
                };

                if (isWork == 0)
                {
                    myGrid.AddChildren(path, 1, 0, 1, 1, default(Color), false);
                    path.HorizontalAlignment = HorizontalAlignment.Left;
                    myGrid.AddChildren(textBlock, 0, 0, 1, 1, default(Color), false);
                    textBlock.HorizontalAlignment = HorizontalAlignment.Right;
                }
                if (isWork == 1)
                {
                    myGrid.AddChildren(path, 0, 0, 1, 1, default(Color), false);
                    path.HorizontalAlignment = HorizontalAlignment.Right;
                    myGrid.AddChildren(textBlock, 1, 0, 1, 1, default(Color), false);
                    textBlock.HorizontalAlignment = HorizontalAlignment.Left;
                }
            }



            return(myGrid);
        }
        private void CreateDependencyTable(StateTableViewModel vm)
        {
            foreach (var node in ViewModel.Nodes)
            {
                node.WarSmokeMode = true;
            }

            foreach (var node in vm.Nodes)
            {
                node.WarSmokeMode = false;
            }

            DependencyTable.ColumnDefinitions.Clear();
            DependencyTable.RowDefinitions.Clear();
            DependencyTable.Children.Clear();

            for (int i = 0, count = vm.Count + 4; i < count; i++)
            {
                DependencyTable.ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = GridLength.Auto
                });
            }
            for (int i = 0, count = vm.Count + 3; i < count; i++)
            {
                DependencyTable.RowDefinitions.Add(new RowDefinition()
                {
                    Height = GridLength.Auto
                });
            }

            DependencyTable.AddChildren(new TextBlock
            {
                Text                = vm.TableDescription,
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center,
                TextAlignment       = TextAlignment.Center
            }, 0, 0, vm.Count + 4, 1, default(Color), false);

            DependencyTable.AddChildren(new TextBlock
            {
                Text                = "Zi",
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                Width               = 30,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center,
                TextAlignment       = TextAlignment.Center
            }, 0, 1);


            DependencyTable.AddChildren(new TextBlock
            {
                Text                = "Состояние блока Si",
                FontSize            = 14,
                FontFamily          = TimesNewRoman,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center
            }, 1, 1, vm.Count);
            DependencyTable.AddChildren(new TextBlock
            {
                Text                = "Число\nсостояний",
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                HorizontalAlignment = HorizontalAlignment.Center,
                TextAlignment       = TextAlignment.Center,
                Margin              = new Thickness(5, 0, 5, 0)
            }, vm.Count + 1, 1, 2);
            DependencyTable.AddChildren(new TextBlock
            {
                Text                = "Wi",
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                Width               = 25,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center,
                TextAlignment       = TextAlignment.Center
            }, vm.Count + 3, 1);

            DependencyTable.AddChildren(new TextBlock {
                Text = ""
            }, 0, 1);
            for (int i = 0; i < vm.Count; i++)
            {
                var zindexTextBlock = new TextBlock
                {
                    Text              = $"{vm.Nodes[i].Zindex + 1}",
                    FontFamily        = TimesNewRoman,
                    FontSize          = 14,
                    MinWidth          = 25,
                    VerticalAlignment = VerticalAlignment.Center,
                    TextAlignment     = TextAlignment.Center
                };
                int zindexI = i;
                zindexTextBlock.MouseEnter += (o, e) =>
                {
                    vm.Nodes[zindexI].ParentMode = true;
                    vm.Nodes[zindexI].ChildMode  = true;
                };
                zindexTextBlock.MouseLeave += (o, e) =>
                {
                    vm.Nodes[zindexI].ParentMode = false;
                    vm.Nodes[zindexI].ChildMode  = false;
                };
                DependencyTable.AddChildren(zindexTextBlock, i + 1, 2);
            }
            DependencyTable.AddChildren(new TextBlock
            {
                Text                = "0",
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center
            }, vm.Count + 1, 2);
            DependencyTable.AddChildren(new TextBlock
            {
                Text                = "1",
                FontFamily          = TimesNewRoman,
                FontSize            = 14,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment   = VerticalAlignment.Center
            }, vm.Count + 2, 2);
            DependencyTable.AddChildren(new TextBlock {
                Text = ""
            }, vm.Count + 3, 2);

            var wIntexOfMin = vm.W.IndexOfMin();

            for (int i = 0; i < vm.Count; i++)
            {
                var color = i == wIntexOfMin?Color.FromArgb(255, 173, 216, 230) : default(Color);

                var zindexTextBlock = new TextBlock
                {
                    Text       = $"Z{vm.Nodes[i].Zindex + 1}",
                    FontSize   = 14,
                    FontFamily = TimesNewRoman,
                    Margin     = new Thickness(3, 0, 0, 0)
                };
                int zindexI = i;
                zindexTextBlock.MouseEnter += (o, e) =>
                {
                    vm.Nodes[zindexI].ParentMode = true;
                    vm.Nodes[zindexI].ChildMode  = true;
                };
                zindexTextBlock.MouseLeave += (o, e) =>
                {
                    vm.Nodes[zindexI].ParentMode = false;
                    vm.Nodes[zindexI].ChildMode  = false;
                };

                DependencyTable.AddChildren(zindexTextBlock, 0, i + 3, 1, 1, color);


                for (int j = 0; j < vm.Count; j++)
                {
                    var dependTextBlock = new TextBlock
                    {
                        Text          = $"{vm.IsWorkMatrix[i, j]}",
                        FontFamily    = TimesNewRoman,
                        FontSize      = 14,
                        TextAlignment = TextAlignment.Center,
                        MinWidth      = 25,
                        Margin        = new Thickness(1, 0.5, 0.5, 1),
                        Background    = new SolidColorBrush(vm.IsWorkMatrix[i, j] == 1
                            ? Color.Add(Color.FromArgb(255, 245, 245, 220), color) : color)
                    };

                    if (vm.IsWorkMatrix[i, j] == 0)
                    {
                        var i1 = i;
                        var j1 = j;
                        dependTextBlock.MouseEnter += (o, e) =>
                        {
                            vm.Nodes[j1].ParentMode = true;
                            vm.Nodes[i1].ChildMode  = true;
                        };
                        dependTextBlock.MouseLeave += (o, e) =>
                        {
                            vm.Nodes[j1].ParentMode = false;
                            vm.Nodes[i1].ChildMode  = false;
                        };
                    }

                    DependencyTable.AddChildren(dependTextBlock, j + 1, i + 3);
                }
                DependencyTable.AddChildren(new TextBlock
                {
                    Text                = $"{vm.Zeros[i]}",
                    FontFamily          = TimesNewRoman,
                    FontSize            = 14,
                    HorizontalAlignment = HorizontalAlignment.Right,
                    VerticalAlignment   = VerticalAlignment.Center,
                    Margin              = new Thickness(0, 0, 3, 0)
                }, vm.Count + 1, i + 3, 1, 1, color);
                DependencyTable.AddChildren(new TextBlock
                {
                    Text                = $"{vm.Ones[i]}",
                    FontFamily          = TimesNewRoman,
                    FontSize            = 14,
                    HorizontalAlignment = HorizontalAlignment.Right,
                    VerticalAlignment   = VerticalAlignment.Center,
                    Margin              = new Thickness(0, 0, 3, 0)
                }, vm.Count + 2, i + 3, 1, 1, color);
                DependencyTable.AddChildren(new TextBlock
                {
                    Text                = $"{vm.W[i]}",
                    FontSize            = 14,
                    FontFamily          = TimesNewRoman,
                    HorizontalAlignment = HorizontalAlignment.Right,
                    VerticalAlignment   = VerticalAlignment.Center,
                    Margin              = new Thickness(0, 0, 3, 0)
                }, vm.Count + 3, i + 3, 1, 1, color);
            }
        }