Demonstra Passo a passo: Adicionar recursos a um editor personalizado
Depois de criar um editor personalizado, você pode adicionar mais recursos a ele.
Para criar um editor para um VSPackage
Crie um editor personalizado usando o modelo de projeto de pacote do Visual Studio.
Para obter mais informações, consulte Demonstra Passo a passo: Criar um editor personalizado.
Decida se você deseja que seu editor ofereça suporte a um único modo de exibição ou a vários modos de exibição.
Um editor que ofereça suporte ao comando Nova Janela ou tenha modo de formulário e modo de código, requer objetos de dados de documento separados e objetos de exibição de documento. Em um editor que oferece suporte a apenas um único modo de exibição, o objeto de dados do documento e o objeto de exibição do documento podem ser implementados no mesmo objeto.
Para obter um exemplo de vários modos de exibição, consulte Suporte a vários modos de exibição de documento.
Implemente uma fábrica de editores configurando a IVsEditorFactory interface.
Para obter mais informações, consulte Fábricas de editores.
Decida se você deseja que seu editor use a ativação in-loco ou a incorporação simplificada para gerenciar a janela do objeto de exibição de documento.
Uma janela simplificada do editor de incorporação hospeda uma exibição de documento padrão, enquanto uma janela do editor de ativação in-loco hospeda um controle ActiveX ou outro objeto ativo como sua exibição de documento. Para obter mais informações, consulte Incorporação simplificada e ativação in-loco.
Implemente a IOleCommandTarget interface para manipular comandos.
Forneça persistência de documento e resposta a alterações de arquivos externos:
Para manter o arquivo, implemente IVsPersistDocData2 e IPersistFileFormat no objeto de dados do documento do editor.
Para responder a alterações de arquivo externo, implemente IVsFileChangeEx e IVsDocDataFileChangeControl no objeto de dados do documento do editor.
Observação
SVsFileChangeEx Ligue
QueryService
para obter um ponteiro paraIVsFileChangeEx
.
Coordenar eventos de edição de documentos com controle de código-fonte. Siga estas etapas:
Obtenha um ponteiro para chamando
IVsQueryEditQuerySave2
QueryService
o SVsQueryEditQuerySave.Quando o primeiro evento de edição ocorrer, chame o QueryEditFiles método.
Esse método solicita que o usuário faça check-out do arquivo se ainda não tiver feito check-out. Certifique-se de manipular uma condição de "arquivo sem check-out" para evitar erros.
Da mesma forma, antes de salvar o arquivo, chame o QuerySaveFile método.
Esse método solicita que o usuário salve o arquivo se ele não tiver sido salvo ou se tiver sido alterado desde o último salvamento.
Habilite a janela Propriedades para exibir as propriedades do texto selecionado no editor. Siga estas etapas:
Ligue OnSelectChange cada vez que a seleção de texto for alterada, passando na implementação do ISelectionContainer.
Chame
QueryService
o STrackSelection serviço para obter um ponteiro para ITrackSelection.
Permitir que os usuários arrastem e soltem itens entre o editor e a Caixa de Ferramentas ou entre editores externos (como o Microsoft Word) e a Caixa de Ferramentas. Siga estas etapas:
Implemente
IDropTarget
em seu editor para alertar o IDE de que seu editor é um destino de descarte.Implemente a IVsToolboxUser interface na exibição para que seu editor possa habilitar e desabilitar itens na Caixa de Ferramentas.
Implemente ResetDefaults e chame
QueryService
o SVsToolbox serviço para obter um ponteiro para as IVsToolbox2 interfaces e IVsToolbox3 .Essas etapas permitem que o VSPackage adicione novos itens à Caixa de Ferramentas.
Decida se você deseja outros recursos opcionais para seu editor.
Se você quiser que seu editor ofereça suporte a comandos de localização e substituição, implemente IVsFindTargeto .
Se você quiser usar uma janela de ferramenta de estrutura de tópicos de documento em seu editor, implemente
IVsDocOutlineProvider
o .Se você quiser usar uma barra de status em seu editor, implemente IVsStatusbarUser e chame
QueryService
SVsStatusbar para obter um ponteiro paraIVsStatusBar
.Por exemplo, um editor pode exibir informações de linha / coluna, modo de seleção (fluxo / caixa) e modo de inserção (inserir / overstrike).
Se você quiser que seu
Undo
editor ofereça suporte ao comando, o método recomendado é usar o modelo de gerenciador de desfazer OLE. Como alternativa, você pode fazer com que o editor manipule oUndo
comando diretamente.
Crie informações do Registro, incluindo os GUIDs para o VSPackage, os menus, o editor e outros recursos.
A seguir está um exemplo genérico de código que você colocaria em seu script de arquivo .rgs para demonstrar como registrar corretamente um editor.
NoRemove Editors { ForceRemove {...guidEditor...} = s 'RTF Editor' { val Package = s '{...guidVsPackage...}' ForceRemove Extensions { val rtf = d 50 } } } NoRemove Menus { val {...guidVsPackage...} = s ',203,11' }
Implemente o suporte de Ajuda sensível ao contexto.
Esta etapa permite que você forneça suporte à Ajuda F1 e à janela Ajuda Dinâmica para itens em seu editor. Para obter mais informações, consulte Como: Fornecer contexto para editores.
Exponha um modelo de objeto de automação do seu editor implementando a
IDispatch
interface.Para obter mais informações, consulte Visão geral do modelo de automação.
Programação robusta
A instância do editor é criada quando o IDE chama o CreateEditorInstance método. Se o editor oferecer suporte a vários modos de exibição,
CreateEditorInstance
criará os dados do documento e os objetos de exibição do documento. Se o objeto de dados do documento já estiver aberto, um valor não nulopunkDocDataExisting
será passado paraIVsEditorFactory::CreateEditorInstance
. A implementação de fábrica do editor deve determinar se um objeto de dados de documento existente é compatível consultando as interfaces apropriadas nele. Para obter mais informações, consulte Suporte a várias exibições de documento.Se você usar a abordagem de incorporação simplificada, implemente a IVsWindowPane interface.
Se você decidir usar a ativação in-loco, implemente as seguintes interfaces:
Observação
A
IOleInPlaceComponent
interface é usada para evitar a mesclagem de menus OLE 2.Sua
IOleCommandTarget
implementação manipula comandos como Recortar, Copiar e Colar. Ao implementar o , decida se o editor requer seu próprio arquivo .vsct para definir sua própria estrutura de menu de comando ou se pode implementarIOleCommandTarget
comandos padrão definidos pelo Visual Studio. Normalmente, os editores usam e estendem os menus do IDE e definem suas próprias barras de ferramentas. No entanto, muitas vezes é necessário que um editor defina seus próprios comandos específicos, além de usar o conjunto de comandos padrão do IDE. Seu editor deve declarar os comandos padrão que usa e, em seguida, definir quaisquer novos comandos, menus de contexto, menus de nível superior e barras de ferramentas em um arquivo .vsct . Se você criar um editor de ativação in-loco, implemente IOleInPlaceComponent e defina os menus e barras de ferramentas para o editor em um arquivo .vsct em vez de usar a mesclagem de menus OLE 2.Para evitar a aglomeração de comandos de menu na interface do usuário, você deve usar os comandos existentes no IDE antes de inventar novos comandos. Os comandos compartilhados são definidos em SharedCmdDef.vsct e ShellCmdDef.vsct. Esses arquivos são instalados por padrão no subdiretório VisualStudioIntegration\Common\Inc da instalação do SDK do Visual Studio.
ISelectionContainer
pode expressar seleções únicas e múltiplas. Cada objeto selecionado é implementado como umIDispatch
objeto.O IDE é
IOleUndoManager
implementado como um serviço acessível a partir de um ou como um CreateInstance objeto que pode ser instanciado por meio CreateInstancedo . Seu editor implementa aIOleUndoUnit
interface para cadaUndo
ação.Há dois locais em que um editor personalizado pode expor objetos de automação:
Document.Object
Window.Object