private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Перемещение вершин - toogleCommand
            var moveCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                _state = State.MoveVertex;
                UserActionsManager.RegisterInfo("Включено перемещение вершин.");
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                _state = State.Nothing;
                UserActionsManager.RegisterInfo("Отключено перемещение вершин.");
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Move.png")),
                Description = "Перемещение вершин"
            };

            // Перемещение вершин
            var dontTouch = new ToolBarInstantCommand(
                () => UserActionsManager.RegisterMistake("Сказали же НЕ ТРОГАТЬ!!!", 1),
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("DontTouch.png")),
                Description = "НЕ ТРОГАТЬ"
            };

            // Завершение работы
            var finishTask = new ToolBarInstantCommand(
                () =>
            {
                UserActionsManager.ReportThatTaskFinished();
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Complete.png")),
                Description = "Завершить задание"
            };

            ToolBarCommands.Add(moveCommand);
            ToolBarCommands.Add(dontTouch);
            ToolBarCommands.Add(finishTask);
        }
        /// <summary> Проверка матрицы </summary>
        private void CheckMatrix()
        {
            var counter = new MatrixErrorCounter();
            var amount  = counter.CountOfErrorsMatrix(Matrix, GivenGraph);

            if (amount > 0)
            {
                short  k       = (short)((short)amount * 3);
                string mistake = null;
                switch (amount)
                {
                case 1:
                    mistake = "Найдена " + amount + " ошибка";
                    break;

                case 2:
                case 3:
                case 4:
                    mistake = "Найдено " + amount + " ошибки";
                    break;

                default:
                    mistake = "Найдено " + amount + " ошибок";
                    break;
                }

                if (UserActionsManager.Score > k)
                {
                    UserActionsManager.RegisterMistake(mistake, k);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake(mistake, (short)UserActionsManager.Score);
                }
            }
            else
            {
                UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание выполнено, переход к следующему заданию");
                MessageBox.Show("Задание 1.1 пройдено.\n Вы перешли к заданию 1.2.\n Ознакомьтесь со справкой.<?>");
                _task = Task.TaskModifiedAdjMatrix;
            }
        }
        //добавление-удаление
        /// <summary> Инициализация </summary>
        protected override void OnInitialized()
        {
            base.OnInitialized();

            InitToolBarCommands();

            OnLoadedCmd = new DelegateCommand(
                o =>
            {
                VariantProvider.DownloadVariantAsync();
                ToolBarCommands.ForEach(c => c.RefreshState());
            }, o => true);
            var outV = new Vertex("a");

            VertexClickCmd = new DelegateCommand(
                o =>
            {
                if (_state == State.AddEdge1)
                {
                    outV = GivenGraph.Vertices.Single(v => v.Name == ((IVertex)o).Name) as Vertex;
                    VertVisCol.Single(v => v.Name == outV.Name).Radius     = 23;
                    VertVisCol.Single(v => v.Name == outV.Name).Background = new SolidColorBrush(Colors.Magenta);
                    UserActionsManager.RegisterInfo(string.Format("Выходная вершина - [{0}]. Выберите входную вершину.", ((IVertex)o).Name));
                    _state = State.AddEdge2;
                    return;
                }
                if (_state == State.AddEdge2)
                {
                    var inV = GivenGraph.Vertices.Single(v => v.Name == ((IVertex)o).Name) as Vertex;
                    UserActionsManager.RegisterInfo(string.Format("Входная вершина - [{0}]. Добавьте другое ребро или выйдете из режима добавления ребер", ((IVertex)o).Name));
                    var newEdge = new DirectedEdge(outV, inV);
                    if (GivenGraph.Edges.Any(newEdge.Equals))
                    {
                        ReportMistake("Указанная дуга уже существует.");
                        return;
                    }
                    VertVisCol.Single(v => v.Name == outV.Name).Radius     = 20;
                    VertVisCol.Single(v => v.Name == outV.Name).Background = new SolidColorBrush(Colors.LightGray);

                    GivenGraph.AddEdge(newEdge);
                    _state = State.AddEdge1;
                }
                if (_state == State.RemoveVertex)
                {
                    GivenGraph.RemoveVertex(GivenGraph.Vertices.Single(v => v.Name == ((IVertex)o).Name));
                    UserActionsManager.RegisterInfo(string.Format("Вершина [{0}] удалена со всеми связями", ((IVertex)o).Name));
                }
            },
                o => true);
            VisualizerClickCmd = new DelegateCommand(
                o =>
            {
                if (_state == State.AddVertex)
                {
                    UserActionsManager.RegisterInfo((string.Format("Вершина добавлена")));
                    var vertex  = (Graphs.UIComponents.Visualization.Vertex)o;
                    vertex.Name = (GivenGraph.VerticesCount).ToString();
                    int i       = 0;
                    while (GivenGraph.Vertices.Any(vertex.Equals))
                    {
                        i           = i + 1;
                        vertex.Name = (i).ToString();
                    }
                }
            },
                o => true);
        }
 /// <summary> Клик по вершине </summary>
 public void OnVertexClick(IVertex vertex)
 {
     UserActionsManager.RegisterInfo(string.Format("Клик по вершине [{0}]", vertex.Name));
 }
        private void InitToolBarCommands()
        {
            new SimpleDialog("Справка", Strings.Strings_RU.stage3Help).Show();

            #region Видимость
            var vis = true;

            var phase3VisCommand = new ToolBarInstantCommand(
                () =>
            {
                vis = !vis;
                WorkspaceGraphVisibility = vis ? Visibility.Visible : Visibility.Collapsed;
            },
                () => _state == State.Nothing
                )
            {
                Description = "Скрыть / Показать слой зелёного графа",
                Image       = new BitmapImage(GetImageUri("HideGreen.png"))
            };
            #endregion

            #region Справка
            var phase3HelpCommand = new ToolBarInstantCommand(
                () => new SimpleDialog("Справка", Strings.Strings_RU.stage3Help).Show(),
                () => _state == State.Nothing
                )
            {
                Description = Strings.Strings_RU.buttonHelp,
                Image       = new BitmapImage(GetImageUri("Info.png"))
            };
            #endregion

            #region Завершить этап
            var phase3Command = new ToolBarInstantCommand(
                () =>
            {
                var dialog     = new AnswerDialog(IsomorphismResult);
                dialog.Closed += (sender, args) =>
                {
                    if (dialog.DialogResult.HasValue && dialog.DialogResult.Value && dialog.Answer)
                    {
                        UserActionsManager.SendReportOnEveryAction = true;
                        UserActionsManager.RegisterInfo("Ответ пользователя: Графы изоморфны");
                        UserActionsManager.ReportThatTaskFinished();
                    }
                    if (dialog.DialogResult.HasValue && dialog.DialogResult.Value && !dialog.Answer)
                    {
                        UserActionsManager.SendReportOnEveryAction = true;
                        UserActionsManager.RegisterInfo("Ответ пользователя: Графы неизоморфны.\n" + dialog.Message);
                        UserActionsManager.ReportThatTaskFinished();
                    }
                };
                dialog.Show();
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Check.png")),
                Description = Strings.Strings_RU.stage3DoneButtonDisc
            };
            #endregion

            Phase3ToolBarCommands = new ObservableCollection <ToolBarCommandBase>
            {
                phase3VisCommand,
                phase3Command,
                phase3HelpCommand
            };
        }
Beispiel #6
0
        private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Перемещение вершин - toogleCommand
            var moveCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                _state = State.MoveVertex;
                UserActionsManager.RegisterInfo("Включено перемещение вершин.");
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                _state = State.Nothing;
                UserActionsManager.RegisterInfo("Отключено перемещение вершин.");
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Move.png")),
                Description = "Перемещение вершин"
            };

            //удаление вершин
            var removeVertex = new ToolBarToggleCommand(
                () =>
            {
                UserActionsManager.RegisterInfo("Нажмите на вершину для удаления (все ее связи удалятся тоже)");
                _state = State.RemoveVertex;
            },
                () => _state = State.Nothing,
                () => _state == State.Nothing,
                () => _state == State.RemoveVertex
                );

            removeVertex.Image       = new BitmapImage(GetImageUri("DontTouch.png"));
            removeVertex.Description = "Удаление вершины";

            //Добавление вершинки
            var testBut = new ToolBarToggleCommand(
                () =>
            {
                UserActionsManager.RegisterInfo("Нажмите в то место, куда ходите добавить вершину.");
                _state = State.AddVertex;
            },
                () =>
            {
                _state = State.Nothing;
                UserActionsManager.RegisterInfo("Добавление вершины отменено");
            },
                () => _state == State.Nothing,
                () => _state == State.AddVertex
                );

            testBut.Image       = new BitmapImage(GetImageUri("NewVertex.png"));
            testBut.Description = "Добавить вершину";

            //Добавление ребрышка
            var addEdgeCommand = new ToolBarToggleCommand(
                () =>
            {
                _state = State.AddEdge1;
                UserActionsManager.RegisterInfo("Добавление ребра: Выберите выходную вершину.");
            },
                () =>
            {
                UserActionsManager.RegisterInfo("Добавление ребра завершено.");
                _state = State.Nothing;
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("NewEdge.png")),
                Description = "Добавление дуги"
            };

            /*  // Завершение работы
             * var finishTask = new ToolBarInstantCommand(
             *    () =>
             *    {
             *        UserActionsManager.ReportThatTaskFinished();
             *    },
             *    () => _state == State.Nothing
             *    )
             * {
             *    Image = new BitmapImage(GetImageUri("Complete.png")),
             *    Description = "Завершить задание"
             * };*/


            var checkGraphBut = new ToolBarInstantCommand(
                CheckGraph,
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("CondReady.png")),
                Description = "Проверить правильность построения графа"
            };

            var checkAllBut = new ToolBarInstantCommand(
                CheckPlan,
                () => _state == State.Nothing
                )
            {
                Image = new BitmapImage(GetImageUri("CondReady.png")), Description = "Проверить, плоский ли граф"
            };

            ToolBarCommands.Add(moveCommand);
            ToolBarCommands.Add(removeVertex);
            // ToolBarCommands.Add(finishTask);
            ToolBarCommands.Add(testBut);
            ToolBarCommands.Add(addEdgeCommand);
            ToolBarCommands.Add(checkGraphBut);
            ToolBarCommands.Add(checkAllBut);
        }
        private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Выбор множества External stability
            var selectDsCommand = new ToolBarToggleCommand(
                () =>
            {
                if (_task == Task.TaskSelectDomSets)
                {
                    VertexClickCmd = new DelegateCommand(
                        o => SelectRMouseClick((IVertex)o),
                        o => true);
                    _state = State.SetEs;
                    IsMouseVerticesMovingEnabled = false;
                }
            },

                () =>
            {
                _state = State.Nothing;
                IsMouseVerticesMovingEnabled = true;
            },

                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("es.png")),
                Description = "Выбор множества внешней устойчивости"
            };

            // Вызов окна со справкой
            var helpM = new ToolBarInstantCommand(
                () => MessageBox.Show
                (
                    "Лабораторная работа \"Устойчивость графов \"\n "
                    +
                    "Задание \"Множество внешней устойчивости\"\n"
                    +
                    "Цель: найти число внешней устойчивости графа\n"
                    +
                    "\n"
                    +
                    "для перехода к следующему заданию нажмите ОК\n"
                    +
                    "Для изменения матрицы необходимо изменить значение в ячейке и нажать \"Enter\"\n"
                    +
                    "Либо дважды кликнуть мышью по ячейке матрицы\n"
                    +
                    "\n"
                    +
                    "Задания:\n"
                    +
                    "1.1 Заполнить матрицу смежности\n"
                    +
                    "1.2 Измените матрицу смежности под выполнение алгоритма красно-синих вершин\n"
                    +
                    "2.Выделите несколько доминирующих множеств графа\n (выделение множества доступно по кнопке <ES>\nзакрытие множества происходит по кнопке <{}>)\n"
                    +
                    "3.Определить число внешней устойчивости (пометить соответствующее множество вершин)"
                ),
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("help.png")),
                Description = "Справка"
            };

            // Проверка задания
            var checkButton = new ToolBarInstantCommand(
                () =>
            {
                var mp = new MatrixPrinter();
                var m  = Matrix;
                switch (_task)
                {
                case Task.TaskAdjacencyMatrix:
                    UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 1.1. На проверку отправлена матрица: " + mp.MatrixToString(m));
                    CheckMatrix();
                    break;

                case Task.TaskModifiedAdjMatrix:
                    UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 1.2. На проверку отправлена матрица: " + mp.MatrixToString(m));
                    CheckMatrixforAghorithm();
                    break;

                case Task.TaskSelectDomSets:
                    MessageBox.Show(string.Format(
                                        "Необходимо найти еще {0} множеств(о) внешней устойчивости", _countOfSes));
                    break;

                case Task.TaskFindMinDomSets:
                    IsMinDS();
                    break;

                case Task.TaskEnd:
                    UserActionsManager.ReportThatTaskFinished();
                    break;
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("ok.png")),
                Description = "Проверить матрицу"
            };

            // Проверка множества и его сохранение
            var addSetofES = new ToolBarInstantCommand(
                () =>
            {
                if (_task == Task.TaskSelectDomSets)
                {
                    ValidateSet();
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("add.png")),
                Description = "Добавить множество"
            };

            // Проверка задания
            var debugButton = new ToolBarInstantCommand(
                () =>
            {
                var counter = new MatrixErrorCounter();
                if (_task == Task.TaskAdjacencyMatrix)
                {
                    counter.FillInMatrix(Matrix, GivenGraph);
                }
                if (_task == Task.TaskModifiedAdjMatrix)
                {
                    counter.ModifyMatrix(Matrix);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("ok.png")),
                Description = "Автозаполнение"
            };

            ToolBarCommands.Add(checkButton);
            ToolBarCommands.Add(selectDsCommand);
            ToolBarCommands.Add(addSetofES);
            ToolBarCommands.Add(helpM);
            //ToolBarCommands.Add(debugButton);
        }
        /// <summary>
        /// Проверка выбранного множества на соответствие наименьшему множеству внешней устойчивости
        /// </summary>
        private void IsMinDS()
        {
            var numofChosen = 0;

            foreach (var sccRow in MdsRows)
            {
                if (sccRow.IsBuilt)
                {
                    numofChosen++;
                }
            }
            // мощность выбранного множества
            foreach (var realSccRow in RealMdsRows)
            {
                foreach (var sccRow in MdsRows)
                {
                    if (sccRow.IsBuilt)
                    {
                        var tempSize = 0;
                        for (int i = 0; i < realSccRow.VerticesSet.Count; i++)
                        {
                            for (int j = 0; j < sccRow.VerticesSet.Count; j++)
                            {
                                if (realSccRow.VerticesSet[i].Name == sccRow.VerticesSet[j].Name)
                                {
                                    tempSize++;
                                }
                                if ((tempSize == realSccRow.VerticesSet.Count) && (realSccRow.VerticesSet.Count == sccRow.VerticesSet.Count))
                                {
                                    realSccRow.IsBuilt = true;
                                }
                            }
                        }
                    }
                }
            }

            var flag       = true;
            var flag2      = true;
            var k          = "";
            var numOfBuilt = 0;
            var m          = 0;

            foreach (var realSccRow in RealMdsRows)
            {
                if (realSccRow.IsBuilt)
                {
                    numOfBuilt++;
                }
                else
                {
                    flag = false;
                    k    = k + realSccRow.VerticesView;
                    m    = m + 5;
                }
            }
            if (numOfBuilt != numofChosen)
            {
                flag2 = false;
            }

            if (flag && flag2)
            {
                UserActionsManager.RegisterInfo("Внешняя устойчивость.Задание 3. Задание выполнено");
                MessageBox.Show("Задание выполнено. Нажмите ещё раз кнопку ОК для выхода.");
                _task = Task.TaskEnd;
                UserActionsManager.ReportThatTaskFinished();
            }
            else if (!flag2)
            {
                k = "Внешняя устойчивость. Задание 3. Выбранные множества не являются минимальными.";
                if (UserActionsManager.Score > 5)
                {
                    UserActionsManager.RegisterMistake(k, 5);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake(k, (short)UserActionsManager.Score);
                }
                MessageBox.Show("Неправильно выбраны множества. Повторите выполнение 3 задания.");
            }
            else
            {
                k = "Внешняя устойчивость. Задание 3. Выбраны не все множества.";
                if (UserActionsManager.Score > m)
                {
                    UserActionsManager.RegisterMistake(k, (short)m);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake(k, (short)UserActionsManager.Score);
                }
                MessageBox.Show("Неправильно выбраны множества. Повторите выполнение 3 задания.");
            }
        }
        /// <summary>
        /// Проверка выбранного множества вершин на соответствие множеству внешней устойчивости
        /// </summary>
        /// <returns></returns>
        private bool ValidateSet()
        {
            var  isAdded    = false;
            var  setChecker = new CheckSet();
            bool isExternal = setChecker.IsExternalStability(DomSet, GivenGraph);
            var  sccStr     = new MdsRowViewModel(DomSet, _dsCount - _countOfSes + 1);
            var  isMinimal  = setChecker.IsMinimal(DomSet, GivenGraph);

            // какое множество проверяем
            UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 2. На проверку отправлено множество: " + sccStr.VerticesView);
            if (isExternal)
            {
                if (isMinimal)
                {
                    //Поиск выбранного множества в списке всех множеств ???
                    foreach (var sccRow in MdsRows)
                    {
                        if (sccRow.VerticesView == sccStr.VerticesView)
                        {
                            isAdded = true;
                            break;
                        }
                    }
                    //Проверка на уже добавленность выбранного множества
                    if (isAdded)
                    {
                        MessageBox.Show("Множество " + sccStr.VerticesView + " уже добавлено.");
                        if (UserActionsManager.Score > 2)
                        {
                            UserActionsManager.RegisterMistake("Множество " + sccStr.VerticesView + " уже добавлено.", 2);
                        }
                        else if (UserActionsManager.Score > 0)
                        {
                            UserActionsManager.RegisterMistake("Множество " + sccStr.VerticesView + " уже добавлено.",
                                                               (short)UserActionsManager.Score);
                        }
                    }
                    else
                    {
                        MdsRows.Add(sccStr);
                        --_countOfSes;
                        //Выбрано достаточное количество множеств внешней устойчивости
                        if (_countOfSes == 0)
                        {
                            UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 2 завершено. ");
                            MessageBox.Show("Задание 2 пройдено.\n Вы перешли к заданию 3.\n Ознакомьтесь со справкой.<?>");
                            _task = Task.TaskFindMinDomSets;
                        }
                        if (UserActionsManager.Score > _countOfSes)
                        {
                            UserActionsManager.RegisterInfo(string.Format(@"Множество добавлено. Осталось {0} множеств(о).",
                                                                          _countOfSes));
                        }
                        else if (UserActionsManager.Score > 0)
                        {
                            UserActionsManager.RegisterInfo(string.Format(@"Множество добавлено. Осталось {0} множеств(о).",
                                                                          UserActionsManager.Score));
                        }
                    }

                    //Очищаем текущее множество выбранных вершин
                    DomSet.Clear();

                    //Визуальное изменение выбранных элементов
                    foreach (var vertex in VertVisCol)
                    {
                        vertex.BorderBrush = new SolidColorBrush(_defaultBorderColor);
                        vertex.Background  = new SolidColorBrush(_defaultBackgroundColor);
                        Matrix[Convert.ToInt32(vertex.Name)].Background =
                            new SolidColorBrush(Color.FromArgb(250, 239, 240, 250));
                    }


                    foreach (var edge in EdgeVisCol)
                    {
                        edge.Stroke = new SolidColorBrush(_defaultBorderColor);
                    }
                }
                else
                {
                    if (UserActionsManager.Score > 10)
                    {
                        UserActionsManager.RegisterMistake("Это множество вершин не является минимальным.", 10);
                    }
                    else if (UserActionsManager.Score > 0)
                    {
                        UserActionsManager.RegisterMistake("Это множество вершин не является минимальным.",
                                                           (short)UserActionsManager.Score);
                    }
                }
            }
            else
            {
                if (UserActionsManager.Score > 10)
                {
                    UserActionsManager.RegisterMistake("Это множество вершин не является внешне устойчивым.", 10);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake("Это множество вершин не является внешне устойчивым.",
                                                       (short)UserActionsManager.Score);
                }
            }
            return(true);
        }
        private void InitToolBarCommands()
        {
            #region Первый этап
            #region Добавление рёбер
            var phase1AddEdgeCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                IsEgesAddingEnabled          = true;
                _state = State.EdgesAdding;
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                IsEgesAddingEnabled          = false;
                _state = State.Nothing;
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Arrow.png")),
                Description = Strings.Strings_RU.buttonEdges
            };
            #endregion

            #region Завершить этап
            var allSubgraphs = new ObservableCollection <IGraph>();

            var phase1Command = new ToolBarInstantCommand(
                () =>
            {
                var solve = true;
                var gp    = new GraphPrinter();
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage1Check + gp.GraphToString(CurrentGraph));
                CurrentGraph.Vertices.ForEach(v1 =>
                                              CurrentGraph.Vertices.ForEach(v2 =>
                {
                    solve = solve && (v1.Equals(v2) || (CurrentGraph[v1, v2] == null ^
                                                        GivenGraph[
                                                            GivenGraph.Vertices.Single(v1.Equals),
                                                            GivenGraph.Vertices.Single(v2.Equals)] == null
                                                        ));
                }
                                                                            ));
                if (solve)
                {
                    UserActionsManager.RegisterInfo(Strings.Strings_RU.stage1Done);
                    GivenGraph   = CurrentGraph;
                    CurrentGraph = new UndirectedGraph();

                    Phase1ToolBarVisibility = Visibility.Collapsed;
                    Phase2ToolBarVisibility = Visibility.Visible;
                    L1 = Strings.Strings_RU.subgraph;

                    FindAllSubgraphs(GivenGraph, 0, GivenGraph.Vertices.ToList(), allSubgraphs);

                    new SimpleDialog("Справка", Strings.Strings_RU.stage2Help).Show();
                }
                else
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage1Mistake1, 10);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Check.png")),
                Description = Strings.Strings_RU.stage1DoneButtonDisc
            };
            #endregion

            #region Справка
            var phase1HelpCommand = new ToolBarInstantCommand(
                () =>
            {
                new SimpleDialog("Справка", Strings.Strings_RU.stage1Help).Show();
            },
                () => _state == State.Nothing
                )
            {
                Description = Strings.Strings_RU.buttonHelp,
                Image       = new BitmapImage(GetImageUri("Info.png"))
            };
            #endregion

            #region Молния
            var thunderbolt1 = new ToolBarInstantCommand(
                () =>
            {
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage1ThunderCall);
                CurrentGraph.Vertices.ForEach(v1 =>
                                              CurrentGraph.Vertices.ForEach(v2 =>
                {
                    if (!v1.Equals(v2) && CurrentGraph[v1, v2] == null && GivenGraph[
                            GivenGraph.Vertices.Single(v1.Equals),
                            GivenGraph.Vertices.Single(v2.Equals)] == null)
                    {
                        CurrentGraph.AddEdge(new UndirectedEdge((Vertex)v1, (Vertex)v2));
                    }
                    if (!v1.Equals(v2) && CurrentGraph[v1, v2] != null && GivenGraph[
                            GivenGraph.Vertices.Single(v1.Equals),
                            GivenGraph.Vertices.Single(v2.Equals)] != null)
                    {
                        CurrentGraph.RemoveEdge(CurrentGraph[v1, v2]);
                    }
                }
                                                                            ));
            },
                () => _state == State.Nothing
                )
            {
                Description = "Молния",
                Image       = new BitmapImage(GetImageUri("thunder.png"))
            };
            #endregion
            #endregion

            #region Второй этап
            #region Добавление вершин

            var vertexDialogCommand = new ToolBarInstantCommand(
                () =>
            {
                var dialog = new VertexDialog((UndirectedGraph)CurrentGraph, GivenGraph.Vertices);
                dialog.Show();
                dialog.Closed += (sender, args) =>
                {
                    var buf      = CurrentGraph;
                    CurrentGraph = null;
                    CurrentGraph = buf;
                };
            },
                () => _state == State.Nothing)
            {
                Image       = new BitmapImage(GetImageUri("Vertexes.png")),
                Description = Strings.Strings_RU.buttonVertexDialog
            };
            #endregion

            #region Добавление рёбер
            var phase2AddEdgeCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                IsEgesAddingEnabled          = true;
                _state = State.EdgesAdding;
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                IsEgesAddingEnabled          = false;
                _state = State.Nothing;
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Arrow.png")),
                Description = Strings.Strings_RU.buttonEdges
            };
            #endregion

            #region Добавление подграфов
            var subgraphCommand = new ToolBarInstantCommand(
                () =>
            {
                var subgraph = true;
                var unique   = Unique((UndirectedGraph)CurrentGraph, GraphLib.Lib);
                var gp       = new GraphPrinter();
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2Check + gp.GraphToString(CurrentGraph));
                CurrentGraph.Vertices.ForEach(v1 =>
                {
                    CurrentGraph.Vertices.ForEach(v2 =>
                    {
                        subgraph &= v1.Equals(v2) || (CurrentGraph[v1, v2] == null ^ GivenGraph[
                                                          GivenGraph.Vertices.Single(v1.Equals),
                                                          GivenGraph.Vertices.Single(v2.Equals)] != null);
                    }
                                                  );
                }
                                              );
                if (CurrentGraph.VerticesCount == 0)
                {
                    return;
                }
                if (!subgraph)
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage2Mistake1, 10);
                    return;
                }

                if (!unique)
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage2Mistake2, 10);
                    return;
                }

                var newGraph = UndirectedGraph.CreateEmpty(CurrentGraph.VerticesCount);
                for (var i = 0; i < CurrentGraph.VerticesCount; i++)
                {
                    for (var j = i + 1; j < CurrentGraph.VerticesCount; j++)
                    {
                        if (CurrentGraph[CurrentGraph.Vertices[i], CurrentGraph.Vertices[j]] != null)
                        {
                            newGraph.AddEdge(new UndirectedEdge(newGraph.Vertices[i], newGraph.Vertices[j]));
                        }
                    }
                }
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2Subgraph);

                GraphLib.Lib.Add(newGraph);
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Collection.png")),
                Description = Strings.Strings_RU.buttonCheckSubgraph
            };
            #endregion

            #region Справка
            var phase2HelpCommand = new ToolBarInstantCommand(
                () =>
            {
                new SimpleDialog("Справка", Strings.Strings_RU.stage2Help).Show();
            },
                () => _state == State.Nothing
                )
            {
                Description = Strings.Strings_RU.buttonHelp,
                Image       = new BitmapImage(GetImageUri("Info.png"))
            };
            #endregion

            #region Молния
            var thunderbolt2 = new ToolBarInstantCommand(
                () =>
            {
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2ThunderCall);
                allSubgraphs.ForEach(s =>
                {
                    if (Unique(s, GraphLib.Lib))
                    {
                        GraphLib.Lib.Add(s);
                    }
                });
                var g = UndirectedGraph.CreateEmpty(GivenGraph.VerticesCount);
                for (var i = 0; i < g.VerticesCount; i++)
                {
                    for (var j = i + 1; j < g.VerticesCount; j++)
                    {
                        if (GivenGraph[GivenGraph.Vertices[i], GivenGraph.Vertices[j]] != null)
                        {
                            g.AddEdge(new UndirectedEdge(g.Vertices[i], g.Vertices[j]));
                        }
                    }
                }
                GraphLib.Lib.Add(g);
            },
                () => _state == State.Nothing
                )
            {
                Description = "Молния",
                Image       = new BitmapImage(GetImageUri("thunder.png"))
            };
            #endregion

            #region Завершить этап
            var phase2Command = new ToolBarInstantCommand(
                () =>
            {
                if (GraphLib.Lib.Count > allSubgraphs.Count)
                {
                    UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2Done);
                    UserActionsManager.ReportThatTaskFinished();
                }
                else
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage2Mistake3, 10);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Check.png")),
                Description = Strings.Strings_RU.stage2DoneButtonDisc
            };
            #endregion
            #endregion

            Phase1ToolBarCommands = new ObservableCollection <ToolBarCommandBase>
            {
                phase1AddEdgeCommand,
                phase1Command,
                phase1HelpCommand
                #if DEBUG
                ,
                thunderbolt1
                #endif
            };
            Phase2ToolBarCommands = new ObservableCollection <ToolBarCommandBase>
            {
                vertexDialogCommand,
                phase2AddEdgeCommand,
                subgraphCommand,
                phase2Command,
                phase2HelpCommand
                #if DEBUG
                ,
                thunderbolt2
                #endif
            };
        }