// // System.ComponentModel.Design.MenuCommandService.cs // // Author: // Atsushi Enomoto // Ivan N. Zlatev // // Copyright (C) 2007 Novell, Inc // Copyright (C) Ivan N. Zlatev // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if NET_2_0 using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel.Design; using System.ComponentModel; namespace System.ComponentModel.Design { public class MenuCommandService : IMenuCommandService, IDisposable { private IServiceProvider _serviceProvider; private DesignerVerbCollection _globalVerbs; private DesignerVerbCollection _verbs; private Dictionary _commands; public MenuCommandService (IServiceProvider serviceProvider) { if (serviceProvider == null) throw new ArgumentNullException ("serviceProvider"); _serviceProvider = serviceProvider; ISelectionService selectionSvc = _serviceProvider.GetService (typeof (ISelectionService)) as ISelectionService; if (selectionSvc != null) selectionSvc.SelectionChanged += OnSelectionChanged; } private void OnSelectionChanged (object sender, EventArgs arg) { this.OnCommandsChanged (new MenuCommandsChangedEventArgs (MenuCommandsChangedType.CommandChanged, null)); // The commands will be updated whenever they are requested/modified. } public event MenuCommandsChangedEventHandler MenuCommandsChanged; public virtual DesignerVerbCollection Verbs { get { this.EnsureVerbs (); return _verbs; } } public virtual void AddCommand (MenuCommand command) { if (command == null) throw new ArgumentNullException ("command"); if (_commands == null) _commands = new Dictionary (); _commands.Add (command.CommandID, command); this.OnCommandsChanged (new MenuCommandsChangedEventArgs (MenuCommandsChangedType.CommandAdded, command)); } public virtual void AddVerb (DesignerVerb verb) { if (verb == null) throw new ArgumentNullException ("verb"); this.EnsureVerbs (); if (!_verbs.Contains (verb)) { if (_globalVerbs == null) _globalVerbs = new DesignerVerbCollection (); _globalVerbs.Add (verb); } this.OnCommandsChanged (new MenuCommandsChangedEventArgs (MenuCommandsChangedType.CommandAdded, verb)); } public void Dispose () { Dispose (true); } protected virtual void Dispose (bool disposing) { if (disposing) { if (_globalVerbs != null) { _globalVerbs.Clear (); _globalVerbs = null; } if (_verbs != null) { _verbs.Clear (); _verbs = null; } if (_commands != null) { _commands.Clear (); _commands = null; } if (_serviceProvider != null) { ISelectionService selectionSvc = _serviceProvider.GetService (typeof (ISelectionService)) as ISelectionService; if (selectionSvc != null) selectionSvc.SelectionChanged -= OnSelectionChanged; _serviceProvider = null; } } } protected void EnsureVerbs () { DesignerVerbCollection selectionVerbs = null; ISelectionService selectionSvc = this.GetService (typeof (ISelectionService)) as ISelectionService; IDesignerHost host = this.GetService (typeof (IDesignerHost)) as IDesignerHost; if (selectionSvc != null && host != null && selectionSvc.SelectionCount == 1) { IComponent primarySelection = selectionSvc.PrimarySelection as IComponent; if (primarySelection != null) { IDesigner designer = host.GetDesigner (primarySelection); if (designer != null) selectionVerbs = designer.Verbs; } } // Designer provided verbs have the higher precedence than the global // Dictionary allVerbs = new Dictionary (); if (_globalVerbs != null) { foreach (DesignerVerb verb in _globalVerbs) allVerbs[verb.Text] = verb; } if (selectionVerbs != null) { foreach (DesignerVerb verb in selectionVerbs) allVerbs[verb.Text] = verb; } if (_verbs == null) _verbs = new DesignerVerbCollection (); else _verbs.Clear (); foreach (DesignerVerb verb in allVerbs.Values) _verbs.Add (verb); } protected MenuCommand FindCommand (Guid guid, int id) { return this.FindCommand (new CommandID (guid, id)); } public MenuCommand FindCommand (CommandID commandID) { if (commandID == null) throw new ArgumentNullException ("commandID"); MenuCommand command = null; if (_commands != null) _commands.TryGetValue (commandID, out command); if (command == null) { this.EnsureVerbs (); foreach (DesignerVerb verb in _verbs) { if (verb.CommandID.Equals (commandID)) { command = (MenuCommand) verb; break; } } } return command; } protected ICollection GetCommandList (Guid guid) { List list = new List (); if (_commands != null) { foreach (MenuCommand command in _commands.Values) { if (command.CommandID.Guid == guid) list.Add (command); } } return list; } public virtual bool GlobalInvoke (CommandID commandID) { if (commandID == null) throw new ArgumentNullException ("commandID"); MenuCommand command = this.FindCommand (commandID); if (command != null) { command.Invoke (); return true; } return false; } public virtual bool GlobalInvoke (CommandID commandID, object arg) { if (commandID == null) throw new ArgumentNullException ("commandID"); MenuCommand command = this.FindCommand (commandID); if (command != null) { command.Invoke (arg); return true; } return false; } protected virtual void OnCommandsChanged (MenuCommandsChangedEventArgs e) { if (MenuCommandsChanged != null) MenuCommandsChanged (this, e); } public virtual void RemoveCommand (MenuCommand command) { if (command == null) throw new ArgumentNullException ("command"); if (_commands != null) _commands.Remove (command.CommandID); this.OnCommandsChanged (new MenuCommandsChangedEventArgs (MenuCommandsChangedType.CommandRemoved, null)); } public virtual void RemoveVerb (DesignerVerb verb) { if (verb == null) throw new ArgumentNullException ("verb"); if (_globalVerbs.Contains (verb)) _globalVerbs.Remove (verb); this.OnCommandsChanged (new MenuCommandsChangedEventArgs (MenuCommandsChangedType.CommandRemoved, verb)); } public virtual void ShowContextMenu (CommandID menuID, int x, int y) { } protected object GetService (Type serviceType) { if (_serviceProvider != null) return _serviceProvider.GetService (serviceType); return null; } } } #endif