Добавить комментарий

Delphi

Как добавить пункт в меню Project Manager

Создадим пакет расширения, следуя общим рекомендациям.

Опишем класс расширения. Для того чтобы встроиться в формирование контекстного меню, наш класс должен реализовать интерфейс IOTAProjectMenuItemCreatorNotifier

type
TProjectWizard = class(TNotifierObject, IOTAProjectMenuItemCreatorNotifier)
                             public
                               procedure AddMenu(const Project: IOTAProject;
                                        const IdentList: TStrings;
                                        const ProjectManagerMenuList: IInterfaceList;
                                        IsMultiSelect: Boolean);
                           end;
...
procedure TProjectWizard.AddMenu(const Project: IOTAProject;
                                 const IdentList: TStrings;
                                 const ProjectManagerMenuList: IInterfaceList;
                                 IsMultiSelect: Boolean);
var
  menuItem : TMyMenuItem;
begin
  menuItem := TMyMenuItem.Create;
   menuItem.SetCaption := 'Пункт меню';
  ProjectManagerMenuList.Add(menuItem);
end;
...
var
  FNotifierIndex: Integer;

procedure Register;
begin
  // Регистрация для получения оповещений о необходимости создать меню.
  FNotifierIndex := (BorlandIDEServices as IOTAProjectManager)
                      .AddMenuItemCreatorNotifier(TProjectWizard.Create);
end;

initialization
  FNotifierIndex := -1;

finalization
  // Отмена регистрации.
  if FNotifierIndex > -1 then
    (BorlandIDEServices as IOTAProjectManager).RemoveMenuItemCreatorNotifier(FNotifierIndex);

end.

Для поддержки интерфейса в нашем классе достаточно реализовать функцию AddMenu, и подписаться на оповещения о создании пунктов меню, тогда при вызове контестного меню в Project Manager оболочка будет вызывать и экземпляр нашего расширения.
Внутри метода AddItem мы создаём новый пункт меню и добавляем его к списку всех пунктов меню, который пришёл к нам в параметре ProjectManagerMenuList.

Чтобы нормально функционировать как пункт меню, TMyMenuItem должен поддерживать два интерфейса:

TMyMenuItem = class(TInterfacedObject, IOTALocalMenu, IOTAProjectManagerMenu)
                    private
                    ...
                    public
                    { IOTANotifier }
                   // В простых случаях реализацию этих методов можно оставить пустой.
                      procedure AfterSave;
                      procedure BeforeSave;
                      procedure Destroyed;
                      procedure Modified;

                  // Реализация этих методов трудностей не вызовет, 
                  //   сохранять и возвращать восемь параметров.
                    { IOTALocalMenu }
                      function GetCaption: string;
                      function GetChecked: Boolean;
                      function GetEnabled: Boolean;
                      function GetHelpContext: Integer;
                      function GetName: string;
                      function GetParent: string;
                      function GetPosition: Integer;
                      function GetVerb: string;
                      procedure SetChecked(Value: Boolean);
                      procedure SetEnabled(Value: Boolean);
                      procedure SetHelpContext(Value: Integer);
                      procedure SetName(const Value: string);
                      procedure SetParent(const Value: string);
                      procedure SetPosition(Value: Integer);
                      procedure SetVerb(const Value: string);
                      procedure SetCaption(const Value: string);

                      { IOTAProjectManagerMenu }
                      function GetIsMultiSelectable: Boolean;
                      procedure SetIsMultiSelectable(Value: Boolean);
                    // Действия, происходящие по клику на пункту меню. 
                      procedure Execute(const MenuContextList: IInterfaceList); overload;
                   // Дополнительно, можно определить действия, 
                   //  выполняемые перед и после срабатывания метода Execute.
                      function PreExecute(const MenuContextList: IInterfaceList): Boolean;
                      function PostExecute(const MenuContextList: IInterfaceList): Boolean;

                      property IsMultiSelectable: Boolean read GetIsMultiSelectable 
                                                          write SetIsMultiSelectable;
                  end;

Если нужно варьировать состав пунктов меню в зависимости от типа выбранного в Project Manager элемента, то внутри AddMenu можно проанализировать IdentList - тип выбранного элемента:

...
procedure TProjectWizard.AddMenu(const Project: IOTAProject;
                                 const IdentList: TStrings;
                                 const ProjectManagerMenuList: IInterfaceList;
                                 IsMultiSelect: Boolean);
var
  menuItem : TMyMenuItem;
begin
  // Только если это меню для элемента типа файл.
  if (IdentList.IndexOf(sFileContainer) <> -1) then
  begin
    menuItem := TMyMenuItem.Create;
     menuItem.SetCaption := 'Пункт меню';
    ProjectManagerMenuList.Add(menuItem);
  end;
end;

Дополнительный пункт меню будет появляться только если выбранный элемент - файл. Константы для всех типов элементов описаны в ToolsAPI.

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.