Dentro do Editor.
O editor é composto por um número de diferentes subsistemas, projetadas para impedir o editor de texto separado de modelo a exibição de texto e a interface do usuário.
Estas seções descrevem os diferentes aspectos do editor:
Estas seções descrevem os recursos do editor:
Visão geral dos subsistemas
Subsistema de modelo de texto
O subsistema de modelo de texto é responsável pelo que representa o texto e permitindo sua manipulação. O subsistema de modelo de texto contém o ITextBuffer interface, que descreve a seqüência de caracteres que deve ser exibidas pelo editor. Este texto pode ser modificado, controlado e manipulado de outra forma de várias maneiras. O modelo de texto também fornece tipos para os seguintes aspectos:
Um serviço que associa a arquivos de texto e gerencia lendo e gravando-as no sistema de arquivos.
Um serviço diferenciado que localiza as diferenças mínimas entre duas seqüências de objetos.
Um sistema usado para descrever o texto em um buffer em termos de subconjuntos do texto em outros buffers.
O subsistema de modelo de texto está livre dos conceitos de interface (UI) do usuário. Por exemplo, não é responsável pela formatação de texto ou o layout de texto, e ele não tem conhecimento de visual ornamentos que podem ser associados com o texto.
Os tipos públicos do subsistema de modelo de texto estão contidos em Microsoft.VisualStudio.Text.Data.dll e Microsoft.VisualStudio.CoreUtilitiy.dll, que dependem somente na.Biblioteca de classes base e o Managed Extensibility Framework (MEF).
Subsistema de modo de exibição de texto
O subsistema de modo de exibição de texto é responsável pela formatação e exibição de texto. Os tipos neste subsistema são divididos em duas camadas, dependendo se os tipos de confiam na de Windows Presentation Foundation (WPF). Os tipos mais importantes são ITextView e IWpfTextView, que controlam o conjunto de linhas de texto devem ser exibidos, e também o cursor, a seleção e os recursos para adorning o texto usando os elementos de interface do usuário do WPF. Este subsistema também fornece a área de exibição de margens ao redor do texto. Essas margens podem ser estendidas e podem conter diferentes tipos de efeitos de conteúdo e visual. Exemplos de margens são linha números exibe e barras de rolagem.
Os tipos públicos do subsistema de modo de exibição de texto estão contidos em Microsoft.VisualStudio.Text.UI.dll e Microsoft.VisualStudio.Text.UI.Wpf.dll. O primeiro conjunto contém os elementos independentes de plataforma e a segunda contém os elementos do WPF específicos.
Subsistema de classificação
O subsistema de classificação é responsável por determinar as propriedades de fonte para texto. Um classificador quebra o texto em diferentes classes, por exemplo, "palavra-chave" ou "comentário". O mapa de formatação de classificação está relacionada a essas classes para propriedades de fonte real, por exemplo, "azul Consolas 10 pt". Essas informações são usadas pelo modo de exibição de texto quando formata e processa o texto. Marcação, que é descrito em mais detalhes posteriormente neste tópico, permite que os dados a serem associadas a extensões de texto.
Os tipos públicos do subsistema de classificação estão contidos no Microsoft.VisualStudio.Text.Logic.dll, e eles interagem com os aspectos visuais da classificação, que estão contidos em Microsoft.VisualStudio.Text.UI.Wpf.dll.
Subsistema de operações
O subsistema de operações define o comportamento do editor. Ele fornece a implementação de comandos do editor de Visual Studio e o sistema de desfazer.
Uma análise detalhada do modelo de texto e o modo de exibição de texto
O modelo de texto
O subsistema de modelo de texto consiste em diferentes grupos de tipos de texto. Eles incluem o buffer de texto, snapshots de texto e distribuições de texto.
Buffers de texto e Snapshots de texto
O ITextBuffer interface representa uma seqüência de caracteres Unicode que são codificados usando UTF-16, que é a codificação usada pelo String digite o.NET Framework. Um buffer de texto pode ser mantido como um documento do sistema de arquivo, mas isso não é necessário.
O ITextBufferFactoryService é usado para criar um buffer de texto vazia ou um buffer de texto que é inicializado a partir de uma seqüência de caracteres ou TextReader. O buffer de texto pode ser transmitido para o sistema de arquivos como um ITextDocument.
O buffer de texto pode ser editado por qualquer segmento até que um segmento se apropria do buffer de texto, chamando TakeThreadOwnership. Depois disso, somente esse thread pode executar edições.
Um buffer de texto pode passar por muitas versões durante sua existência. Uma nova versão é gerada sempre que o buffer é editado e uma imutável ITextSnapshot representa o conteúdo do que a versão do buffer. Como os snapshots de texto são imutáveis, você pode acessar um instantâneo de texto em qualquer segmento, sem restrições, mesmo se o buffer de texto que ele representa continue a mudar.
Instantâneos de texto e linhas de texto instantâneo
Você pode exibir o conteúdo de um instantâneo de texto como uma seqüência de caracteres ou como uma seqüência de linhas. Caracteres e as linhas são que ambos indexados, começando em zero. Um instantâneo de texto vazio contém zero caracteres e uma linha vazia. Uma linha é delimitada por qualquer seqüência de caracteres de quebra de linha Unicode válida, ou pelo início ou final do buffer. Caracteres de quebra de linha explicitamente são representados no instantâneo texto e as quebras de linha em um instantâneo de texto não tiverem todos o mesmo.
Dica
Para obter mais informações sobre caracteres de quebra de linha no editor de Visual Studio, consulte Codificações e quebras de linha.
Uma linha de texto é representada por um ITextSnapshotLine o objeto, que pode ser obtido a partir de um instantâneo de texto para um número de linha específico ou para uma posição de caractere específico.
SnapshotPoints, SnapshotSpans e NormalizedSnapshotSpanCollections
A SnapshotPoint representa uma posição de caractere em um instantâneo. A posição é garantida estar entre zero e o comprimento do instantâneo. A SnapshotSpan representa um trecho de texto em um instantâneo. Sua posição final é garantida estar entre zero e o comprimento do instantâneo. O NormalizedSnapshotSpanCollection consiste em um conjunto de SnapshotSpan objetos do mesmo instantâneo.
Spans e NormalizedSpanCollections
A Span representa um intervalo que pode ser aplicado a um trecho de texto em um instantâneo de texto. Posições de instantâneo são baseada em zero, para que inicie em qualquer posição incluindo zero spans. O End propriedade de span é igual à soma dos seus Start propriedade e seu Length propriedade. A Span não inclui o caractere que é indexado pelo End propriedade. Por exemplo, um intervalo que tem início = 5 e comprimento = 3 tem final = 8, e inclui os caracteres em posições 5, 6 e 7. A notação para esse intervalo é 5..8).
Duas extensões se cruzam se eles tiverem qualquer posições em comum, incluindo a posição final. Portanto, a interseção de [3, 5) e [2, 7) é [3, 5) e a interseção de [3, 5) e [5, 7) é [5, 5). (Observe que [5, 5) é um span vazio.)
Duas extensões se sobrepõem se eles têm posições em comum, exceto para a posição final. Um span vazio nunca se sobrepõe a qualquer outra extensão, e a sobreposição de duas extensões nunca está vazia.
A NormalizedSpanCollection é uma lista de extensões na ordem das propriedades de início das extensões. Na lista, spans sobrepostas ou adjacentes são mescladas. Por exemplo, considerando o conjunto de extensões [5..9), [0..1), [3..6), e [9..10), a lista normalizada de spans é [0..1), [3..10).
ITextEdit, TextVersion e notificações de alteração do texto
O conteúdo de um buffer de texto pode ser alterado usando um ITextEdit objeto. A criação de tal objeto (usando um do CreateEdit() métodos de ITextBuffer) inicia uma transação de texto que consiste em edições de texto. Cada edição é uma substituição de alguns trecho de texto no buffer por uma seqüência de caracteres. As coordenadas e o conteúdo de cada edição são expressos em relação ao snapshot do buffer quando a transação foi iniciada. O ITextEdit objeto ajusta as coordenadas de edições que são afetadas por outras edições na mesma transação.
Por exemplo, considere um buffer de texto que contém essa seqüência de caracteres:
abcdefghij
Aplicar uma transação que contém duas edições, uma edição que substitui o span em [2..4) usando o caractere X e uma segunda edição que substitui o span em [6..9) usando o caractere Y. O resultado é que esse buffer:
abXefYj
As coordenadas para a segunda edição foram computadas em relação ao conteúdo do buffer no início da transação, antes que a primeira edição foi aplicada.
As alterações para o buffer terão efeito quando o ITextEdit compromete objeto chamando seus Apply() método. Se houver pelo menos uma edição de não-vazia, uma nova ITextVersion é criado, uma nova ITextSnapshot é criado e um Changed evento é gerado. Cada versão de texto tem um outro instantâneo de texto. Um instantâneo de texto representa o estado completo do buffer de texto após uma transação de edição, mas uma versão em texto descreve somente as alterações de um instantâneo para o próximo. Em geral, snapshots de texto são deve ser usado uma vez e, em seguida, descartados, enquanto as versões de texto devem permanecer ativas por algum tempo.
Uma versão de texto contém um INormalizedTextChangeCollection. Essa coleção descreve as alterações que, quando aplicado ao snapshot, produzirá o instantâneo subseqüente. Cada ITextChange na coleção contém a posição de caractere da string de substituição, a seqüência de caracteres de substituição e a alteração. A seqüência de caracteres de substituição é vazia para uma inserção básica e a seqüência de substituição está vazia para uma exclusão básica. A coleção normalizada é sempre null para a versão mais recente do buffer de texto.
Apenas um ITextEdit objeto pode ser instanciado para um buffer de texto a qualquer momento e todas as edições de texto devem ser executadas no thread que possui o buffer de texto (se a propriedade tenha sido solicitada). Uma edição de texto pode ser abandonada chamando seu Cancel método ou de sua Dispose método.
ITextBuffertambém fornece Insert(), Delete(), e Replace() métodos que são semelhantes àquelas encontradas na ITextEdit interface. Chamar esses tem o mesmo efeito como a criação de um ITextEdit objeto, fazendo a chamada semelhante e, em seguida, aplicando a edição.
Pontos de controle e rastreamento Spans
Um ITrackingPoint representa uma posição de caractere em um buffer de texto. Se o buffer é editado de maneira que faz com que a posição do caractere para deslocar, o ponto de controle é deslocado com ele. Por exemplo, se um ponto de controle se refere à posição 10 em um buffer e cinco caracteres é inserido no início do buffer, o ponto de controle, em seguida, referente à posição 15. Se uma inserção acontecer precisamente a posição indicada pelo ponto de controle, seu comportamento é determinado pelo seu PointTrackingMode, que pode ser uma Positive ou Negative. Se o modo de controle for positivo, o ponto de controle refere-se para o mesmo caractere, que agora está no final da inserção; Se o modo de controle for negativo, o ponto de controle se refere ao primeiro caractere inserido na posição original. Se o caractere na posição que é representado por um ponto de controle é excluído, o ponto de controle é deslocado para o primeiro caractere que segue o intervalo excluído. Por exemplo, se um ponto de controle se refere ao caractere na posição 5 e os caracteres nas posições de 3 a 6 são excluídos, o ponto de controle se refere ao caractere na posição 3.
Um ITrackingSpan representa um intervalo de caracteres em vez de apenas uma posição. Seu comportamento é determinado pelo seu SpanTrackingMode. Se o modo de rastreamento de span for EdgeInclusive, a extensão de rastreamento que cresce para incorporar o texto inserido em suas bordas; Se o modo de rastreamento de span for EdgeExclusive, a extensão de rastreamento não incorporar o texto inserido em suas bordas. No entanto, se o modo de rastreamento de span for EdgePositive, uma inserção empurra a posição atual em direção ao início e se o modo de controle de span EdgeNegative, uma inserção empurra a posição atual para o fim.
Você pode obter a posição de um ponto de controle ou a extensão de uma extensão de rastreamento para qualquer snapshot do buffer de texto às quais eles pertencem. Pontos de controle e rastreamento spans podem ser consultados com segurança de qualquer segmento.
Tipos de conteúdo
Tipos de conteúdo são um mecanismo para definir os diferentes tipos de conteúdo. Um tipo de conteúdo pode ser um tipo de arquivo, como "text", "código" ou "binário", ou um tipo de tecnologia como, por exemplo, "xml", "vb" ou "c#". Por exemplo, a palavra "using" é uma palavra-chave em C# e Visual Basic, mas não em outras linguagens de programação. Portanto, a definição dessa palavra-chave seria limitada aos tipos de conteúdo "c#" e "vb".
Tipos de conteúdo são usados como um filtro de ornamentos e outros elementos do editor. Muitos recursos do editor e pontos de extensão são definidos por tipo de conteúdo. Por exemplo, a coloração de texto é diferente para os arquivos de texto sem formatação, arquivos XML e arquivos de código-fonte de Visual Basic. Buffers de texto geralmente são atribuídos a um tipo de conteúdo quando eles são criados e o tipo de conteúdo de um buffer de texto pode ser alterado.
Tipos de conteúdo podem herdar múltiplo de outros tipos de conteúdo. O ContentTypeDefinition lhe permite especificar vários tipos de base como pai de um determinado tipo de conteúdo.
Os desenvolvedores podem definir seus próprios tipos de conteúdo e registrá-los usando o IContentTypeRegistryService. Muitos recursos do editor podem ser definidos em relação a um tipo específico de conteúdo usando o ContentTypeAttribute. Por exemplo, margens de editor, ornamentos e manipuladores de mouse podem ser definidos para que se apliquem somente aos editores que exibem a tipos específicos de conteúdo.
O modo de exibição de texto
A parte de modo de exibição do modelo view controller (MVC) padrão define o modo de exibição de texto, a formatação do modo de exibição, elementos gráficos, como a barra de rolagem e o cursor. Todos os elementos de apresentação do editor de Visual Studio baseiam-se no WPF.
Modos de exibição de texto
O ITextView interface é uma representação de independente de plataforma de um modo de exibição de texto. Ele é usado principalmente para exibir documentos de texto em uma janela, mas ele também pode ser usado para outras finalidades, por exemplo, em uma dica de ferramenta.
O modo de exibição de texto faz referência a tipos diferentes de buffers de texto. O TextViewModel propriedade se refere a uma ITextViewModel objeto que aponta para esses três buffers de texto diferente: o buffer de dados, o buffer de dados de nível superior, buffer de edição, em que a edição ocorre e o buffer visual, o que é o buffer que é exibido no modo de exibição de texto.
O texto é formatado com base nos classificadores que estão anexados ao buffer de texto subjacente e é adornado usando os provedores de adorno que estão anexados ao modo de exibição de texto propriamente dito.
O sistema de coordenadas de modo de exibição de texto
O sistema de coordenadas de modo de exibição de texto Especifica posições no modo de exibição de texto. No sistema de coordenadas, o x valor de 0.0 corresponde à borda esquerda do texto que está sendo exibido e o y valor de 0.0 corresponde à borda superior do texto que está sendo exibido.O x coordenar aumenta da esquerda para a direita e o y coordenar aumentos de cima para baixo.
Uma porta de visualização (a parte do texto visível na janela de texto) não pode ser rolada da mesma maneira horizontalmente conforme ele é rolado verticalmente. Uma porta de visualização é rolada na horizontal, alterando suas coordenadas esquerda para se mover em relação à superfície de desenho. No entanto, uma porta de visualização pode ser rolada verticalmente apenas alterando o texto processado, o que faz com que uma LayoutChanged evento a ser gerado.
Distâncias no sistema de coordenadas correspondem aos pixels lógicos. Se a superfície de processamento de texto é exibida sem uma transformação de dimensionamento, uma unidade no sistema de coordenadas de processamento de texto corresponde a um pixel na tela.
Margins
O ITextViewMargin interface representa uma margem e permite o controle da visibilidade da margem e seu tamanho. Existem quatro margens predefinidas, que são chamadas de "Top", "Left", "Right" e "Bottom" e estão conectadas na parte superior, inferior, esquerda ou borda direita de um modo de exibição. Essas margens são recipientes no qual outras margens podem ser colocadas. A interface define métodos que retornam o tamanho da margem e a visibilidade de uma margem. As margens são elementos visuais que fornecem informações adicionais sobre o modo de exibição de texto ao qual eles estão conectados. Por exemplo, a margem do número da linha exibe os números de linha para o modo de exibição de texto. Margem do glifo exibe os elementos de interface do usuário.
O IWpfTextViewMarginProvider interface trata a criação e o posicionamento das margens. Margens podem ser solicitadas em relação aos outras margens. Margens de prioridade mais alta são localizadas perto o modo de exibição de texto. Por exemplo, se existem duas margens esquerdas, margem a e b de margem e margem b tem uma prioridade mais baixa que a da margem, margem b aparece à esquerda da margem a.
O Host de modo de exibição de texto
O IWpfTextViewHost interface contém o modo de exibição de texto e qualquer decorações adjacentes que acompanham o modo de exibição, por exemplo, as barras de rolagem. O host de modo de exibição de texto também contém margens anexadas a uma borda do modo de exibição.
Texto formatado
O texto que é exibido em uma exibição de texto é composto de ITextViewLine objetos. Cada linha de exibição de texto corresponde a uma linha de texto no modo de exibição de texto. Linhas longas no buffer de texto subjacente podem ser parcialmente obscurecidas (que não está habilitada a quebra automática) ou divididas em várias linhas de modo de exibição de texto. O ITextViewLine interface contém métodos e propriedades para o mapeamento entre os caracteres e as coordenadas e os ornamentos que podem ser associados à linha.
ITextViewLineos objetos são criados usando um IFormattedLineSource interface. Se você estiver preocupado apenas com o texto que está sendo exibido no modo de exibição, você pode ignorar a origem da formatação. Se você estiver interessado no formato de texto que não é exibido no modo de exibição (por exemplo, para oferecer suporte a um corte de rich text e colar), você pode usar IFormattedLineSource para formatar o texto em um buffer de texto.
O modo de exibição de texto formata um ITextSnapshotLine ao mesmo tempo.
Recursos do Editor
Os recursos do editor são projetados para que a definição do recurso é separada da sua implementação. O editor inclui os seguintes recursos:
Marcas e classificadores
Ornamentos
Projeção
Estrutura de tópicos
Ligações de mouse e tecla
Operações e primitivos
IntelliSense
Marcas e classificadores
As marcas são marcadores que estão associados um trecho de texto. Eles podem ser apresentados de diversas maneiras, por exemplo, usando a cor do texto, sublinhados, gráficos ou pop-ups. Classificadores são um tipo de marca.
Outros tipos de marcas são TextMarkerTag para realce de texto, OutliningRegionTag para a estrutura de tópicos, e ErrorTag para erros de compilação.
Tipos de classificação
Um IClassificationType interface representa uma classe de equivalência, que é uma categoria abstrata de texto. Tipos de classificação podem herdar múltiplo de outros tipos de classificação. Por exemplo, as classificações de linguagem de programação pode incluir "palavra-chave", "comentário" e "identificador", que herda de "código". Tipos de classificação de linguagem natural podem incluir "substantivo", "verbo" e "adjetivo", que herda de "idioma natural".
Classificações
Uma classificação é uma instância de um tipo específico de classificação, normalmente em um intervalo de texto. A ClassificationSpan é usado para representar uma classificação. Um intervalo de classificação pode ser pensado como um rótulo que abrange um determinado trecho de texto e informa ao sistema que este trecho de texto é de um tipo específico de classificação.
Classificadores
Um IClassifier é um mecanismo que divide o texto em um conjunto de classificações. Classificadores devem ser definidos para tipos específicos de conteúdo e instanciados para buffers de texto específico. Os clientes devem implementar IClassifier para participar de classificação de texto.
Agregadores de classificador
Um agregador de classificador é um mecanismo que combina todos os classificadores de buffer de um texto em apenas um conjunto de classificações. Por exemplo, um classificador C# e um classificador de idioma inglês foi possível criar classificações sobre um comentário em um arquivo C#. Considere este comentário:
// This method produces a classifier
Um classificador C# pode rotular o intervalo inteiro como um comentário e o classificador de idioma inglês pode classificar "produz" como "verbo" e "método" como um "substantivo". O agregador produz um conjunto de classificações não sobrepostas e o tipo do conjunto se baseia em todas as contribuições.
Um agregador de classificador é também um classificador, porque quebra o texto em um conjunto de classificações. O agregador de classificador também garante que não há nenhuma classificação sobrepostas e que as classificações são classificadas. Classificadores individuais são livres para retornar qualquer conjunto de classificações, em qualquer ordem e sobreposição de forma alguma.
Formatação de classificação e a cor do texto
Formatação de texto é um exemplo de um recurso que se baseia em classificação de texto. Ele é usado pela camada de modo de exibição de texto para determinar a exibição de texto em um aplicativo. Depende da área de formatação de texto no WPF, mas a definição de lógica de classificações não é.
Um formato de classificação é um conjunto de propriedades de formatação de um tipo específico de classificação. Esses formatos herdam o formato do pai do tipo de classificação.
Um IClassificationFormatMap é um mapa de um tipo de classificação a um conjunto de propriedades de formatação de texto. A implementação do mapa no editor de formato lida com todas as exportações dos formatos de classificação.
Ornamentos
Ornamentos são efeitos gráficos que não estão diretamente relacionados a fonte e a cor dos caracteres no modo de exibição de texto. Por exemplo, o sublinhado de rabisco vermelho que é usado para marcar o código não compilar em muitas linguagens de programação é um adorno incorporado e dicas de ferramentas são ornamentos pop-up. Ornamentos são derivados do UIElement e implementar ITag. São dois tipos especializados de marca de adorno o SpaceNegotiatingAdornmentTag, para que ocupam o mesmo espaço que o texto em uma exibição, ornamentos e o ErrorTag, para o sublinhado linha ondulada.
Ornamentos incorporados são gráficos que fazem parte do modo de exibição de texto formatado. Eles são organizados em camadas diferentes da ordem Z. Existem três camadas internas, da seguinte forma: texto, o cursor e a seleção. No entanto, os desenvolvedores podem definir mais camadas e colocá-los na ordem em relação ao outro. Os três tipos de ornamentos incorporados são ornamentos relativo ao texto (que mover quando o texto se move e são excluídos quando o texto é excluído), ornamentos relativo ao modo de exibição (que têm a ver com partes não-texto da exibição) e ornamentos controlados pelo proprietário (o desenvolvedor deve gerenciar a sua colocação).
Pop-up ornamentos são gráficos que aparecem em uma pequena janela acima da exibição de texto, por exemplo, as dicas de ferramentas.
Projeção
Projeção é uma técnica para a construção de um tipo diferente de buffer de texto que realmente não armazenar o texto, mas em vez disso, combina o texto dos outros buffers de texto. Por exemplo, um buffer de projeção pode ser usado para concatenar o texto dos dois outros buffers e apresentar o resultado como se estivesse em apenas um buffer ou ocultar partes do texto em um buffer. Um buffer de projeção pode atuar como um buffer de origem para outro buffer de projeção. Um conjunto de buffers são relacionadas pela projeção pode ser construído para reorganizar o texto de várias formas diferentes. (Desses conjuntos é também conhecido como um gráfico buffer.) O recurso de estrutura de tópicos do texto de Visual Studio é implementado usando-se em um buffer de projeção para ocultar o texto recolhido e o editor de Visual Studio para ASP.NET páginas usa a projeção para oferecer suporte a linguagens incorporadas como, por exemplo, Visual Basic e C#.
Um IProjectionBuffer é criado usando IProjectionBufferFactoryService. Um buffer de projeção é representado por uma seqüência ordenada de ITrackingSpan objetos que são conhecidos como fonte se estende por. O conteúdo dessas extensões é apresentado como uma seqüência de caracteres. Os buffers de texto a partir do qual as extensões de origem são desenhadas são nomeados buffers de origem. Clientes de um buffer de projeção não é necessário estar ciente de que ele é diferente de um buffer de texto comum.
O buffer de projeção ouve os eventos de alteração de texto nos buffers de origem. Quando o texto em uma fonte de span alterações, o buffer de projeção mapeia as coordenadas do texto alterado para suas próprias coordenadas e gera eventos de alteração de texto apropriado. Por exemplo, considere os buffers de origem a e b que têm esse conteúdo:
A: ABCDE
B: vwxyz
Se o buffer de projeção p é formada por duas extensões de texto, uma que tenha todos os de buffer e o outro que tenha todas as buffer B, P tem o seguinte conteúdo:
P: ABCDEvwxyz
Se a subseqüência de caracteres xy é excluído do buffer B, e em seguida, o buffer p gerará um evento que indica que os caracteres em posições 7 e 8 foram excluídos.
O buffer de projeção também pode ser editado diretamente. Ele propaga edições aos buffers de fonte apropriada. Por exemplo, se uma seqüência de caracteres é inserida em buffer p na posição 6 (a posição original do caractere "v"), a inserção é propagada para o buffer b na posição 1.
Há restrições sobre as extensões de origem que contribuem para um buffer de projeção. Não podem se sobrepor a distribuições de origem; um local em um buffer de projeção não é possível mapear mais de um local em que o buffer de qualquer origem e um local em um buffer de origem não é possível mapear mais de um local em um buffer de projeção. Nenhum circularities são permitidos na relação de buffer de origem.
Eventos são gerados quando o conjunto da fonte de buffers para um alterações de buffer de projeção e quando o conjunto de origem abrange as alterações.
Um buffer de elision é um tipo especial de buffer de projeção. Ele é usado principalmente para a estrutura de tópicos e para operações que expandir e recolher blocos de texto. Um buffer elision se baseia em apenas um buffer de origem e as extensões no buffer de elision devem ser solicitadas a mesma conforme elas são ordenadas no buffer de origem.
O gráfico de Buffer
O IBufferGraph interface permite o mapeamento entre um gráfico de buffers de projeção. Todos os buffers de texto e buffers de projeção são coletados em um gráfico direcionado Acíclico, bem como a árvore de sintaxe abstrata produzido por um compilador de linguagem. O gráfico é definido pelo buffer superior, que pode ser qualquer buffer de texto. O gráfico de buffer pode mapear a partir de um ponto no buffer superior a um ponto em um buffer de origem ou de uma extensão no buffer superior a um conjunto de extensões em um buffer de origem. Da mesma forma, ele pode mapear um ponto ou variam de um buffer de origem para um ponto no buffer superior. Gráficos de buffer são criados usando o IBufferGraphFactoryService.
Eventos e Buffers de projeção
Quando um buffer de projeção é modificado, as modificações são enviadas do buffer de projeção para os buffers que dependem dele. Depois que todos os buffers são modificados, são gerados eventos de alteração de buffer, começando com o buffer mais profundo.
Estrutura de tópicos
Estrutura de tópicos é a capacidade para expandir ou recolher diferentes blocos de texto em um modo de exibição de texto. Estrutura de tópicos é definida como uma espécie de ITag, da mesma forma que a ornamentos são definidos. A OutliningRegionTag é uma marca que define uma região de texto que pode ser expandida ou recolhida. Para usar a estrutura de tópicos, você deve importar o IOutliningManagerService para obter um IOutliningManager. O Gerenciador de estrutura de tópicos enumera, recolhe e expande diferentes blocos, que são representados como ICollapsible objetos e gera eventos de maneira adequada.
Ligações de mouse
Ligações de mouse vincular os movimentos do mouse para comandos diferentes. Ligações de mouse são definidas usando um IMouseProcessorProvider, e ligações de tecla são definidas usando um IKeyProcessorProvider. O IWpfTextViewHost automaticamente instancia a todas as ligações e conecta-se a eventos do mouse no modo de exibição.
O IMouseProcessor interface contém manipuladores de eventos de pre-process e a eventos de mouse diferente. A alça de um dos eventos, você pode substituir alguns dos métodos em MouseProcessorBase.
Operações do Editor
Operações do editor podem ser usadas para automatizar a interação com o editor, para execução de scripts ou outros fins. Você pode importar o IEditorOperationsFactoryService para operações de acesso em um determinado ITextView. Você pode usar esses objetos para modificar a seleção, rolar a exibição ou mover o cursor para partes diferentes da exibição.
IntelliSense
IntelliSense oferece suporte a conclusão da instrução, a Ajuda de assinatura (também conhecido como informações de parâmetro), informações rápidas e marcas inteligentes.
Conclusão da instrução fornece listas de pop-up de conclusões possíveis para nomes de método, elementos XML e outros elementos de codificação ou marcação. Em geral, um gesto do usuário invoca uma sessão de conclusão. A sessão exibe a lista de possíveis conclusões e o usuário pode selecionar uma ou descartar a lista. O ICompletionBroker é responsável pela criação e o acionamento do ICompletionSession. O ICompletionSource computa a CompletionSet de itens de conclusão para a sessão.