blob: e4cd47bb188698457c1aa9b120948eaca785156f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Red Hat.
* All rights reserved. This program and the accompanying materials
* are 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 - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.docker.ui.wizards;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.linuxtools.docker.core.AbstractRegistry;
import org.eclipse.linuxtools.docker.core.IRegistry;
import org.eclipse.linuxtools.docker.core.IRegistryAccount;
import org.eclipse.linuxtools.internal.docker.core.RegistryAccountManager;
import org.eclipse.linuxtools.internal.docker.core.RegistryInfo;
import org.eclipse.linuxtools.internal.docker.ui.SWTImagesFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
/**
* Base {@link WizardPage} for {@link ImagePushPage} and {@link ImagePullPage}
*
* @param <M>
* the type of model associated with this {@link WizardPage}
*/
public abstract class ImagePullPushPage<M extends ImagePullPushPageModel>
extends WizardPage {
protected final DataBindingContext dbc;
protected final String DOCKER_DAEMON_DEFAULT = AbstractRegistry.DOCKERHUB_REGISTRY;
private final M model;
/**
* Constructor.
*
* @param pageName
* the name of the page
* @param title
* the title of the page
* @param model
* the databinding model associated with this page
*
*/
public ImagePullPushPage(final String pageName, final String title,
final M model) {
super(pageName, title, SWTImagesFactory.DESC_BANNER_REPOSITORY);
setMessage(WizardMessages.getString("ImagePull.desc")); //$NON-NLS-1$
this.dbc = new DataBindingContext();
this.model = model;
}
M getModel() {
return this.model;
}
@SuppressWarnings("unchecked")
IObservableValue<IRegistry> createRegistrySelectionControls(
Composite parent) {
// registry selection
final Label accountLabel = new Label(parent, SWT.NULL);
accountLabel.setText(WizardMessages
.getString("ImagePullPushPage.registry.account.label")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(false, false).applyTo(accountLabel);
final Combo registryAccountCombo = new Combo(parent,
SWT.DROP_DOWN | SWT.READ_ONLY);
registryAccountCombo.setToolTipText(WizardMessages
.getString("ImagePullPushPage.registry.account.desc")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(registryAccountCombo);
final ComboViewer registryAccountComboViewer = new ComboViewer(
registryAccountCombo);
registryAccountComboViewer
.setContentProvider(ArrayContentProvider.getInstance());
registryAccountComboViewer
.setLabelProvider(new RegistryAccountLabelProvider());
final List<IRegistry> allRegistryAccounts = getRegistryAccounts();
registryAccountComboViewer.setInput(allRegistryAccounts);
if (!allRegistryAccounts.isEmpty()) {
getModel().setSelectedRegistry(allRegistryAccounts.get(0));
}
final IObservableValue<IRegistry> registryAccountObservable = BeanProperties
.value(ImagePushPageModel.class,
ImagePullPushPageModel.SELECTED_REGISTRY)
.observe(model);
dbc.bindValue(ViewerProperties.singleSelection().observe(
registryAccountComboViewer), registryAccountObservable);
// link to add registries and accounts
final Link addRegistryLink = new Link(parent, SWT.NONE);
addRegistryLink.setText(
WizardMessages.getString("ImagePullPushPage.add.link")); //$NON-NLS-1$
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER)
.grab(true, false).applyTo(addRegistryLink);
addRegistryLink.addSelectionListener(
onAddRegistry(registryAccountComboViewer));
return registryAccountObservable;
}
private SelectionListener onAddRegistry(
final ComboViewer registryAccountComboViewer) {
return new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
final RegistryAccountDialog dialog = new RegistryAccountDialog(
getShell(),
WizardMessages
.getString(
"ImagePullPushPage.addregistry.title"), //$NON-NLS-1$
AbstractRegistry.DOCKERHUB_REGISTRY,
WizardMessages.getString(
"RegistryAccountDialog.add.explanation")); ///$NON-NLS-1$
if (dialog.open() == Window.OK) {
RegistryAccountManager.getInstance()
.add(dialog.getSignonInformation());
final List<IRegistry> updatedRegistryAccounts = getRegistryAccounts();
registryAccountComboViewer
.setInput(updatedRegistryAccounts);
// set selection on the newly created registry
model.setSelectedRegistry(dialog.getSignonInformation());
}
}
};
}
/**
* @return all existing {@link IRegistryAccount} plus an entry at the first
* position for the registry configured in the selected Docker
* daemon.
*/
protected List<IRegistry> getRegistryAccounts() {
// get a local copy an insert an entry at the first position for Docker
// Hub with no credentials
final List<IRegistry> accounts = new ArrayList<>(
RegistryAccountManager.getInstance().getAccounts());
accounts.add(0, new RegistryInfo(DOCKER_DAEMON_DEFAULT, true));
return accounts;
}
static final class RegistryAccountLabelProvider
extends ColumnLabelProvider {
@Override
public String getText(Object element) {
if (element instanceof IRegistryAccount) {
final IRegistryAccount registryAccount = (IRegistryAccount) element;
final StringBuilder textBuilder = new StringBuilder();
// only display account username if it is set.
if (registryAccount.getUsername() != null) {
textBuilder.append(registryAccount.getUsername())
.append('@'); // $NON-NLS-1$
}
textBuilder.append(registryAccount.getServerAddress());
return textBuilder.toString();
}
else if (element instanceof IRegistry) {
final IRegistry registry = (IRegistry) element;
return registry.getServerAddress();
}
return null;
}
}
}