Open Tools API その3:ソースエディタへのアクセス

モジュール

モジュールとはIDEがアクセスする抽象的なエディタの組み合わせのことで、Delphi/C++Builderのプロジェクトにおけるユニットに相当。ユニットがソースファイル(*.pas/*.cpp)やヘッダファイル(*.h)、フォームファイル(*.dfm)の組み合わせであるように、モジュールは1つ以上のテキストエディタとフォームエディタなどから構成される。
モジュールに対するインターフェースを提供するのがIOTAModuleで、IDEからはIOTAModuleServiceより取得します。以下は、IDEが参照しているファイルの一覧を列挙する例。

procedure TfrmEditorStatus.Button6Click(Sender: TObject);
var
  I, J: Integer;
  ModuleServices: IOTAModuleServices;
  Editor: IOTAEditor;
  SourceEditor: IOTASourceEditor;
  FormEditor: IOTAFormEditor;
begin
  // モジュールの取得
  ModuleServices := (BorlandIDEServices as IOTAModuleServices);

  with ModuleServices do
  begin
    // IDEが開いているモジュールの列挙
    for I := 0 to ModuleCount - 1 do
    begin
      Memo1.Lines.Add(Modules[I].FileName);

      // モジュールが参照するエディタの列挙
      for J := 0 to Modules[I].GetModuleFileCount - 1 do
      begin
        Editor := Modules[I].GetModuleFileEditor(J);
        if Supports(Editor, IOTASourceEditor, SourceEditor) then
        begin
          // エディタはソースエディタ
          Memo1.Lines.Add('SourceEditor - ' + SourceEditor.FileName);
        end
        else if Supports(Editor, IOTAFormEditor, FormEditor) then
        begin
          // エディタはフォームエディタ
          Memo1.Lines.Add('FormEditor - ' + FormEditor.FileName);
        end else
        begin
          // 不明
          Memo1.Lines.Add('Unknown - ' + Editor.FileName);
        end;
      end;
    end;
  end;
end;

エディタの種類の判別には、Supports関数でそれぞれのインターフェースをサポートするかどうかで判別する。

ソースエディタ、ビュー

ソースエディタのインターフェースがIOTASourceEditorで、ソースエディタは複数個のビュー(IOTAEditView)から構成される。EditViewCountプロパティがビューの個数で、この値が0の場合はサブビューが隠れていることを表しす。ビューそのものはEditViews[n]でアクセスする。
ビューがエディタそのもので、カーソル位置やセレクション情報、内部バッファなどの情報をもつ。
IOTAEditViewの主なプロパティ

プロパティ 型名 内容
Block IOTAEditBlock ブロック:エディタの選択範囲
Buffer IOTABuffer バッファ:エディタの内部バッファ
Position IOTAEditPosition カーソル位置
TopRow Integer 最上部に表示されている行の行番号
RightColumn Integer ビューの右端の桁番号