+ // CONTROLERS FOR THIS EDITOR AND ITS PAGES
+
+ private class NameChangeListener implements UserAdminListener {
+
+ private final User user;
+
+ public NameChangeListener(User user) {
+ this.user = user;
+ }
+
+ @Override
+ public void roleChanged(UserAdminEvent event) {
+ Role changedRole = event.getRole();
+ if (changedRole == null || changedRole.equals(user))
+ updateEditorTitle(null);
+ }
+ }
+
+ class MainInfoListener implements UserAdminListener {
+ private final AbstractFormPart part;
+
+ public MainInfoListener(AbstractFormPart part) {
+ this.part = part;
+ }
+
+ @Override
+ public void roleChanged(UserAdminEvent event) {
+ // Rollback
+ if (event.getRole() == null)
+ part.markStale();
+ }
+ }
+
+ class GroupChangeListener implements UserAdminListener {
+ private final AbstractFormPart part;
+
+ public GroupChangeListener(AbstractFormPart part) {
+ this.part = part;
+ }
+
+ @Override
+ public void roleChanged(UserAdminEvent event) {
+ // always mark as stale
+ part.markStale();
+ }
+ }
+
+ /** Registers a listener that will notify this part */
+ class FormPartML implements ModifyListener {
+ private static final long serialVersionUID = 6299808129505381333L;
+ private AbstractFormPart formPart;
+
+ public FormPartML(AbstractFormPart generalPart) {
+ this.formPart = generalPart;
+ }
+
+ public void modifyText(ModifyEvent e) {
+ // Discard event when the control does not have the focus, typically
+ // to avoid all editors being marked as dirty during a Rollback
+ if (((Control) e.widget).isFocusControl())
+ formPart.markDirty();
+ }
+ }
+