Compartilhar via


Modificar um comando de menu padrão em uma Linguagem Específica de Domínio

É possível modificar o comportamento de alguns dos comandos padrão que são definidos automaticamente na DSL. Por exemplo, é possível modificar Recortar para excluir informações confidenciais. Para isso, substitua métodos em uma classe de conjunto de comandos. Essas classes são definidas no arquivo CommandSet.cs, no projeto DslPackage e são derivadas de CommandSet.

Observação

Se você quiser criar seus comandos de menu, confira Como adicionar um comando ao Menu de Atalho.

Quais comandos podem ser modificados?

Para descobrir quais comandos podem ser modificados

  1. No projeto DslPackage, abra GeneratedCode\CommandSet.cs. Esse arquivo C# pode ser encontrado no Gerenciador de Soluções como uma subsidiária de CommandSet.tt.

  2. Encontre classes nesse arquivo cujos nomes terminem com "CommandSet", por exemplo, Language1CommandSet e Language1ClipboardCommandSet.

  3. Em cada classe de conjunto de comandos, digite "override" seguido por um espaço. O IntelliSense mostrará uma lista dos métodos que podem ser substituídos. Cada comando contém um par de métodos cujos nomes começam com "ProcessOnStatus" e "ProcessOnMenu".

  4. Observe qual das classes de conjunto de comandos contém o comando que deseja modificar.

  5. Feche o arquivo sem salvar as edições.

    Observação

    Normalmente, é aconselhável não editar arquivos que foram gerados. Qualquer edição será perdida na próxima vez em que os arquivos forem gerados.

Estenda a classe de conjunto de comandos adequada

Crie um novo arquivo que contenha uma declaração parcial da classe de conjunto de comandos.

Estender a classe de Conjunto de Comandos

  1. No Gerenciador de Soluções, no projeto DslPackage, abra a pasta GeneratedCode e procure sob CommandSet.tt e abra o arquivo gerado CommandSet.cs. Observe o namespace e o nome da primeira classe que está definida lá. Por exemplo, é possível ver:

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. Em DslPackage, crie uma pasta nomeada Código Personalizado. Nessa pasta, crie um novo arquivo de classe nomeado CommandSet.cs.

  3. No novo arquivo, grave uma declaração parcial que contenha o mesmo namespace e o nome que a classe parcial gerada. Por exemplo:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Design;
    namespace Company.Language1 /* Make sure this is correct */
    { internal partial class Language1CommandSet { ...
    

    Observação

    Se o modelo de arquivo de classe foi usado para criar o novo arquivo, é necessário corrigir o namespace e o nome da classe.

Substitua os métodos de comando

A maioria dos comandos tem dois métodos associados: o método com um nome como ProcessOnStatus... determina se o comando deve estar visível e habilitado. É chamado sempre que o usuário clicar com o botão direito do mouse no diagrama e deve ser executado rapidamente e não realizar alterações. ProcessOnMenu... é chamado quando o usuário clica no comando e deve realizar a função do comando. É possível substituir qualquer um dos métodos ou os dois.

Para alterar quando o comando é exibido em um menu

Substitua o método ProcessOnStatus.... Esse método deve definir as propriedades Visível e Habilitado de seu parâmetro MenuCommand. Geralmente, o comando examina this.CurrentSelection para determinar se o comando é aplicável aos elementos selecionados e também poderá examinar suas propriedades para determinar se o comando pode ser aplicado em seu estado atual.

Como guia geral, a propriedade Visível deve ser determinada por quais elementos estão selecionados. A propriedade Habilitado, que determina se o comando é exibido em preto ou cinza no menu, deve depender do estado atual da seleção.

O exemplo a seguir desabilita o item de menu Excluir quando o usuário selecionar mais de uma forma.

Observação

Esse método não afeta se o comando está disponível através de um pressionamento de tecla. Por exemplo, desabilitar o item de menu Excluir não impede a invocação do comando através da tecla Delete.

/// <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;
  }
}

É uma boa prática chamar primeiro o método base, para lidar com todos os casos e as configurações pelos quais não houver interesse.

O método ProcessOnStatus não deve criar, excluir ou atualizar elementos no Armazenamento.

Para alterar o comportamento do comando

Substitua o método ProcessOnMenu.... O exemplo a seguir impede o usuário de excluir mais de um elemento de cada vez, mesmo usando a tecla Delete.

/// <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();
  }
}

Se o código fizer alterações ao Armazenamento, como criar, excluir ou atualizar elementos ou links, será necessário fazer isso dentro de uma transação. Para obter mais informações, confira Como criar e atualizar elementos de modelo.

Gravar o código dos métodos

Os seguintes fragmentos são úteis com frequência dentro desses métodos:

  • this.CurrentSelection. A forma que o usuário clicou com o botão direito sempre é incluída nessa lista de formas e conectores. Se o usuário clicar em uma parte em branco do diagrama, o Diagrama será o único membro da lista.

  • this.IsDiagramSelected() - true se o usuário clicou em uma parte em branco do diagrama.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection() – o usuário não selecionou múltiplas formas

  • this.SingleSelection – a forma ou o diagrama em que o usuário clicou com o botão direito

  • shape.ModelElement as MyLanguageElement – o elemento de modelo representado por uma forma.

Para obter mais informações sobre como navegar de elemento em elemento e sobre como criar objetos e links, confira Navegar e atualizar um modelo no código do programa.