Comment : modifier une commande de menu standard dans un langage spécifique à un domaine
Vous pouvez modifier le comportement de certaines des commandes standard qui sont définies automatiquement dans votre DSL. Vous pourriez par exemple modifier la commande Couper pour qu'elle exclut les informations sensibles. Pour cela, vous devez substituer des méthodes dans une classe de jeu de commandes. Ces classes sont définies dans le fichier CommandSet.cs, dans le projet DslPackage, et son dérivées de CommandSet.
En résumé, pour modifier une commande :
Découvrez les commandes que vous pouvez modifier.
Créez une déclaration partielle de la classe de jeu de commandes appropriée.
Substituez les méthodes ProcessOnStatus et ProcessOnMenu pour la commande.
Cette rubrique explique cette procédure.
Notes
Si vous voulez créer vos propres commandes de menu, consultez Comment : ajouter une commande au menu contextuel.
Quelles commandes pouvez-vous modifier ?
Pour découvrir les commandes que vous pouvez modifier
Dans le projet DslPackage, ouvrez GeneratedCode\CommandSet.cs. Ce fichier C# est accessible dans l'Explorateur de solutions en tant que fichier auxiliaire de CommandSet.tt.
Recherchez dans ce fichier les classes dont le nom se termine par « CommandSet », par exemple Language1CommandSet et Language1ClipboardCommandSet.
Dans chaque classe de jeu de commandes, tapez « override » suivi d'un espace. IntelliSense affiche une liste des méthodes que vous pouvez substituer. Chaque commande à une paire de méthodes dont le nom commence par « ProcessOnStatus » et « ProcessOnMenu ».
Notez parmi les classes de jeu de commandes celle qui contient la commande à modifier.
Fermez le fichier sans enregistrer vos modifications.
Notes
En temps normal, vous ne devez pas modifier les fichiers qui ont été générés.Toute modification sera perdue lors de la prochaine génération des fichiers.
Développer la classe de jeu de commandes appropriée
Créez un fichier qui contient une déclaration partielle de la classe de jeu de commandes.
Pour développer la classe de jeu de commandes
Dans l'Explorateur de solutions, dans le projet DslPackage, ouvrez le dossier GeneratedCode, puis regardez sous CommandSet.tt et ouvrez son fichier généré CommandSet.cs. Notez l'espace de noms et le nom de la première classe qui y est définie. Par exemple, vous pouvez voir :
namespace Company.Language1
{ ... internal partial class Language1CommandSet : ...
Dans DslPackage, créez un dossier nommé Code personnalisé. Dans ce dossier, créez un fichier de classe nommé CommandSet.cs.
Dans le nouveau fichier, écrivez une déclaration partielle dont l'espace de noms et le nom sont les mêmes que ceux de la classe partielle générée. Par exemple :
using System; using System.Collections.Generic; using System.ComponentModel.Design; namespace Company.Language1 /* Make sure this is correct */ { internal partial class Language1CommandSet { ...
Remarque Si vous avez utilisé le modèle de fichier de classe pour créer le fichier, vous devez corriger à la fois l'espace de noms et le nom de la classe.
Substituer les méthodes de commande
La plupart des commandes ont deux méthodes associées : la méthode avec un nom tel que ProcessOnStatus... détermine si la commande doit être visible et activée. Elle est appelée chaque fois que l'utilisateur clique avec le bouton droit sur le diagramme et doit être exécutée rapidement et n'apporter aucune modification. ProcessOnMenu... est appelée quand l'utilisateur clique sur la commande et doit effectuer la fonction de la commande. Vous souhaiterez peut-être substituer l'une ou l'autre de ces méthodes, ou les deux.
Pour modifier quand la commande apparaît dans un menu
Substituez la méthode ProcessOnStatus... . Cette méthode doit définir les propriétés Visible et Activé de son paramètre MenuCommand. En général, la commande examine this.CurrentSelection pour déterminer si elle s'applique aux éléments sélectionnés et peut également examiner leurs propriétés pour déterminer si elle peut être appliquée dans leur état actuel.
D'une manière générale, la propriété Visible doit être déterminée en fonction des éléments sélectionnés. La propriété Activé, qui détermine si la commande apparaît en noir ou en gris dans le menu, doit dépendre de l'état actuel de la sélection.
L'exemple suivant désactive l'élément de menu Delete quand l'utilisateur a sélectionné plusieurs formes.
Notes
Cette méthode n'a aucun impact sur la disponibilité de la commande par l'intermédiaire du clavier.Par exemple, la désactivation de l'élément de menu Delete n'empêche pas d'appeler la commande par l'intermédiaire de la touche Suppr.
/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
// Default settings from the base method.
base.ProcessOnStatusDeleteCommand(command);
if (this.CurrentSelection.Count > 1)
{
// If user has selected more than one item, Delete is greyed out.
command.Enabled = false;
}
}
Il est préférable d'appeler la méthode de base en premier, pour gérer tous les cas et les paramètres dont vous ne vous souciez pas.
La méthode ProcessOnStatus ne doit pas créer, supprimer ou mettre à jour des éléments dans le magasin.
Pour modifier le comportement de la commande
Substituez la méthode ProcessOnStatus... . L'exemple suivant empêche l'utilisateur de supprimer plusieurs éléments à la fois, même à l'aide de la touche Suppr.
/// <summary>
/// Called when user presses Delete key
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
// Allow users to delete only one thing at a time.
if (this.CurrentSelection.Count <= 1)
{
base.ProcessOnMenuDeleteCommand();
}
}
Si votre code modifie le magasin, par exemple s'il crée, supprime ou met à jour des éléments ou des liens, il doit le faire à l'intérieur d'une transaction. Pour plus d'informations, consultez Comment : modifier une commande de menu standard dans un langage spécifique à un domaine.
Écriture du code des méthodes
Les fragments suivants sont souvent utiles dans ces méthodes :
this.CurrentSelection. La forme sur laquelle l'utilisateur a cliqué avec le bouton droit est toujours incluse dans cette liste de formes et de connecteurs. Si l'utilisateur clique sur une partie vierge du diagramme, ce dernier est le seul membre de la liste.
this.IsDiagramSelected() - true si l'utilisateur a cliqué sur une partie vierge du diagramme.
this.IsCurrentDiagramEmpty()
this.IsSingleSelection() - l'utilisateur n'a pas sélectionné plusieurs formes.
this.SingleSelection - forme ou diagramme sur lequel l'utilisateur a cliqué avec le bouton droit.
shape.ModelElement as MyLanguageElement - élément de modèle représenté par une forme.
Pour plus d'informations sur la façon de naviguer d'un élément à un autre et sur la façon de créer des objets et des liens, consultez Navigation et mise à jour d'un modèle dans le code de programme.
Voir aussi
Tâches
Comment : ajouter une commande au menu contextuel
[redirection] Procédure pas à pas : obtention d'informations d'un lien sélectionné
Référence
Concepts
Comment les VSPackages ajoutent des éléments de l'interface utilisateur à l'IDE
Autres ressources
Écriture de code pour personnaliser un langage spécifique à un domaine
Tableau de commande Visual Studio (. fichiers de Vsct)
VMSDK – Exemple de diagrammes de circuits. Personnalisation DSL étendue