With a check out of main-silver from yesterday, I'm able to use the brand new "role" attribute in @TopComponent.Registration, as you can see below, in the bit in bold:
@ConvertAsProperties(dtd = "-//org.role.demo.ui//Admin//EN",
autostore = false)
@TopComponent.Description(preferredID = "AdminTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE",
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "editor", openAtStartup = true, role="admin")
public final class AdminTopComponent extends TopComponent {
And here's a window for general users of the application, with the "role" attribute set to "user":
@ConvertAsProperties(dtd = "-//org.role.demo.ui//User//EN",
autostore = false)
@TopComponent.Description(preferredID = "UserTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE",
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "explorer", openAtStartup = true, role="user")
public final class UserTopComponent extends TopComponent {
So, I have two windows. One is assigned to the "admin" role, the other to the "user" role. In the "ModuleInstall" class, I add a "WindowSystemListener" and set "user" as the application's role:
public class Installer extends ModuleInstall implements WindowSystemListener {
@Override
public void restored() {
WindowManager.getDefault().addWindowSystemListener(this);
}
@Override
public void beforeLoad(WindowSystemEvent event) {
WindowManager.getDefault().setRole("user");
WindowManager.getDefault().removeWindowSystemListener(this);
}
@Override
public void afterLoad(WindowSystemEvent event) {
}
@Override
public void beforeSave(WindowSystemEvent event) {
}
@Override
public void afterSave(WindowSystemEvent event) {
}
}
So, when the application starts, the "UserTopComponent" is shown, not the "AdminTopComponent".
Next, I have two Actions, for switching between the two roles, as shown below:
@ActionID(category = "Window",
id = "org.role.demo.ui.SwitchToAdminAction")
@ActionRegistration(displayName = "#CTL_SwitchToAdminAction")
@ActionReferences({
@ActionReference(path = "Menu/Window", position = 250)
})
@Messages("CTL_SwitchToAdminAction=Switch To Admin")
public final class SwitchToAdminAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
WindowManager.getDefault().setRole("admin");
}
@Override
public boolean isEnabled() {
return !WindowManager.getDefault().getRole().equals("admin");
}
}
@ActionID(category = "Window",
id = "org.role.demo.ui.SwitchToUserAction")
@ActionRegistration(displayName = "#CTL_SwitchToUserAction")
@ActionReferences({
@ActionReference(path = "Menu/Window", position = 250)
})
@Messages("CTL_SwitchToUserAction=Switch To User")
public final class SwitchToUserAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
WindowManager.getDefault().setRole("user");
}
@Override
public boolean isEnabled() {
return !WindowManager.getDefault().getRole().equals("user");
}
}
When I select one of the above actions, the role changes, and the other window is shown. I could, of course, add a Login dialog to the "SwitchToAdminAction", so that authentication is required in order to switch to the "admin" role.
Now, let's say I am now in the "user" role. So, the "UserTopComponent" shown above is now opened. I decide to also open another window, the Properties window, as below...
...and, when I am in the "admin" role, when the "AdminTopComponent" is open, I decide to also open the Output window, as below...
Now, when I switch from one role to the other, the additional window/s I opened will also be opened, together with the explicit members of the currently selected role. And, the main window position and size are also persisted across roles.
When I look in the "build" folder of my project in development, I see two different Windows2Local folders, one per role, automatically created by the fact that there is something to be persisted for a particular role, e.g., when a switch to a different role is done:
And, with that, we now clearly have roles/profiles/perspectives in NetBeans Platform applications from NetBeans Platform 7.1 onwards.