예제 #1
0
        /// <summary>
        /// Determines the optimal start and end positions.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>
        /// <param name="startX">The start X.</param>
        /// <param name="startY">The start Y.</param>
        /// <param name="endX">The end X.</param>
        /// <param name="endY">The end Y.</param>
        private static void DetermineOptimalStartEndPositions(CompositeComponentGraph compositeComponentGraph, out double startX, out double startY, out double endX, out double endY)
        {
            double leftX, rightX, topY, bottomY;

            TraceLab.Core.Utilities.ExperimentHelper.DetermineGraphBoundaries(compositeComponentGraph, out leftX, out rightX, out topY, out bottomY);

            startX = 0;
            startY = 0;
            endX   = 0;
            endY   = 0;

            //calculate optimal start and end position
            if (leftX == rightX)
            {
                startX = leftX;
                endX   = leftX;
            }
            else
            {
                double middleX = (leftX + rightX) / 2;
                startX = middleX;
                endX   = middleX;
            }

            startY = topY - 50;
            endY   = bottomY + 50;
        }
예제 #2
0
        public override BaseExperiment Clone()
        {
            var clone = new CompositeComponentGraph(this);

            clone.ResetModifiedFlag();
            return(clone);
        }
예제 #3
0
        /// <summary>
        /// Connects the nodes to start and end node.
        /// In case user selected partial graph without start or/and end node, this methods adds
        /// accordingly Start and End node to the given composite graph.
        /// If some selected nodes didn't have any outgoing paths they are automatically connected to the end node.
        /// If some selected nodes didn't have any incoming paths they are automatically connected to the start node.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>

        // HERZUM SPRINT 2.4 TLAB-157
        // private static void ConnectNodesToStartAndEndNode(CompositeComponentGraph compositeComponentGraph)
        public static void ConnectNodesToStartAndEndNode(CompositeComponentGraph compositeComponentGraph)
        // END HERZUM SPRINT 2.4 TLAB-157
        {
            if (compositeComponentGraph.StartNode == null || compositeComponentGraph.EndNode == null)
            {
                double startX, startY, endX, endY;

                DetermineOptimalStartEndPositions(compositeComponentGraph, out startX, out startY, out endX, out endY);

                if (compositeComponentGraph.StartNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentStartNode start = new ExperimentStartNode();
                    start.Data.X = startX;
                    start.Data.Y = startY;
                    compositeComponentGraph.AddVertex(start);
                    compositeComponentGraph.StartNode = start;
                }

                if (compositeComponentGraph.EndNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentEndNode end = new ExperimentEndNode();
                    end.Data.X = endX;
                    end.Data.Y = endY;
                    compositeComponentGraph.AddVertex(end);
                    compositeComponentGraph.EndNode = end;
                }

                //connect subgraph to start and end
                foreach (ExperimentNode node in compositeComponentGraph.Vertices)
                {
                    if (node is ExperimentStartNode == false && node is ExperimentEndNode == false)
                    {
                        //if node has not any incoming connection from other Selected Nodes it has to be connected to the start
                        if (compositeComponentGraph.IsInEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), compositeComponentGraph.StartNode, node));
                        }

                        //if node has not any outcoming connection from other Selected Nodes it has to be connected to the end
                        if (compositeComponentGraph.IsOutEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), node, compositeComponentGraph.EndNode));
                        }
                    }
                }
                // HERZUM SPRINT 3.0: COMPOSITE BUG FIX
                if (compositeComponentGraph.EdgeCount == 0 && compositeComponentGraph.StartNode != null && compositeComponentGraph.EndNode != null)
                {
                    compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), compositeComponentGraph.StartNode, compositeComponentGraph.EndNode));
                    compositeComponentGraph.StartNode.Data.X = 0;
                    compositeComponentGraph.StartNode.Data.Y = 0;
                    compositeComponentGraph.EndNode.Data.X   = 0;
                    compositeComponentGraph.EndNode.Data.Y   = 100;
                }
                // END HERZUM SPRINT 3.0: COMPOSITE BUG FIX
            }
        }
예제 #4
0
        // HERZUM SPRINT 2.4 TLAB-157
        public static CompositeComponentGraph ConstructEmptyGraph()
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();
            compositeComponentGraph.OwnerNode      = null;
            return(compositeComponentGraph);
        }
예제 #5
0
        // HERZUM SPRINT 2.3 TLAB-56 TLAB-57 TLAB-58 TLAB-59
        public void CopyAndAdd(CompositeComponentGraph subExperiment, double x, double y)
        {
            if (subExperiment == null)
            {
                return;
            }

            CopyAndAdd(subExperiment, x, y, true);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="DefiningCompositeComponentSetup"/> class.
        /// </summary>
        /// <param name="experiment">The experiment.</param>
        public DefiningCompositeComponentSetup(Experiment experiment)
        {
            CompositeComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes(experiment);

            InputSettings  = new SortedDictionary <string, ItemSetting>();
            OutputSettings = new SortedDictionary <string, ItemSetting>();
            ConfigSettings = new SortedDictionary <string, ConfigItemSetting>();

            TraceLab.Core.Utilities.ExperimentHelper.BFSTraverseExperiment(CompositeComponentGraph, CompositeComponentGraph.StartNode, RetrieveIOSpecAndConfig);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="CompositeComponentGraph"/> class with the given settings.
        /// </summary>
        /// <param name="compositeComponentNode">The composite component node.</param>
        /// <param name="componentGraph">The component graph.</param>
        /// <param name="settings">The settings. All components are initialized with with the given settings.</param>
        public CompositeComponentGraph(CompositeComponentNode compositeComponentNode, CompositeComponentGraph componentGraph) : base()
        {
            if (componentGraph == null)
            {
                throw new ArgumentException("Component graph cannot be null");
            }

            CopyFrom(componentGraph);
            OwnerNode = compositeComponentNode;
        }
 private void ConstructGraphFromSelectedScopeNodes(CompositeComponentGraph experiment)
 {
     if (experiment == null)
         return;
     CompositeComponentGraph.CopyAndAdd (CompositeComponentGraph.ConstructGraphFromSelectedNodes (experiment), 200.0, 200.0);  
     foreach (ExperimentNode node in experiment.Vertices) {
         if (!node.IsSelected){
             ScopeBaseMetadata scopeBaseMetadata = node.Data.Metadata as ScopeBaseMetadata;
             if (scopeBaseMetadata!= null && scopeBaseMetadata.ComponentGraph!=null)
                 ConstructGraphFromSelectedScopeNodes(scopeBaseMetadata.ComponentGraph);
         }
     }
 }
예제 #9
0
파일: Clipboard.cs 프로젝트: CoEST/TraceLab
        public static void Copy(BaseExperiment originalExperiment)
        {
            // HERZUM SPRINT 4: TLAB-215
            if (clipboardComponentGraph != null)
                clipboardComponentGraph.Clear ();
            // END HERZUM SPRINT 4: TLAB-215

            clipboardComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes (originalExperiment);

            foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
                node.IsSelected = false;

        }
예제 #10
0
        /// <summary>
        /// Discovers the full graph ID path.
        /// </summary>
        private void DiscoverFullGraphIDPath()
        {
            //call the method that discovers it along with top owner node
            CompositeComponentGraph parentGraph = OwnerNode.Owner as CompositeComponentGraph;

            if (parentGraph != null)
            {
                //otherwise add to already existing path
                m_fullGraphIdPath = parentGraph.GraphIdPath + ":" + OwnerNode.ID;
            }
            else
            {
                //otherwise it must have reached the top level experiment
                m_fullGraphIdPath = OwnerNode.ID;
            }
        }
예제 #11
0
        public static void Copy(ApplicationContext applicationContext, BaseExperiment originalExperiment)
        {
            clipboardComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes (originalExperiment);

            foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
                node.IsSelected = false;

            BasicNodeControl componentControl;
            foreach (ExperimentNode originalNode in originalExperiment.Vertices)
                foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
                    if (originalNode.ID.Equals(node.ID))
                        if(applicationContext.NodeControlFactory.TryGetNodeControl(originalNode, out componentControl)) {
                        node.Data.X = componentControl.DisplayBox.X;
                        node.Data.Y = componentControl.DisplayBox.Y;
                    }
        }
예제 #12
0
        public static void Copy(BaseExperiment originalExperiment)
        {
            // HERZUM SPRINT 4: TLAB-215
            if (clipboardComponentGraph != null)
            {
                clipboardComponentGraph.Clear();
            }
            // END HERZUM SPRINT 4: TLAB-215

            clipboardComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes(originalExperiment);

            foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
            {
                node.IsSelected = false;
            }
        }
        private static void PushParents(CompositeComponentGraph graph, List<Crumb> crumbs) 
        {
            IExperiment parent = graph.OwnerNode.Owner;

            CompositeComponentGraph graphAbove = parent as CompositeComponentGraph;
            if(graphAbove != null) 
            {
                PushParents(graphAbove, crumbs);
                ExperimentNode ownerNode = graphAbove.OwnerNode;
                crumbs.Add(new ExperimentCrumb(ownerNode.Data.Metadata.Label, graphAbove));
            }
            else if(parent is Experiment)
            {
                crumbs.Add(new ExperimentCrumb(parent.Title, parent));
            }
        }
예제 #14
0
        // END HERZUM SPRINT 3.1 TLAB-180

        /// <summary>
        /// Initializes a new instance of the <see cref="DefiningCompositeComponentSetup"/> class.
        /// </summary>
        /// <param name="experiment">The experiment.</param>
        public DefiningCompositeComponentSetup(Experiment experiment)
        {
            // HERZUM SPRINT 2.4 TLAB-157
            // CompositeComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes(experiment);
            CompositeComponentGraph = CompositeComponentGraph.ConstructEmptyGraph();
            // HERZUM SPRINT 3.1 TLAB-180
            // CompositeComponentGraph.CopyAndAdd (CompositeComponentGraph.ConstructGraphFromSelectedNodes (experiment), 200.0, 200.0);
            ConstructGraphFromSelectedScopeNodes(experiment);
            // END HERZUM SPRINT 3.1 TLAB-180
            CompositeComponentGraph.ConnectNodesToStartAndEndNode(CompositeComponentGraph);
            // END HERZUM SPRINT 2.4 TLAB-157

            InputSettings  = new SortedDictionary <string, ItemSetting>();
            OutputSettings = new SortedDictionary <string, ItemSetting>();
            ConfigSettings = new SortedDictionary <string, ConfigItemSetting>();

            TraceLab.Core.Utilities.ExperimentHelper.BFSTraverseExperiment(CompositeComponentGraph, CompositeComponentGraph.StartNode, RetrieveIOSpecAndConfig);
        }
예제 #15
0
 private void ConstructGraphFromSelectedScopeNodes(CompositeComponentGraph experiment)
 {
     if (experiment == null)
     {
         return;
     }
     CompositeComponentGraph.CopyAndAdd(CompositeComponentGraph.ConstructGraphFromSelectedNodes(experiment), 200.0, 200.0);
     foreach (ExperimentNode node in experiment.Vertices)
     {
         if (!node.IsSelected)
         {
             ScopeBaseMetadata scopeBaseMetadata = node.Data.Metadata as ScopeBaseMetadata;
             if (scopeBaseMetadata != null && scopeBaseMetadata.ComponentGraph != null)
             {
                 ConstructGraphFromSelectedScopeNodes(scopeBaseMetadata.ComponentGraph);
             }
         }
     }
 }
        // HERZUM SPRINT 3.0: TLAB-176
        private bool IncludeChallenge(CompositeComponentGraph experiment) {
            if (experiment == null)
                return false;
            foreach (ExperimentNode node in experiment.Vertices){
                ChallengeMetadata ch_meta = node.Data.Metadata as ChallengeMetadata;
                if (ch_meta != null){

                    // HERZUM SPRINT 3.0: TLAB-176
                    ExperimentNodeConnection firstInEdge = experiment.InEdge (node,0);
                    ExperimentNodeConnection firstOutEdge = experiment.OutEdge (node,0);
                    if (firstInEdge != null && firstInEdge.Source!= null && firstOutEdge != null && firstOutEdge.Target!= null)
                        experiment.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), firstInEdge.Source, firstOutEdge.Target));
                    // END HERZUM SPRINT 3.0: TLAB-176
                    experiment.RemoveVertex (node);
                    return true;
                }
                CompositeComponentBaseMetadata meta = node.Data.Metadata as CompositeComponentBaseMetadata;
                if (meta != null)
                    return IncludeChallenge(meta.ComponentGraph);
            }
            return false;
        }
예제 #17
0
        private static void PushParents(CompositeComponentGraph graph, List<Crumb> crumbs) 
        {

            IExperiment parent = graph.OwnerNode.Owner;

            CompositeComponentGraph graphAbove = parent as CompositeComponentGraph;
           
            if(graphAbove != null) 
            {
                PushParents(graphAbove, crumbs);
                ExperimentNode ownerNode = graphAbove.OwnerNode;
                // HERZUM SPRINT 2.5: TLAB-173
                if (graphAbove.OwnerNode is ScopeNode || graphAbove.OwnerNode is LoopScopeNode || graphAbove.OwnerNode is ChallengeNode)
                    return;
                // END HERZUM SPRINT 2.5: TLAB-173
                crumbs.Add(new ExperimentCrumb(ownerNode.Data.Metadata.Label, graphAbove));
            }
            else if(parent is Experiment)
            {
                crumbs.Add(new ExperimentCrumb(parent.Title, parent));
            }
        }
예제 #18
0
        void m_data_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsModified")
            {
                NotifyPropertyChanged("IsModified");
            }
            if (e.PropertyName == "ErrorMessage")
            {
                SetError(Data.ErrorMessage);
            }

            // HERZUM SPRINT 5.3 TLAB-251
            CompositeComponentGraph subgraph = Owner as CompositeComponentGraph;

            if (subgraph != null)
            {
                subgraph.IsModified = true;
                if (subgraph.OwnerNode != null)
                {
                    subgraph.OwnerNode.NotifyPropertyChanged(e.PropertyName);
                }
            }
            // END HERZUM SPRINT 5.3 TLAB-251
        }
예제 #19
0
        // HERZUM SPRINT 2.4 TLAB-157
        public static ExperimentCanvasPad CreateCompositeExperimentCanvasPad(ApplicationContext applicationContext, ExperimentCanvasWidget experimentCanvasWidget, CompositeComponentGraph experiment) 
        {   
            ExperimentCanvasPad experimentCanvasPad = null;
            if (m_mapPadToNodes.TryGetValue (applicationContext.GetHashCode() + experiment.ExperimentInfo.Id, out experimentCanvasPad))
                return experimentCanvasPad;
            else
            {
                experimentCanvasPad = new  ExperimentCanvasPad(applicationContext);
                m_mapPadToNodes.Add(applicationContext.GetHashCode() + experiment.ExperimentInfo.Id, experimentCanvasPad);
            } 
 
            DockFrame m_dockFrame = new DockFrame();
            Gdk.WindowAttr attributes = new Gdk.WindowAttr();
            attributes.WindowType = Gdk.WindowType.Child;
            attributes.X = 100;
            attributes.Y = 100;
            attributes.Width = 100;
            attributes.Height = 100;    
            Gdk.WindowAttributesType mask = WindowAttributesType.X | WindowAttributesType.Y;
            m_dockFrame.GdkWindow = new Gdk.Window(null, attributes, (int) mask);
            experimentCanvasPad.Initialize (m_dockFrame);
            experimentCanvasPad.SetApplicationModel(applicationContext.Application, experimentCanvasWidget, experiment);
            return experimentCanvasPad;
        }
 public SubLevelExperimentViewModel(CompositeComponentGraph componentGraph, BaseLevelExperimentViewModel owner)
     : base(componentGraph, owner)
 {
 }
예제 #21
0
        // END HERZUM SPRINT 4.0: TLAB-204

        #region Create Composite Component

        /// <summary>
        /// Constructs the graph from selected nodes of the given experiment graph.
        /// </summary>
        /// <param name="graph">The graph.</param>
        /// <returns></returns>
        public static CompositeComponentGraph ConstructGraphFromSelectedNodes(BaseExperiment originalExperiment)
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();

            AssureCompleteDecisionSelection(originalExperiment);

            //keep lookup from original node to its clone for later edge reproduction
            Dictionary <ExperimentNode, ExperimentNode> clonedNodeLookup = new Dictionary <ExperimentNode, ExperimentNode>();

            // Clone vertices that are selected and add them to the composite component graph
            foreach (ExperimentNode node in originalExperiment.Vertices)
            {
                if (node.IsSelected)
                {
                    var clonedNode = node.Clone();
                    clonedNodeLookup[node] = clonedNode;
                    compositeComponentGraph.SetLogLevelSettings(clonedNode, compositeComponentGraph.Settings);

                    compositeComponentGraph.AddVertex(clonedNode);

                    if (clonedNode.ID == "Start" && compositeComponentGraph.StartNode == null)
                    {
                        compositeComponentGraph.StartNode = (ExperimentStartNode)clonedNode;
                    }
                    else if (clonedNode.ID == "End" && compositeComponentGraph.EndNode == null)
                    {
                        compositeComponentGraph.EndNode = (ExperimentEndNode)clonedNode;
                    }
                }
            }

            // Clone edges
            foreach (ExperimentNodeConnection connection in originalExperiment.Edges)
            {
                ExperimentNode cloneSourceNode, cloneTargetNode;

                //add edges only if both source and target nodes has been found in clones lookup
                bool foundSourceNode = clonedNodeLookup.TryGetValue(connection.Source, out cloneSourceNode);
                bool foundTargetNode = clonedNodeLookup.TryGetValue(connection.Target, out cloneTargetNode);
                if (foundSourceNode && foundTargetNode)
                {
                    ExperimentNodeConnection clonedConnection = new ExperimentNodeConnection(connection.ID, cloneSourceNode, cloneTargetNode, connection.IsFixed, connection.IsVisible);
                    //copy also all route points
                    clonedConnection.RoutePoints.CopyPointsFrom(connection.RoutePoints);

                    compositeComponentGraph.AddEdge(clonedConnection);

                    //perform fixes for scopes
                    ScopeNodeHelper.TryFixScopeDecisionEntryAndExitNodes(cloneSourceNode, cloneTargetNode);
                }
            }

            ConnectNodesToStartAndEndNode(compositeComponentGraph);

            //move graph closer to the origin point
            TraceLab.Core.Utilities.ExperimentHelper.MoveGraphCloserToOriginPoint(compositeComponentGraph, 200, 200);

            if (originalExperiment.References != null)
            {
                compositeComponentGraph.References = originalExperiment.References.CopyCollection();
            }

            compositeComponentGraph.OwnerNode = null;

            return(compositeComponentGraph);
        }
 public override BaseExperiment Clone()
 {
     var clone = new CompositeComponentGraph(this);
     clone.ResetModifiedFlag();
     return clone;
 }
예제 #23
0
        // HERZUM SPRINT 2.4 TLAB-157
        public static CompositeComponentGraph ConstructEmptyGraph()
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();       
            compositeComponentGraph.OwnerNode = null;
            return compositeComponentGraph;

        }
        /// <summary>
        /// Determines the optimal start and end positions.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>
        /// <param name="startX">The start X.</param>
        /// <param name="startY">The start Y.</param>
        /// <param name="endX">The end X.</param>
        /// <param name="endY">The end Y.</param>
        private static void DetermineOptimalStartEndPositions(CompositeComponentGraph compositeComponentGraph, out double startX, out double startY, out double endX, out double endY)
        {
            double leftX, rightX, topY, bottomY;
            TraceLab.Core.Utilities.ExperimentHelper.DetermineGraphBoundaries(compositeComponentGraph, out leftX, out rightX, out topY, out bottomY);

            startX = 0;
            startY = 0;
            endX = 0;
            endY = 0;

            //calculate optimal start and end position
            if (leftX == rightX)
            {
                startX = leftX;
                endX = leftX;
            }
            else
            {
                double middleX = (leftX + rightX) / 2;
                startX = middleX;
                endX = middleX;
            }

            startY = topY - 50;
            endY = bottomY + 50;
        }
        /// <summary>
        /// Connects the nodes to start and end node.
        /// In case user selected partial graph without start or/and end node, this methods adds 
        /// accordingly Start and End node to the given composite graph. 
        /// If some selected nodes didn't have any outgoing paths they are automatically connected to the end node.
        /// If some selected nodes didn't have any incoming paths they are automatically connected to the start node.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>
        private static void ConnectNodesToStartAndEndNode(CompositeComponentGraph compositeComponentGraph)
        {
            if (compositeComponentGraph.StartNode == null || compositeComponentGraph.EndNode == null)
            {
                double startX, startY, endX, endY;

                DetermineOptimalStartEndPositions(compositeComponentGraph, out startX, out startY, out endX, out endY);

                if (compositeComponentGraph.StartNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentStartNode start = new ExperimentStartNode();
                    start.Data.X = startX;
                    start.Data.Y = startY;
                    compositeComponentGraph.AddVertex(start);
                    compositeComponentGraph.StartNode = start;
                }

                if (compositeComponentGraph.EndNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentEndNode end = new ExperimentEndNode();
                    end.Data.X = endX;
                    end.Data.Y = endY;
                    compositeComponentGraph.AddVertex(end);
                    compositeComponentGraph.EndNode = end;
                }

                //connect subgraph to start and end
                foreach (ExperimentNode node in compositeComponentGraph.Vertices)
                {
                    if (node is ExperimentStartNode == false && node is ExperimentEndNode == false)
                    {
                        //if node has not any incoming connection from other Selected Nodes it has to be connected to the start
                        if (compositeComponentGraph.IsInEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), compositeComponentGraph.StartNode, node));
                        }

                        //if node has not any outcoming connection from other Selected Nodes it has to be connected to the end
                        if (compositeComponentGraph.IsOutEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), node, compositeComponentGraph.EndNode));
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Constructs the graph from selected nodes of the given experiment graph.
        /// </summary>
        /// <param name="graph">The graph.</param>
        /// <returns></returns>
        public static CompositeComponentGraph ConstructGraphFromSelectedNodes(BaseExperiment originalExperiment)
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();

            AssureCompleteDecisionSelection(originalExperiment);

            //keep lookup from original node to its clone for later edge reproduction
            Dictionary<ExperimentNode, ExperimentNode> clonedNodeLookup = new Dictionary<ExperimentNode, ExperimentNode>();

            // Clone vertices that are selected and add them to the composite component graph
            foreach (ExperimentNode node in originalExperiment.Vertices)
            {
                if (node.IsSelected)
                {
                    var clonedNode = node.Clone();
                    clonedNodeLookup[node] = clonedNode;
                    compositeComponentGraph.SetLogLevelSettings(clonedNode, compositeComponentGraph.Settings);
                    compositeComponentGraph.AddVertex(clonedNode);

                    if (clonedNode.ID == "Start" && compositeComponentGraph.StartNode == null)
                    {
                        compositeComponentGraph.StartNode = (ExperimentStartNode)clonedNode;
                    }
                    else if (clonedNode.ID == "End" && compositeComponentGraph.EndNode == null)
                    {
                        compositeComponentGraph.EndNode = (ExperimentEndNode)clonedNode;
                    }
                }
            }

            // Clone edges
            foreach (ExperimentNodeConnection connection in originalExperiment.Edges)
            {
                ExperimentNode cloneSourceNode, cloneTargetNode;

                //add edges only if both source and target nodes has been found in clones lookup
                bool foundSourceNode = clonedNodeLookup.TryGetValue(connection.Source, out cloneSourceNode);
                bool foundTargetNode = clonedNodeLookup.TryGetValue(connection.Target, out cloneTargetNode);
                if (foundSourceNode && foundTargetNode)
                {
                    ExperimentNodeConnection clonedConnection = new ExperimentNodeConnection(connection.ID, cloneSourceNode, cloneTargetNode, connection.IsFixed, connection.IsVisible);
                    //copy also all route points
                    clonedConnection.RoutePoints.CopyPointsFrom(connection.RoutePoints);

                    compositeComponentGraph.AddEdge(clonedConnection);

                    //perform fixes for scopes 
                    ScopeNodeHelper.TryFixScopeDecisionEntryAndExitNodes(cloneSourceNode, cloneTargetNode);
                }
            }

            ConnectNodesToStartAndEndNode(compositeComponentGraph);

            //move graph closer to the origin point
            TraceLab.Core.Utilities.ExperimentHelper.MoveGraphCloserToOriginPoint(compositeComponentGraph, 200, 200);
                        
            if (originalExperiment.References != null)
            {
                if (!TraceLabSDK.RuntimeInfo.IsRunInMono)
                {
                    compositeComponentGraph.References = new ObservableCollection<TraceLabSDK.PackageSystem.IPackageReference>(originalExperiment.References);
                }
                else
                {
                    // Mono currently has not implemented constructor of ObservableCollection(IEnumerable<T> collection)
                    // thus we have to add references manually
                    compositeComponentGraph.References = new ObservableCollection<TraceLabSDK.PackageSystem.IPackageReference>();
                    foreach (TraceLabSDK.PackageSystem.IPackageReference reference in originalExperiment.References)
                    {
                        compositeComponentGraph.References.Add(reference);
                    }
                }
            }

            compositeComponentGraph.OwnerNode = null;

            return compositeComponentGraph;
        }
 /// <summary>
 /// Initializes the component graph from ComponentMetadataDefinition graph
 /// </summary>
 /// <param name="node">The node.</param>
 /// <param name="settings">The settings.</param>
 public override void InitializeComponentGraph(CompositeComponentNode node, TraceLab.Core.Settings.Settings settings)
 {
     //each composite node gets its own copy of ComponentMetadataDefinition.ComponentGraph
     m_compositeComponentGraph = new CompositeComponentGraph(node, ComponentMetadataDefinition.ComponentGraph);
     m_compositeComponentGraph.Settings = settings;
 }
예제 #28
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CompositeComponentGraph"/> class with the given settings.
        /// </summary>
        /// <param name="compositeComponentNode">The composite component node.</param>
        /// <param name="componentGraph">The component graph.</param>
        /// <param name="settings">The settings. All components are initialized with with the given settings.</param>
        public CompositeComponentGraph(CompositeComponentNode compositeComponentNode, CompositeComponentGraph componentGraph) : base()
        {
            if (componentGraph == null)
            {
                throw new ArgumentException("Component graph cannot be null");
            }

            CopyFrom(componentGraph);
            OwnerNode = compositeComponentNode;
        }
        /// <summary>
        /// Performs a deep copy of the data in this object to another instance of the Metadata.
        /// </summary>
        /// <param name="other">The other.</param>
        protected override void CopyFrom(Metadata other)
        {
            if (other == null)
                throw new ArgumentNullException("other");

            base.CopyFrom(other);

            ScopeBaseMetadata metadata = (ScopeBaseMetadata)other;
            m_experimentLocationRoot = metadata.m_experimentLocationRoot;
            m_compositeComponentGraph = (CompositeComponentEditableGraph)(metadata.m_compositeComponentGraph.Clone());
            
            HasDeserializationError = metadata.HasDeserializationError;
            if (HasDeserializationError)
            {
                DeserializationErrorMessage = metadata.DeserializationErrorMessage;
            }
            
        }
예제 #30
0
        public void CopyAndAdd(CompositeComponentGraph subExperiment, double x, double y, bool first)
        {
            if (subExperiment == null)
            {
                return;
            }

            if (subExperiment.IsVerticesEmpty)
            {
                return;
            }

            bool   firstNode = true;
            double minX      = 0;
            double minY      = 0;
            double offsetX   = 0;
            double offsetY   = 0;

            if (first)
            {
                foreach (ExperimentNode node in subExperiment.Vertices)
                {
                    // HERZUM SPRINT 2.6 TLAB-175
                    // if (node.ID != "Start" && node.ID != "End"){
                    if ((node.ID != "Start" && node.ID != "End") && !(first && (node is ExperimentStartNode || node is ExperimentEndNode)))
                    {
                        // END HERZUM SPRINT 2.6 TLAB-175
                        if (firstNode)
                        {
                            minX      = node.Data.X;
                            minY      = node.Data.Y;
                            firstNode = false;
                        }
                        else
                        {
                            if (node.Data.X < minX)
                            {
                                minX = node.Data.X;
                            }
                            if (node.Data.Y < minY)
                            {
                                minY = node.Data.Y;
                            }
                        }
                    }
                }
            }

            offsetX = x - minX;
            offsetY = y - minY;

            //keep lookup from original node to its clone for later edge reproduction
            Dictionary <ExperimentNode, ExperimentNode> clonedNodeLookup = new Dictionary <ExperimentNode, ExperimentNode>();

            // Clone vertices and add them to the composite component graph
            foreach (ExperimentNode node in subExperiment.Vertices)
            {
                // HERZUM SPRINT 2.6 TLAB-175
                // if (node.ID != "Start" && node.ID != "End")
                if ((node.ID != "Start" && node.ID != "End") && !(first && (node is ExperimentStartNode || node is ExperimentEndNode)))
                // END HERZUM SPRINT 2.6 TLAB-175
                {
                    var clonedNode = node.Clone();
                    clonedNode.ID = Guid.NewGuid().ToString();
                    SetLogLevelSettings(clonedNode, Settings);
                    clonedNodeLookup[node] = clonedNode;

                    clonedNode.Owner = this;

                    if (first)
                    {
                        clonedNode.Data.X = clonedNode.Data.X + offsetX;
                        clonedNode.Data.Y = clonedNode.Data.Y + offsetY;
                    }

                    AddVertex(clonedNode);

                    ScopeBaseMetadata scopeBaseMetadata       = node.Data.Metadata as ScopeBaseMetadata;
                    ScopeBaseMetadata clonedScopeBaseMetadata = clonedNode.Data.Metadata as ScopeBaseMetadata;
                    if ((scopeBaseMetadata != null && clonedScopeBaseMetadata != null) &&
                        (scopeBaseMetadata.ComponentGraph != null))
                    {
                        clonedScopeBaseMetadata.ComponentGraph.Clear();
                        clonedScopeBaseMetadata.ComponentGraph.GetExperiment().ExperimentInfo = clonedScopeBaseMetadata.ComponentGraph.GetExperiment().ExperimentInfo.CloneWithNewId();
                        clonedScopeBaseMetadata.ComponentGraph.CopyAndAdd(scopeBaseMetadata.ComponentGraph, x, y, false);
                    }
                }
            }

            // Clone edges
            foreach (ExperimentNodeConnection connection in subExperiment.Edges)
            {
                ExperimentNode cloneSourceNode, cloneTargetNode;

                //add edges only if both source and target nodes has been found in clones lookup
                bool foundSourceNode = clonedNodeLookup.TryGetValue(connection.Source, out cloneSourceNode);
                bool foundTargetNode = clonedNodeLookup.TryGetValue(connection.Target, out cloneTargetNode);
                if (foundSourceNode && foundTargetNode)
                {
                    ExperimentNodeConnection clonedConnection = new ExperimentNodeConnection(Guid.NewGuid().ToString(), cloneSourceNode, cloneTargetNode, connection.IsFixed, connection.IsVisible);
                    //copy also all route points
                    clonedConnection.RoutePoints.CopyPointsFrom(connection.RoutePoints);
                    AddEdge(clonedConnection);

                    //special case - fix scope node references
                    ScopeNodeHelper.TryFixScopeDecisionEntryAndExitNodes(cloneSourceNode, cloneTargetNode);
                }
            }

            // HERZUM SPRINT 2.4 TLAB-56 TLAB-57 TLAB-58 TLAB-59
            if (first)
            {
                if (subExperiment.References != null)
                {
                    References = subExperiment.References.CopyCollection();
                }
            }
            // HERZUM SPRINT 2.4 TLAB-56 TLAB-57 TLAB-58 TLAB-59

            // Do deep copy of errors.
            this.m_errors = new ObservableDictionary <ExperimentNode, ExperimentNodeError>();
            foreach (KeyValuePair <ExperimentNode, ExperimentNodeError> pair in m_errors)
            {
                m_errors[clonedNodeLookup[pair.Key]] = new ExperimentNodeError(pair.Value.ErrorMessage, pair.Value.ErrorType);
            }
        }
        /// <summary>
        /// Creates sub level view for the given composite component graph.
        /// SubLevelViewModel represents the view for the breadcrumbs.
        /// 
        /// Method also collects the sub level into dictionary of sublevel id to its corresponding view model,
        /// so that when user opens subgraph it can locate coressponging view model.
        /// </summary>
        /// <param name="componentGraph">The component graph.</param>
        /// <param name="subLevelId">The sub level id.</param>
        /// <param name="parentLevelViewModel">The parent level view model - it may either top level experiment view model, or another sublevel view model.</param>
        private void CreateSubLevelViewModel(CompositeComponentGraph componentGraph, string subLevelId, BaseLevelExperimentViewModel parentLevelViewModel)
        {
            //if it is null the loading failed... and node should be marked with error already
            if (componentGraph != null)
            {
                var subLevel = new SubLevelExperimentViewModel(componentGraph, parentLevelViewModel);
                m_subLevels.Add(subLevelId, subLevel);
                AddSubLevels(subLevelId, subLevel);

                //if the graph is editable graph listen to added node event
                if (componentGraph is CompositeComponentEditableGraph)
                {
                    componentGraph.NodeAdded += OnNodeAdded;
                }
            }
        }
예제 #32
0
 // HERZUM SPRINT 2.3 TLAB-56 TLAB-57 TLAB-58 TLAB-59
 internal void DrawSubExperiment(CompositeComponentGraph sub_experiment)
 {   
     if (m_subExperiment != null)
         m_experimentDrawer.DrawExperiment (sub_experiment, true);              
 }
예제 #33
0
        // HERZUM SPRINT 2.5 TLAB-157
        /*
        private bool IsInEditableExperiment(CompositeComponentGraph experiment){
            if (experiment == null || experiment.OwnerNode == null)
                return true;

            CompositeComponentGraph fatherExperiment = experiment.OwnerNode.Owner as CompositeComponentGraph ;
            if (fatherExperiment != null && fatherExperiment.OwnerNode!= null){
                CompositeComponentBaseMetadata meta = fatherExperiment.OwnerNode.Data.Metadata as CompositeComponentBaseMetadata;
                if (meta != null && meta.ComponentGraph is CompositeComponentEditableGraph)
                    return IsInEditableExperiment (meta.ComponentGraph);
                else
                    return false;
            } else
                return true;
        }
        */
        // END SPRINT 2.5 TLAB-157

        public void SetScopeApplicationModel(ScopeNodeControl scopeNodeControl, ApplicationViewModel applicationViewModel, CompositeComponentGraph subExperiment) 
        {
            // HERZUM SPRINT 1.0
            // scopeNodeControlCurrent = scopeNodeControl;
            // END HERZUM SPRINT 1.0

                if(m_initialized == false || m_dockFrame.GdkWindow == null) 
            {
                //GdkWindow is for each dock frame is assigned when windowShell calls ShowAll(). See DockContainer.OnRealize method
                throw new InvalidOperationException ("ExperimentCanvasPad must be first initialized and dockFrame must have assigned GdkWindow before setting application model.");
            }

            m_applicationViewModel = applicationViewModel;

            // HERZUM SPRINT 1.0
            // Experiment e = new Experiment ();
            // m_applicationViewModel = ApplicationViewModel.CreateNewApplicationViewModel (applicationViewModel, e);
            // m_applicationContext = new ApplicationContext (m_applicationViewModel);
            // END HERZUM SPRINT 1.0

            if(m_applicationViewModel.Experiment == null) 
            {
                m_experimentPad.Content = new WelcomePageWidget(m_applicationContext);
            } 
            else 
            {
                // CreateExperimentControlToolbar();

                // HERZUM SPRINT 1.0
                m_subExperiment = new CompositeComponentEditableGraph (subExperiment);
                // END HERZUM SPRINT 1.0

                // HERZUM SPRINT 1.0 PROGRESS
                // HERZUM SPRINT 2.4 TLAB-157
                if (subExperiment.OwnerNode != null)
                    // END HERZUM SPRINT 2.4 TLAB-157
                    m_subExperiment.OwnerNode = subExperiment.OwnerNode;
                // HERZUM SPRINT 2.4 TLAB-157
                if (subExperiment.GraphIdPath != null)
                    // END HERZUM SPRINT 2.4 TLAB-157
                    m_subExperiment.GraphIdPath = subExperiment.GraphIdPath;
                // END HERZUM SPRINT 1.0

                // HERZUM SPRINT 4.3: TLAB-238 TLAB-243
                if (m_subExperiment.ExperimentInfo != null)
                    m_subExperiment.ExperimentInfo.FilePath = m_applicationContext.Application.Experiment.ExperimentInfo.FilePath;
                // END HERZUM SPRINT 4.3: TLAB-238 TLAB-243

                // HERZUM SPRINT 1.1 LOOP
                // ScopeMetadata scopeMetadata = scopeNodeControlCurrent.ExperimentNode.Data.Metadata as ScopeMetadata;

                // HERZUM SPRINT 2.1
                // ScopeBaseMetadata scopeMetadata = scopeNodeControlCurrent.ExperimentNode.Data.Metadata as ScopeBaseMetadata;
                ScopeBaseMetadata scopeMetadata = scopeNodeControl.ExperimentNode.Data.Metadata as ScopeBaseMetadata;
                // END HERZUM SPRINT 2.1

                // END HERZUM SPRINT 1.1 LOOP

                scopeMetadata.SetSubExperiment (m_subExperiment);
                m_experimentCanvasWidget = new ExperimentCanvasWidget ();
                m_experimentPad.Content = m_experimentCanvasWidget;

                bool isExperimentEditable = m_applicationViewModel.Experiment is IEditableExperiment;
             //   isExperimentEditable = isChallengePasswordBeenUsed ();

                m_experimentDrawer = new ExperimentDrawer (m_experimentCanvasWidget, m_applicationContext.NodeControlFactory,
                                                           m_applicationContext.NodeConnectionControlFactory);

                //m_experimentDrawer.DrawExperiment(m_applicationViewModel.Experiment, isExperimentEditable);

                // HERZUM SPRINT 2.5 TLAB-157
                // isExperimentEditable = isExperimentEditable && IsInEditableExperiment (m_subExperiment);
                isExperimentEditable = checkEditable (m_subExperiment);
                // END HERZUM SPRINT 2.5 TLAB-157

                if (scopeNodeControl is ChallengeNodeControl)
                    isExperimentEditable = true;

                // HERZUM SPRINT 3.0: TLAB-172
                isExperimentEditable = isExperimentEditable && !isInCompositeCrumb();
                // END HERZUM SPRINT 3.0: TLAB-172

                m_experimentDrawer.DrawExperiment(m_subExperiment, isExperimentEditable);               

                // HERZUM SPRINT 1.0
                m_subExperiment.NodeRemoved += OnNodeRemoved;
                m_subExperiment.EdgeRemoved += OnEdgeRemoved;
                //
                //m_applicationViewModel.Experiment.NodeRemoved += OnNodeRemoved;
                //m_applicationViewModel.Experiment.EdgeRemoved += OnEdgeRemoved;
                // END HERZUM SPRINT 1.0

                if(isExperimentEditable) 
                {
                    //enable drop of components to canvas
                    EnableDrop ();
                }
            }
        }
예제 #34
0
        //TRUE if it is editable
        private bool checkEditable(CompositeComponentGraph experiment){
            if (experiment == null || experiment.OwnerNode == null)
                return true;

            if(isChallengeExp()){
                if (!hasAnyPasswordBeenUsed () || !hasChallengePasswordBeenUsed()) {
                    return true;
                } else {
                    CompositeComponentGraph fatherExperiment = experiment.OwnerNode.Owner as CompositeComponentGraph;
                    if (fatherExperiment != null && fatherExperiment.OwnerNode != null) {
                        if ((fatherExperiment.OwnerNode.Data.Metadata as ChallengeMetadata) != null) {
                            return true;
                        } else {
                            return checkEditable (fatherExperiment);
                        }

                    } else {
                        return false;
                    }
                }
            } else {
                return true;
            }
                 
        }
예제 #35
0
 // HERZUM SPRINT 1.0
 public void SetSubExperiment(CompositeComponentEditableGraph compositeComponentEditableGraph)
 {
     m_compositeComponentGraph = compositeComponentEditableGraph;
 }
        /// <summary>
        /// Performs a deep copy of the data in this object to another instance of the Metadata.
        /// </summary>
        /// <param name="other">The other.</param>
        protected override void CopyFrom(Metadata other)
        {
            if (other == null)
                throw new ArgumentNullException("other");
            
            base.CopyFrom(other);

            CompositeComponentMetadata metadata = (CompositeComponentMetadata)other;
            m_IOSpec = metadata.m_IOSpec.Clone();
            m_configWrapper = metadata.m_configWrapper.Clone();
            m_experimentLocationRoot = metadata.m_experimentLocationRoot;
            m_compositeComponentMetadataDefinition = metadata.m_compositeComponentMetadataDefinition;
            m_componentMetadataDefinitionID = metadata.m_componentMetadataDefinitionID;

            HasDeserializationError = metadata.HasDeserializationError;
            if (HasDeserializationError)
            {
                DeserializationErrorMessage = metadata.DeserializationErrorMessage;
            } 

            // if composite component was not present in the library, then corresponding component graph may be null.
            // the deserialization has already set the corresponding error above, nevertheless subgraph cannot be cloned obviously
            if (HasDeserializationError == false && metadata.m_compositeComponentGraph != null)
            {
                m_compositeComponentGraph = (CompositeComponentGraph)(metadata.m_compositeComponentGraph.Clone());
            }

            m_tempConfigWrapper = metadata.m_tempConfigWrapper;
            m_tempIoSpec = metadata.m_tempIoSpec;
            m_tempLabel = metadata.m_tempLabel;
        }
예제 #37
0
        // ***************************************************
        // HERZUM SPRINT 2.4 TLAB-157
        public void SetApplicationModel(ApplicationViewModel applicationViewModel,  ExperimentCanvasWidget experimentCanvasWidget, CompositeComponentGraph subExperiment) 
        {
            // HERZUM SPRINT 1.0
            // scopeNodeControlCurrent = scopeNodeControl;
            // END HERZUM SPRINT 1.0

            if(m_initialized == false || m_dockFrame.GdkWindow == null) 
            {
                //GdkWindow is for each dock frame is assigned when windowShell calls ShowAll(). See DockContainer.OnRealize method
                throw new InvalidOperationException("ExperimentCanvasPad must be first initialized and dockFrame must have assigned GdkWindow before setting application model.");
            }

            m_applicationViewModel = applicationViewModel;

            if(m_applicationViewModel.Experiment == null) 
            {
                m_experimentPad.Content = new WelcomePageWidget(m_applicationContext);
            } 
            else 
            {
                // CreateExperimentControlToolbar();


                m_subExperiment = new CompositeComponentEditableGraph(subExperiment);
                if (subExperiment.OwnerNode != null)
                    m_subExperiment.OwnerNode = subExperiment.OwnerNode;
                if (subExperiment.GraphIdPath != null)
                    m_subExperiment.GraphIdPath = subExperiment.GraphIdPath;

                m_experimentCanvasWidget = experimentCanvasWidget;


                m_experimentPad.Content = m_experimentCanvasWidget;

                // bool isExperimentEditable = m_applicationViewModel.Experiment is IEditableExperiment;


                m_experimentDrawer = new ExperimentDrawer(m_experimentCanvasWidget, 
                                                          new NodeControlFactory(m_applicationContext),
                                                          new NodeConnectionControlFactory(m_applicationContext));


                m_experimentDrawer.DrawExperiment(m_subExperiment, false);

            }
        }
        /// <summary>
        /// Process excuted once xml deserialization was completed.
        /// </summary>
        /// <param name="library">The library.</param>
        /// <param name="experimentLocationRoot">The experiment location root.</param>
        public override void PostProcessReadXml(Components.IComponentsLibrary library, string experimentLocationRoot)
        {
            m_experimentLocationRoot = experimentLocationRoot;

            if (m_experimentXml != null)
            {
                using (XmlReader reader = XmlReader.Create(new System.IO.StringReader(m_experimentXml)))
                {
                    var experiment = TraceLab.Core.Experiments.ExperimentSerializer.DeserializeExperiment(reader, library);
                    m_compositeComponentGraph = new Experiments.CompositeComponentEditableGraph(experiment);
                }
                //clear variable
                m_experimentXml = null;
            }

            IsInitialized = true;
            IsModified = false;
        }