IDE のメイン メニューへの項目の追加

提供: RAD Studio
移動先: 案内検索

IDE 固有のオブジェクトを使用する への移動


INTAServices ネイティブ Tools API インターフェイスを使用して、IDE のメイン メニューに独自のメニュー項目を追加することができます。

メイン メニューへの項目の追加

TMenuItem のインスタンスを IDE のメイン メニューに追加するには:

  1. メイン メニュー オブジェクトを親として TMenuItem のインスタンスを作成します。メイン メニュー オブジェクトは、INTAServices にキャストした BorlandIDEServices 変数の MainMenu プロパティです。
  2. メニュー項目を構成します。たとえば次のように設定します。
    • NameCaptionHintShortCut などのプロパティを定義します。
    • 次のいずれかを行って、メニュー項目の動作を定義します。
      • アクションを作成して、メニューの Action プロパティに割り当てます。
      • メニューの OnClick イベントのイベント ハンドラを作成します。
    • メニュー項目のアイコンを定義するには、IDE の画像リストにアイコンを追加し、そのインデックスをメニュー項目の ImageIndex プロパティに割り当てます。
  3. INTAServices にキャストした BorlandIDEServices 変数の AddActionMenu を呼び出し、以下のパラメータを渡します。
    1. IDE のメイン メニューの既存メニュー項目の名前を含む文字列。"ToolsMenu" や "HelpMenu" など。
    2. IDE のアクション リストに追加するアクション。メニュー項目でアクションを実行する場合には、ここに指定すると IDE のアクション リストに追加されます。実行しない場合は nil 値を渡します。
    3. メニュー項目オブジェクト。

Delphi の場合:

if Supports(BorlandIDEServices, INTAServices, NTAServices) then
begin
  MyMenuItem := TMenuItem.Create(nil);
  MyMenuItem.Caption := 'My Menu Item';
  NTAServices.AddActionMenu('ToolsMenu', nil, MyMenuItem);
end;

C++ の場合:

_di_INTAServices NTAServices;
if (BorlandIDEServices->Supports(NTAServices)) {
  MyMenuItem = new TMenuItem(NULL);
  MyMenuItem->Caption = "My Menu Item";
  NTAServices->AddActionMenu("ToolsMenu", NULL, MyMenuItem);
}

AddActionMenu を呼び出すと、指定した名前を持つ既存メニュー項目の後に、メニュー項目が追加されます。指定した既存メニュー項目の左側に配置したりメニュー項目の子にするなど、異なる相対位置にメニューを配置することもできます。

パッケージの読み込みを解除するときには、メニュー項目オブジェクトの解放も忘れずに行ってください。

既存メイン メニュー項目の名前の検索

IDE のメイン メニューにメニュー項目を追加するには、既存メニュー項目の名前を知る必要があります。

既存メニュー項目の名前を検索するには、パッケージ内で以下の手続きを実装します。

Delphi の場合:

type
  TMenuBreadcrumbs = array of String;

procedure FindMenuItem(AMenuBreadcrumbs: TMenuBreadcrumbs);

  procedure IterateMenuItems(MenuItems: TMenuItem);
  var
    I, J: Integer;
    ArrayLength: Cardinal;
    Caption: String;
  begin
    for I := 0 To MenuItems.Count - 1 do
    begin
      Caption := StringReplace(MenuItems[I].Caption, '&', '', []);
      if Uppercase(AMenuBreadcrumbs[0]) = Uppercase(Caption) then
      begin
        ArrayLength := Length(AMenuBreadcrumbs);
        if ArrayLength = 1 then
          ShowMessage(MenuItems[I].Name)
        else
        begin
          for J := 1 to ArrayLength - 1 do
            AMenuBreadcrumbs[J - 1] := AMenuBreadcrumbs[J];
          SetLength(AMenuBreadcrumbs, ArrayLength - 1);
          IterateMenuItems(MenuItems.Items[I]);
        end;
        break;
      end;
    end;
  end;

var
  NTAServices: INTAServices;
begin
  if Supports(BorlandIDEServices, INTAServices, NTAServices) then
    IterateMenuItems(NTAServices.MainMenu.Items);
end;

C++ の場合:

void IterateMenuItems(TMenuItem* MenuItems,
                      DynamicArray<UnicodeString> &AMenuBreadcrumbs) {
  for (int i = 0; i < MenuItems->Count; i++) {
    UnicodeString Caption = StringReplace(
      MenuItems->Items[i]->Caption, "&", "", TReplaceFlags());
    if (AMenuBreadcrumbs[0].UpperCase() == Caption.UpperCase()) {
      int ArrayLength = AMenuBreadcrumbs.Length;
      if (ArrayLength == 1)
        ShowMessage(MenuItems->Items[i]->Name);
      else {
        for (int j = 1; j < ArrayLength; j++)
          AMenuBreadcrumbs[j - 1] = AMenuBreadcrumbs[j];
        AMenuBreadcrumbs.Length = ArrayLength - 1;
        IterateMenuItems(MenuItems->Items[i], AMenuBreadcrumbs);
      }
      break;
    }
  }
}

void FindMenuItems(DynamicArray<UnicodeString> AMenuBreadcrumbs) {
  _di_INTAServices NTAServices;
  if (BorlandIDEServices->Supports(NTAServices)) {
      IterateMenuItems(NTAServices->MainMenu->Items, AMenuBreadcrumbs);
  }
}

その後、パッケージの初期化処理で FindMenuItem を呼び出し、対象のメニュー エントリまでのキャプションの配列を渡します。

たとえば、メニュー項目[File|Open From Version Control...][ファイル|バージョン管理リポジトリから開く...])の名前を検索するには、FindMenuItem を次のように呼び出します。

Delphi の場合:

FindMenuItem(['File', 'Open From Version Control...']);

C++ の場合:

FindMenuItems(DynamicArray<UnicodeString>(
  "File", "Open From Version Control..."););

これを呼び出すパッケージを IDE にインストールすると、指定したメニューの名前("OpenFromRepository1" など)がダイアログ ボックスに表示されます。

この関数を呼び出してメニュー項目の名前を検索するのは、IDE 拡張機能の開発時だけにしてください。ユーザーが英語以外の言語で IDE を実行する可能性があるため、最終的なパッケージでこの関数を使用してはなりません。そうではなく、開発時に検索した対象メニュー項目の実際の名前を指定してください。

Delphi の場合:

NTAServices.AddActionMenu('OpenFromRepository1', nil, MyMenuItem);

C++ の場合:

NTAServices->AddActionMenu("OpenFromRepository1", NULL, MyMenuItem);

メニュー項目への異なる相対位置の指定

AddActionMenu は、デフォルトでは、指定した既存メニュー項目の右側にメニュー項目を追加します。ただし、任意指定のパラメータを追加することで、この動作を変更できます。

指定した既存メニュー項目の左側にメニュー項目を配置するには、4 番目のパラメータに False を渡します。

Delphi の場合:

NTAServices.AddActionMenu('OpenFromRepository1', nil, MyMenuItem, False);

C++ の場合:

NTAServices->AddActionMenu("OpenFromRepository1", NULL, MyMenuItem, false);

指定した既存メニュー項目の中に子メニュー項目としてメニュー項目を配置するには、5 番目のパラメータに True を渡します(4 番目のパラメータの値は何でもかまいません)。

Delphi の場合:

NTAServices.AddActionMenu('OpenFromRepository1', nil, MyMenuItem, False, True);

C++ の場合:

NTAServices->AddActionMenu("OpenFromRepository1", NULL, MyMenuItem, false, true);

関連項目