Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
37
Добавлен:
20.03.2016
Размер:
7.31 Mб
Скачать

StarUML. Руководство разработчика. Глава 9. Написание дополнительных COM-объектов 98 / 139

 

Целое

 

Вид события (литерал)

Описание события

значние

 

 

 

 

 

EVK_UNIT_SEPARATED

11

Возникает, когда секция выделена.

EVK_UNIT_MERGED

12

Возникает, когда секция присоединена.

EVK_UNIT_OPENED

13

Возникает, когда секция открыта.

EVK_SELECTION_CHANGED

14

Возникает, когда выбран другой элемент моделирования.

EVK_DIAGRAM_ACTIVATED

15

Возникает, когда диаграмма открывается.

EVK_ELEMENTS_ADDED

16

Возникает, когда новый модельный элемент создан.

EVK_ELEMENTS_DELETING

17

Возникает, когда модельный элемент удляется.

EVK_ELEMENTS_DELETED

18

Возникает, когда модельный элемент удалён.

EVK_MODELS_CHANGED

19

Возникает, когда изменено свойство модельного элемента

EVK_VIEWS_CHANGED

20

Возникает, когда изменяется свойство представления

модельного элемента.

 

 

Подписка на события

Аддин, чтобы подписаться на события, должен реализовать интерфейс IEventSubscriber в дополнение к интерфейсу IStarUMLAddIn, который является общим интерфейсом для всех аддинов.

Следующий пример показывает определение класса аддина, который реализовывает интерфейсы IStarUMLAddIn и IEventSubscriber. Этот пример написан на Delphi.

type

AddInExample = class(TComObject, IStarUMLAddIn, IEventSubscriber) private

StarUMLApp: IStarUMLApplication; EventPub: IEventPublisher;

protected

function InitializeAddIn: HResult; stdcall; function FinalizeAddIn: HResult; stdcall;

function DoMenuAction(ActionID: Integer): HResult; stdcall; function NotifyEvent(AEvent: EventKind): HResult; stdcall;

...

public

procedure Initialize; override; destructor Destroy; override;

...

end;

Регистрация и удаление обработки событий

Чтобы аддин, который реализовывает интерфейс IEventSubscriber, мог подписаться на события, должен быть зарегистрирован обработчик событий . Регистрация обработчика событий и его удаление могут быть сделаны через объект типа IEventPublisher. Ссылка на объект типа IEventPublisher может быть получена через элемент IStarUMLApplication. Следующий пример на Delphi показывает, как получить ссылку на IStarUMLApplication и объект IEventPublisher.

implementation

procedure AddInExample.Initialize; begin

inherited;

StarUMLApp := CreateOleObject('StarUML.StarUMLApplication') as IStarUMLApplication; EventPub := StarUMLApp.EventPublisher;

end;

destructor AddInExample.Destroy;

StarUML. Руководство разработчика. Глава 9. Написание дополнительных COM-объектов 99 / 139

begin

EventPub := nil; StarUMLApp := nil; inherited;

end;

Интерфейс IEventPublisher предоставляет следующие методы для регистрации и удаления обработчиков событий. Параметр "ASubscriber" для каждого метода представляет факический объект аддина, который реализовывает интерфейс IEventSubscriber.

Метод

Описание

 

 

Subscribe(ASubscriber: IEventSubscriber; AEvent:

Регистрирует обработчик события, указанного

EventKind)

аргументом AEvent.

SubscribeAll(ASubscriber: IEventSubscriber)

Регистрирует обработчик всех событий.

Unsubscribe(ASubscriber: IEventSubscriber; AEvent:

Деактивирует обработчик события, указанного

EventKind)

аргументом AEvent.

UnsubscribeAll(ASubscriber: IEventSubscriber)

Деактивирует обработку сех событий.

Используйте метод Subscribe, если аддин должен подписаться только на некоторые события. Например, для того, чтобы подписаться на два специфических события, вызовите метод Subscribe для каждого события. Используйте метод SubscribeAll, чтобы подписаться на все события. Вообще, методы Subscribe и SubscribeAll вызывает метод IStarUMLAddIn.InitializeAddIn.

Если аддину больше не нужно реагировать на события (например, когда объект уничтожен), все зарегистрированные события должны быть разрегистрированы. Использование метод Unsubscribe, если обработчик был зарегистрирован методом Subscribe, и метод UnsubscribeAll , если подписка была зарегистрирована методом SubscribeAll. Вообще, методы UnSubscribe и UnSubscribeAll вызывает метод IStarUMLAddIn.FinalizeAddIn.

Следующий пример показывает регистрацию и удаление подписки на события EVK_ELEMENTS_ADDED и EVK_ELEMENTS_DELETED.

implementation

function AddInExample.InitializeAddIn: HResult; begin

EventPub.Subscribe(Self, EVK_ELEMENTS_ADDED); EventPub.Subscribe(Self, EVK_ELEMENTS_DELETED);

...

Result := S_OK;

end;

function AddInExample.FinalizeAddIn: HResult; begin

EventPub.Unsubscribe(Self, EVK_ELEMENTS_ADDED); EventPub.Unsubscribe(Self, EVK_ELEMENTS_DELETED);

...

Result := S_OK;

end;

Доступ к параметрам события

Когда событие возникает, необходимо получить связанные с ним параметры. Например, когда происходит событие EVK_ELEMENTS_ADDED, связанное с созданием элемента моделирования, необходимо выяснить, какой элемент был создан. Интерфейс IEventPublisher предоставляет следующие методы получения параметров события.

StarUML. Руководство разработчика. Глава 9. Написание дополнительных COM-объектов 100 / 139

Метод

Описание

 

 

GetEventArgModelCount(): Integer

Возвращает количество модельных элементов, относящихся к

 

событию.

GetEventArgModelAt(Index:

Возвращает по индексу ссылку на модельный элемент, относящийся к

Integer): IModel

событию.

GetEventArgViewCount: Integer

Возвращает количество визуальных представлений, относящихся к

событию.

 

GetEventArgViewAt(Index: Integer):

Возвращает по индексу ссылку на визуальное представление,

IView

относящееся к событию.

GetEventArgDocument: IDocument

Возвращает ссылку на элемент документа, относящегося к событию.

GetEventArgUnit:

Возвращает ссылку на документ секции, относящийся к событию.

IUMLUnitDocument

 

Обработка событий

Когда происходит событие, на которое подписан аддин, он должен выполнить соответствующую обработку. Всякий раз, когда подписанное событие происходит, приложение StarUML™ вызывает метод NotifyEvent соответствующего Аддина и передает вид события как параметр. Вид события передаётся потому, что аддин может подписаться больше чем на одно событие. Каждый аддин должен реализовать в методе NotifyEvent логику запуска различных процессов в зависимости от вида события.

Следующий пример показывает реализацию метода NotifyEvent. Этот пример проверяет семантическую допустимость связей элемента, когда в приложении создаются элементы ассоциации (UMLAssociation) или обобщения (UMLGeneralization). (Этот пример - продолжение примеров, приведённых выше. Объявление аддина выполнено в примерах выше.)

implementation

function AddInExample.NotifyEvent(AEvent: EventKind): HResult; var

M: IModel;

Assoc: IUMLAssociation;

Gen: IUMLGeneralization; End1, End2: IUMLClassifier;

begin

if AEvent = EVK_ELEMENTS_ADDED then begin

if EventPub.GetEventArgModelCount = 1 then begin

M := EventPub.GetEventArgModelAt(0);

// Association

if M.QueryInterface(IUMLAssociation, Assoc) = S_OK then begin

End1 := Assoc.GetConnectionAt(0).Participant;

End2 := Assoc.GetConnectionAt(1).Participant

if End1.IsKindOf('UMLPackage') or End2.IsKindOf('UMLPackage') then ShowMessage('Packages cannot have associations.')

...

end;

// Generalization

if M.QueryInterface(IUMLGeneralization, Gen) = S_OK then begin

if Gen.Child.IsRoot then

ShowMessage('Root elements cannot have parent elements.'); if Gen.Parent.IsLeaf then

ShowMessage('Leaf elements cannot have child elements.');

end;

end;

end;

StarUML. Руководство разработчика. Глава 9. Написание дополнительных COM-объектов 101 / 139

Result := S_OK;

end;

Соседние файлы в папке ПиАПС ЛР2