private void DrawBaseTypes()
        {
            var offset = _leftMargin;
            for (int i = 0; i < _classDiagram.BaseTypes.Count; i++)
            {
                var diagram = _classDiagramSvgRenderer.RenderDiagram(_classDiagram.BaseTypes[i]);
                var diagramSize = new Size(
                    _classDiagramSvgRenderer.CalculateDiagramWidth(_classDiagram.BaseTypes[i]),
                    _classDiagramSvgRenderer.CalculateDiagramHeight(_classDiagram.BaseTypes[i]));

                var positionX = (i * 50) + offset;
                var positionY = 0;

                var translate = diagram.CreateAttribute("transform");
                translate.Value = string.Format("translate({0}, {1})", positionX.ToString("0.00", CultureInfo.InvariantCulture), positionY.ToString("0.00", CultureInfo.InvariantCulture));
                diagram["svg"]["g"].Attributes.Append(translate);

                _mainDiagram.ImportAdd((SvgElement)diagram["svg"]["g"]);

                offset += diagramSize.Width;

                var pathGraphic = new SvgGraphic(_mainDiagram);

                //line
                if (i == 0)
                {
                    var path = new SvgPath(_mainDiagram, string.Format("M{0},{1}L{0},{2}",
                        (positionX + 50).ToString("0.00", CultureInfo.InvariantCulture),
                        (positionY + diagramSize.Height).ToString("0.00", CultureInfo.InvariantCulture),
                        _topMargin.ToString("0.00", CultureInfo.InvariantCulture)));
                    path.StrokeWidth = 1;
                    path.Stroke = "#979797";
                    pathGraphic.Add(path);
                }

                //arrow
                var startX = positionX + 50;
                var startY = diagramSize.Height;

                var points = string.Format("{0},{1} {2},{3} {4},{3}",
                    startX.ToString("0.00", CultureInfo.InvariantCulture),
                    startY.ToString("0.00", CultureInfo.InvariantCulture),
                    (startX - 5).ToString("0.00", CultureInfo.InvariantCulture),
                    (startY + 10).ToString("0.00", CultureInfo.InvariantCulture),
                    (startX + 5).ToString("0.00", CultureInfo.InvariantCulture));
                var arrow = new SvgPolygon(_mainDiagram, points);
                arrow.Stroke = "#979797";
                arrow.Fill = "#FFFFFF";

                pathGraphic.Add(arrow);

                _mainDiagram.Add(pathGraphic);
            }
        }
        private double RenderHeader(ClassDiagram classDiagram, double position)
        {
            var accessibility = new SvgText(_svgRoot, classDiagram.Accessibility, (_diagramWidth - classDiagram.Accessibility.GetWidth(11, Fonts.FontItalic)) / 2, position);
            accessibility.FontSize = 11;

            var name = new SvgLink(_svgRoot, classDiagram.Name, string.Format("{{{{type-link:{0}}}}}", classDiagram.TypeIdentifier), (_diagramWidth - classDiagram.Name.GetWidth(14, Fonts.FontLight)) / 2, position += 20);
            name.Text.FontSize = 14;

            position += 15;

            var path = new SvgPath(_svgRoot, string.Format("M0.5,{0}L{1},{0}", position.ToString("0.00", CultureInfo.InvariantCulture), _diagramWidth.ToString("0.00", CultureInfo.InvariantCulture)));
            path.StrokeWidth = 1;
            path.Stroke = "#979797";

            _svgRoot.AppendChild(accessibility.XmlElement);
            _svgRoot.AppendChild(name.XmlElement);
            _svgRoot.AppendChild(path.XmlElement);

            return position + 25;
        }
        private void DrawVerticalLines(SequenceDiagram sequenceDiagram)
        {
            foreach (var node in _nodeMiddlePoints)
            {
                var path = new SvgPath(_svgRoot, string.Format("M{0},{1}L{0},{2}", 
                    node.Value.ToString("0.50", CultureInfo.InvariantCulture), 
                    45, 
                    _diagramSize.Height.ToString("0.50", CultureInfo.InvariantCulture)));
                path.StrokeWidth = 1;
                path.Stroke = "#979797";

                _svgGraphic.Add(path);
            }
        }
        private void DrawReturnConnection(SequenceDiagramConnection connection)
        {
            var callerNodeMiddlePoint = _nodeMiddlePoints[connection.CallerId];
            var calledNodeMiddlePoint = connection.CalledId == Guid.Empty ? 0 : _nodeMiddlePoints[connection.CalledId];

            var textWidth = ("return " + connection.Text).GetWidth(12, Fonts.FontLight);
            var text = new SvgText(_svgRoot, "return " + connection.Text, calledNodeMiddlePoint + 10, _diagramSize.Height + 10);
            text.FontSize = 12;
            _svgGraphic.Add(text);

            if ((textWidth + calledNodeMiddlePoint + 10) > _diagramSize.Width)
            {
                _diagramSize.Width = textWidth + calledNodeMiddlePoint + 20;
            }

            var path = new SvgPath(_svgRoot, string.Format("M{0},{1}L{2},{1}",
                    calledNodeMiddlePoint.ToString("0.00", CultureInfo.InvariantCulture),
                    (_diagramSize.Height + 20).ToString("0.00", CultureInfo.InvariantCulture),
                    callerNodeMiddlePoint.ToString("0.00", CultureInfo.InvariantCulture)));
            path.StrokeWidth = 1;
            path.Stroke = "#979797";
            _svgGraphic.Add(path);

            var startX = (int)calledNodeMiddlePoint;
            var startY = (int)_diagramSize.Height + 20;

            var points = string.Format("{0},{1} {2},{3} {2},{4}", startX, startY, startX + 5, startY + 5, startY - 5);
            var arrow = new SvgPolygon(_svgRoot, points);
            arrow.Stroke = arrow.Fill = "#979797";

            _svgGraphic.Add(arrow);

            _diagramSize.Height += 35;
        }
        private void DrawConnectionLine(SequenceDiagramConnection connection, double callerNodeMiddlePoint, double calledNodeMiddlePoint)
        {
            if (connection.CallerId == connection.CalledId)
            {
                double x1 = callerNodeMiddlePoint;
                double x2 = callerNodeMiddlePoint - 10;
                double y1 = _diagramSize.Height + 10;
                double y2 = _diagramSize.Height + 20;

                var path = new SvgPath(_svgRoot, string.Format("M{0},{1}L{2},{1}",
                    x1.ToString("0.00", CultureInfo.InvariantCulture),
                    y1.ToString("0.00", CultureInfo.InvariantCulture),
                    x2.ToString("0.00", CultureInfo.InvariantCulture)));
                path.StrokeWidth = 1;
                path.Stroke = "#979797";

                var path2 = new SvgPath(_svgRoot, string.Format("M{0},{1}L{0},{2}",
                    x2.ToString("0.00", CultureInfo.InvariantCulture),
                    y1.ToString("0.00", CultureInfo.InvariantCulture),
                    y2.ToString("0.00", CultureInfo.InvariantCulture)));
                path2.StrokeWidth = 1;
                path2.Stroke = "#979797";

                var path3 = new SvgPath(_svgRoot, string.Format("M{0},{1}L{2},{1}",
                    x2.ToString("0.00", CultureInfo.InvariantCulture),
                    y2.ToString("0.00", CultureInfo.InvariantCulture),
                    x1.ToString("0.00", CultureInfo.InvariantCulture)));
                path3.StrokeWidth = 1;
                path3.Stroke = "#979797";

                _svgGraphic.Add(path);
                _svgGraphic.Add(path2);
                _svgGraphic.Add(path3);
            }
            else
            {
                var path = new SvgPath(_svgRoot, string.Format("M{0},{2}L{1},{2}",
                    callerNodeMiddlePoint.ToString("0.00", CultureInfo.InvariantCulture),
                    calledNodeMiddlePoint.ToString("0.00", CultureInfo.InvariantCulture), 
                    (_diagramSize.Height + 20).ToString("0.00", CultureInfo.InvariantCulture)));
                path.StrokeWidth = 1;
                path.Stroke = "#979797";

                _svgGraphic.Add(path);
            }

            _diagramSize.Height += 20;
        }
        private void DrawUses()
        {
            var leftOffset = _leftMargin + _classDiagramSvgRenderer.CalculateDiagramWidth(_classDiagram);
            var offset = leftOffset;
            for (int i = 0; i < _classDiagram.Uses.Count; i++)
            {
                var diagram = _classDiagramSvgRenderer.RenderDiagram(_classDiagram.Uses[i]);
                var diagramSize = new Size(
                    _classDiagramSvgRenderer.CalculateDiagramWidth(_classDiagram.Uses[i]),
                    _classDiagramSvgRenderer.CalculateDiagramHeight(_classDiagram.Uses[i]));

                var positionX = (i * 50) + offset + 50;
                var positionY = _topMargin + 50;

                var translate = diagram.CreateAttribute("transform");
                translate.Value = string.Format("translate({0}, {1})", positionX.ToString("0.00", CultureInfo.InvariantCulture), positionY.ToString("0.00", CultureInfo.InvariantCulture));
                diagram["svg"]["g"].Attributes.Append(translate);

                _mainDiagram.ImportAdd((SvgElement)diagram["svg"]["g"]);

                var pathGraphic = new SvgGraphic(_mainDiagram);

                var path = new SvgPath(_mainDiagram, string.Format("M{0},{1}L{0},{2}",
                    (positionX + (diagramSize.Width / 2)).ToString("0.00", CultureInfo.InvariantCulture),
                    positionY.ToString("0.00", CultureInfo.InvariantCulture),
                    (positionY - 25).ToString("0.00", CultureInfo.InvariantCulture)));
                path.StrokeWidth = 1;
                path.Stroke = "#979797";
                pathGraphic.Add(path);

                path = new SvgPath(_mainDiagram, string.Format("M{0},{1}L{2},{3}",
                    (positionX + (diagramSize.Width / 2) - 5).ToString("0.00", CultureInfo.InvariantCulture),
                    (positionY - 10).ToString("0.00", CultureInfo.InvariantCulture),
                    (positionX + (diagramSize.Width / 2)).ToString("0.00", CultureInfo.InvariantCulture),
                    positionY.ToString("0.00", CultureInfo.InvariantCulture)));
                path.StrokeWidth = 1;
                path.Stroke = "#979797";
                pathGraphic.Add(path);

                path = new SvgPath(_mainDiagram, string.Format("M{0},{1}L{2},{3}",
                    (positionX + (diagramSize.Width / 2) + 5).ToString("0.00", CultureInfo.InvariantCulture),
                    (positionY - 10).ToString("0.00", CultureInfo.InvariantCulture),
                    (positionX + (diagramSize.Width / 2)).ToString("0.00", CultureInfo.InvariantCulture),
                    positionY.ToString("0.00", CultureInfo.InvariantCulture)));
                path.StrokeWidth = 1;
                path.Stroke = "#979797";
                pathGraphic.Add(path);

                if (i == _classDiagram.Uses.Count - 1)
                {
                    path = new SvgPath(_mainDiagram, string.Format("M{0},{2}L{1},{2}",
                        (positionX + (diagramSize.Width / 2)).ToString("0.00", CultureInfo.InvariantCulture),
                        leftOffset.ToString("0.00", CultureInfo.InvariantCulture),
                        (positionY - 25.5d).ToString("0.00", CultureInfo.InvariantCulture)));
                    path.StrokeWidth = 1;
                    path.Stroke = "#979797";
                    pathGraphic.Add(path);
                }

                _mainDiagram.Add(pathGraphic);
                offset += diagramSize.Width;
            }
        }
        private double RenderLine(double position)
        {
            var path = new SvgPath(_svgRoot, string.Format("M0.5,{0}L{1},{0}", position.ToString("0.00", CultureInfo.InvariantCulture), _diagramWidth.ToString("0.00", CultureInfo.InvariantCulture)));
            path.StrokeWidth = 1;
            path.Stroke = "#979797";
            _svgRoot.AppendChild(path.XmlElement);

            return position + 20;
        }
        private void RenderHeader()
        {
            var accessibility = new SvgText(
                _svgRoot, 
                _classDiagram.Accessibility, 
                (_diagramSize.Width - _classDiagram.Accessibility.GetWidth(11, Fonts.FontItalic)) / 2,
                ACCESSIBILITY_LABEL_Y);
            accessibility.FontSize = 11;

            SvgElement name;
            if (_classDiagram.IsProjectStranger)
            {
                name = new SvgText(
                    _svgRoot,
                    _classDiagram.Name,
                    (_diagramSize.Width - _classDiagram.Name.GetWidth(14, Fonts.FontLight)) / 2,
                    CLASSLABEL_Y);
                ((SvgText)name).FontSize = 14;
            }
            else
            {
                name = new SvgLink(
                    _svgRoot,
                    _classDiagram.Name,
                    string.Format("{{{{type-link:{0}}}}}", _classDiagram.TypeIdentifier),
                    (_diagramSize.Width - _classDiagram.Name.GetWidth(14, Fonts.FontLight)) / 2,
                    CLASSLABEL_Y);
                ((SvgLink)name).Text.FontSize = 14;
            }

            var path = new SvgPath(
                _svgRoot, 
                string.Format("M0.5,{0}L{1},{0}", 
                    (CLASSLABEL_Y + 10).ToString("0.00", CultureInfo.InvariantCulture),
                    _diagramSize.Width.ToString("0.00", CultureInfo.InvariantCulture)));
            path.StrokeWidth = 1;
            path.Stroke = "#979797";

            _svgGraphic.Add(accessibility);
            _svgGraphic.Add(name);
            _svgGraphic.Add(path);
        }
 private void RenderLine(double position)
 {
     var path = new SvgPath(
         _svgRoot, 
         string.Format("M0.5,{0}L{1},{0}", 
             position.ToString("0.00", CultureInfo.InvariantCulture),
             _diagramSize.Width.ToString("0.00", CultureInfo.InvariantCulture)));
     path.StrokeWidth = 1;
     path.Stroke = "#979797";
     _svgGraphic.Add(path);
 }