package org.eclipse.linuxtools.internal.docker.ui.wizards;
import java.util.stream.Stream;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.linuxtools.docker.core.AbstractRegistry;
import org.eclipse.linuxtools.docker.core.IRegistryAccount;
import org.eclipse.linuxtools.internal.docker.core.RegistryAccountInfo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
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;
public class RegistryAccountDialog extends Dialog {
private String serverAddress;
private String username;
private String email;
private char[] password;
private String title;
private String explanation = WizardMessages
.getString("RegistryAccountDialog.add.edit.explanation"); //$NON-NLS-1$
public RegistryAccountDialog(Shell parentShell, String title) {
super(parentShell);
this.title = title;
}
public RegistryAccountDialog(Shell parentShell, String title,
String defaultServerAddress, String explanation) {
super(parentShell);
this.title = title;
this.serverAddress = defaultServerAddress;
this.explanation = explanation;
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(title);
}
@Override
protected Point getInitialSize() {
return new Point(350, super.getInitialSize().y);
}
@Override
protected Control createDialogArea(Composite parent) {
final int COLUMNS = 2;
final Composite container = new Composite(parent, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL)
.span(COLUMNS, 1).grab(true, true).applyTo(container);
GridLayoutFactory.fillDefaults().numColumns(COLUMNS).margins(10, 10)
.applyTo(container);
final Label explanationLabel = new Label(container, SWT.NONE);
explanationLabel.setText(explanation);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.span(COLUMNS, 1).grab(false, false).applyTo(explanationLabel);
final Label serverLabel = new Label(container, SWT.NONE);
serverLabel.setText(
WizardMessages.getString("RegistryAccountDialog.server.label")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(false, false).applyTo(serverLabel);
final Text serverText = new Text(container, SWT.BORDER);
serverText.setToolTipText(
WizardMessages.getString("RegistryAccountDialog.server.desc")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(serverText);
if (serverAddress != null) {
serverText.setText(serverAddress);
}
serverText.addModifyListener(e -> {
serverAddress = serverText.getText();
validate();
});
final Label usernameLabel = new Label(container, SWT.NONE);
usernameLabel.setText(WizardMessages
.getString("RegistryAccountDialog.username.label")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(false, false).applyTo(usernameLabel);
final Text usernameText = new Text(container, SWT.BORDER);
usernameText.setToolTipText(WizardMessages
.getString("RegistryAccountDialog.username.desc")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(usernameText);
if (username != null) {
usernameText.setText(username);
}
usernameText.addModifyListener(e -> {
username = usernameText.getText();
validate();
});
final Label emailLabel = new Label(container, SWT.NONE);
emailLabel.setText(
WizardMessages.getString("RegistryAccountDialog.email.label")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(false, false).applyTo(emailLabel);
final Text emailText = new Text(container, SWT.BORDER);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(emailText);
if (email != null) {
emailText.setText(email);
} else {
email = ""; //$NON-NLS-1$
}
emailText.addModifyListener(e -> {
email = emailText.getText();
});
final Label passwordLabel = new Label(container, SWT.NONE);
passwordLabel.setText(WizardMessages
.getString("RegistryAccountDialog.password.label")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(false, false).applyTo(passwordLabel);
final Text passwordText = new Text(container, SWT.BORDER);
passwordText.setEchoChar('*');
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(passwordText);
if (password != null) {
passwordText.setText(new String(password));
}
passwordText.addModifyListener(e -> {
password = passwordText.getText().toCharArray();
validate();
});
// status message
return container;
}
private void validate() {
if (serverAddress != null && !serverAddress.isEmpty()
// username and password should be optional
// && username != null && !username.isEmpty()
// && password != null && password.length > 0
) {
getButton(IDialogConstants.OK_ID).setEnabled(true);
} else {
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
}
public void setInputData(IRegistryAccount info) {
this.serverAddress = info.getServerAddress();
this.username = info.getUsername();
this.email = info.getEmail();
this.password = info.getPassword();
}
public IRegistryAccount getSignonInformation() {
final boolean dockerHubRegistryAlias = Stream
.of(AbstractRegistry.DOCKERHUB_REGISTRY_ALIASES)
.anyMatch(alias -> serverAddress.contains(alias));
return new RegistryAccountInfo(serverAddress, username, email, password,
dockerHubRegistryAlias);
}
}