diff options
Diffstat (limited to 'containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ContainerLinkDialog.java')
-rw-r--r-- | containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ContainerLinkDialog.java | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ContainerLinkDialog.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ContainerLinkDialog.java new file mode 100644 index 0000000000..fcb4c64abc --- /dev/null +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ContainerLinkDialog.java @@ -0,0 +1,337 @@ +/******************************************************************************* + * Copyright (c) 2015 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.Arrays; +import java.util.List; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.beans.BeanProperties; +import org.eclipse.core.databinding.observable.value.IValueChangeListener; +import org.eclipse.core.databinding.observable.value.ValueChangeEvent; +import org.eclipse.jface.databinding.swt.ISWTObservableValue; +import org.eclipse.jface.databinding.swt.WidgetProperties; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.fieldassist.ComboContentAdapter; +import org.eclipse.jface.fieldassist.ContentProposal; +import org.eclipse.jface.fieldassist.ContentProposalAdapter; +import org.eclipse.jface.fieldassist.IContentProposal; +import org.eclipse.jface.fieldassist.IContentProposalProvider; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.linuxtools.docker.core.IDockerConnection; +import org.eclipse.linuxtools.docker.core.IDockerContainer; +import org.eclipse.linuxtools.internal.docker.ui.databinding.BaseDatabindingModel; +import org.eclipse.linuxtools.internal.docker.ui.wizards.ImageRunSelectionModel.ContainerLinkModel; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +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; + +/** + * @author xcoulon + * + */ +public class ContainerLinkDialog extends Dialog { + + private final IDockerConnection connection; + + private final ContainerLinkDialogModel model; + + private final List<String> containerNames; + + private final DataBindingContext dbc = new DataBindingContext(); + + protected ContainerLinkDialog(final Shell shell, + final IDockerConnection connection) { + super(shell); + this.connection = connection; + this.model = new ContainerLinkDialogModel(); + this.containerNames = WizardUtils.getContainerNames(connection); + } + + public ContainerLinkDialog(final Shell shell, + final IDockerConnection connection, + final ContainerLinkModel selectedContainerLink) { + super(shell); + this.connection = connection; + this.model = new ContainerLinkDialogModel(selectedContainerLink); + this.containerNames = WizardUtils.getContainerNames(connection); + } + + @Override + protected void configureShell(final Shell shell) { + super.configureShell(shell); + setShellStyle(getShellStyle() | SWT.RESIZE); + shell.setText("Container Linking"); + } + + @Override + protected Point getInitialSize() { + return new Point(400, super.getInitialSize().y); + } + + @Override + protected Control createDialogArea(final 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, false).applyTo(container); + GridLayoutFactory.fillDefaults().numColumns(COLUMNS).margins(6, 6) + .applyTo(container); + final Label explanationLabel = new Label(container, SWT.NONE); + explanationLabel + .setText("Select a container to link and give it an alias:"); //$NON-NLS-1$ + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) + .span(COLUMNS, 1).grab(false, false).applyTo(explanationLabel); + final Label containerLabel = new Label(container, SWT.NONE); + containerLabel.setText("Container:"); //$NON-NLS-1$ + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) + .grab(false, false).applyTo(containerLabel); + final Combo containerSelectionCombo = new Combo(container, SWT.NONE); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) + .grab(true, false).applyTo(containerSelectionCombo); + final ComboViewer containerSelectionComboViewer = new ComboViewer( + containerSelectionCombo); + containerSelectionComboViewer + .setContentProvider(new ArrayContentProvider()); + containerSelectionComboViewer.setInput(model.getContainerNames()); + new ContentProposalAdapter(containerSelectionCombo, + new ComboContentAdapter() { + @Override + public void insertControlContents(Control control, + String text, int cursorPosition) { + final Combo combo = (Combo) control; + final Point selection = combo.getSelection(); + combo.setText(text); + selection.x = text.length(); + selection.y = selection.x; + combo.setSelection(selection); + } + }, getContainerNameContentProposalProvider( + containerSelectionCombo), + null, null); + final Label aliasLabel = new Label(container, SWT.NONE); + aliasLabel.setText("Alias:"); //$NON-NLS-1$ + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) + .grab(false, false).applyTo(aliasLabel); + final Text containerAliasText = new Text(container, SWT.BORDER); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) + .grab(true, false).applyTo(containerAliasText); + // error message + final Label errorMessageLabel = new Label(container, SWT.NONE); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) + .span(COLUMNS, 1).grab(true, false).applyTo(errorMessageLabel); + + final ISWTObservableValue containerNameObservable = WidgetProperties + .selection().observe(containerSelectionComboViewer.getCombo()); + + dbc.bindValue(containerNameObservable, + BeanProperties + .value(ContainerLinkDialogModel.class, + ContainerLinkDialogModel.CONTAINER_NAME) + .observe(model)); + final ISWTObservableValue containerAliasObservable = WidgetProperties + .text(SWT.Modify).observe(containerAliasText); + + dbc.bindValue(containerAliasObservable, + BeanProperties + .value(ContainerLinkDialogModel.class, + ContainerLinkDialogModel.CONTAINER_ALIAS) + .observe(model)); + containerNameObservable.addValueChangeListener( + onContainerLinkSettingsChanged(errorMessageLabel)); + containerAliasObservable.addValueChangeListener( + onContainerLinkSettingsChanged(errorMessageLabel)); + return container; + } + + private IValueChangeListener onContainerLinkSettingsChanged( + final Label errorMessageLabel) { + return new IValueChangeListener() { + + @Override + public void handleValueChange(ValueChangeEvent event) { + validateInput(errorMessageLabel); + } + }; + } + + @Override + protected Button createButton(Composite parent, int id, String label, + boolean defaultButton) { + final Button button = super.createButton(parent, id, label, + defaultButton); + if (id == IDialogConstants.OK_ID) { + button.setEnabled(false); + } + return button; + } + + public String getContainerName() { + return model.getContainerName(); + } + + public String getContainerAlias() { + return model.getContainerAlias(); + } + + /** + * Creates an {@link IContentProposalProvider} to propose + * {@link IDockerContainer} names based on the current text. + * + * @param items + * @return + */ + private IContentProposalProvider getContainerNameContentProposalProvider( + final Combo containerSelectionCombo) { + return new IContentProposalProvider() { + + @Override + public IContentProposal[] getProposals(final String contents, + final int position) { + final List<IContentProposal> proposals = new ArrayList<IContentProposal>(); + for (String containerName : containerSelectionCombo + .getItems()) { + if (containerName.contains(contents)) { + proposals.add(new ContentProposal(containerName, + containerName, containerName, position)); + } + } + return proposals.toArray(new IContentProposal[0]); + } + }; + } + + private void validateInput(final Label errorMessageLabel) { + final String selectedContainerName = model.getContainerName(); + final Object[] containerNames = model.getContainerNames().toArray(); + final String containerAlias = model.getContainerAlias(); + if (selectedContainerName == null || selectedContainerName.isEmpty()) { + setOkButtonEnabled(false); + } else if (Arrays.binarySearch(containerNames, 0, containerNames.length, + selectedContainerName) < 0) { + setOkButtonEnabled(false); + } else if (containerAlias == null || containerAlias.isEmpty()) { + setOkButtonEnabled(false); + return; + } else { + setOkButtonEnabled(true); + } + } + + private void setOkButtonEnabled(final boolean enabled) { + getButton(IDialogConstants.OK_ID).setEnabled(enabled); + } + + class ContainerLinkDialogModel extends BaseDatabindingModel { + + public static final String CONTAINER_NAME = "containerName"; + + public static final String CONTAINER_ALIAS = "containerAlias"; + + private String containerName; + + private String containerAlias; + + public ContainerLinkDialogModel() { + } + + public ContainerLinkDialogModel( + final ContainerLinkModel selectedContainerLink) { + this(); + this.containerName = selectedContainerLink.getContainerName(); + this.containerAlias = selectedContainerLink.getContainerAlias(); + } + + public IDockerConnection getConnection() { + return connection; + } + + private List<String> getContainerNames() { + return containerNames; + } + + public List<IDockerContainer> getContainers() { + return getConnection().getContainers(); + } + + public String getContainerName() { + return containerName; + } + + public void setContainerName(final String containerName) { + firePropertyChange(CONTAINER_NAME, this.containerName, + this.containerName = containerName); + } + + public String getContainerAlias() { + return containerAlias; + } + + public void setContainerAlias(final String containerAlias) { + firePropertyChange(CONTAINER_ALIAS, this.containerAlias, + this.containerAlias = containerAlias); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ((containerAlias == null) ? 0 + : containerAlias.hashCode()); + result = prime * result + + ((containerName == null) ? 0 : containerName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ContainerLinkDialogModel other = (ContainerLinkDialogModel) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (containerAlias == null) { + if (other.containerAlias != null) + return false; + } else if (!containerAlias.equals(other.containerAlias)) + return false; + if (containerName == null) { + if (other.containerName != null) + return false; + } else if (!containerName.equals(other.containerName)) + return false; + return true; + } + + private ContainerLinkDialog getOuterType() { + return ContainerLinkDialog.this; + } + + } + +} |