org.eclipse.linuxtools.internal.docker.ui.wizards.ConfigureLabelsPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.linuxtools.internal.docker.ui.wizards.ConfigureLabelsPage.java

Source

/*******************************************************************************
 * 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.Iterator;
import java.util.LinkedHashMap;

import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
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.jface.wizard.WizardPage;
import org.eclipse.linuxtools.docker.ui.Activator;
import org.eclipse.linuxtools.internal.docker.ui.SWTImagesFactory;
import org.eclipse.linuxtools.internal.docker.ui.launch.LaunchMessages;
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 ConfigureLabelsPage extends WizardPage {

    private final int COLUMNS = 2;
    private static final String CONTAINER_FILTER_LABELS = "containerFilterLabels"; //$NON-NLS-1$

    private final ConfigureLabelsModel model;

    public ConfigureLabelsPage() {
        super("ConfigureLabelsPage", //$NON-NLS-1$
                WizardMessages.getString("ConfigureLabelsPage.title"), //$NON-NLS-1$
                SWTImagesFactory.DESC_BANNER_REPOSITORY);
        setPageComplete(true);
        this.model = new ConfigureLabelsModel();
    }

    public ConfigureLabelsModel getModel() {
        return 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);
            createLabelVariablesContainer(container);
        }
        setControl(container);
    }

    private void createLabelVariablesContainer(final Composite container) {
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(false, false).span(3, 1)
                .applyTo(new Label(container, SWT.NONE));
        final Label envVarLabel = new Label(container, SWT.NONE);
        envVarLabel.setText(WizardMessages.getString("ImageRunResourceVolVarPage.labelVarLabel")); //$NON-NLS-1$
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).span(COLUMNS, 1)
                .applyTo(envVarLabel);
        final TableViewer labelVariablesTableViewer = createLabelVariablesTable(container);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).hint(200, 100)
                .applyTo(labelVariablesTableViewer.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("ImageRunResourceVolVarPage.addButton")); //$NON-NLS-1$
        addButton.setEnabled(true);
        addButton.addSelectionListener(onAddLabelVariable(labelVariablesTableViewer));
        final Button editButton = new Button(buttonsContainers, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(editButton);
        editButton.setText(WizardMessages.getString("ImageRunResourceVolVarPage.editButton")); //$NON-NLS-1$
        editButton.setEnabled(true);
        editButton.addSelectionListener(onEditLabelVariable(labelVariablesTableViewer));
        editButton.setEnabled(false);
        final Button removeButton = new Button(buttonsContainers, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(removeButton);
        removeButton.setText(WizardMessages.getString("ImageRunResourceVolVarPage.removeButton")); //$NON-NLS-1$
        removeButton.addSelectionListener(onRemoveLabelVariable(labelVariablesTableViewer));
        removeButton.setEnabled(false);
        setDefaultValues();
        // update table content when selected image changes
        ViewerSupport.bind(labelVariablesTableViewer, model.getLabelVariables(), BeanProperties.values(
                LabelVariableModel.class, new String[] { LabelVariableModel.NAME, LabelVariableModel.VALUE }));

        // disable the edit and removeButton if the table is empty
        labelVariablesTableViewer.addSelectionChangedListener(onSelectionChanged(editButton, removeButton));
    }

    private void setDefaultValues() {
        IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
        String filterLabelString = preferences.get(CONTAINER_FILTER_LABELS, ""); //$NON-NLS-1$
        String[] labels = filterLabelString.split("\u00a0");
        LinkedHashMap<String, String> labelMap = new LinkedHashMap<>();
        for (String label : labels) {
            if (label.length() > 1) {
                String[] tokens = label.split("="); //$NON-NLS-1$
                String key = tokens[0];
                String value = ""; //$NON-NLS-1$
                if (tokens.length > 1)
                    value = tokens[1];
                labelMap.put(key, value);
            }
        }
        model.setLabelVariables(labelMap);
    }

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

    private TableViewerColumn addTableViewerColumn(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 TableViewer createLabelVariablesTable(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);
        addTableViewerColumn(tableViewer, WizardMessages.getString("ImageRunResourceVolVarPage.nameColumn"), //$NON-NLS-1$
                200);
        addTableViewerColumn(tableViewer, WizardMessages.getString("ImageRunResourceVolVarPage.valueColumn"), //$NON-NLS-1$
                200);
        tableViewer.setContentProvider(new ObservableListContentProvider());
        return tableViewer;
    }

    private SelectionListener onAddLabelVariable(final TableViewer labelVariablesTableViewer) {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final ContainerLabelVariableDialog dialog = new ContainerLabelVariableDialog(getShell());
                dialog.create();
                if (dialog.open() == IDialogConstants.OK_ID) {
                    model.getLabelVariables().add(dialog.getLabelVariable());
                    labelVariablesTableViewer.add(dialog.getLabelVariable());
                    labelVariablesTableViewer.refresh();
                }
            }
        };
    }

    private SelectionListener onEditLabelVariable(final TableViewer labelVariablesTableViewer) {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final LabelVariableModel selectedVariable = (LabelVariableModel) labelVariablesTableViewer
                        .getStructuredSelection().getFirstElement();
                final ContainerLabelVariableDialog dialog = new ContainerLabelVariableDialog(getShell(),
                        selectedVariable);
                dialog.create();
                if (dialog.open() == IDialogConstants.OK_ID) {
                    selectedVariable.setName(dialog.getLabelVariable().getName());
                    selectedVariable.setValue(dialog.getLabelVariable().getValue());
                    labelVariablesTableViewer.refresh();
                }
            }
        };
    }

    private SelectionListener onRemoveLabelVariable(final TableViewer labelVariablesTableViewer) {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                final IStructuredSelection selection = labelVariablesTableViewer.getStructuredSelection();
                for (@SuppressWarnings("unchecked")
                Iterator<LabelVariableModel> iterator = selection.iterator(); iterator.hasNext();) {
                    LabelVariableModel m = iterator.next();
                    model.removeLabelVariable(m);
                    labelVariablesTableViewer.remove(m);
                    labelVariablesTableViewer.refresh();
                }
            }
        };
    }

    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_LABELS_TAB);
    }

}