org.eclipse.linuxtools.internal.docker.ui.launch.RunImageLinksTab.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.linuxtools.internal.docker.ui.launch.RunImageLinksTab.java

Source

/*******************************************************************************
 * 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.launch;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.linuxtools.internal.docker.ui.SWTImagesFactory;
import org.eclipse.linuxtools.internal.docker.ui.wizards.ContainerLinkDialog;
import org.eclipse.linuxtools.internal.docker.ui.wizards.ImageRunSelectionModel;
import org.eclipse.linuxtools.internal.docker.ui.wizards.ImageRunSelectionModel.ContainerLinkModel;
import org.eclipse.linuxtools.internal.docker.ui.wizards.WizardMessages;
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.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

public class RunImageLinksTab extends AbstractLaunchConfigurationTab {

    private static final String TAB_NAME = "RunLinksTab.name"; //$NON-NLS-1$

    private static final int COLUMNS = 3;

    private ImageRunSelectionModel model = null;

    public RunImageLinksTab(ImageRunSelectionModel model) {
        this.model = model;
    }

    @Override
    public void createControl(Composite parent) {
        final Composite container = new Composite(parent, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).span(1, 1).grab(true, false).applyTo(container);
        GridLayoutFactory.fillDefaults().numColumns(COLUMNS).margins(6, 6).applyTo(container);
        if (model == null) {
            setErrorMessage(LaunchMessages.getString("NoConnectionError.msg"));
        } else {
            setErrorMessage(null);
            createLinkSettingsSection(container);
        }
        setControl(container);
    }

    private TableViewerColumn createTableViewerColumn(final TableViewer tableViewer, final String title,
            final int width) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        final TableColumn column = viewerColumn.getColumn();
        if (title != null) {
            column.setText(title);
        }
        column.setWidth(width);
        return viewerColumn;
    }

    private void createLinkSettingsSection(final Composite container) {
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(false, false).span(3, 1)
                .applyTo(new Label(container, SWT.NONE));
        final Label linksLabel = new Label(container, SWT.NONE);
        linksLabel.setText(WizardMessages.getString("ImageRunSelectionPage.links"));
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(false, false).span(COLUMNS, 1)
                .applyTo(linksLabel);
        final TableViewer linksTableViewer = createLinksTable(container);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).hint(200, 100)
                .applyTo(linksTableViewer.getTable());
        // buttons
        final Composite buttonsContainers = new Composite(container, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(false, false).applyTo(buttonsContainers);
        GridLayoutFactory.fillDefaults().numColumns(1).margins(0, 0).spacing(SWT.DEFAULT, 0)
                .applyTo(buttonsContainers);

        final Button addButton = new Button(buttonsContainers, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(addButton);
        addButton.setText(WizardMessages.getString("ImageRunSelectionPage.addButton")); //$NON-NLS-1$
        addButton.addSelectionListener(onAddLink());
        final Button editButton = new Button(buttonsContainers, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(editButton);
        editButton.setText(WizardMessages.getString("ImageRunSelectionPage.editButton")); //$NON-NLS-1$
        editButton.setEnabled(false);
        editButton.addSelectionListener(onEditLink(linksTableViewer));
        final Button removeButton = new Button(buttonsContainers, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(removeButton);
        removeButton.setText(WizardMessages.getString("ImageRunSelectionPage.remove")); //$NON-NLS-1$
        removeButton.addSelectionListener(onRemoveLinks(linksTableViewer));
        removeButton.setEnabled(false);
        ViewerSupport.bind(linksTableViewer, model.getLinks(), BeanProperties.values(ContainerLinkModel.class,
                new String[] { ContainerLinkModel.CONTAINER_NAME, ContainerLinkModel.CONTAINER_ALIAS }));
        // disable the edit and removeButton if the table is empty
        linksTableViewer.addSelectionChangedListener(onSelectionChanged(editButton, removeButton));

    }

    private ISelectionChangedListener onSelectionChanged(final Button... targetButtons) {
        return e -> {
            if (e.getSelection().isEmpty()) {
                setControlsEnabled(targetButtons, false);
            } else {
                setControlsEnabled(targetButtons, true);
            }
            updateLaunchConfigurationDialog();
        };
    }

    private TableViewer createLinksTable(final Composite container) {
        final Table table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL);
        final TableViewer tableViewer = new TableViewer(table);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        createTableViewerColumn(tableViewer, WizardMessages.getString("ImageRunSelectionPage.containerNameColumn"), //$NON-NLS-1$
                200);
        createTableViewerColumn(tableViewer, WizardMessages.getString("ImageRunSelectionPage.aliasColumn"), //$NON-NLS-1$
                150);
        tableViewer.setContentProvider(new ObservableListContentProvider());
        return tableViewer;
    }

    private SelectionListener onAddLink() {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                final ContainerLinkDialog dialog = new ContainerLinkDialog(getShell(),
                        model.getSelectedConnection());
                dialog.create();
                if (dialog.open() == IDialogConstants.OK_ID) {
                    model.addLink(dialog.getContainerName(), dialog.getContainerAlias());
                }
                updateLaunchConfigurationDialog();
            }
        };
    }

    private SelectionListener onEditLink(final TableViewer linksTableViewer) {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                final IStructuredSelection selection = linksTableViewer.getStructuredSelection();

                final ContainerLinkModel selectedContainerLink = (ContainerLinkModel) selection.getFirstElement();
                final ContainerLinkDialog dialog = new ContainerLinkDialog(getShell(),
                        model.getSelectedConnection(), selectedContainerLink);
                dialog.create();
                if (dialog.open() == IDialogConstants.OK_ID) {
                    selectedContainerLink.setContainerName(dialog.getContainerName());
                    selectedContainerLink.setContainerAlias(dialog.getContainerAlias());
                    linksTableViewer.refresh();
                    updateLaunchConfigurationDialog();
                }
            }
        };
    }

    private SelectionListener onRemoveLinks(final TableViewer linksTableViewer) {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                final IStructuredSelection selection = linksTableViewer.getStructuredSelection();
                for (@SuppressWarnings("unchecked")
                Iterator<ContainerLinkModel> iterator = selection.iterator(); iterator.hasNext();) {
                    model.removeLink(iterator.next());
                }
                updateLaunchConfigurationDialog();
            }
        };
    }

    private static void setControlsEnabled(final Control[] controls, final boolean enabled) {
        for (Control control : controls) {
            control.setEnabled(enabled);
        }
    }

    @Override
    public Image getImage() {
        return SWTImagesFactory.get(SWTImagesFactory.IMG_CONTAINER_LINK);
    }

    @Override
    public void setDefaults(final ILaunchConfigurationWorkingCopy configuration) {
    }

    @Override
    public void initializeFrom(final ILaunchConfiguration configuration) {
        if (model == null)
            return;
        try {
            // model needs to be recycled
            model.removeLinks();
            final List<String> containerLinks = configuration
                    .getAttribute(IRunDockerImageLaunchConfigurationConstants.LINKS, new ArrayList<String>());
            for (String containerLink : containerLinks) {
                model.addLink(ImageRunSelectionModel.ContainerLinkModel.createContainerLinkModel(containerLink));
            }
        } catch (CoreException e) {
            // do nothing
        }
        // update the underlying launch config working copy on model
        // changes.
        model.addPropertyChangeListener(new LaunchConfigurationChangeListener());
    }

    @Override
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
        if (model == null)
            return;
        ArrayList<String> linksList = new ArrayList<>();
        for (Object o : model.getLinks()) {
            ImageRunSelectionModel.ContainerLinkModel m = (ImageRunSelectionModel.ContainerLinkModel) o;
            linksList.add(m.toString());
        }
        configuration.setAttribute(IRunDockerImageLaunchConfigurationConstants.LINKS, linksList);
    }

    @Override
    public String getName() {
        return LaunchMessages.getString(TAB_NAME);
    }

    private class LaunchConfigurationChangeListener implements PropertyChangeListener {

        @Override
        public void propertyChange(final PropertyChangeEvent evt) {
            updateLaunchConfigurationDialog();
        }
    }

}