/// <inheritdoc />
 protected override void InitializeFolderNodeLabels(FolderNodeState state, IFoldingView foldingView, INode viewNode, INode masterNode)
 {
     state.ClearLabels();
     if (CopyLabels)
     {
         var labels = masterNode.Labels;
         if (labels.Count > 0)
         {
             for (var i = 0; i < labels.Count; i++)
             {
                 var label = labels[i];
                 // If the node is a choreographyNode, just copy all Labels
                 if (masterNode.Style is ChoreographyNodeStyle)
                 {
                     state.AddLabel(label.Text, label.LayoutParameter, label.Style, label.PreferredSize, label.Tag);
                 }
                 else
                 {
                     // if subProcessNode, create new Layout & Style
                     var labelStyle = CreateLabelStyle(foldingView, null, label);
                     var labelModel = new InteriorStretchLabelModel {
                         Insets = new InsetsD(3, 3, 3, 3)
                     };
                     var labelLayoutParameter = labelModel.CreateParameter(InteriorStretchLabelModel.Position.Center);
                     state.AddLabel(label.Text, labelLayoutParameter ?? label.LayoutParameter, labelStyle ?? label.Style, label.PreferredSize, label.Tag);
                 }
             }
         }
     }
 }
        public override void UpdateFolderNodeState(FolderNodeState state, IFoldingView foldingView, INode viewNode, INode masterNode)
        {
            SynchronizeLabels(state, foldingView, viewNode, masterNode);

            // Copys the changed master Style to the state
            state.Style = masterNode.Style;
        }
        /// <inheritdoc />
        protected override void InitializeFolderNodePorts(FolderNodeState state, IFoldingView foldingView, INode viewNode, INode masterNode)
        {
            foreach (var port in viewNode.Ports)
            {
                var masterPort = foldingView.GetMasterItem(port);
                var newStyle   = CreatePortStyle(foldingView, port, masterPort);
                var portState  = state.GetFoldingPortState(masterPort);
                if (newStyle != null)
                {
                    portState.Style = newStyle;
                }
                var newLocationParameter = CreatePortLocationParameter(foldingView, port, masterPort);
                if (newLocationParameter != null)
                {
                    portState.LocationParameter = newLocationParameter;
                }

                if (masterPort.Labels.Count > 0)
                {
                    for (var i = 0; i < masterPort.Labels.Count; i++)
                    {
                        var label                = masterPort.Labels[i];
                        var labelStyle           = CreateLabelStyle(foldingView, null, label);
                        var labelLayoutParameter = CreateLabelLayoutParameter(foldingView, null, label);

                        portState.AddLabel(label.Text, labelLayoutParameter ?? label.LayoutParameter, labelStyle ?? label.Style, label.PreferredSize, label.Tag);
                    }
                }
            }
        }
        /// <summary>
        /// Called by <see cref="UpdateFolderNodeState" /> to synchronize all labels, if <see cref="CopyLabels" />
        /// is enabled. Also synchronizes all port labels of ports connected to the node.
        /// </summary>
        /// <remarks>This will adjust the label text property.</remarks>
        /// <param name="state">The node view state whose labels should be synchronized.</param>
        /// <param name="foldingView">The folding view.</param>
        /// <param name="viewNode">The local node instance.</param>
        /// <param name="masterNode">The master node.</param>
        protected override void SynchronizeLabels(FolderNodeState state, IFoldingView foldingView, INode viewNode, INode masterNode)
        {
            if (CopyLabels)
            {
                if (masterNode.Labels.Count > 0 && state.Labels.Count > 0)
                {
                    for (var i = 0; i < masterNode.Labels.Count; i++)
                    {
                        var masterLabel    = masterNode.Labels[i];
                        var labelViewState = state.Labels[i];
                        labelViewState.Text          = masterLabel.Text;
                        labelViewState.PreferredSize = masterLabel.PreferredSize;
                        labelViewState.Tag           = masterLabel.Tag;
                    }
                }

                if (masterNode.Ports.Count > 0)
                {
                    for (var j = 0; j < masterNode.Ports.Count; j++)
                    {
                        var port = masterNode.Ports[j];
                        if (port.Labels.Count > 0)
                        {
                            for (var i = 0; i < port.Labels.Count; i++)
                            {
                                var masterLabel    = port.Labels[i];
                                var labelViewState = state.Ports[j].Labels[i];
                                labelViewState.Text          = masterLabel.Text;
                                labelViewState.PreferredSize = masterLabel.PreferredSize;
                                labelViewState.Tag           = masterLabel.Tag;
                            }
                        }
                    }
                }
            }
        }