チュートリアル: カスタム エディターに機能を追加する

カスタム エディターを作成した後に、機能を追加することができます。

VSPackage のエディターを作成するには

  1. Visual Studio パッケージ プロジェクト テンプレートを使用してカスタム エディターを作成します。

    詳細については、「チュートリアル: カスタム エディターを作成する」を参照してください。

  2. エディターで 1 つのビューと複数のビューのどちらをサポートするかを決定します。

    [新しいウィンドウ] コマンドをサポートするエディター、またはフォーム ビューとコード ビューがあるエディターには、ドキュメント データ オブジェクトとドキュメント ビュー オブジェクトを別々に用意する必要があります。 1 つのビューのみをサポートするエディターの場合、ドキュメント データ オブジェクトとドキュメント ビュー オブジェクトを同じオブジェクトに実装できます。

    複数のビューの例については、「複数のドキュメント ビューのサポート」を参照してください。

  3. IVsEditorFactory インターフェイスを設定して、エディター ファクトリを実装します。

    詳細については、「エディター ファクトリ」を参照してください。

  4. エディターで、ドキュメント ビュー オブジェクト ウィンドウを管理するためにインプレース アクティブ化と簡易埋め込みのどちらを使用するかを決定します。

    簡易埋め込みエディター ウィンドウは標準のドキュメント ビューをホストし、インプレース アクティブ化エディター ウィンドウは ActiveX コントロールまたはその他のアクティブ オブジェクトをドキュメント ビューとしてホストします。 詳細については、「簡易埋め込み」と「インプレース アクティブ化」を参照してください。

  5. コマンドを処理する IOleCommandTarget インターフェイスを実装します。

  6. ドキュメントの保持機能と外部ファイルの変更への応答機能を用意します。

    1. ファイルを保持するには、エディターのドキュメント データ オブジェクトに IVsPersistDocData2IPersistFileFormat を実装します。

    2. 外部ファイルの変更に応答するには、エディターのドキュメント データ オブジェクトに IVsFileChangeExIVsDocDataFileChangeControl を実装します。

      Note

      SVsFileChangeEx に対して QueryService を呼び出し、IVsFileChangeEx へのポインターを取得します。

  7. ソース コード管理を使用してドキュメント編集イベントを調整します。 次のステップを実行します。

    1. SVsQueryEditQuerySave に対して QueryService を呼び出し、IVsQueryEditQuerySave2 へのポインターを取得します。

    2. 最初の編集イベントが発生したら、QueryEditFiles メソッドを呼び出します。

      このメソッドは、ファイルがまだチェックアウトされていない場合にファイルをチェックアウトするようにユーザーに促すものです。エラーを回避するために、必ず "ファイルがチェックアウトされていない" 条件を処理してください。

    3. 同様に、ファイルを保存する前に、QuerySaveFile メソッドを呼び出します。

      このメソッドは、ファイルが保存されていない場合、または最後の保存以降に変更された場合に、ファイルを保存するようにユーザーに促すものです。

  8. エディターで選択したテキストのプロパティを表示するには、[プロパティ] ウィンドウを有効にします。 次のステップを実行します。

    1. テキストの選択が変更されるたびに OnSelectChange を呼び出し、ISelectionContainer の実装を渡します。

    2. STrackSelection サービスに対して QueryService を呼び出し、ITrackSelection へのポインターを取得します。

  9. ユーザーがエディターとツールボックスの間、または外部エディター (Microsoft Word など) とツールボックスの間で項目をドラッグ アンド ドロップできるようにします。 次のステップを実行します。

    1. エディターに IDropTarget を実装し、エディターがドロップ ターゲットであることを IDE に警告します。

    2. エディターでツールボックスの項目を有効または無効にできるように、ビューに IVsToolboxUser インターフェイスを実装します。

    3. ResetDefaults を実装し、SVsToolbox サービスに対して QueryService を呼び出し、IVsToolbox2IVsToolbox3 のインターフェイスへのポインターを取得します。

      以上の手順で、VSPackage から新しい項目をツールボックスに追加できるようになります。

  10. エディターに他のオプション機能が必要かどうかを決定します。

    • エディターで検索と置換のコマンドをサポートする場合は、IVsFindTarget を実装します。

    • エディターでドキュメント アウトライン ツール ウィンドウを使用する場合は、IVsDocOutlineProvider を実装します。

    • エディターでステータス バーを使用する場合は、IVsStatusbarUser を実装し、SVsStatusbar に対して QueryService を呼び出し、IVsStatusBar へのポインターを取得します。

      たとえば、エディターには、行と列の情報、選択モード (ストリームとボックス)、挿入モード (挿入と上書き) を表示できます。

    • エディターで Undo コマンドをサポートする場合は、OLE の元に戻すマネージャー モデルを使用することをお勧めします。 また、エディターで Undo コマンドを直接処理する方法もあります。

  11. VSPackage、メニュー、エディター、その他の機能の GUID を含むレジストリ情報を作成します。

    エディターを適切に登録する方法を示すために、.rgs ファイル スクリプトに配置するコードの一般的な例を次に示します。

    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. 状況依存のヘルプのサポートを実装します。

    この手順を実行すると、エディター内の項目に F1 ヘルプと動的ヘルプ ウィンドウをサポートできるようになります。 詳細については、「方法: エディターにコンテキストを提供する」を参照してください。

  13. IDispatch インターフェイスを実装することで、エディターからオートメーション オブジェクト モデルを公開します。

    詳細については、「Automation モデルの概要」を参照してください

信頼性の高いプログラミング

  • エディター インスタンスは、IDE から CreateEditorInstance メソッドが呼び出されたときに作成されます。 エディターが複数のビューをサポートしている場合、CreateEditorInstance により、ドキュメント データとドキュメント ビューのオブジェクトが両方作成されます。 ドキュメント データ オブジェクトが既に開かれている場合は、null ではない punkDocDataExisting 値が IVsEditorFactory::CreateEditorInstance に渡されます。 エディター ファクトリの実装の場合、既存のドキュメント データ オブジェクトに適切なインターフェイスのクエリを実行して、互換性があるかどうかを判断する必要があります。 詳細については、「複数のドキュメント ビューのサポート」を参照してください。

  • 簡易埋め込みアプローチを使用する場合は、IVsWindowPane インターフェイスを実装します。

  • インプレース アクティブ化を使用する場合は、次のインターフェイスを実装します。

    IOleObject

    IOleInPlaceActiveObject

    IOleInPlaceComponent

    Note

    IOleInPlaceComponent インターフェイスは、OLE 2 メニューのマージを回避するために使用されます。

    IOleCommandTarget の実装により、切り取りコピー貼り付けなどのコマンドを処理します。 IOleCommandTarget を実装する場合は、独自のコマンド メニュー構造を定義するために独自の .vsct ファイルがエディターに必要か、それとも Visual Studio に定義されている標準のコマンドを実装できるかを決定します。 通常、エディターに IDE のメニューを使用して拡張し、独自のツールバーを定義します。 ただし、エディターに IDE の標準のコマンド セットを使用するだけでなく、独自の特定のコマンドを定義する必要があることがよくあります。 エディターにより、使用する標準のコマンドを宣言してから、新しいコマンド、コンテキスト メニュー、トップレベル メニュー、およびツールバーを .vsct ファイルで定義する必要があります。 インプレース アクティブ化エディターを作成する場合は、OLE 2 メニューのマージを使用するのではなく、IOleInPlaceComponent を実装し、エディターのメニューとツールバーを .vsct ファイルで定義します。

  • UI でメニュー コマンドが煩雑になるのを防ぐには、新しいコマンドを作成する前に、IDE の既存のコマンドを使用するようにします。 共有コマンドは、SharedCmdDef.vsctShellCmdDef.vsct で定義されています。 これらのファイルは、既定で Visual Studio SDK インストールの VisualStudioIntegration\Common\Inc サブディレクトリにインストールされています。

  • ISelectionContainer を使用して、1 つの選択と複数の選択の両方を表すことができます。 選択された各オブジェクトは、IDispatch オブジェクトとして実装されます。

  • IDE には、CreateInstance からアクセス可能なサービスとして、または CreateInstance を介してインスタンス化できるオブジェクトとして IOleUndoManager が実装されています。 このエディターには、Undo アクションごとに IOleUndoUnit インターフェイスが実装されています。

  • カスタム エディターからオートメーション オブジェクトを公開できる場所は 2 つあります。

    • Document.Object

    • Window.Object