Remove 32 bits SWT.
[lgpl/argeo-commons.git] / org.argeo.cms.ui.workbench / src / org / argeo / cms / ui / workbench / internal / useradmin / parts / UserMainPage.java
index 2ff5f510fdda475ea6bb1df0570cc1918eac6b46..04111c4a8d322d6a6371f3f346d0898547ded04f 100644 (file)
  */
 package org.argeo.cms.ui.workbench.internal.useradmin.parts;
 
+import static org.argeo.cms.util.UserAdminUtils.getProperty;
+import static org.argeo.naming.LdapAttrs.cn;
+import static org.argeo.naming.LdapAttrs.givenName;
+import static org.argeo.naming.LdapAttrs.mail;
+import static org.argeo.naming.LdapAttrs.sn;
+import static org.argeo.naming.LdapAttrs.uid;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.argeo.cms.CmsException;
+import org.argeo.cms.ArgeoNames;
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.workbench.CmsWorkbenchStyles;
 import org.argeo.cms.ui.workbench.internal.useradmin.SecurityAdminImages;
 import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper;
 import org.argeo.cms.ui.workbench.internal.useradmin.parts.UserEditor.GroupChangeListener;
@@ -28,17 +37,18 @@ import org.argeo.cms.ui.workbench.internal.useradmin.providers.CommonNameLP;
 import org.argeo.cms.ui.workbench.internal.useradmin.providers.DomainNameLP;
 import org.argeo.cms.ui.workbench.internal.useradmin.providers.RoleIconLP;
 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserFilter;
-import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserNameLP;
 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserTableDefaultDClickListener;
-import org.argeo.cms.util.useradmin.UserAdminUtils;
+import org.argeo.cms.util.CmsUtils;
+import org.argeo.cms.util.UserAdminUtils;
 import org.argeo.eclipse.ui.ColumnDefinition;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.parts.LdifUsersTable;
 import org.argeo.naming.LdapAttrs;
-import org.argeo.node.ArgeoNames;
 import org.argeo.node.NodeConstants;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.TrayDialog;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -62,7 +72,11 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.ui.forms.AbstractFormPart;
@@ -105,8 +119,6 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                appendOverviewPart(body, user);
                // Remove to ability to force the password for his own user. The user
                // must then use the change pwd feature
-               if (!UserAdminUtils.isCurrentUser(user))
-                       appendPasswordPart(body, user);
                appendMemberOfPart(body, user);
        }
 
@@ -114,26 +126,27 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        private void appendOverviewPart(final Composite parent, final User user) {
                FormToolkit tk = getManagedForm().getToolkit();
 
-               Section section = addSection(tk, parent, "Main information");
-               Composite body = (Composite) section.getClient();
+               Section section = tk.createSection(parent, SWT.NO_FOCUS);
+               GridData gd = EclipseUiUtils.fillWidth();
+               // gd.verticalAlignment = PRE_TITLE_INDENT;
+               section.setLayoutData(gd);
+               Composite body = tk.createComposite(section, SWT.WRAP);
+               body.setLayoutData(EclipseUiUtils.fillAll());
+               section.setClient(body);
+               // body.setLayout(new GridLayout(6, false));
                body.setLayout(new GridLayout(2, false));
 
-               final Text distinguishedName = createLT(tk, body, "User Name",
-                               UserAdminUtils.getProperty(user, LdapAttrs.uid.name()));
-               distinguishedName.setEnabled(false);
-
-               final Text commonName = createLT(tk, body, "Common Name",
-                               UserAdminUtils.getProperty(user, LdapAttrs.cn.name()));
-               commonName.setEnabled(false);
-
-               final Text firstName = createLT(tk, body, "First name",
-                               UserAdminUtils.getProperty(user, LdapAttrs.givenName.name()));
+               Text commonName = createReadOnlyLT(tk, body, "Name", getProperty(user, cn));
+               Text distinguishedName = createReadOnlyLT(tk, body, "Login", getProperty(user, uid));
+               Text firstName = createLT(tk, body, "First name", getProperty(user, givenName));
+               Text lastName = createLT(tk, body, "Last name", getProperty(user, sn));
+               Text email = createLT(tk, body, "Email", getProperty(user, mail));
 
-               final Text lastName = createLT(tk, body, "Last name",
-                               UserAdminUtils.getProperty(user, LdapAttrs.sn.name()));
-
-               final Text email = createLT(tk, body, "Email",
-                               UserAdminUtils.getProperty(user, LdapAttrs.mail.name()));
+               Link resetPwdLk = new Link(body, SWT.NONE);
+               if (!UserAdminUtils.isCurrentUser(user)) {
+                       resetPwdLk.setText("<a>Reset password</a>");
+               }
+               resetPwdLk.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
 
                // create form part (controller)
                AbstractFormPart part = new SectionPart((Section) body.getParent()) {
@@ -142,8 +155,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new MainInfoListener(parent.getDisplay(),
-                                               this);
+                               listener = editor.new MainInfoListener(parent.getDisplay(), this);
                                userAdminWrapper.addListener(listener);
                        }
 
@@ -156,29 +168,20 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @SuppressWarnings("unchecked")
                        public void commit(boolean onSave) {
                                // TODO Sanity checks (mail validity...)
-                               user.getProperties().put(LdapAttrs.givenName.name(),
-                                               firstName.getText());
-                               user.getProperties().put(LdapAttrs.sn.name(),
-                                               lastName.getText());
-                               user.getProperties().put(LdapAttrs.cn.name(),
-                                               commonName.getText());
-                               user.getProperties()
-                                               .put(LdapAttrs.mail.name(), email.getText());
+                               user.getProperties().put(LdapAttrs.givenName.name(), firstName.getText());
+                               user.getProperties().put(LdapAttrs.sn.name(), lastName.getText());
+                               user.getProperties().put(LdapAttrs.cn.name(), commonName.getText());
+                               user.getProperties().put(LdapAttrs.mail.name(), email.getText());
                                super.commit(onSave);
                        }
 
                        @Override
                        public void refresh() {
-                               distinguishedName.setText(UserAdminUtils.getProperty(user,
-                                               LdapAttrs.uid.name()));
-                               commonName.setText(UserAdminUtils.getProperty(user,
-                                               LdapAttrs.cn.name()));
-                               firstName.setText(UserAdminUtils.getProperty(user,
-                                               LdapAttrs.givenName.name()));
-                               lastName.setText(UserAdminUtils.getProperty(user,
-                                               LdapAttrs.sn.name()));
-                               email.setText(UserAdminUtils.getProperty(user,
-                                               LdapAttrs.mail.name()));
+                               distinguishedName.setText(UserAdminUtils.getProperty(user, LdapAttrs.uid.name()));
+                               commonName.setText(UserAdminUtils.getProperty(user, LdapAttrs.cn.name()));
+                               firstName.setText(UserAdminUtils.getProperty(user, LdapAttrs.givenName.name()));
+                               lastName.setText(UserAdminUtils.getProperty(user, LdapAttrs.sn.name()));
+                               email.setText(UserAdminUtils.getProperty(user, LdapAttrs.mail.name()));
                                refreshFormTitle(user);
                                super.refresh();
                        }
@@ -196,7 +199,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                                String cn = first.trim() + " " + last.trim() + " ";
                                cn = cn.trim();
                                commonName.setText(cn);
-                               getManagedForm().getForm().setText(cn);
+                               // getManagedForm().getForm().setText(cn);
                                editor.updateEditorTitle(cn);
                        }
                };
@@ -207,45 +210,76 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                firstName.addModifyListener(defaultListener);
                lastName.addModifyListener(defaultListener);
                email.addModifyListener(defaultListener);
+
+               if (!UserAdminUtils.isCurrentUser(user))
+                       resetPwdLk.addSelectionListener(new SelectionAdapter() {
+                               private static final long serialVersionUID = 5881800534589073787L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       new ChangePasswordDialog(tk, user, "Reset password").open();
+                               }
+                       });
+
                getManagedForm().addPart(part);
        }
 
-       /** Creates the password section */
-       private void appendPasswordPart(Composite parent, final User user) {
-               FormToolkit tk = getManagedForm().getToolkit();
-               Section section = addSection(tk, parent, "Password");
-               Composite body = (Composite) section.getClient();
-               body.setLayout(new GridLayout(2, false));
+       private class ChangePasswordDialog extends TrayDialog {
+               private static final long serialVersionUID = 2843538207460082349L;
 
-               // add widgets (view)
-               final Text password1 = createLP(tk, body, "New password", "");
-               final Text password2 = createLP(tk, body, "Repeat password", "");
+               private User user;
+               private Text password1;
+               private Text password2;
+               private String title;
+               private FormToolkit tk;
 
-               // create form part (controller)
-               AbstractFormPart part = new SectionPart((Section) body.getParent()) {
-                       @SuppressWarnings("unchecked")
-                       public void commit(boolean onSave) {
-                               if (!password1.getText().equals("")
-                                               || !password2.getText().equals("")) {
-                                       if (password1.getText().equals(password2.getText())) {
-                                               char[] newPassword = password1.getText().toCharArray();
-                                               // userAdminWrapper.beginTransactionIfNeeded();
-                                               user.getCredentials().put(null, newPassword);
-                                               password1.setText("");
-                                               password2.setText("");
-                                               super.commit(onSave);
-                                       } else {
-                                               password1.setText("");
-                                               password2.setText("");
-                                               throw new CmsException("Passwords are not equals");
-                                       }
-                               }
+               public ChangePasswordDialog(FormToolkit tk, User user, String title) {
+                       super(Display.getDefault().getActiveShell());
+                       this.tk = tk;
+                       this.user = user;
+                       this.title = title;
+               }
+
+               protected Control createDialogArea(Composite parent) {
+                       Composite dialogarea = (Composite) super.createDialogArea(parent);
+                       dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                       Composite body = new Composite(dialogarea, SWT.NO_FOCUS);
+                       body.setLayoutData(EclipseUiUtils.fillAll());
+                       GridLayout layout = new GridLayout(2, false);
+                       body.setLayout(layout);
+
+                       password1 = createLP(tk, body, "New password", "");
+                       password2 = createLP(tk, body, "Repeat password", "");
+                       parent.pack();
+                       return body;
+               }
+
+               @SuppressWarnings("unchecked")
+               @Override
+               protected void okPressed() {
+                       String msg = null;
+
+                       if (password1.getText().equals(""))
+                               msg = "Password cannot be empty";
+                       else if (password1.getText().equals(password2.getText())) {
+                               char[] newPassword = password1.getText().toCharArray();
+                               // userAdminWrapper.beginTransactionIfNeeded();
+                               userAdminWrapper.beginTransactionIfNeeded();
+                               user.getCredentials().put(null, newPassword);
+                               userAdminWrapper.commitOrNotifyTransactionStateChange();
+                               super.okPressed();
+                       } else {
+                               msg = "Passwords are not equals";
                        }
-               };
-               ModifyListener defaultListener = editor.new FormPartML(part);
-               password1.addModifyListener(defaultListener);
-               password2.addModifyListener(defaultListener);
-               getManagedForm().addPart(part);
+
+                       if (EclipseUiUtils.notEmpty(msg))
+                               MessageDialog.openError(getParentShell(), "Cannot reset pasword", msg);
+               }
+
+               protected void configureShell(Shell shell) {
+                       super.configureShell(shell);
+                       shell.setText(title);
+               }
        }
 
        private LdifUsersTable appendMemberOfPart(final Composite parent, User user) {
@@ -254,31 +288,28 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                Composite body = (Composite) section.getClient();
                body.setLayout(EclipseUiUtils.noSpaceGridLayout());
 
-               boolean isAdmin = UserAdminUtils.isUserInRole(NodeConstants.ROLE_ADMIN);
+               // boolean isAdmin = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN);
 
                // Displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
-               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
-                               150));
-               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain Name",
-                               200));
+               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150));
+               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 100));
                // Only show technical DN to administrators
-               if (isAdmin)
-                       columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                                       "Distinguished Name", 120));
+               // if (isAdmin)
+               // columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name",
+               // 300));
 
                // Create and configure the table
-               final LdifUsersTable userViewerCmp = new MyUserTableViewer(body,
-                               SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, user);
+               final LdifUsersTable userViewerCmp = new MyUserTableViewer(body, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, user);
 
                userViewerCmp.setColumnDefinitions(columnDefs);
-               if (isAdmin)
-                       userViewerCmp.populateWithStaticFilters(false, false);
-               else
-                       userViewerCmp.populate(true, false);
+               // if (isAdmin)
+               // userViewerCmp.populateWithStaticFilters(false, false);
+               // else
+               userViewerCmp.populate(true, false);
                GridData gd = EclipseUiUtils.fillAll();
-               gd.heightHint = 300;
+               gd.heightHint = 500;
                userViewerCmp.setLayoutData(gd);
 
                // Controllers
@@ -286,8 +317,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
                int operations = DND.DROP_COPY | DND.DROP_MOVE;
                Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
-               GroupDropListener dropL = new GroupDropListener(userAdminWrapper,
-                               userViewer, user);
+               GroupDropListener dropL = new GroupDropListener(userAdminWrapper, userViewer, user);
                userViewer.addDropSupport(operations, tt, dropL);
 
                SectionPart part = new SectionPart((Section) body.getParent()) {
@@ -297,8 +327,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new GroupChangeListener(parent.getDisplay(),
-                                               this);
+                               listener = editor.new GroupChangeListener(parent.getDisplay(), this);
                                userAdminWrapper.addListener(listener);
                        }
 
@@ -335,20 +364,21 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        super(parent, style, true);
                        this.user = user;
                        userFilter = new UserFilter();
-                       userFilter.setShowSystemRole(false);
                }
 
                protected void populateStaticFilters(Composite staticFilterCmp) {
                        staticFilterCmp.setLayout(new GridLayout());
                        showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK);
                        showSystemRoleBtn.setText("Show system roles");
+                       boolean showSysRole = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN);
+                       showSystemRoleBtn.setSelection(showSysRole);
+                       userFilter.setShowSystemRole(showSysRole);
                        showSystemRoleBtn.addSelectionListener(new SelectionAdapter() {
                                private static final long serialVersionUID = -7033424592697691676L;
 
                                @Override
                                public void widgetSelected(SelectionEvent e) {
-                                       userFilter.setShowSystemRole(showSystemRoleBtn
-                                                       .getSelection());
+                                       userFilter.setShowSystemRole(showSystemRoleBtn.getSelection());
                                        refresh();
                                }
                        });
@@ -368,13 +398,11 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                }
        }
 
-       private void addRemoveAbitily(SectionPart sectionPart,
-                       TableViewer userViewer, User user) {
+       private void addRemoveAbitily(SectionPart sectionPart, TableViewer userViewer, User user) {
                Section section = sectionPart.getSection();
                ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
                ToolBar toolbar = toolBarManager.createControl(section);
-               final Cursor handCursor = new Cursor(section.getDisplay(),
-                               SWT.CURSOR_HAND);
+               final Cursor handCursor = new Cursor(section.getDisplay(), SWT.CURSOR_HAND);
                toolbar.setCursor(handCursor);
                toolbar.addDisposeListener(new DisposeListener() {
                        private static final long serialVersionUID = 3882131405820522925L;
@@ -386,10 +414,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        }
                });
 
-               String tooltip = "Remove " + UserAdminUtils.getUsername(user)
-                               + " from the below selected groups";
-               Action action = new RemoveMembershipAction(userViewer, user, tooltip,
-                               SecurityAdminImages.ICON_REMOVE_DESC);
+               String tooltip = "Remove " + UserAdminUtils.getUserLocalId(user.getName()) + " from the below selected groups";
+               Action action = new RemoveMembershipAction(userViewer, user, tooltip, SecurityAdminImages.ICON_REMOVE_DESC);
                toolBarManager.add(action);
                toolBarManager.update(true);
                section.setTextClient(toolbar);
@@ -401,8 +427,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                private final TableViewer userViewer;
                private final User user;
 
-               RemoveMembershipAction(TableViewer userViewer, User user, String name,
-                               ImageDescriptor img) {
+               RemoveMembershipAction(TableViewer userViewer, User user, String name, ImageDescriptor img) {
                        super(name, img);
                        this.userViewer = userViewer;
                        this.user = user;
@@ -428,8 +453,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        }
                        userAdminWrapper.commitOrNotifyTransactionStateChange();
                        for (Group group : groups) {
-                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
-                                               UserAdminEvent.ROLE_CHANGED, group));
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, group));
                        }
                }
        }
@@ -444,16 +468,14 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                private final UserAdminWrapper myUserAdminWrapper;
                private final User myUser;
 
-               public GroupDropListener(UserAdminWrapper userAdminWrapper,
-                               Viewer userViewer, User user) {
+               public GroupDropListener(UserAdminWrapper userAdminWrapper, Viewer userViewer, User user) {
                        super(userViewer);
                        this.myUserAdminWrapper = userAdminWrapper;
                        this.myUser = user;
                }
 
                @Override
-               public boolean validateDrop(Object target, int operation,
-                               TransferData transferType) {
+               public boolean validateDrop(Object target, int operation, TransferData transferType) {
                        // Target is always OK in a list only view
                        // TODO check if not a string
                        boolean validDrop = true;
@@ -473,8 +495,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                                Group group = (Group) role;
                                group.addMember(myUser);
                                userAdminWrapper.commitOrNotifyTransactionStateChange();
-                               myUserAdminWrapper.notifyListeners(new UserAdminEvent(null,
-                                               UserAdminEvent.ROLE_CHANGED, group));
+                               myUserAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, group));
                        }
                        super.drop(event);
                }
@@ -488,8 +509,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
 
        // LOCAL HELPERS
        private void refreshFormTitle(User group) {
-               getManagedForm().getForm().setText(
-                               UserAdminUtils.getProperty(group, LdapAttrs.cn.name()));
+               // getManagedForm().getForm().setText(UserAdminUtils.getProperty(group,
+               // LdapAttrs.cn.name()));
        }
 
        /** Appends a section with a title */
@@ -509,8 +530,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        }
 
        /** Creates label and multiline text. */
-       Text createLMT(FormToolkit toolkit, Composite body, String label,
-                       String value) {
+       Text createLMT(FormToolkit toolkit, Composite body, String label, String value) {
                Label lbl = toolkit.createLabel(body, label);
                lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
                Text text = toolkit.createText(body, value, SWT.BORDER | SWT.MULTI);
@@ -519,22 +539,33 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        }
 
        /** Creates label and password. */
-       Text createLP(FormToolkit toolkit, Composite body, String label,
-                       String value) {
+       Text createLP(FormToolkit toolkit, Composite body, String label, String value) {
                Label lbl = toolkit.createLabel(body, label);
-               lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
                Text text = toolkit.createText(body, value, SWT.BORDER | SWT.PASSWORD);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
                return text;
        }
 
        /** Creates label and text. */
-       Text createLT(FormToolkit toolkit, Composite body, String label,
-                       String value) {
-               Label lbl = toolkit.createLabel(body, label);
-               lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-               Text text = toolkit.createText(body, value, SWT.BORDER);
+       Text createLT(FormToolkit toolkit, Composite parent, String label, String value) {
+               Label lbl = toolkit.createLabel(parent, label);
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
+               lbl.setFont(EclipseUiUtils.getBoldFont(parent));
+               Text text = toolkit.createText(parent, value, SWT.BORDER);
+               text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+               CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
+               return text;
+       }
+
+       Text createReadOnlyLT(FormToolkit toolkit, Composite parent, String label, String value) {
+               Label lbl = toolkit.createLabel(parent, label);
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
+               lbl.setFont(EclipseUiUtils.getBoldFont(parent));
+               Text text = toolkit.createText(parent, value, SWT.NONE);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+               text.setEditable(false);
+               CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
                return text;
        }
-}
\ No newline at end of file
+}