private void WriteLogWithTraveledData(TraveledPathData data)
        {
            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                SearchEventManager sem = data.EventManager;

                Logger.ClearLog();

                foreach (var searchEvent in sem.Events)
                {
                    Logger.WriteLogInfo(
                        searchEvent.EventMessage);
                }
                StringBuilder msg = new StringBuilder();

                Logger.WriteLogInfo(string.Format("Total edges EXPLORED in PATH: {0}", data.ExploredEdges.Count));
                foreach (var edge in data.ExploredEdges)
                {
                    msg.Append(edge + "=>");
                }
                Logger.WriteLogInfo(msg.ToString());
                msg.Clear();


                Logger.WriteLogInfo(string.Format("Total edges TRAVELED in PATH: {0}", data.TraveledEdges.Count));
                foreach (var vert in data.TraveledEdges)
                {
                    msg.Append(vert + "=>");
                }
                Logger.WriteLogInfo(msg.ToString());
                msg.Clear();

                Logger.WriteLogInfo("SHORTEST PATH:");

                var shortestPath = data.GetShortestPath();
                foreach (var edge in shortestPath)
                {
                    msg.Append(edge + "=>");
                }
                Logger.WriteLogInfo(msg.ToString());
            }));
        }
        private void SearchDidFinishedWithData(object data)
        {
            Application.Current.Dispatcher.Invoke(new Action(() => this.FillVisioGraphWithGraph(this.Graph)));
            Application.Current.Dispatcher.Invoke(new Action(this.SetupVisioTree));

            SearchEventManager sem;
            List <Edge>        shortestPath;

            if (data is TwoWayTraveledPathData)
            {
                TwoWayTraveledPathData twtpd = data as TwoWayTraveledPathData;
                sem          = twtpd.SEM;
                shortestPath = twtpd.GetShortestPath();
                this.WritePathCostToTextBox(twtpd.TotalCost);
                this.WriteLogWithTwoWayTraveledData(twtpd);
            }
            else if (data is TraveledPathData)
            {
                TraveledPathData tpd = data as TraveledPathData;
                sem          = tpd.EventManager;
                shortestPath = tpd.TraveledEdges;
                this.WritePathCostToTextBox(tpd.TotalCost);
                this.WriteLogWithTraveledData(tpd);



                List <Vertex> visited = new List <Vertex>();
                foreach (var vert in this.VisioGraph.Vertices)
                {
                    var edges = this.VisioGraph.Edges.Where(e => (Vertex)e.Source == (Vertex)vert && !visited.Contains((Vertex)e.Target));
                    foreach (var edge in edges)
                    {
                        if (edge is MyEdge)
                        {
                            var ed = (edge as MyEdge);
                            ed.Tag += "(" + this.Graph.HeuristicData.GetEdge((Vertex)edge.Target, sem.GoalVertex).Weight + ")";
                        }
                    }
                    visited.Add((Vertex)vert);
                }
            }
            else
            {
                return;
            }



            foreach (var searchEvent in sem.Events)
            {
                var edges1 = this.VisioGraph.Edges.Where(
                    e =>
                    (Vertex)e.Source == searchEvent.ParticipantEdge.VerticeFrom &&
                    (Vertex)e.Target == searchEvent.ParticipantEdge.VerticeTo);

                switch (searchEvent.Type)
                {
                //case SearchEventType.AddedEdgeToExplored:
                //    foreach (var edge in edges1)
                //    {
                //        if (edge is MyEdge)
                //        {
                //            var ed = edge as MyEdge;
                //            ed.EdgeColor = Colors.Blue;

                //            Application.Current.Dispatcher.Invoke(new Action(() => { this.VisioTree.AddVerticesAndEdge(edge); this.treeLayout.Graph = this.VisioTree; }));
                //            Thread.Sleep(1000);
                //        }
                //    }
                //    break;
                case SearchEventType.AddedEdgeToTraveled:
                    foreach (var edge in edges1)
                    {
                        if (edge is MyEdge)
                        {
                            var ed = edge as MyEdge;
                            ed.EdgeColor = Colors.Green;

                            Application.Current.Dispatcher.Invoke(new Action(() => { this.VisioTree.AddVerticesAndEdge(edge); this.treeLayout.Graph = this.VisioTree; }));
                            Thread.Sleep(1000);
                        }
                    }
                    break;
                    //case SearchEventType.RemovedEdgeFromExplored:
                    //    foreach (var edge in edges1)
                    //    {
                    //        if (edge is MyEdge)
                    //        {
                    //            var ed = edge as MyEdge;
                    //            ed.EdgeColor = Colors.Red;

                    //            Application.Current.Dispatcher.Invoke(new Action(() => { this.VisioTree.AddVerticesAndEdge(edge); this.treeLayout.Graph = this.VisioTree; }));
                    //            Thread.Sleep(1000);
                    //        }
                    //    }
                    //    break;
                }
            }

            foreach (var edge in shortestPath)
            {
                var edgeFromGraph = this.VisioGraph.Edges.Single(
                    e => (Vertex)e.Source == edge.VerticeFrom &&
                    (Vertex)e.Target == edge.VerticeTo);
                if (edgeFromGraph is MyEdge)
                {
                    var ed = edgeFromGraph as MyEdge;
                    ed.EdgeColor = Colors.OrangeRed;
                }
            }
        }