Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / WinForms / Managed / System / WinForms / ComponentModel / COM2Interop / COM2IVsPerPropertyBrowsingHandler.cs / 1305376 / COM2IVsPerPropertyBrowsingHandler.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms.ComponentModel.Com2Interop { using System; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using Microsoft.Win32; ////// /// This is the base class for handlers for Com2 extended browsing interface /// such as IPerPropertyBrowsing, etc. /// /// These handlers should be stateless. That is, they should keep no refs to object /// and should only work on a give object and dispid. That way all objects that /// support a give interface can share a handler. /// /// See Com2Properties for the array of handler classes to interface classes /// where handlers should be registered. /// [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal class Com2IVsPerPropertyBrowsingHandler: Com2ExtendedBrowsingHandler { ////// /// The interface that this handler managers /// such as IPerPropertyBrowsing, IProvidePropertyBuilder, etc. /// public override Type Interface { get { return typeof(NativeMethods.IVsPerPropertyBrowsing); } } public static bool AllowChildProperties(Com2PropertyDescriptor propDesc) { if (propDesc.TargetObject is NativeMethods.IVsPerPropertyBrowsing) { bool pfHide = false; int hr = ((NativeMethods.IVsPerPropertyBrowsing)propDesc.TargetObject).DisplayChildProperties(propDesc.DISPID, ref pfHide); return (hr == NativeMethods.S_OK && pfHide); } return false; } ////// /// Called to setup the property handlers on a given properties /// In this method, the handler will add listeners to the events that /// the Com2PropertyDescriptor surfaces that it cares about. /// public override void SetupPropertyHandlers(Com2PropertyDescriptor[] propDesc){ if (propDesc == null){ return; } for (int i = 0; i < propDesc.Length; i++){ propDesc[i].QueryGetDynamicAttributes += new GetAttributesEventHandler(this.OnGetDynamicAttributes); propDesc[i].QueryGetBaseAttributes += new GetAttributesEventHandler(this.OnGetBaseAttributes); propDesc[i].QueryGetDisplayName += new GetNameItemEventHandler(this.OnGetDisplayName); propDesc[i].QueryGetIsReadOnly += new GetBoolValueEventHandler(this.OnGetIsReadOnly); propDesc[i].QueryShouldSerializeValue += new GetBoolValueEventHandler(this.OnShouldSerializeValue); propDesc[i].QueryCanResetValue += new GetBoolValueEventHandler(this.OnCanResetPropertyValue); propDesc[i].QueryResetValue += new Com2EventHandler(this.OnResetPropertyValue); propDesc[i].QueryGetTypeConverterAndTypeEditor += new GetTypeConverterAndTypeEditorEventHandler(this.OnGetTypeConverterAndTypeEditor); } } private void OnGetBaseAttributes(Com2PropertyDescriptor sender, GetAttributesEvent attrEvent){ NativeMethods.IVsPerPropertyBrowsing vsObj = sender.TargetObject as NativeMethods.IVsPerPropertyBrowsing; if (vsObj == null) { return; } // should we localize this? string[] pHelpString = new string[1]; int hr = vsObj.GetLocalizedPropertyInfo(sender.DISPID, CultureInfo.CurrentCulture.LCID, null, pHelpString); if (hr == NativeMethods.S_OK && pHelpString[0] != null){ attrEvent.Add(new DescriptionAttribute(pHelpString[0])); } } ////// /// Here is where we handle IVsPerPropertyBrowsing.GetLocalizedPropertyInfo and IVsPerPropertyBrowsing. HideProperty /// such as IPerPropertyBrowsing, IProvidePropertyBuilder, etc. /// private void OnGetDynamicAttributes(Com2PropertyDescriptor sender, GetAttributesEvent attrEvent){ if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing){ NativeMethods.IVsPerPropertyBrowsing vsObj = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; int hr = NativeMethods.S_OK; // we want to avoid allowing clients to force a bad property to be browsable, // so we don't allow things that are marked as non browsable to become browsable, // only the other way around. // if (sender.CanShow) { // should we hide this? bool pfHide = sender.Attributes[typeof(BrowsableAttribute)].Equals(BrowsableAttribute.No); hr = vsObj.HideProperty(sender.DISPID, ref pfHide); if (hr == NativeMethods.S_OK){ attrEvent.Add(pfHide ? BrowsableAttribute.No : BrowsableAttribute.Yes); } } // should we show this if (typeof(UnsafeNativeMethods.IDispatch).IsAssignableFrom(sender.PropertyType) && sender.CanShow){ bool pfDisplay = false; hr = vsObj.DisplayChildProperties(sender.DISPID, ref pfDisplay); if (hr == NativeMethods.S_OK && pfDisplay){ attrEvent.Add(BrowsableAttribute.Yes); } } } Debug.Assert(sender.TargetObject == null || sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing, "Object is not " + Interface.Name + "!"); } private void OnCanResetPropertyValue(Com2PropertyDescriptor sender, GetBoolValueEvent boolEvent) { if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing) { NativeMethods.IVsPerPropertyBrowsing target = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; bool canReset = boolEvent.Value; int hr = target.CanResetPropertyValue(sender.DISPID, ref canReset); if (NativeMethods.Succeeded(hr)){ boolEvent.Value = canReset; } } Debug.Assert(sender.TargetObject == null || sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing, "Object is not " + Interface.Name + "!"); } ////// /// Here is where we handle IVsPerPropertyBrowsing.GetLocalizedPropertyInfo (part 2) /// private void OnGetDisplayName(Com2PropertyDescriptor sender, GetNameItemEvent nameItem){ if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing){ NativeMethods.IVsPerPropertyBrowsing vsObj = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; // get the localized name, if applicable string[] pNameString = new string[1]; int hr = vsObj.GetLocalizedPropertyInfo(sender.DISPID, CultureInfo.CurrentCulture.LCID, pNameString, null); if (hr == NativeMethods.S_OK && pNameString[0] != null){ nameItem.Name = pNameString[0]; } } Debug.Assert(sender.TargetObject == null || sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing, "Object is not " + Interface.Name + "!"); } ////// /// Here is where we handle IVsPerPropertyBrowsing.IsPropertyReadOnly /// private void OnGetIsReadOnly(Com2PropertyDescriptor sender, GetBoolValueEvent gbvevent){ if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing){ NativeMethods.IVsPerPropertyBrowsing vsObj = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; // should we make this read only? bool pfResult = false; int hr = vsObj.IsPropertyReadOnly(sender.DISPID, ref pfResult); if (hr == NativeMethods.S_OK){ gbvevent.Value = pfResult; } } } ////// /// Here is where we handle IVsPerPropertyBrowsing.DisplayChildProperties /// private void OnGetTypeConverterAndTypeEditor(Com2PropertyDescriptor sender, GetTypeConverterAndTypeEditorEvent gveevent) { if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing){ // we only do this for IDispatch types if (sender.CanShow && typeof(UnsafeNativeMethods.IDispatch).IsAssignableFrom(sender.PropertyType)){ NativeMethods.IVsPerPropertyBrowsing vsObj = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; // should we make this read only? bool pfResult = false; int hr = vsObj.DisplayChildProperties(sender.DISPID, ref pfResult); if (gveevent.TypeConverter is Com2IDispatchConverter){ gveevent.TypeConverter = new Com2IDispatchConverter(sender, (hr == NativeMethods.S_OK && pfResult)); } else{ gveevent.TypeConverter = new Com2IDispatchConverter(sender, (hr == NativeMethods.S_OK && pfResult), gveevent.TypeConverter); } } } Debug.Assert(sender.TargetObject == null || sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing, "Object is not " + Interface.Name + "!"); } private void OnResetPropertyValue(Com2PropertyDescriptor sender, EventArgs e) { if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing) { NativeMethods.IVsPerPropertyBrowsing target = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; int dispid = sender.DISPID; bool canReset = false; int hr = target.CanResetPropertyValue(dispid, ref canReset); if (NativeMethods.Succeeded(hr)){ target.ResetPropertyValue(dispid); } } Debug.Assert(sender.TargetObject == null || sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing, "Object is not " + Interface.Name + "!"); } private void OnShouldSerializeValue(Com2PropertyDescriptor sender, GetBoolValueEvent gbvevent){ if (sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing){ NativeMethods.IVsPerPropertyBrowsing vsObj = (NativeMethods.IVsPerPropertyBrowsing)sender.TargetObject; // by default we say it's default bool pfResult = true; int hr = vsObj.HasDefaultValue(sender.DISPID,ref pfResult); if (hr == NativeMethods.S_OK && !pfResult){ // specify a default value editor gbvevent.Value = true; } } Debug.Assert(sender.TargetObject == null || sender.TargetObject is NativeMethods.IVsPerPropertyBrowsing, "Object is not " + Interface.Name + "!"); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Transactions.cs
- ClipboardData.cs
- TextRangeSerialization.cs
- DesignerMetadata.cs
- _BasicClient.cs
- DebugView.cs
- TableLayoutColumnStyleCollection.cs
- EpmAttributeNameBuilder.cs
- BinaryParser.cs
- SimpleRecyclingCache.cs
- HtmlInputButton.cs
- TableLayoutColumnStyleCollection.cs
- DiagnosticTraceSchemas.cs
- RtType.cs
- IndexedGlyphRun.cs
- SqlBinder.cs
- DataRecordInternal.cs
- StickyNoteHelper.cs
- CopyCodeAction.cs
- PropertyRecord.cs
- FloatMinMaxAggregationOperator.cs
- ListViewCancelEventArgs.cs
- CustomAssemblyResolver.cs
- ByteConverter.cs
- XmlRawWriterWrapper.cs
- UserControl.cs
- PenContexts.cs
- ObjectToken.cs
- DataGridView.cs
- SimpleHandlerFactory.cs
- DbProviderFactories.cs
- SmiEventSink.cs
- ApplicationInfo.cs
- Transform3DGroup.cs
- HtmlInputReset.cs
- GridView.cs
- SuppressMessageAttribute.cs
- ProcessModuleCollection.cs
- UIntPtr.cs
- TitleStyle.cs
- ReferenceEqualityComparer.cs
- AnnotationAdorner.cs
- GridViewRowPresenter.cs
- XmlEntity.cs
- XmlWriterTraceListener.cs
- MetadataFile.cs
- RequestNavigateEventArgs.cs
- DiagnosticsElement.cs
- TrackingDataItem.cs
- ZipIOLocalFileDataDescriptor.cs
- GenericWebPart.cs
- milrender.cs
- DataServiceRequestException.cs
- CompoundFileDeflateTransform.cs
- CodeTypeDeclaration.cs
- MemoryFailPoint.cs
- Validator.cs
- SqlServices.cs
- ScrollItemProviderWrapper.cs
- Help.cs
- StrongNamePublicKeyBlob.cs
- PngBitmapDecoder.cs
- FieldAccessException.cs
- PointValueSerializer.cs
- SrgsToken.cs
- Brushes.cs
- EnumerationRangeValidationUtil.cs
- XamlPoint3DCollectionSerializer.cs
- x509store.cs
- Converter.cs
- TextMetrics.cs
- IIS7UserPrincipal.cs
- DataGridViewToolTip.cs
- XmlIncludeAttribute.cs
- DiagnosticTraceSource.cs
- JoinQueryOperator.cs
- RegistryExceptionHelper.cs
- Soap12ProtocolImporter.cs
- XmlHierarchyData.cs
- RenderOptions.cs
- ChunkedMemoryStream.cs
- Win32Native.cs
- ReliabilityContractAttribute.cs
- DocComment.cs
- HttpGetProtocolReflector.cs
- SystemColorTracker.cs
- MULTI_QI.cs
- PointAnimationUsingKeyFrames.cs
- SortAction.cs
- SignatureDescription.cs
- DataServiceRequestException.cs
- XPathEmptyIterator.cs
- InstanceOwnerQueryResult.cs
- GridToolTip.cs
- safex509handles.cs
- MailAddressCollection.cs
- XamlTreeBuilderBamlRecordWriter.cs
- InstanceDataCollection.cs
- SafeTokenHandle.cs
- DetailsViewUpdateEventArgs.cs