/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.foundation.ui.credentials.internal;
import java.util.Arrays;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
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.jboss.tools.foundation.core.credentials.ICredentialDomain;
import org.jboss.tools.foundation.core.credentials.ICredentialsModel;
import org.jboss.tools.foundation.ui.util.FormDataUtility;
public class NewCredentialUserDialog extends TitleAreaDialog {
private ICredentialsModel model;
private ICredentialDomain selectedDomain;
private String user, pass;
private String[] domainNames;
private ICredentialDomain[] allDomains;
private boolean freezeUser = false;
private boolean freezeDomain = false;
private boolean alwaysPrompt = false;
/**
* Open a new user dialog. The selected domain will be pre-selected, but not frozen.
*
* @param parentShell
* @param model
* @param selected
*/
public NewCredentialUserDialog(Shell parentShell, ICredentialsModel model, ICredentialDomain selected) {
super(parentShell);
this.model = model;
this.selectedDomain = selected;
if( selected != null )
freezeDomain = true;
}
/**
* Open a new user dialog. The selected domain and username will be frozen.
*
* @param parentShell
* @param model
* @param selected
* @param user
*/
public NewCredentialUserDialog(Shell parentShell, ICredentialsModel model, ICredentialDomain selected, String user) {
super(parentShell);
this.model = model;
this.selectedDomain = selected;
this.user = user;
freezeDomain = true;
freezeUser = true;
alwaysPrompt = model.credentialRequiresPrompt(selected, user);
}
@Override
public void create() {
super.create();
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setBounds(shell.getLocation().x, shell.getLocation().y, 550, 500);
Shell s2 = shell.getParent().getShell();
if( s2 != null )
shell.setLocation(s2.getLocation());
if( freezeUser) {
shell.setText(CredentialMessages.EditACredentialLabel);
} else
shell.setText(CredentialMessages.AddACredentialLabel);
}
protected int getShellStyle() {
int ret = super.getShellStyle();
return ret | SWT.RESIZE;
}
protected Control createDialogArea(Composite parent) {
if( freezeUser) {
setTitle(CredentialMessages.EditACredentialLabel);
setMessage("Existing passwords will not shown.");
} else
setTitle(CredentialMessages.AddACredentialLabel);
Composite main = new Composite((Composite)super.createDialogArea(parent), SWT.NONE);
main.setLayoutData(new GridData(GridData.FILL_BOTH));
main.setLayout(new FormLayout());
final Combo domains = new Combo(main, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
Label l = new Label(main, SWT.NONE);
l.setText(CredentialMessages.DomainLabel);
Label separator = new Label(main, SWT.SEPARATOR | SWT.HORIZONTAL);
allDomains = model.getDomains();
domainNames = new String[allDomains.length];
for( int i = 0; i < allDomains.length; i++ ) {
domainNames[i] = allDomains[i].getName();
}
domains.setItems(domainNames);
if( selectedDomain != null ) {
int sIndex = Arrays.asList(allDomains).indexOf(selectedDomain);
if( sIndex != -1) {
domains.select(sIndex);
}
}
Label nameLabel = new Label(main, SWT.None);
nameLabel.setText(CredentialMessages.UsernameLabel);
final Text nameText = new Text(main, SWT.SINGLE | SWT.BORDER);
final Button promptBtn = new Button(main, SWT.CHECK);
promptBtn.setText(CredentialMessages.AlwaysPromptForPasswordLabel);
promptBtn.setSelection(alwaysPrompt);
Label passLabel = new Label(main, SWT.None);
passLabel.setText(CredentialMessages.PasswordLabel);
final Text passText = new Text(main, SWT.SINGLE | SWT.BORDER);
if( user != null ) {
nameText.setText(user);
}
final Button showPassword = new Button(main, SWT.CHECK );
showPassword.setText(CredentialMessages.ShowPasswordLabel);
class SL implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent e) {
passwordVisibility();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
passwordVisibility();
}
protected void passwordVisibility() {
boolean selected = showPassword.getSelection();
if (selected) {
passText.setEchoChar('\0');
} else {
passText.setEchoChar('*');
}
}
}
SL sl = new SL();
showPassword.setSelection(false);
passText.setEchoChar('*');
showPassword.addSelectionListener(sl);
sl.passwordVisibility();
int rightMargin = -10;
l.setLayoutData( new FormDataUtility().createFormData(0, 12, null, 0, 0, 10, null, 0));
domains.setLayoutData( new FormDataUtility().createFormData(0, 8, null, 0, 25, 0, 100, rightMargin));
separator.setLayoutData(new FormDataUtility().createFormData(l, 29, null, 0, 0, 10, 100, rightMargin));
nameLabel.setLayoutData(new FormDataUtility().createFormData(separator, 17, null, 0, 0, 10, null, 0));
nameText.setLayoutData( new FormDataUtility().createFormData(separator, 13, null, 0, 25, 0, 100, rightMargin));
promptBtn.setLayoutData(new FormDataUtility().createFormData(nameLabel, 21, null, 0, 0, 10, 100, rightMargin));
passLabel.setLayoutData(new FormDataUtility().createFormData(promptBtn, 15, null, 0, 0, 10, null, 0));
passText.setLayoutData( new FormDataUtility().createFormData(promptBtn, 11, null, 0, 25, 0, 100, rightMargin));
showPassword.setLayoutData(new FormDataUtility().createFormData(passText, 11, null, 0, passText, -140, 100, rightMargin));
nameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
user = nameText.getText();
validate();
}
});
promptBtn.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean enabled = !promptBtn.getSelection();
passText.setEnabled(enabled);
showPassword.setEnabled(enabled);
alwaysPrompt = promptBtn.getSelection();
validate();
}
});
passText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
pass = passText.getText();
validate();
}
});
domains.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
int i = domains.getSelectionIndex();
if( i != -1 ) {
selectedDomain = allDomains[i];
}
validate();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
if( freezeDomain) {
domains.setEnabled(false);
}
if( freezeUser ) {
nameText.setEnabled(false);
}
if( alwaysPrompt ) {
passText.setEnabled(false);
}
return main;
}
private void validate() {
if( selectedDomain == null ) {
setMessage(CredentialMessages.SelectDomain, IMessageProvider.ERROR);
getButton(IDialogConstants.OK_ID).setEnabled(false);
return;
}
if( user == null || user.isEmpty()) {
setMessage(CredentialMessages.UsernameCannotBeBlank, IMessageProvider.ERROR);
getButton(IDialogConstants.OK_ID).setEnabled(false);
return;
}
String[] names = selectedDomain.getUsernames();
if( !freezeUser && Arrays.asList(names).contains(user)) {
setMessage(NLS.bind(CredentialMessages.UsernameAlreadyExists, user, selectedDomain.getName()), IMessageProvider.ERROR);
getButton(IDialogConstants.OK_ID).setEnabled(false);
return;
}
if( !alwaysPrompt && ( pass == null || pass.isEmpty())) {
setMessage(CredentialMessages.PasswordCannotBeBlank, IMessageProvider.ERROR);
getButton(IDialogConstants.OK_ID).setEnabled(false);
return;
}
setMessage(null, IMessageProvider.NONE);
getButton(IDialogConstants.OK_ID).setEnabled(true);
}
public ICredentialDomain getDomain() {
return selectedDomain;
}
public String getUser() {
return user;
}
public boolean isAlwaysPrompt() {
return alwaysPrompt;
}
public String getPass() {
return pass;
}
}