package org.nightlabs.jfire.auth.ui.preference; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import javax.jdo.FetchPlan; import javax.security.auth.login.LoginException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.language.I18nTextEditor; import org.nightlabs.base.ui.language.I18nTextEditor.EditMode; import org.nightlabs.base.ui.language.I18nTextEditorMultiLine; import org.nightlabs.base.ui.progress.ProgressMonitorWrapper; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.util.RCPUtil; import org.nightlabs.jfire.auth.ui.resource.Messages; import org.nightlabs.jfire.base.login.ui.Login; import org.nightlabs.jfire.security.dao.UserManagementSystemTypeDAO; import org.nightlabs.jfire.security.integration.UserManagementSystemType; import org.nightlabs.progress.ProgressMonitor; /** * Preference page for editing names and descriptions for existent {@link UserManagementSystemType} objects. * * @author Denis Dudnik <deniska.dudnik[at]gmail{dot}com> * */ public class UserManagementSystemTypePreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private final static String[] FETCH_GROUPS_USER_MANAGEMENT_SYSTEM_TYPES = new String[]{ UserManagementSystemType.FETCH_GROUP_NAME, UserManagementSystemType.FETCH_GROUP_DESCRIPTION, FetchPlan.DEFAULT }; private final static int FETCH_DEPTH_USER_MANAGEMENT_SYSTEM_TYPES = 3; private Job loadTypesJob; private UserManagementSystemTypeTable userManagementSystemTypeTable; private I18nTextEditor nameEditor; private I18nTextEditorMultiLine descriptionEditor; boolean isDirty = false; private UserManagementSystemType<?> selectedUserManagementSystemType; /** * Default constructor */ public UserManagementSystemTypePreferencePage() { super(); setDescription(Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.pageDescription")); //$NON-NLS-1$ } /** * {@inheritDoc} */ @Override protected Control createContents(Composite parent) { Composite content = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER); content.setLayout(new GridLayout(1, false)); content.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); try { Login.getLogin(false).setForceLogin(true); Login.getLogin(); } catch (LoginException e) { setValid(false); return content; } userManagementSystemTypeTable = new UserManagementSystemTypeTable(content, SWT.NONE, true, AbstractTableComposite.DEFAULT_STYLE_SINGLE_BORDER); userManagementSystemTypeTable.setLinesVisible(true); userManagementSystemTypeTable.setHeaderVisible(true); userManagementSystemTypeTable.addSelectionChangedListener(defaultSelectionListener); userManagementSystemTypeTable.getTableViewer().setSorter(new ViewerSorter()); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.minimumHeight = 100; gd.heightHint = 150; userManagementSystemTypeTable.setLayoutData(gd); userManagementSystemTypeTable.setInput(Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.userManagementSystemTypeTableLoadingLabel")); //$NON-NLS-1$ loadTypesJob = new Job(Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.loadUserManagementSystemTypesJobTitle")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor){ try { final Collection<UserManagementSystemType<?>> allUserManagementSystemTypes = UserManagementSystemTypeDAO.sharedInstance().getAllUserManagementSystemTypes( FETCH_GROUPS_USER_MANAGEMENT_SYSTEM_TYPES, FETCH_DEPTH_USER_MANAGEMENT_SYSTEM_TYPES, monitor); Display display = userManagementSystemTypeTable.getDisplay(); if (!display.isDisposed()) { final Job thisJob = this; display.asyncExec(new Runnable() { public void run() { if (loadTypesJob != thisJob){ return; } userManagementSystemTypeTable.setInput(allUserManagementSystemTypes); } }); } } catch (Exception e) { throw new RuntimeException(e); } return Status.OK_STATUS; } }; loadTypesJob.schedule(); nameEditor = new I18nTextEditor(content, Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.nameEditorLabel")); //$NON-NLS-1$ nameEditor.setToolTipText(Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.nameEditorTooltip")); //$NON-NLS-1$ nameEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); nameEditor.setVisible(false); nameEditor.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { isDirty = true; String editText = ""; //$NON-NLS-1$ try{ nameEditor.getEditText(); }catch(Exception e){ // do nothing in case text is disposed or null } setValid(!"".equals(editText)); //$NON-NLS-1$ } }); descriptionEditor = new I18nTextEditorMultiLine(content, Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.descriptionEditorLabel")); //$NON-NLS-1$ descriptionEditor.setToolTipText(Messages.getString("org.nightlabs.jfire.auth.ui.preference.UserManagementSystemTypePreferencePage.descriptionEditorTooltip")); //$NON-NLS-1$ descriptionEditor.setVisibleLineCount(I18nTextEditorMultiLine.DEFAULT_LINECOUNT + 3); descriptionEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_BEGINNING)); descriptionEditor.setVisible(false); descriptionEditor.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { isDirty = true; } }); return content; } /** * {@inheritDoc} */ @Override public boolean performOk() { String editText = ""; //$NON-NLS-1$ try{ nameEditor.getEditText(); }catch(Exception e){ // do nothing in case text is disposed or null } if (Login.isLoggedIn() && selectedUserManagementSystemType != null && !"".equals(editText) //$NON-NLS-1$ && isDirty){ ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(RCPUtil.getActiveShell()); progressDialog.setOpenOnRun(true); try { progressDialog.run(false, false, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { if (selectedUserManagementSystemType.getName() != null){ nameEditor.copyToOriginal(); }else{ selectedUserManagementSystemType.setName(nameEditor.getI18nText()); } if (selectedUserManagementSystemType.getDescription() != null){ descriptionEditor.copyToOriginal(); }else{ selectedUserManagementSystemType.setDescription(descriptionEditor.getI18nText()); } selectedUserManagementSystemType = UserManagementSystemTypeDAO.sharedInstance().storeUserManagementSystemType( selectedUserManagementSystemType, true, FETCH_GROUPS_USER_MANAGEMENT_SYSTEM_TYPES, FETCH_DEPTH_USER_MANAGEMENT_SYSTEM_TYPES, new ProgressMonitorWrapper(monitor)); isDirty = false; } }); } catch (Exception e) { throw new RuntimeException(e); } } return super.performOk(); } /** * {@inheritDoc} */ @Override public void init(IWorkbench workbench) { // do nothing } private ISelectionChangedListener defaultSelectionListener = new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { if (!event.getSelection().isEmpty() && event.getSelection() instanceof StructuredSelection) { StructuredSelection sel = (StructuredSelection) event.getSelection(); if (sel.getFirstElement() instanceof UserManagementSystemType) { selectedUserManagementSystemType = (UserManagementSystemType<?>) sel.getFirstElement(); nameEditor.setI18nText(selectedUserManagementSystemType.getName(), EditMode.BUFFERED); descriptionEditor.setI18nText(selectedUserManagementSystemType.getDescription(), EditMode.BUFFERED); nameEditor.setVisible(true); descriptionEditor.setVisible(true); } }else{ nameEditor.setVisible(false); descriptionEditor.setVisible(false); } } }; }