Suporte para a barra de navegação (estrutura de pacote gerenciado)
A barra de navegação na parte superior do modo de exibição editor exibe os tipos e membros do arquivo. Tipos são mostrados no drop-down à esquerda, e os membros são mostrados no direito drop-down. Quando o usuário seleciona um tipo, o cursor é colocado na primeira linha do tipo. Quando o usuário seleciona um membro, o cursor é colocado na definição do membro. As caixas de lista suspensa são atualizadas para refletir o local atual do cursor.
Exibir e atualizar a barra de navegação
Para oferecer suporte a barra de navegação, você deve derivar uma classe a partir de TypeAndMemberDropdownBars de classe e implementar o OnSynchronizeDropdowns método. Quando o seu serviço de linguagem é dada uma janela de código, a base da LanguageService classe instancia o CodeWindowManager, que contém o IVsCodeWindow objeto que representa a janela de código. O CodeWindowManager objeto recebe um novo IVsTextView objeto. O CreateDropDownHelper método obtém um TypeAndMemberDropdownBars objeto. Se você retornar uma instância do seu TypeAndMemberDropdownBars classe, o CodeWindowManager chamadas seu OnSynchronizeDropdowns método para preencher o internal listas e passa sua TypeAndMemberDropdownBars o objeto para o Visual Studio suspensa barra manager. Na lista suspensa barra manager, por sua vez, chama o SetDropdownBar método no seu TypeAndMemberDropdownBars objeto para estabelecer a IVsDropdownBar objeto que contém as duas barras de menu suspenso.
Quando o cursor se move, o OnIdle chamadas de método de OnCaretMoved método. Base da OnCaretMoved chamadas de método de OnSynchronizeDropdowns método no seu TypeAndMemberDropdownBars classe para atualizar o estado da barra de navegação. Você passa um conjunto de DropDownMember objetos para este método. Cada objeto representa uma entrada na lista suspensa.
O conteúdo da barra de navegação
A barra de navegação geralmente contém uma lista de tipos e uma lista de membros. A lista de tipos inclui todos os tipos disponíveis no arquivo de origem atual. Os nomes de tipo incluem as informações de espaço para nome completo. Este é um exemplo de código de C# com dois tipos:
namespace TestLanguagePackage
{
public class TestLanguageService
{
internal struct Token
{
int tokenID;
}
private Tokens[] tokens;
private string serviceName;
}
}
Será exibida a lista de tipos de TestLanguagePackage.TestLanguageService e TestLanguagePackage.TestLanguageService.Tokens.
A lista de membros exibe os membros disponíveis do tipo selecionado na lista de tipos. Usando o exemplo de código acima, se TestLanguagePackage.TestLanguageService é o tipo selecionado, a lista de membros conteria os membros privados tokens e serviceName. A estrutura interna Token não é exibida.
Você pode implementar a lista de membros para colocar o nome de um membro em negrito quando o cursor é colocado dentro dela. Membros também podem ser exibidos em cinza texto, indicando que não estão dentro do escopo onde o cursor é posicionado no momento.
Habilitando o suporte para a barra de navegação
Para ativar o suporte para a barra de navegação, você deve definir o ShowDropdownBarOption parâmetro da ProvideLanguageServiceAttribute para o atributo true. Este parâmetro define o ShowNavigationBar propriedade. Para oferecer suporte a barra de navegação, você deve implementar a TypeAndMemberDropdownBars de objeto na CreateDropDownHelper método na LanguageService classe.
Na sua implementação da CreateDropDownHelper método, se a ShowNavigationBar propriedade estiver definida como true, você pode retornar um TypeAndMemberDropdownBars objeto. Se você retornar o objeto, a barra de navegação não é exibida.
A opção para mostrar a barra de navegação pode ser definida pelo usuário, portanto, é possível para esse controle a ser redefinido enquanto o modo de edição está aberto. O usuário deve fechar e reabrir a janela do editor antes da alteração ocorre.
Implementando o suporte para a barra de navegação
O OnSynchronizeDropdowns método usa duas listas (um para cada lista suspensa) e dois valores, que representa a seleção atual em cada lista. As listas e os valores de seleção podem ser atualizados, caso em que o OnSynchronizeDropdowns método deve retornar true para indicar que as listas foram alterados.
Como a seleção é alterada em tipos de lista suspensa, a lista de membros deve ser atualizada para refletir o novo tipo. O que é mostrado na lista de membros pode ser:
A lista de membros para o tipo atual.
Todos os membros disponíveis na fonte de arquivo, mas com todos os membros não está no tipo de atual exibido em texto acinzentado. O usuário ainda pode selecionar os membros acinzentada, para que eles podem ser usados para navegação rápida, mas a cor indica que não são parte do tipo selecionado no momento.
Uma implementação de OnSynchronizeDropdowns método normalmente realiza as seguintes etapas:
Obtenha uma lista das declarações atuais para o arquivo de origem.
Há várias maneiras para preencher as listas. Uma abordagem é criar um método personalizado em sua versão do LanguageService classe que chama o ParseSource método com um motivo de análise personalizada que retorna uma lista de todas as declarações. Outra abordagem seria chamar o ParseSource método diretamente a partir do OnSynchronizeDropdowns método com o motivo de análise personalizado. Uma terceira abordagem pode ser em cache declarações a AuthoringScope classe retornado pela última operação de análise completa no LanguageService de classe e recuperá-lo do OnSynchronizeDropdowns método.
Preencher ou atualizar a lista de tipos.
O conteúdo da lista de tipos pode ser atualizado quando a fonte é alterada ou se você optou por alterar o estilo do texto dos tipos com base na posição atual do cursor. Observe que essa posição é passada para o OnSynchronizeDropdowns método.
Determine o tipo para selecionar na lista de tipos com base na posição atual do cursor.
Você pode pesquisar as declarações que foram obtidas na etapa 1 para localizar o tipo que envolve a posição atual do cursor e procure na lista de tipos para esse tipo determinar seu índice para a lista de tipos.
Preencher ou atualizar a lista de membros com base no tipo selecionado.
A lista de membros reflete o que é exibido no momento o membros drop-down. O conteúdo da lista de membros talvez precise ser atualizado se a origem foi alterada ou se você estiver exibindo apenas os membros do tipo selecionado e o tipo selecionado foi alterado. Se você optar por exibir todos os membros no arquivo de origem, em seguida, o estilo do texto de cada membro da lista precisa ser atualizado se o tipo selecionado no momento foi alterado.
Determine o membro para selecionar na lista de membros com base na posição atual do cursor.
Pesquisar as declarações que foram obtidas na etapa 1 para o membro que contém a posição atual do cursor e, em seguida, procure na lista de membros para esse membro determinar seu índice para a lista de membros.
Retornar true se todas as alterações foram feitas para as listas ou as seleções na lista.