File: winforms\Managed\System\WinForms\ComponentModel\COM2Interop\COM2ICategorizePropertiesHandler.cs
Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms)
//------------------------------------------------------------------------------
// <copyright file="COM2ICategorizePropertiesHandler.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Windows.Forms.ComponentModel.Com2Interop {
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Globalization;
    using Microsoft.Win32;
 
    [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
    internal class Com2ICategorizePropertiesHandler : Com2ExtendedBrowsingHandler {
 
        public override Type Interface {
            get {
                return typeof(NativeMethods.ICategorizeProperties);
            }
        }
 
        private string GetCategoryFromObject(object obj, int dispid) {
            if (obj == null) {
                return null;
            }
 
            if (obj is NativeMethods.ICategorizeProperties) {
                NativeMethods.ICategorizeProperties catObj = (NativeMethods.ICategorizeProperties)obj;
 
                try {
                    int categoryID = 0;
 
                    if (NativeMethods.S_OK == catObj.MapPropertyToCategory(dispid, ref categoryID)) {
                        string categoryName = null;
                        
                        switch (categoryID) {
                            case NativeMethods.ActiveX.PROPCAT_Nil:
                                return "";
                            case NativeMethods.ActiveX.PROPCAT_Misc:
                                return SR.GetString(SR.PropertyCategoryMisc);
                            case NativeMethods.ActiveX.PROPCAT_Font:
                                return SR.GetString(SR.PropertyCategoryFont);
                            case NativeMethods.ActiveX.PROPCAT_Position:
                                return SR.GetString(SR.PropertyCategoryPosition);
                            case NativeMethods.ActiveX.PROPCAT_Appearance:
                                return SR.GetString(SR.PropertyCategoryAppearance);
                            case NativeMethods.ActiveX.PROPCAT_Behavior:
                                return SR.GetString(SR.PropertyCategoryBehavior);
                            case NativeMethods.ActiveX.PROPCAT_Data:
                                return SR.GetString(SR.PropertyCategoryData);
                            case NativeMethods.ActiveX.PROPCAT_List:
                                return SR.GetString(SR.PropertyCategoryList);
                            case NativeMethods.ActiveX.PROPCAT_Text:
                                return SR.GetString(SR.PropertyCategoryText);
                            case NativeMethods.ActiveX.PROPCAT_Scale:
                                return SR.GetString(SR.PropertyCategoryScale);
                            case NativeMethods.ActiveX.PROPCAT_DDE:
                                return SR.GetString(SR.PropertyCategoryDDE);
                        }
                        
                        if (NativeMethods.S_OK == catObj.GetCategoryName(categoryID, CultureInfo.CurrentCulture.LCID, out categoryName)) {
                            return categoryName;
                        }
                    }
                }
                catch {
                }
            }
            return null;
        }
 
        public override void SetupPropertyHandlers(Com2PropertyDescriptor[] propDesc) {
            if (propDesc == null) {
                return;
            }
            for (int i = 0; i < propDesc.Length; i++) {
                propDesc[i].QueryGetBaseAttributes += new GetAttributesEventHandler(this.OnGetAttributes);
            }
        }
 
        private void OnGetAttributes(Com2PropertyDescriptor sender, GetAttributesEvent attrEvent) {
 
            string cat = GetCategoryFromObject(sender.TargetObject, sender.DISPID);
 
            if (cat != null && cat.Length > 0) {
                attrEvent.Add(new CategoryAttribute(cat));
            }
        }
    }
}