File: winforms\Managed\System\WinForms\ComponentModel\COM2Interop\COM2ComponentEditor.cs
Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms)
//------------------------------------------------------------------------------
// <copyright file="COM2ComponentEditor.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Windows.Forms.ComponentModel.Com2Interop {
 
    using System.Runtime.Remoting;
    using System.Runtime.InteropServices;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis;
    using System;    
    using System.Collections;
    using Microsoft.Win32;
    using System.Windows.Forms.Design;
 
    internal class Com2ComponentEditor : WindowsFormsComponentEditor {
    
        public static bool NeedsComponentEditor(object obj) {
            if (obj is NativeMethods.IPerPropertyBrowsing) {
                 // check for a property page
                 Guid guid = Guid.Empty;
                 int hr = ((NativeMethods.IPerPropertyBrowsing)obj).MapPropertyToPage(NativeMethods.MEMBERID_NIL, out guid);
                 if ((hr == NativeMethods.S_OK) && !guid.Equals(Guid.Empty)) {
                     return true;
                 }
            }
            
            if (obj is NativeMethods.ISpecifyPropertyPages) {
                 try {
                    NativeMethods.tagCAUUID uuids = new NativeMethods.tagCAUUID();
                    try {
                        ((NativeMethods.ISpecifyPropertyPages)obj).GetPages(uuids);
                        if (uuids.cElems > 0) {
                           return true;
                        }
                    }
                    finally {
                        if (uuids.pElems != IntPtr.Zero) {
                            Marshal.FreeCoTaskMem(uuids.pElems);
                        }
                    }
                 }
                 catch {
                 }
                 
                 return false;
            }
            return false;
        }
    
        [
            SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters") // This was shipped in Everett.
        ]
        public override bool EditComponent(ITypeDescriptorContext context, object obj, IWin32Window parent) {
        
                IntPtr handle = (parent == null ? IntPtr.Zero : parent.Handle);
        
                // try to get the page guid
                if (obj is NativeMethods.IPerPropertyBrowsing) {
                    // check for a property page
                    Guid guid = Guid.Empty;
                    int hr = ((NativeMethods.IPerPropertyBrowsing)obj).MapPropertyToPage(NativeMethods.MEMBERID_NIL, out guid);
                    if (hr == NativeMethods.S_OK) {
                        if (!guid.Equals(Guid.Empty)) {
                            object o = obj;
                            SafeNativeMethods.OleCreatePropertyFrame(new HandleRef(parent, handle), 0, 0, "PropertyPages", 1, ref o, 1, new Guid[]{guid}, Application.CurrentCulture.LCID, 0, IntPtr.Zero);
                            return true;
                        }
                    }
                } 
                
                if (obj is NativeMethods.ISpecifyPropertyPages) {
                    bool failed = false;
                    Exception failureException;
 
                    try {
                       NativeMethods.tagCAUUID uuids = new NativeMethods.tagCAUUID();
                       try {
                           ((NativeMethods.ISpecifyPropertyPages)obj).GetPages(uuids);
                           if (uuids.cElems <= 0) {
                               return false;
                           }
                       }
                       catch {
                           return false;
                       }
                       try {
                           object o = obj;
                           SafeNativeMethods.OleCreatePropertyFrame(new HandleRef(parent, handle), 0, 0, "PropertyPages", 1, ref o, uuids.cElems, new HandleRef(uuids, uuids.pElems), Application.CurrentCulture.LCID, 0, IntPtr.Zero);
                           return true;
                       }
                       finally {
                           if (uuids.pElems != IntPtr.Zero) {
                               Marshal.FreeCoTaskMem(uuids.pElems);
                           }
                       }
                  
                    }
                    catch (Exception ex1) {
                        failed = true;
                        failureException = ex1;
                    }
 
                    if (failed) {
                        String errString = SR.GetString(SR.ErrorPropertyPageFailed);
 
                        IUIService uiSvc = (context != null) ? ((IUIService) context.GetService(typeof(IUIService))) : null;
                        
                        if (uiSvc == null) {
                            RTLAwareMessageBox.Show(null, errString, SR.GetString(SR.PropertyGridTitle),
                                    MessageBoxButtons.OK, MessageBoxIcon.Error,
                                    MessageBoxDefaultButton.Button1, 0);
                        }
                        else if (failureException != null) {
                            uiSvc.ShowError(failureException, errString);
                        }
                        else {
                            uiSvc.ShowError(errString);
                        }
                    }
                }
                return false;
            }
 
    }
 
}