package org.eclipse.emf.emfstore.client.ui.dialogs.login; import org.eclipse.emf.emfstore.client.model.ModelFactory; import org.eclipse.emf.emfstore.client.model.Usersession; import org.eclipse.emf.emfstore.server.exceptions.EmfStoreException; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.wb.swt.ResourceManager; public class LoginDialog extends TitleAreaDialog { private Text passwordField; private Button savePassword; private ComboViewer usernameCombo; private final ILoginDialogController controller; private Usersession selectedUsersession; private boolean passwordModified; private Usersession[] knownUsersessions; /** * Create the dialog. * * @param parentShell */ public LoginDialog(Shell parentShell, ILoginDialogController controller) { super(parentShell); this.controller = controller; } /** * Create contents of the dialog. * * @param parent */ @Override protected Control createDialogArea(Composite parent) { setTitleImage(ResourceManager.getPluginImage("org.eclipse.emf.emfstore.client.ui", "icons/login_icon.png")); setTitle("Log in to " + controller.getServerLabel()); setMessage("Please enter your username and password"); getShell().setText("Authentication required"); Composite area = (Composite) super.createDialogArea(parent); Composite container = new Composite(area, SWT.NONE); container.setLayout(new GridLayout(1, false)); container.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite loginContainer = new Composite(container, SWT.NONE); loginContainer.setLayout(new GridLayout(3, false)); loginContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); loginContainer.setBounds(0, 0, 64, 64); Label usernameLabel = new Label(loginContainer, SWT.NONE); GridData gd_usernameLabel = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); gd_usernameLabel.widthHint = 95; usernameLabel.setLayoutData(gd_usernameLabel); usernameLabel.setText("Username"); usernameCombo = new ComboViewer(loginContainer, SWT.NONE); ComboListener comboListener = new ComboListener(); usernameCombo.addPostSelectionChangedListener(comboListener); Combo combo = usernameCombo.getCombo(); if (controller.isUsersessionLocked()) { combo.setEnabled(false); // combo.setText(controller.getUsersession().getUsername()); } combo.addModifyListener(comboListener); GridData gd_usernameCombo = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_usernameCombo.widthHint = 235; combo.setLayoutData(gd_usernameCombo); new Label(loginContainer, SWT.NONE); Label passwordLabel = new Label(loginContainer, SWT.NONE); GridData gd_passwordLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_passwordLabel.widthHint = 80; passwordLabel.setLayoutData(gd_passwordLabel); passwordLabel.setText("Password"); passwordField = new Text(loginContainer, SWT.BORDER | SWT.PASSWORD); // passwordField.setText("password"); GridData gd_passwordField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_passwordField.widthHint = 250; passwordField.setLayoutData(gd_passwordField); passwordField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { passwordModified = true; flushErrorMessage(); } }); new Label(loginContainer, SWT.NONE); Label savePasswordLabel = new Label(loginContainer, SWT.NONE); savePasswordLabel.setText("Save Password"); savePassword = new Button(loginContainer, SWT.CHECK); new Label(loginContainer, SWT.NONE); initData(); if (controller.getUsersession() == null) { loadUsersession(controller.getServerInfo().getLastUsersession()); } else { loadUsersession(controller.getUsersession()); } return area; } private void initData() { usernameCombo.setContentProvider(ArrayContentProvider.getInstance()); usernameCombo.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Usersession && ((Usersession) element).getUsername() != null) { return ((Usersession) element).getUsername(); } return super.getText(element); } }); knownUsersessions = controller.getKnownUsersessions(); if (!controller.isUsersessionLocked()) { usernameCombo.setInput(knownUsersessions); } } /** * Fills the login dialog data according to the given {@link Usersession}. * * @param usersession * the user session to be loaded */ private void loadUsersession(Usersession usersession) { if (usersession != null && selectedUsersession == usersession) { return; } selectedUsersession = usersession; // reset fields passwordField.setMessage(""); savePassword.setSelection(false); if (selectedUsersession != null) { // check whether text is set correctly if (!usernameCombo.getCombo().getText().equals(selectedUsersession.getUsername())) { usernameCombo.getCombo().setText(selectedUsersession.getUsername()); } if (selectedUsersession.isSavePassword() && selectedUsersession.getPassword() != null) { passwordField.setMessage("<password is saved, reenter to change>"); passwordField.setText(""); savePassword.setSelection(true); } // reset password modified. modified password is only relevant when dealing with saved passwords. passwordModified = false; } } /** * * {@inheritDoc} * * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ @Override protected void okPressed() { try { String username = usernameCombo.getCombo().getText(); String password = passwordField.getText(); boolean savePass = savePassword.getSelection(); Usersession candidate = selectedUsersession; // try to find usersession with same username in order to avoid duplicates if (candidate == null) { candidate = getUsersessionIfKnown(username); } if (candidate == null) { candidate = ModelFactory.eINSTANCE.createUsersession(); candidate.setServerInfo(controller.getServerInfo()); candidate.setUsername(username); } candidate.setSavePassword(savePass); if (passwordModified) { candidate.setPassword(password); } controller.validate(candidate); } catch (EmfStoreException e) { setErrorMessage(e.getMessage() + " Maybe your password changed."); return; } super.okPressed(); } private Usersession getUsersessionIfKnown(String username) { for (Usersession session : knownUsersessions) { if (session.getUsername().equals(username)) { return session; } } return null; } /** * * {@inheritDoc} * * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * * {@inheritDoc} * * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize() */ @Override protected Point getInitialSize() { return new Point(400, 280); } /** * Clears the error message. */ private void flushErrorMessage() { setErrorMessage(null); } private final class ComboListener implements ISelectionChangedListener, ModifyListener { private String lastText = ""; public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection instanceof StructuredSelection) { Object firstElement = ((StructuredSelection) selection).getFirstElement(); if (firstElement instanceof Usersession) { loadUsersession((Usersession) firstElement); } } } public void modifyText(ModifyEvent e) { String text = usernameCombo.getCombo().getText(); if (text != null && !text.equals("") && !text.equals(lastText)) { loadUsersession(getUsersessionIfKnown(text)); lastText = text; } flushErrorMessage(); } } }