private void ParseMethodBlock(SequenceDiagramComposite composite, SDBlock block)
 {
     var sequenceDiagramBlock = composite.AddBlock(block.Expression);
     foreach (var statement in block.Statements)
     {
         ParseCall(statement, sequenceDiagramBlock);
     }
 }
        public SequenceDiagramComposite AddBlock(string text)
        {
            var block = new SequenceDiagramComposite
            {
                Text = text
            };
            Content.Add(block);

            return block;
        }
        public SequenceDiagramComposite AddBlock(string text)
        {
            var block = new SequenceDiagramComposite
            {
                Text = text
            };

            Content.Add(block);

            return(block);
        }
        private void ParseCall(SDNode call, SequenceDiagramComposite composite)
        {
            var block = call as SDBlock;
            if (block != null && NodeNotEmpty(block, block.Statements))
            {
                ParseMethodBlock(composite, block);
            }

            var conditionalBlock = call as SDConditionalBlock;
            if (conditionalBlock != null && NodeNotEmpty(conditionalBlock, conditionalBlock.TrueStatements))
            {
                ParseConditionalMethodBlock(composite, conditionalBlock);
            }

            var targetNode = call as SDTargetNode;
            if (targetNode != null && NodeNotEmpty(targetNode, null))
            {
                ParseTargetNode(composite, targetNode);
            }
        }
        private void OpenBlock(SequenceDiagramComposite block)
        {
            var textWidth = block.Text.GetWidth(12, Fonts.FontLight);
            var text = new SvgText(_svgRoot, block.Text, 20 + _openBlocks * 15, _diagramSize.Height + 10);
            text.FontSize = 10;
            _svgGraphic.Add(text);

            // Setzen der Breite des Diagramms auf die eventuell größere Breite des Textes
            if ((textWidth + 20 + _openBlocks * 15) > _diagramSize.Width)
                _diagramSize.Width = textWidth + 20 + _openBlocks * 15 + 10;

            _diagramSize.Height += 20;
            _openBlocks++;
        }
        private void ParseConditionalMethodBlock(SequenceDiagramComposite composite, SDConditionalBlock conditionalBlock)
        {
            var sequenceDiagramBlock = composite.AddBlock(string.Format("if ({0})", conditionalBlock.Expression));
            foreach (var statement in conditionalBlock.TrueStatements)
            {
                ParseCall(statement, sequenceDiagramBlock);
            }

            if (NodeNotEmpty(conditionalBlock, conditionalBlock.FalseStatements))
            {
                sequenceDiagramBlock = composite.AddBlock("else");
                foreach (var statement in conditionalBlock.FalseStatements)
                {
                    ParseCall(statement, sequenceDiagramBlock);
                }
            }
        }
        private void ParseTargetNode(SequenceDiagramComposite composite, SDTargetNode targetNode)
        {
            if (!targetNode.CalledType.IsProjectStranger)
            {
                var caller = _sequenceDiagram.Nodes.SingleOrDefault(o => o.TypeIdentifier == targetNode.CallerType.Identifier);
                caller = caller == null ? _sequenceDiagram.Nodes.Single(o => o.ID == _sequenceDiagram.StartNodeID) : caller;

                var called = _sequenceDiagram.Nodes.SingleOrDefault(o => o.TypeIdentifier == targetNode.CalledType.Identifier) ?? _sequenceDiagram.AddNode(targetNode.CalledType.Identifier);

                composite.AddConnection(caller.ID, called.ID, targetNode.CalledMethod.Name, targetNode.CalledMethod.Identifier);

                var sdType = _sdRepository.GetTypeByIdentifier(targetNode.CalledType.Identifier);
                var targetMethod = sdType.Methods.SingleOrDefault(o => o.Identifier == targetNode.CalledMethod.Identifier);
                if (caller.ID != called.ID && targetMethod.ReturnType != null && targetMethod.ReturnType.Name.ToUpper() != "VOID")
                {
                    composite.AddConnection(called.ID, caller.ID, targetMethod.ReturnType.Name, targetNode.CalledMethod.Identifier, true);
                }
            }
        }
        private Size OpenBlock(SequenceDiagramComposite block, Size size)
        {
            var text = new FormattedText(block.Text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.FontLight, 10, Brushes.DimGray);
            _context.DrawText(text, new Point(20 + _openBlocks * 15, size.Height));

            // Setzen der Breite des Diagramms auf die eventuell größere Breite des Textes
            if ((text.Width + 20 + _openBlocks * 15) > size.Width)
                size.Width = text.Width + 20 + _openBlocks * 15 + 10;
            
            size.Height += 20;
            _openBlocks++;

            return size;
        }