// bool registerCallbackToParent = false;

        public VisualWindow()
        {
            this.StyleBorderRadius(4, 4, 4, 4);
            this.StyleBorderWidth(1, 1, 2, 2);
            Color borderColor = new Color32(58, 121, 187, 255);

            this.StyleBorderColor(Color.grey, Color.grey, borderColor, borderColor);
            Color backgroundColor = EditorGUIUtility.isProSkin
                ? new Color32(64, 64, 64, 255)
                : new Color32(184, 184, 184, 255);

            this.StyleBackgroundColor(backgroundColor);
            this.StyleMinSize(128, 32);
            this.StyleMaxSize(9999, 9999);
            this.StylePosition(Position.Absolute);
            this.AddManipulator(new UIDragger(this, true));

            this.RegisterCallback <MouseOverEvent>(RegisterParentGeometryChanged);


            headerElement      = new HorizontalLayout();
            headerElement.name = nameof(headerElement).ToUpper();
            headerElement.StyleMaxHeight(24);
            headerElement.StyleMinHeight(24);
            headerElement.StylePadding(18, 18, 4, 4);
            headerElement.StyleJustifyContent(Justify.Center);
            headerElement.RegisterCallback <MouseUpEvent>((callback) =>
            {
                if (callback.button == 2)
                {
                    this.style.width = this.style.height = StyleKeyword.Auto;
                    Repaint();
                }
            });
            base.Add(headerElement);

            labelElement      = new Label();
            labelElement.name = nameof(labelElement).ToUpper();
            name = labelElement.text = "Untitled";
            labelElement.StyleMargin(0, 0, 0, 2);
            labelElement.StyleAlignSelf(Align.Center);
            labelElement.StyleFont(FontStyle.Bold);
            headerElement.Add(labelElement);

            Image closeButton = new Image();

            closeButton.name  = nameof(closeButton).ToUpper();
            closeButton.image = EditorGUIUtility.IconContent("winbtn_win_close").image;
            closeButton.StyleSize(16, 16);
            closeButton.StyleBorderWidth(1, 0, 0, 1);
            closeButton.StyleBorderRadius(0, 0, 4, 0);
            closeButton.StyleBorderColor(borderColor);
            closeButton.StylePosition(Position.Absolute);
            closeButton.StyleAlignSelf(Align.FlexEnd);
            base.Add(closeButton);

            closeButton.RegisterCallback <MouseDownEvent>((e) => { this.StyleDisplay(DisplayStyle.None); });

            contentElement      = new VisualElement();
            contentElement.name = nameof(contentElement).ToUpper();
            contentElement.StyleMargin(0, 0, 0, 9);
            base.Add(contentElement);

            Image resizeButton = new Image();

            resizeButton.name = nameof(resizeButton).ToUpper();
            resizeButton.StyleAlignSelf(Align.FlexEnd);
            resizeButton.StylePosition(Position.Absolute);
            resizeButton.StyleSize(8, 8);
            resizeButton.StyleBorderRadius(0, 0, 0, 4);
            resizeButton.StyleBorderWidth(0, 2, 0, 2);
            resizeButton.StyleBorderColor(Color.grey);
            resizeButton.StyleRight(1);
            resizeButton.StyleBottom(1);
            base.Add(resizeButton);
            var uIResizer = new UIResizer(this);

            resizeButton.AddManipulator(uIResizer);
            uIResizer.mouseMoveAction += () =>
            {
                resizeButton.StyleRight(1);
                resizeButton.StyleBottom(1);
            };
        }
        private void Init(string title)
        {
            this.StyleFont(FontStyle.Bold);
            this.StyleMinHeight(20);
            this.StyleBorderWidth(0, 0, 1, 0);
            Color borderColor = EditorGUIUtility.isProSkin
                ? new Color32(35, 35, 35, 255)
                : new Color32(153, 153, 153, 255);

            this.StyleBorderColor(borderColor);

            headerElement = new HorizontalLayout();
            headerElement.StyleHeight(21);
            headerElement.StyleMaxHeight(21);
            headerElement.StyleMinHeight(21);
            headerElement.StylePadding(4, 0, 0, 0);
            headerElement.StyleAlignItem(Align.Center);
            Color backgroundColor = EditorGUIUtility.isProSkin
                ? new Color32(80, 80, 80, 255)
                : new Color32(222, 222, 222, 255);

            headerElement.StyleBackgroundColor(backgroundColor);
            Color hoverBorderColor = new Color32(58, 121, 187, 255);

            headerElement.RegisterCallback <MouseEnterEvent>((evt) =>
            {
                headerElement.StyleBorderWidth(1);
                headerElement.StyleBorderColor(hoverBorderColor);
            });
            headerElement.RegisterCallback <MouseLeaveEvent>((evt) =>
            {
                headerElement.StyleBorderWidth(0);
                headerElement.StyleBorderColor(Color.clear);
            });
            base.Add(headerElement);

            contentElement = new VerticalLayout();
            contentElement.StyleDisplay(value);
            base.Add(contentElement);

            labelElement      = new Label();
            labelElement.text = title;
            headerElement.Add(labelElement);

            imageElement      = new Image();
            imageElement.name = nameof(imageElement);
            imageElement.StyleMargin(0, 4, 0, 0);
            imageElement.StyleSize(16, 16);
            headerElement.Add(imageElement);
            imageElement.SendToBack();
            imageElement.RegisterCallback <GeometryChangedEvent>((evt) =>
            {
                imageElement.StyleDisplay(imageElement.image == null ? DisplayStyle.None : DisplayStyle.Flex);
            });

            foloutImage = new Image();
            foloutImage.StyleWidth(13);
            foloutImage.StyleMargin(0, 2, 0, 0);
            foloutImage.scaleMode = ScaleMode.ScaleToFit;
            foloutImage.image     = value ? onIcon : offIcon;
            if (!EditorGUIUtility.isProSkin)
            {
                foloutImage.tintColor = Color.grey;
            }
            headerElement.Add(foloutImage);
            foloutImage.SendToBack();


            headerElement.RegisterCallback <MouseUpEvent>((evt) =>
            {
                if (evt.button == 0)
                {
                    Value = !Value;
                    evt.StopPropagation();
                }
            });
        }