IDE のメイン メニューへの項目の追加
IDE 固有のオブジェクトを使用する への移動
INTAServices
ネイティブ Tools API インターフェイスを使用して、IDE のメイン メニューに独自のメニュー項目を追加することができます。
メイン メニューへの項目の追加
TMenuItem のインスタンスを IDE のメイン メニューに追加するには:
- メイン メニュー オブジェクトを親として
TMenuItem
のインスタンスを作成します。メイン メニュー オブジェクトは、INTAServices
にキャストしたBorlandIDEServices
変数のMainMenu
プロパティです。 - メニュー項目を構成します。たとえば次のように設定します。
- Name、Caption、Hint、ShortCut などのプロパティを定義します。
- 次のいずれかを行って、メニュー項目の動作を定義します。
- メニュー項目のアイコンを定義するには、IDE の画像リストにアイコンを追加し、そのインデックスをメニュー項目の ImageIndex プロパティに割り当てます。
INTAServices
にキャストしたBorlandIDEServices
変数のAddActionMenu
を呼び出し、以下のパラメータを渡します。- IDE のメイン メニューの既存メニュー項目の名前を含む文字列。"ToolsMenu" や "HelpMenu" など。
- IDE のアクション リストに追加するアクション。メニュー項目でアクションを実行する場合には、ここに指定すると IDE のアクション リストに追加されます。実行しない場合は nil 値を渡します。
- メニュー項目オブジェクト。
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);