Sirius provides an aird editor with a default page allowing to handle viewpoints and representations as well as semantic models. It is the entry point to any Sirius project for end user.
Custom pages can be provided to aird editor instances to show different information not available in the default page. It can be anything from business information to aird information. The functionalities around custom page providing are the following:
Sirius offers two distinct ways of providing custom pages for aird editor:
PageRegistry
as entry point.
sessionEditorPageProvider
extension point as entry point.
The API is composed of the following classes:
AbstractSessionEditorPage
PageProvider
PageUpdateCOmmand
PositioningKind
PageUpdateCommandBuilder
PageRegistry
and are available in the package
org.eclipse.sirius.ui.editor.api.pages
from the plugin
org.eclipse.sirius.ui.editor
To provide a custom page by using this API you have to:
AbstractSessionEditorPage
and with the help of
PageUpdateCommandBuilder
if needed.
PageProvider
that will provide your custom page as well as other custom pages you want.
PageProvider
either directly in the
PageRegistry
or by using the provided extension point.
Example with the Sirius Debug Page:
When contributing a custom page, you can tell where the editor tab corresponding to your page will be located regarding other pages' tab in different contexts:
PageProvider
Whatever the context is, you always need to provide two kind of information to position your page regarding others:
org.eclipse.sirius.ui.editor.SessionEditorPlugin.DEFAULT_PAGE_ID
org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry.PositioningKind
:
BEFORE
kind will place your page’s tab in the aird editor before the target page’s tab. For example with the debug page before
Overview:
AFTER
kind will place your page’s tab in the aird editor after the target page’s tab. For example with the debug page after
Overview:
REPLACE
kind will replace the target page’s tab in the aird editor by your page’s tab. For example with the debug page replace the default page
Overview:
If a page identified by the id used to position your custom page does not exists in the aird editor when positioning your page, then your page will be added to the leftmost position.
To build a custom page you need to create a class extending
org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage
that also extends
FormPage
.
The UI creation part of your page is handled by the methods of
FormPage
with the method
createFormContent(IManagedForm managedForm)
as entry point.
The
AbstractSessionEditorPage
abstract class brings the following methods to implement:
Optional<PageUpdateCommand> pageChanged(boolean)
Optional<PageUpdateCommand> resourceSetChanged(ResourceSetChangeEvent)
Optional<PositioningKind> getPositioning()
Optional<String> getLocationId()
There is also a method
NotificationFilter getFilterForPageRequesting()
with default behavior that can be overridden.
This method is called by the aird editor whenever a resource set event occurs on its session’s resource set. The event can be a change regarding the aird file, or the loaded resources or viewpoints.
You can internally refresh your graphic components when called according to the change event. You also can return a list of
PageUpdateCommand
that the editor needs to execute to update your page by using the builder
PageUpdateCommandBuilder
. For example:
return Optional.of(new PageUpdateCommandBuilder().removePage().build());
This builder allows you to build a command the owning aird editor must execute. The built command can do one or a combination of the following command:
PageUpdateCommandBuilder removePage()
): when the aird editor execute this command, your page will be removed from the editor.
PageUpdateCommandBuilder reorderPage(PositioningKind positioningKind, String targetPageId)
): when the aird editor execute this command, your page will be placed at the defined position. To know more about positioning, please read the section
Page Positioning
PageUpdateCommandBuilder renameTab(String newLabel)
: when the aird editor execute this command, the editor tab owning your page will have its label updated with the one given to build the command.
If the built command contains the remove command and a reorder, rename or both command, then the remove command will be executed but not the other(s).
If you does not need to use this functionality you must return
Optional.empty()
.
This method is called with true as parameter when your page just becomes visible (i.e it is selected). It is called with false as parameter when any other page than yours is selected.
You can use the parameter to avoid doing heavy computation on model changes when you know your page is not visible to the end-user, and defer these to later, when it will become visible again (i.e. when pageChanged is invoked with
true
).
You also can internally refresh your graphic components when called according to the change event. You also can return a list of
PageUpdateCommand
that the editor needs to execute to update your page by using the builder
PageUpdateCommandBuilder
. See section
resourceSetChanged to have details about the commands.
If you want to apply page update only when the page is visible and if certain conditions are fulfilled regarding the session, then it is your responsibility to keep track of what happens since the last page selection with calls to
resourceSetChanged(ResourceSetChangeEvent)
to know if some update must be done.
If you does not need to use this functionality you must return
Optional.empty()
.
This method defined with a default implementation in
AbstractSessionEditorPage
allows to prevent calls to
AbstractSessionEditorPage.resourceSetChanged(ResourceSetChangeEvent)
for events you does not want to consider because you know your page will not refresh anything from these.
By default the filter
org.eclipse.emf.transaction.NotificationFilter.NOT_TOUCH
is used. This filter makes sure you are not called when all the event’s notification does not change any values.
You can override this method to provide your own filter.
This method is used when your page is created to position it among other pages. See section Page Positioning to now more about how positioning works.
It defines the kind of positioning to achieve.
If you don’t want to position your page relatively to another one, you can return
Optional.empty()
. In this case your page will be added to the leftmost position (first position).
This method is used when your page is created to position it among other pages. See section Page Positioning to now more about how positioning works.
It defines the page id from which your page should be positioned relatively to.
If you don’t want to position your page relatively to another one, you can return
Optional.empty()
. In this case your page will be added to the leftmost position (first position).
The PageProvider responsibilities are:
To build a custom page you need to create a class extending
org.eclipse.sirius.ui.editor.api.pages.PageProvider
.
This abstract class brings the following methods to implements:
Map<String, Supplier<AbstractSessionEditorPage>> getPages(SessionEditor)
NotificationFilter getFilterForPageRequesting()
boolean provides(String)
This method returns all custom pages instances extending
AbstractSessionEditorPage
to initialize.
This method must return a map of page id to its supplier initializing a new instance of the page.
For example with the debug page:
Map<String, Supplier<AbstractSessionEditorPage>> resultMap = new HashMap<>();
resultMap.put(DebugPage.PAGE_ID, () -> {
return new DebugPage(editor, DebugPage.PAGE_ID, DEBUG_PAGE_TITLE);
});
return resultMap;
You can use the given parameter to determine if your pages should be provided at the moment. You have access to the editor
org.eclipse.sirius.ui.editor.SessionEditor
asking for the pages of your provider. From this parameter you can access to its session by using the method
org.eclipse.sirius.ui.editor.SessionEditor.getSession()
. You also can use any singleton like
PlatformUI
to know if your pages should be created at the moment.
If the required conditions to display a page that can be computed from the session are not verified, then you should not return a new instance of this page.
The method is called when:
getFilterForPageRequesting
.
PageProvider
is added or removed from the providers registry.
This method defined with a default implementation in
PageProvider
allows to prevent calls to
PageProvider.getPages(SessionEditor)
for events you does not want to consider because you know that the initial conditions to show your pages will not be fulfilled.
By default the filter
org.eclipse.emf.transaction.NotificationFilter.NOT_TOUCH
is used. This filter makes sure you are not called when the event does not change any values.
You can override this method to provide your own filter.
This method tells if your provider can create a page instance of the given id as parameter. It is used when computing page positions.
Warning: If you don’t return true for the id of a page you provide, then positioning may not be what you expect.
You can create pages at a given position of an editor only when some initial conditions are fulfilled. This mechanism involves the methods:
PageProvider.getPages(SessionEditor)
AbstractSessionEditorPage.getPositioning()
AbstractSessionEditorPage.getLocationId()
You also can dynamically change the page position by reacting to session’s resource set events or even tell the editor to remove the page no longer useful. This mechanism involves the methods:
AbstractSessionEditorPage.resourceSetChanged(ResourceSetChangeEvent)
AbstractSessionEditorPage.pageChanged(boolean)
So we have two distinct mechanism allowing for page positioning that can be conflicted if not careful.
For example, your
AbstractSessionEditorPage
page can dynamically be removed when a condition A is verified. But your page creation initial condition in
PageProvider
is also A. In this situation, if A is verified a first time, the page is created. Then if A is verified a second time, the page will be removed dynamically and created again.
So to avoid conflicts, the page position and creation/removal must have the most specific conditions in the
PageProvider
and the less specific in
AbstractSessionEditorPage
For example, if a page can be created from
PageProvider
when condition A and B are verified, then this page can be dynamically removed only if !A or !B is verified but not if another condition is verified like C or !C.
When your PageProvider providing your custom pages is done, you have to register it to Sirius so it can be use to display your pages in aird editors.
You have two ways to do that either by using the
PageRegistry
or an extension point.
The
PageRegistry
is the registry containing all
PageProvider
used by aird editors.
To be used, your provider can be registered in this registry.
You can do this programmatically by calling the method
org.eclipse.sirius.ui.editor.SessionEditorPlugin.getPlugin().getPageRegistry().addPageProvider(parameter)
with a new instance of your page provider as parameter.
The extension point
org.eclipse.sirius.ui.editor.sessionEditorPageProvider
allows you to define the class of your page provider that should be taken in consideration when Sirius populates pages of aird editors: