1 // 2 // System.ComponentModel.Design.DesignSurfaceServiceContainer 3 // 4 // Authors: 5 // Ivan N. Zlatev (contact i-nz.net) 6 // 7 // (C) 2006 Ivan N. Zlatev 8 9 // 10 // Permission is hereby granted, free of charge, to any person obtaining 11 // a copy of this software and associated documentation files (the 12 // "Software"), to deal in the Software without restriction, including 13 // without limitation the rights to use, copy, modify, merge, publish, 14 // distribute, sublicense, and/or sell copies of the Software, and to 15 // permit persons to whom the Software is furnished to do so, subject to 16 // the following conditions: 17 // 18 // The above copyright notice and this permission notice shall be 19 // included in all copies or substantial portions of the Software. 20 // 21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28 // 29 30 31 using System; 32 using System.Collections; 33 using System.ComponentModel; 34 35 namespace System.ComponentModel.Design 36 { 37 38 // Implements a ServiceContainer, which allows specific sets of services 39 // to be non-replacable for users of the IServiceContainer . 40 // 41 internal sealed class DesignSurfaceServiceContainer : ServiceContainer 42 { 43 44 private Hashtable _nonRemoveableServices; 45 DesignSurfaceServiceContainer()46 public DesignSurfaceServiceContainer () : this (null) 47 { 48 } 49 DesignSurfaceServiceContainer(IServiceProvider parentProvider)50 public DesignSurfaceServiceContainer (IServiceProvider parentProvider) : base (parentProvider) 51 { 52 } 53 AddNonReplaceableService(Type serviceType, object instance)54 internal void AddNonReplaceableService (Type serviceType, object instance) 55 { 56 if (_nonRemoveableServices == null) 57 _nonRemoveableServices = new Hashtable (); 58 59 _nonRemoveableServices[serviceType] = serviceType; 60 base.AddService (serviceType, instance); 61 } 62 63 RemoveNonReplaceableService(Type serviceType, object instance)64 internal void RemoveNonReplaceableService (Type serviceType, object instance) 65 { 66 if (_nonRemoveableServices != null) 67 _nonRemoveableServices.Remove (serviceType); 68 base.RemoveService (serviceType); 69 } 70 RemoveService(Type serviceType, bool promote)71 public override void RemoveService (Type serviceType, bool promote) 72 { 73 if (serviceType != null && _nonRemoveableServices != null && _nonRemoveableServices.ContainsKey (serviceType)) 74 throw new InvalidOperationException ("Cannot remove non-replaceable service: " + serviceType.AssemblyQualifiedName); 75 76 base.RemoveService (serviceType, promote); 77 } 78 } 79 } 80