/******************************************************************************* * Copyright (c) 2015, 2016 Red Hat Inc. and others. * 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 org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.wizard.WizardPageSupport; 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.jface.wizard.WizardPage; import org.eclipse.linuxtools.docker.core.IDockerImage; import org.eclipse.linuxtools.docker.core.IRegistry; import org.eclipse.swt.SWT; 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.Label; /** * {@link WizardPage} to push an image to a registry. */ public class ImagePushPage extends ImagePullPushPage<ImagePushPageModel> { /** * Constructor * * @param image * the {@link IDockerImage} to push. * @param selectedImageName * the default image name/tag */ public ImagePushPage(final IDockerImage image, final String selectedImageName) { super(WizardMessages.getString("ImagePush.name"), //$NON-NLS-1$ WizardMessages.getString("ImagePush.title"), //$NON-NLS-1$ new ImagePushPageModel(image, selectedImageName)); } @Override public void dispose() { this.dbc.dispose(); super.dispose(); } /** * @return the tag to select/apply on the image */ public String getSelectedImageName() { return getModel().getSelectedImageName(); } /** * @return the target {@link IRegistry} on which to push the image */ public IRegistry getSelectedRegistryAccount() { return getModel().getSelectedRegistry(); } /** * @return flag to indicate if the 'force' option should be used when * tagging the image. */ public boolean isForceTagging() { return getModel().isForceTagging(); } /** * @return flag to indicate if the tagged image should be kept upon * completion. */ public boolean isKeepTaggedImage() { return getModel().isKeepTaggedImage(); } @SuppressWarnings("unchecked") @Override public void createControl(final Composite parent) { parent.setLayout(new GridLayout()); final Composite container = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(3).margins(6, 6) .applyTo(container); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) .grab(true, false).applyTo(container); // registry selection final IObservableValue<IRegistry> registryAccountObservable = super.createRegistrySelectionControls( container); // image selection final IObservableValue<String> imageNameObservable = createImageSelectionControls( container); // force tagging final Button forceTaggingButton = new Button(container, SWT.CHECK); forceTaggingButton.setText(WizardMessages .getString("ImagePushPage.forcetagging.label")); //$NON-NLS-1$ ); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) .grab(true, false).span(2, 1).applyTo(forceTaggingButton); dbc.bindValue(WidgetProperties.selection().observe(forceTaggingButton), BeanProperties.value(ImagePushPageModel.class, ImagePushPageModel.FORCE_TAGGING).observe(getModel())); // keep tagged image upon completion final Button keepTaggedImageButton = new Button(container, SWT.CHECK); keepTaggedImageButton.setText(WizardMessages .getString("ImagePushPage.keeptaggedimage.label")); //$NON-NLS-1$ ); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) .grab(true, false).span(2, 1).applyTo(keepTaggedImageButton); dbc.bindValue( WidgetProperties.selection().observe(keepTaggedImageButton), BeanProperties .value(ImagePushPageModel.class, ImagePushPageModel.KEEP_TAGGED_IMAGE) .observe(getModel())); // setup validation support WizardPageSupport.create(this, dbc); dbc.addValidationStatusProvider(getModel().new ImagePushValidator( imageNameObservable, registryAccountObservable)); setControl(container); } @SuppressWarnings("unchecked") private IObservableValue<String> createImageSelectionControls( final Composite container) { final Label nameLabel = new Label(container, SWT.NULL); nameLabel.setText( WizardMessages.getString("ImagePullPushPage.name.label")); //$NON-NLS-1$ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) .grab(false, false).applyTo(nameLabel); final Combo imageNameCombo = new Combo(container, SWT.DROP_DOWN); imageNameCombo.setToolTipText( WizardMessages.getString("ImagePushName.toolTip")); //$NON-NLS-1$ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) .grab(true, false).applyTo(imageNameCombo); final ComboViewer imageNameComboViewer = new ComboViewer( imageNameCombo); imageNameComboViewer.setContentProvider(new ArrayContentProvider()); imageNameComboViewer.setInput(getModel().getImage().repoTags()); // binding must take place after the input is set, so that default // repo/name can be selected. final IObservableValue<String> imageNameObservable = BeanProperties .value(ImagePushPageModel.class, ImagePullPushPageModel.SELECTED_IMAGE_NAME) .observe(getModel()); dbc.bindValue(WidgetProperties.selection().observe(imageNameCombo), imageNameObservable); // filler for the last column GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER) .grab(false, false).applyTo(new Label(container, SWT.NONE)); return imageNameObservable; } }