イベントの購読
概要
イベントの拡張ポイントはリボン同様にエクステンションのOnActivate
メソッド内で定義します。
ExtensionPoints
プロパティのEvents
プロパティにアクセスすることでイベントの購読を定義できます。
購読できるイベントについてはマニフェストのイベントを参照して下さい。
public class SampleExtensionEntryPoint : ExtensionBase
{
/// <summary>
/// アクティベート時の処理です。
/// </summary>
protected override void OnActivate()
{
// イベント
ExtensionPoints.Events.Application.RegisterOnAfterStart<ApplicationAfterStartEvent>();
}
}
購読したイベントはベースクラスから派生したイベントハンドラのクラスでOnHandle
メソッドを実装することで処理を実現します。
/// <summary>
/// アプリケーション実行イベント
/// </summary>
public class ApplicationAfterStartEvent : ApplicationAfterStartEventHandlerBase
{
/// <summary>
/// イベントハンドラの処理です。
/// </summary>
/// <param name="c"></param>
/// <param name="p"></param>
protected override void OnHandle(IEventContext c, AfterStartEventParams p)
{
// イベント処理を実装します。
Output.WriteLine(ExtensionName, $"Events: ApplicationAfterStart Event. Version: {App.Version}");
}
}
イベント購読の実装
アプリケーション
アプリケーションの起動と終了前のイベントを購読できます。
// イベント
ExtensionPoints.Events.Application.RegisterOnAfterStart<ApplicationAfterStartEvent>();
ExtensionPoints.Events.Application.RegisterOnBeforeQuit<ApplicationBeforeQuitEvent>();
コマンド
Next Designのコマンド実行の前後に対してイベントを購読できます。
// コマンド
// エクステンションで実装した"MyExtensionCommand"コマンドに対してイベントを追加します
ExtensionPoints.Events.AddCommandEvent("MyExtensionCommand").RegisterOnBeforeExecute<MyExtensionCommandsBeforeExecuteEvent>();
ExtensionPoints.Events.AddCommandEvent("MyExtensionCommand").RegisterOnAfterExecute<MyExtensionCommandsAfterExecuteEvent>();
AddCommandEvent
メソッドの引数に対応する識別子を設定することで、システムコマンドに対してもイベント購読できます。
ExtensionPoints.Events.AddCommandEvent(NextDesignAppCommands.Home_CheckError).RegisterOnBeforeExecute<CheckErrorCommandBeforeExecuteEvent>();
プロジェクト
プロジェクトの新規作成、開く、保存といったイベントを購読できます。
// プロジェクト
ExtensionPoints.Events.Project.RegisterOnAfterNew<ProjectAfterNewEvent>();
ExtensionPoints.Events.Project.RegisterOnBeforeOpen<ProjectBeforeOpenEvent>();
ExtensionPoints.Events.Project.RegisterOnAfterOpen<ProjectAfterOpenEvent>();
ExtensionPoints.Events.Project.RegisterOnBeforeSave<ProjectBeforeSaveEvent>();
ExtensionPoints.Events.Project.RegisterOnAfterSave<ProjectAfterSaveEvent>();
ExtensionPoints.Events.Project.RegisterOnBeforeClose<ProjectBeforeCloseEvent>();
ExtensionPoints.Events.Project.RegisterOnAfterClose<ProjectAfterCloseEvent>();
ExtensionPoints.Events.Project.RegisterOnBeforeReload<ProjectBeforeReloadEvent>();
ExtensionPoints.Events.Project.RegisterOnAfterReload<ProjectAfterReloadEvent>();
モデル
モデルの作成や編集に関するイベントを購読できます。AddModelEvent
メソッドでイベントを購読するクラスを指定し、RegisterOn...
メソッドで購読するモデル編集イベントを指定します。
// モデル
// "SoftwareComponent"のメタモデルにイベントを追加します
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnBeforeNew<ModelsBeforeNewEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnAfterNew<ModelsAfterNewEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnFieldChanged<ModelsFieldChangedEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnBeforeDelete<ModelsBeforeDeleteEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnBeforeChangeOwner<ModelsBeforeChangeOwnerEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnAfterChangeOwner<ModelsAfterChangeOwnerEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnBeforeChangeOrder<ModelsBeforeChangeOrderEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnAfterChangeOrder<ModelsAfterChangeOrderEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnBeforeNewRelation<ModelsBeforeNewRelationEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnAfterNewRelation<ModelsAfterNewRelationEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnValidate<ModelsValidateEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnError<ModelsErrorEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnSelectionChanged<ModelsSelectionChangedEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnModelEdited<ModelsModelEditedEvent>();
ExtensionPoints.Events.AddModelEvent("SoftwareComponent").RegisterOnUndoRedo<ModelsUndoRedoEvent>();
クラス名はカンマ区切りで複数指定できます。
ExtensionPoints.Events.AddModelEvent("Actor,UseCase,UseCaseStep").RegisterOnAfterNew<ModelsAfterNewEvent>();
メタモデル名を省略するとすべてのモデルに対してイベントを購読します。これはマニフェストにおける*
と同じ意味となります。
ExtensionPoints.Events.AddModelEvent().RegisterOnAfterNew<ModelsAfterNewEvent>();
エディタ
エディタの表示や選択イベントを購読できます。
// エディタ
// "MyViewDefenition"のビューにイベントを追加します
ExtensionPoints.Events.AddEditorEvent("MyViewDefenition").RegisterOnShow<EditorsShowEvent>();
ExtensionPoints.Events.AddEditorEvent("MyViewDefenition").RegisterOnHide<EditorsHideEvent>();
ExtensionPoints.Events.AddEditorEvent("MyViewDefenition").RegisterOnSelectionChanged<EditorsSelectionChangedEvent>();
エディタ名を省略するとすべてのビューに対してイベントを購読します。
ExtensionPoints.Events.AddEditorEvent().RegisterOnShow<EditorsShowEvent>();
ページ
ページの変更前後のイベントを購読できます。
ExtensionPoints.Events.Pages.RegisterOnBeforeChange<PagesBeforeChangeEvent>();
ExtensionPoints.Events.Pages.RegisterOnAfterChange<PagesAfterChangeEvent>();
ナビゲータ
ナビゲータの変更イベントを購読できます。AddNavigatorEvent
メソッドでイベントハンドラを登録します。
// ナビゲータ
ExtensionPoints.Events.AddNavigatorEvent().RegisterOnShow<NavigatorsShowEvent>();
ExtensionPoints.Events.AddNavigatorEvent().RegisterOnHide<NavigatorsHideEvent>();
ExtensionPoints.Events.AddNavigatorEvent().RegisterOnSelectionChanged<NavigatorsSelectionChangedEvent>();
購読するナビゲータのタブを指定する場合は次のようにEventTargetNavigatorType
列挙体でナビゲータの種類を指定します。
// モデルナビゲータの表示イベントを購読します
ExtensionPoints.Events.AddNavigatorEvent(EventTargetNavigatorType.Model).RegisterOnShow<NavigatorsShowEvent>();
情報ウィンドウ
情報ウィンドウの表示・非表示、選択変更、ダブルクリックを購読できます。
// ナビゲータ
ExtensionPoints.Events.AddInformationEvent().RegisterOnShow<InformationsShowEvent>();
ExtensionPoints.Events.AddInformationEvent().RegisterOnHide<InformationsHideEvent>();
ExtensionPoints.Events.AddInformationEvent().RegisterOnSelectionChanged<InformationsSelectionChangedEvent>();
ExtensionPoints.Events.AddInformationEvent().RegisterOnDoubleClick<InformationsDoubleClickEvent>();
購読する情報ウィンドウのタブを指定する場合は次のようにEventTargetInformationAreaType
列挙体で情報ウィンドウの種類を指定します。
ExtensionPoints.Events.AddInformationEvent(EventTargetInformationAreaType.Error).RegisterOnDoubleClick<InformationsDoubleClickEvent>();