Como: acessar e restringir a seleção atual
Quando você escreve um manipulador de comando ou do gesto para sua linguagem específica de domínio, você pode determinar qual elemento o usuário clique com o botão direito do mouse.Você também pode impedir que alguns formas ou campos estão selecionados.Por exemplo, você pode organizar que quando o usuário clica em um decorador ícone, a forma que o contém está selecionada em vez de isso.Restringir a seleção de essa maneira reduz o número de manipuladores que você precisa escrever.Ele também torna mais fácil para o usuário, que pode clicar em qualquer lugar no formulário sem ter que evitar o decorador.
Acessando a seleção atual de um manipulador de comando
A classe do comando para uma linguagem específica de domínio contém os manipuladores de comando para os comandos personalizados.A classe de CommandSet , que a classe do comando para uma linguagem específica de domínio é derivado de, fornece alguns membros para acessar a seleção atual.
Dependendo do comando, o manipulador de comando pode precisar a seleção no designer modelo, no modelo, ou na janela ativa.
Para acessar informações de seleção
a classe de CommandSet define os seguintes membros que podem ser usados para acessar a seleção atual.
Membro
Descrição
Retorna true se qualquer um dos elementos selecionados no designer modelo são uma maneira de compartimento; caso contrário, false.
Método IsDiagramSelected
Retorna true se o diagrama é selecionado no designer modelo; caso contrário, false.
Método IsSingleDocumentSelection
Retorna true se um elemento é selecionado exatamente modelo; no designer caso contrário, false.
Método IsSingleSelection
Retorna true se um elemento é selecionado exatamente na janela ativa; caso contrário, false.
Propriedade CurrentDocumentSelection
Obtém uma coleção somente leitura dos elementos selecionados no designer modelo.
Propriedade CurrentSelection
Obtém uma coleção somente leitura dos elementos selecionados na janela ativa.
Propriedade SingleDocumentSelection
Obtém o elemento primária de seleção no designer modelo.
Propriedade SingleSelection
Obtém o elemento primária de seleção na janela ativa.
A propriedade de CurrentDocView da classe de CommandSet fornece acesso ao objeto de DiagramDocView que representa a janela modelo de designer e fornece acesso adicional elementos selecionados no designer modelo.
Além de isso, o código gerado define uma propriedade da janela de ferramentas do explorer e uma propriedade de seleção do na classe do comando para a linguagem específica de domínio.
A propriedade da janela de ferramentas do retorna uma instância da classe de janela de ferramentas do para a linguagem específica de domínio.A classe de janela de ferramentas do deriva da classe de ModelExplorerToolWindow e o representa-se o modelo para a linguagem específica de domínio.
A propriedade de ExplorerSelection retorna o elemento selecionado na janela do explorer modelo para a linguagem específica de domínio.
Determinando quais janela está ativa
A interface de IMonitorSelectionService contém define os membros que fornecem acesso ao estado de seleção atual no shell.Você pode obter um objeto de IMonitorSelectionService da classe do pacote ou da classe do comando para a linguagem específica de domínio através da propriedade de MonitorSelection definida na classe base de cada um.A classe de pacote deriva da classe de ModelingPackage , e a classe do comando deriva da classe de CommandSet .
Para determinar de um manipulador de comando que tipo de janela está ativa
A propriedade de MonitorSelection da classe de CommandSet retorna um objeto de IMonitorSelectionService que fornece acesso ao estado de seleção atual no shell.
A propriedade de CurrentSelectionContainer de interface de IMonitorSelectionService obtém o contêiner de seleção ativa, que pode ser diferente da janela ativa.
Adicione as seguintes propriedades para a classe do comando para você linguagem específica de domínio para determinar que tipo de janela está ativa.
// using Microsoft.VisualStudio.Modeling.Shell; // Returns true if the model designer is the active selection container; // otherwise, false. protected bool IsDesignerActive { get { return (this.MonitorSelection.CurrentSelectionContainer is DiagramDocView); } } // Returns true if the model explorer is the active selection container; // otherwise, false. protected bool IsExplorerActive { get { return (this.MonitorSelection.CurrentSelectionContainer is ModelExplorerToolWindow); } }
Restringir a seleção
Adicionando regras de seleção, você pode controlar quais elementos são selecionados quando o usuário seleciona um elemento no modelo.Por exemplo, para permitir que o usuário manipular um número de elementos como uma unidade, você pode usar uma regra de seleção.
para criar uma regra de seleção
Crie um arquivo de código personalizado no projeto de DSL
Defina uma classe de regra de seleção que é derivada da classe de DiagramSelectionRules .
Substituir o método do GetCompliantSelection da classe da regra de seleção para aplicar os critérios de seleção.
Adicione uma definição de classe parcial para a classe de ClassDiagram ao seu arquivo de código personalizado.
A classe de ClassDiagram deriva da classe de Diagram e é definida no arquivo de código gerado, Diagram.cs, no projeto de DSL.
Substitua a propriedade de SelectionRules da classe de ClassDiagram para retornar a regra de seleção personalizado.
A implementação padrão da propriedade de SelectionRules obtém um objeto de regra de seleção que não altera a seleção.
Exemplo
O seguinte arquivo de código a seguir cria uma regra de seleção que expande a seleção para incluir todas as instâncias de cada uma das formas de domínio que foi selecionado inicialmente.
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
namespace CompanyName.ProductName.GroupingDsl
{
public class CustomSelectionRules : DiagramSelectionRules
{
protected Diagram diagram;
protected IElementDirectory elementDirectory;
public CustomSelectionRules(Diagram diagram)
{
if (diagram == null) throw new ArgumentNullException();
this.diagram = diagram;
this.elementDirectory = diagram.Store.ElementDirectory;
}
/// <summary>Called by the design surface to allow selection filtering.
/// </summary>
/// <param name="currentSelection">[in] The current selection before any
/// ShapeElements are added or removed.</param>
/// <param name="proposedItemsToAdd">[in/out] The proposed DiagramItems to
/// be added to the selection.</param>
/// <param name="proposedItemsToRemove">[in/out] The proposed DiagramItems
/// to be removed from the selection.</param>
/// <param name="primaryItem">[in/out] The proposed DiagramItem to become
/// the primary DiagramItem of the selection. A null value signifies that
/// the last DiagramItem in the resultant selection should be assumed as
/// the primary DiagramItem.</param>
/// <returns>true if some or all of the selection was accepted; false if
/// the entire selection proposal was rejected. If false, appropriate
/// feedback will be given to the user to indicate that the selection was
/// rejected.</returns>
public override bool GetCompliantSelection(
SelectedShapesCollection currentSelection,
DiagramItemCollection proposedItemsToAdd,
DiagramItemCollection proposedItemsToRemove,
DiagramItem primaryItem)
{
if (currentSelection.Count == 0 && proposedItemsToAdd.Count == 0) return true;
HashSet<DomainClassInfo> itemsToAdd = new HashSet<DomainClassInfo>();
foreach (DiagramItem item in proposedItemsToAdd)
{
if (item.Shape != null)
itemsToAdd.Add(item.Shape.GetDomainClass());
}
proposedItemsToAdd.Clear();
foreach (DomainClassInfo classInfo in itemsToAdd)
{
foreach (ModelElement element
in this.elementDirectory.FindElements(classInfo, false))
{
if (element is ShapeElement)
{
proposedItemsToAdd.Add(
new DiagramItem((ShapeElement)element));
}
}
}
return true;
}
}
public partial class ClassDiagram
{
protected CustomSelectionRules customSelectionRules = null;
protected bool multipleSelectionMode = true;
public override DiagramSelectionRules SelectionRules
{
get
{
if (multipleSelectionMode)
{
if (customSelectionRules == null)
{
customSelectionRules = new CustomSelectionRules(this);
}
return customSelectionRules;
}
else
{
return base.SelectionRules;
}
}
}
}
}