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

  1. 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.

  2. 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.

  3. Implemente uma fábrica de editores configurando a IVsEditorFactory interface.

    Para obter mais informações, consulte Fábricas de editores.

  4. 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.

  5. Implemente a IOleCommandTarget interface para manipular comandos.

  6. Forneça persistência de documento e resposta a alterações de arquivos externos:

    1. Para manter o arquivo, implemente IVsPersistDocData2 e IPersistFileFormat no objeto de dados do documento do editor.

    2. 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 para IVsFileChangeEx.

  7. Coordenar eventos de edição de documentos com controle de código-fonte. Siga estas etapas:

    1. Obtenha um ponteiro para chamando IVsQueryEditQuerySave2QueryService o SVsQueryEditQuerySave.

    2. 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.

    3. 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.

  8. Habilite a janela Propriedades para exibir as propriedades do texto selecionado no editor. Siga estas etapas:

    1. Ligue OnSelectChange cada vez que a seleção de texto for alterada, passando na implementação do ISelectionContainer.

    2. Chame QueryService o STrackSelection serviço para obter um ponteiro para ITrackSelection.

  9. 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:

    1. Implemente IDropTarget em seu editor para alertar o IDE de que seu editor é um destino de descarte.

    2. Implemente a IVsToolboxUser interface na exibição para que seu editor possa habilitar e desabilitar itens na Caixa de Ferramentas.

    3. 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.

  10. 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 IVsDocOutlineProvidero .

    • Se você quiser usar uma barra de status em seu editor, implemente IVsStatusbarUser e chame QueryServiceSVsStatusbar para obter um ponteiro para IVsStatusBar.

      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 o Undo comando diretamente.

  11. 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'
    }
    
  12. 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.

  13. 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 nulo punkDocDataExisting será passado para IVsEditorFactory::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:

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    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 implementar IOleCommandTargetcomandos 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 um IDispatch 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 a IOleUndoUnit interface para cada Undo ação.

  • Há dois locais em que um editor personalizado pode expor objetos de automação:

    • Document.Object

    • Window.Object