// ======================================================================
 // Initialization
 // ----------------------------------------------------------------------
 public DSTableView(RectOffset margins, bool displayFrame,
                    GUIContent title, AnchorEnum titleAlignment, bool titleSeperator,
                    bool displayColumnFrame, bool columnTitleSeperator = true)
 {
     myMainView = new DSTitleView(margins, displayFrame,
                                  title, titleAlignment, titleSeperator,
                                  DisplayMainView, GetMainViewLayoutSize);
     myColumnTitleSeperator = columnTitleSeperator;
     myDisplayColumnFrame   = displayColumnFrame;
 }
        // ---------------------------------------------------------------------------------
        void BuildViews()
        {
            var typeName = new GUIContent(NameUtility.ToDisplayName(iCS_Types.TypeName(myTarget.RuntimeType)));

            myVariablesController = new iCS_ClassVariablesController(myTarget.RuntimeType, myStorage, typeName, myTarget);

            // Build class wizard layout view.
            myLayoutView = new DSVerticalLayoutView(new RectOffset(0, 0, 0, 0), false);
            myLayoutView.AddSubview(myVariablesController.View, new RectOffset(0, 0, 0, kSpacer), DSView.AnchorEnum.Center);

            // Build class wizard title view.
            string     instanceTitle       = myTarget.DisplayName;
            GUIContent instanceEditorTitle = new GUIContent(instanceTitle);

            myMainView = new DSTitleView(new RectOffset(0, 0, 0, 0), false, instanceEditorTitle, DSView.AnchorEnum.Center, true);
            myMainView.SetSubview(myLayoutView);
        }
        Vector2 GetMainViewLayoutSize(DSTitleView view, Rect displayArea)
        {
            float width  = Mathf.Max(myColumnTitleSize.x, myColumnDataSize.x);
            float height = myColumnTitleSize.y + myColumnDataSize.y;

            if (width > displayArea.width)
            {
                height += kScrollbarSize;
            }
            if (height > displayArea.height)
            {
                width += kScrollbarSize;
            }
            Vector2 displaySize = new Vector2(width, height);

            return(displaySize);
        }
        // ======================================================================
        // Main View implementation.
        // ----------------------------------------------------------------------
        void DisplayMainView(DSTitleView view, Rect displayArea)
        {
            // Compute piece-part display areas.
            Rect titleDisplayArea = new Rect(displayArea.x, displayArea.y,
                                             Mathf.Min(displayArea.width, myColumnTitleSize.x),
                                             Mathf.Min(displayArea.height, myColumnTitleSize.y));
            Rect dataDisplayArea = new Rect(displayArea.x, titleDisplayArea.yMax,
                                            Mathf.Min(displayArea.width, myColumnDataSize.x),
                                            displayArea.height - titleDisplayArea.height);

            if (dataDisplayArea.height < 0)
            {
                dataDisplayArea.height = 0;
            }

            // Compute scrollbar information.
            bool needHorizontalScrollbar = false;
            bool needVerticalScrollbar   = false;

            float displayWidth  = displayArea.width;
            float displayHeight = displayArea.height;

            if (myColumnTitleSize.x > displayWidth)
            {
                needHorizontalScrollbar = true;
                dataDisplayArea.height -= kScrollbarSize;
                if (dataDisplayArea.height < 0)
                {
                    dataDisplayArea.height = 0;
                }
            }
            float dataHeight = displayHeight - myColumnTitleSize.y - (needHorizontalScrollbar ? kScrollbarSize : 0);

            if (myColumnDataSize.y > dataHeight)
            {
                needVerticalScrollbar = true;
                if (displayArea.width > dataDisplayArea.width)
                {
                    if (displayArea.width - kScrollbarSize < dataDisplayArea.width)
                    {
                        dataDisplayArea.width = displayArea.width - kScrollbarSize;
                    }
                }
                else
                {
                    dataDisplayArea.width -= kScrollbarSize;
                }
                if (dataDisplayArea.width < 0)
                {
                    dataDisplayArea.width = 0;
                }
            }

            // Display column titles.
            GUI.BeginGroup(titleDisplayArea);
            DisplayColumnTitles();
            GUI.EndGroup();
            if (myColumnTitleSeperator)
            {
                GUI.Box(new Rect(displayArea.x, titleDisplayArea.yMax - 2, displayArea.width, 3), "");
                if (myDisplayColumnFrame && displayArea.xMax > titleDisplayArea.xMax)
                {
                    GUI.Box(new Rect(titleDisplayArea.xMax, titleDisplayArea.y, displayArea.xMax - titleDisplayArea.xMax, titleDisplayArea.height), "");
                }
            }
            // Display column data.
            GUI.BeginGroup(dataDisplayArea);
            DisplayColumnData();
            GUI.EndGroup();

            // Process mouse events.
            ProcessMouseEvents(titleDisplayArea, dataDisplayArea);

            // Display scrollbar if needed.
            myHScrollbarSize = myVScrollbarSize = 0;
            if (needHorizontalScrollbar)
            {
                myHScrollbarSize = dataDisplayArea.width;
                Rect scrollbarPos = new Rect(titleDisplayArea.x, displayArea.yMax - kScrollbarSize, titleDisplayArea.width, kScrollbarSize);
                myScrollbarPosition.x = GUI.HorizontalScrollbar(scrollbarPos, myScrollbarPosition.x, dataDisplayArea.width, 0, myColumnTitleSize.x);
            }
            if (needVerticalScrollbar)
            {
                myVScrollbarSize = dataDisplayArea.height;
                Rect scrollbarPos = new Rect(dataDisplayArea.xMax, dataDisplayArea.y, kScrollbarSize, dataDisplayArea.height);
                myScrollbarPosition.y = GUI.VerticalScrollbar(scrollbarPos, myScrollbarPosition.y, dataDisplayArea.height, 0, myColumnDataSize.y);
            }
        }