public NExpandableShape()
            {
                // add a rectangle shape as base
                NRectangleShape rect = new NRectangleShape(new NRectangleF(0, 0, 75, 75));

                rect.DestroyShapeElements(ShapeElementsMask.All);
                rect.Protection = new NAbilities(AbilitiesMask.Select | AbilitiesMask.InplaceEdit);
                Shapes.AddChild(rect);

                // add an expand collapse shape
                NExpandCollapseCheck check = new NExpandCollapseCheck();

                check.Bounds            = new NRectangleF(80, 0, 12, 12);
                check.Protection        = new NAbilities(AbilitiesMask.Select | AbilitiesMask.InplaceEdit);
                check.ResizeInAggregate = ResizeInAggregate.RepositionOnly;
                Shapes.AddChild(check);

                // update the model bounds with the rectangle bounds
                UpdateModelBounds(rect.Transform.TransformBounds(rect.ModelBounds));

                // initially it is expanded
                m_bExpanded = true;

                // by default the group has one dynamic port anchored to the rectangle
                CreateShapeElements(ShapeElementsMask.Ports);
                NDynamicPort port = new NDynamicPort(rect.UniqueId, ContentAlignment.MiddleCenter, DynamicPortGlueMode.GlueToContour);

                Ports.AddChild(port);
                Ports.DefaultInwardPortUniqueId = port.UniqueId;

                // by default the group has one rotated bounds port anchored to the rectangle
                CreateShapeElements(ShapeElementsMask.Labels);
                NRotatedBoundsLabel label = new NRotatedBoundsLabel("", rect.UniqueId, new Nevron.Diagram.NMargins(10));

                Labels.AddChild(label);
                Labels.DefaultLabelUniqueId = label.UniqueId;
            }