// -----------------------------------------------------------------------
        void DisplayObjectErrorsAndWarnings(List <ErrorWarning> errors, List <ErrorWarning> warnings)
        {
            // -- Determine wich objects have errors or warnings --
            var objectIds = P.append(P.map(e => e.ObjectId, errors), P.map(w => w.ObjectId, warnings));

            objectIds = P.removeDuplicates(objectIds);

            // -- Display the errors/warnings on the objects in the graph --
            foreach (var id in objectIds)
            {
                // -- Determine if node is visible --
                var node = IStorage[id];
                if (!DisplayRoot.IsParentOf(node))
                {
                    continue;
                }
                var pos = node.GlobalPosition;
                if (!VisibleGraphRect.Contains(pos))
                {
                    continue;
                }
                // -- Determine errors/warnings for this particular node --
                var nodeErrors   = P.filter(e => e.ObjectId == id, errors);
                var nodeWarnings = P.filter(w => w.ObjectId == id, warnings);
                // -- Display the appropriate error/warning icon --
                var r = Math3D.BuildRectCenteredAt(pos, 32f, 32f);
                r = myGraphics.TranslateAndScale(r);
                DisplayErrorsAndWarningAt(r, nodeErrors, nodeWarnings);
            }
        }
        public void OnActivate(Type classType, iCS_IStorage storage, GUIContent title = null, iCS_EditorObject target = null)
        {
            // Configuration parameters.
            myClassType = classType;
            myStorage   = storage;
            myTitle     = title ?? new GUIContent(kDefaultTitle);
            myTarget    = target;

            // Common variables.
            myCheckBoxSize = GUI.skin.toggle.CalcSize(new GUIContent(""));

            // Extract fields & properties from class descriptor.
            var libraryDatabase            = LibraryController.LibraryDatabase;
            var libraryType                = libraryDatabase.GetLibraryType(classType);
            var libraryFields              = libraryType.GetMembers <LibraryField>();
            var libraryProperties          = libraryType.GetMembers <LibraryProperty>();
            var libraryFieldsAndProperties = P.append <LibraryObject>(libraryFields, libraryProperties);
            List <VariablePair> variables  = new List <VariablePair>();

            foreach (var libraryObject in libraryFieldsAndProperties)
            {
                bool   isActive     = (myTarget != null && myStorage != null) ? myStorage.PropertiesWizardFindFunction(myTarget, libraryObject) != null : false;
                string name         = GetVariableName(libraryObject);
                var    variablePair = GetVariablePair(name, variables);
                if (libraryObject is LibraryFieldSetter || libraryObject is LibraryPropertySetter)
                {
                    if (variablePair != null)
                    {
                        variablePair.InputControlPair.Component = libraryObject;
                        variablePair.InputControlPair.IsActive  = isActive;
                    }
                    else
                    {
                        variables.Add(new VariablePair(libraryObject, isActive, null, false));
                    }
                }
                else
                {
                    if (variablePair != null)
                    {
                        variablePair.OutputControlPair.Component = libraryObject;
                        variablePair.OutputControlPair.IsActive  = isActive;
                    }
                    else
                    {
                        variables.Add(new VariablePair(null, false, libraryObject, isActive));
                    }
                }
            }
            myVariables = variables.ToArray();
            Array.Sort(myVariables, (x, y) => GetVariableName(x).CompareTo(GetVariableName(y)));

            // Build view
            myTableView            = new DSTableView(new RectOffset(0, 0, 0, 0), true, myTitle, DSView.AnchorEnum.Center, true, true);
            myTableView.DataSource = this;
            DSTableColumn inColumn = new DSTableColumn(kInColumnId, new RectOffset(kSpacer, kSpacer, 0, 0), new GUIContent("In"), DSView.AnchorEnum.Center);

            myTableView.AddColumn(inColumn);
            DSTableColumn outColumn = new DSTableColumn(kOutColumnId, new RectOffset(kSpacer, kSpacer, 0, 0), new GUIContent("Out"), DSView.AnchorEnum.Center);

            myTableView.AddColumn(outColumn);
            DSTableColumn variableNameColumn = new DSTableColumn(kNameColumnId, new RectOffset(kSpacer, kSpacer, 0, 0), new GUIContent("Name"), DSView.AnchorEnum.CenterLeft);

            myTableView.AddColumn(variableNameColumn);
            DSTableColumn variableTypeColumn = new DSTableColumn(kTypeColumnId, new RectOffset(kSpacer, kSpacer, 0, 0), new GUIContent("Type"), DSView.AnchorEnum.CenterLeft);

            myTableView.AddColumn(variableTypeColumn);
        }