org.jboss.tools.openshift.internal.ui.wizard.newapp.fromtemplate.NewApplicationSummaryFromTemplateDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.openshift.internal.ui.wizard.newapp.fromtemplate.NewApplicationSummaryFromTemplateDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.openshift.internal.ui.wizard.newapp.fromtemplate;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.DefaultToolTip;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.jboss.tools.openshift.internal.common.ui.utils.TableViewerBuilder;
import org.jboss.tools.openshift.internal.common.ui.utils.TableViewerBuilder.ICellToolTipProvider;
import org.jboss.tools.openshift.internal.common.ui.utils.TableViewerBuilder.IColumnLabelProvider;
import org.jboss.tools.openshift.internal.ui.OpenShiftImages;
import org.jboss.tools.openshift.internal.ui.dialog.ResourceSummaryContentProvider;
import org.jboss.tools.openshift.internal.ui.dialog.ResourceSummaryDialog;
import org.jboss.tools.openshift.internal.ui.dialog.ResourceSummaryLabelProvider;
import org.jboss.tools.openshift.internal.ui.job.CreateApplicationFromTemplateJob;
import org.jboss.tools.openshift.internal.ui.webhooks.WebHooksDialog;
import org.jboss.tools.openshift.internal.ui.webhooks.WebhookUtil;
import org.jboss.tools.openshift.internal.ui.wizard.newapp.fromtemplate.TemplateParameterViewerUtils.ParameterNameViewerComparator;

import com.openshift.restclient.model.IBuildConfig;
import com.openshift.restclient.model.IResource;
import com.openshift.restclient.model.template.IParameter;

/**
 * 
 * @author jeff.cantrill
 * @author Andre Dietisheim
 * @author Fred Bricon
 */
public class NewApplicationSummaryFromTemplateDialog extends ResourceSummaryDialog {

    private static final int COPIED_NOTIFICATION_SHOW_DURATION = 2 * 1000;

    private CreateApplicationFromTemplateJob job;

    public NewApplicationSummaryFromTemplateDialog(Shell parentShell, CreateApplicationFromTemplateJob job,
            String message) {
        super(parentShell, job.getResources(), "Create Application Summary", message,
                new ResourceSummaryLabelProvider(), new ResourceSummaryContentProvider());
        this.job = job;
    }

    @Override
    protected void createAreaAfterResourceSummary(Composite parent) {

        Composite area = new Composite(parent, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(area);
        GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(area);

        final Collection<IBuildConfig> buildConfigs = findBuildConfigsWithWebHooks();
        if (!buildConfigs.isEmpty()) {
            Link webHooksLink = new Link(area, SWT.NONE);
            webHooksLink.setText(
                    "Click <a>here</a> to display the webhooks available to automatically trigger builds.");
            GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(webHooksLink);
            webHooksLink.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    WebHooksDialog dialog = new WebHooksDialog(getParentShell(), buildConfigs);
                    dialog.open();
                }
            });
        }

        if (job.getParameters().isEmpty()) {
            return;
        }

        Label lblParams = new Label(area, SWT.WRAP);
        lblParams.setText(
                "Please make note of the following parameters which may include values required to administer your resources:");
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).hint(100, SWT.DEFAULT).grab(true, false)
                .applyTo(lblParams);

        Composite container = new Composite(parent, SWT.NONE);
        GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).applyTo(container);
        GridLayoutFactory.fillDefaults().numColumns(2).margins(10, 10).equalWidth(false).applyTo(container);

        Composite parameters = new Composite(container, SWT.NONE);
        GridDataFactory.fillDefaults().hint(100, 200).grab(true, true).applyTo(parameters);

        TableViewer viewer = createTable(parameters);
        viewer.setInput(job.getParameters());

        Button copyToClipboard = new Button(container, SWT.PUSH);
        copyToClipboard.setImage(OpenShiftImages.COPY_TO_CLIPBOARD_IMG);
        copyToClipboard.setToolTipText("Copy parameters to clipboard");
        copyToClipboard.addSelectionListener(onClickCopyButton(lblParams));
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(false, false).applyTo(copyToClipboard);
    }

    private SelectionAdapter onClickCopyButton(final Control control) {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                List<IParameter> params = new ArrayList<>(job.getParameters());
                Collections.sort(params, new Comparator<IParameter>() {

                    @Override
                    public int compare(IParameter p1, IParameter p2) {
                        return p1.getName().compareTo(p2.getName());
                    }
                });
                String text = getAsString(params);
                copyToClipBoard(control, text, "Parameters copied to clipboard");
            }
        };
    }

    private static String getAsString(Collection<IParameter> parameters) {
        StringBuilder content = new StringBuilder();
        for (IParameter param : parameters) {
            content.append(getAsString(param)).append("\r\n");
        }
        return content.toString();
    }

    private static String getAsString(IParameter param) {
        StringBuilder content = new StringBuilder(param.getName());
        content.append(": ").append(param.getValue());
        return content.toString();
    }

    private void copyToClipBoard(Control control, String text, String notification) {
        copyToClipBoard(text);
        notifyCopied(control, notification);
    }

    private void notifyCopied(Control control, String notification) {
        DefaultToolTip copiedNotification = new DefaultToolTip(control, ToolTip.NO_RECREATE, true);
        copiedNotification.setText(notification);
        copiedNotification.setHideDelay(COPIED_NOTIFICATION_SHOW_DURATION);
        copiedNotification.show(control.getLocation());
        copiedNotification.deactivate();
    }

    private void copyToClipBoard(String text) {
        Clipboard clipboard = new Clipboard(Display.getCurrent());
        Object[] data = new Object[] { text };
        Transfer[] dataTypes = new Transfer[] { TextTransfer.getInstance() };
        clipboard.setContents(data, dataTypes);
        clipboard.dispose();
    }

    private Collection<IBuildConfig> findBuildConfigsWithWebHooks() {
        Set<IBuildConfig> buildConfigs = new LinkedHashSet<>();
        for (IResource r : job.getResources()) {
            if (r instanceof IBuildConfig && !WebhookUtil.getWebHooks((IBuildConfig) r).isEmpty()) {
                buildConfigs.add((IBuildConfig) r);
            }
        }
        return buildConfigs;
    }

    public TableViewer createTable(Composite tableContainer) {
        Table table = new Table(tableContainer, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        ICellToolTipProvider<IParameter> cellToolTipProvider = new ICellToolTipProvider<IParameter>() {

            @Override
            public String getToolTipText(IParameter object) {
                return object.getDescription();
            }

            @Override
            public int getToolTipDisplayDelayTime(IParameter object) {
                return 0;
            }
        };
        TableViewer viewer = new TableViewerBuilder(table, tableContainer)
                .contentProvider(new ArrayContentProvider()).column(new IColumnLabelProvider<IParameter>() {

                    @Override
                    public String getValue(IParameter variable) {
                        return variable.getName();
                    }
                }).cellToolTipProvider(cellToolTipProvider).name("Name").align(SWT.LEFT).weight(2).minWidth(100)
                .buildColumn().column(new IColumnLabelProvider<IParameter>() {

                    @Override
                    public String getValue(IParameter parameter) {
                        return TemplateParameterViewerUtils.getValueLabel(parameter);
                    }
                }).cellToolTipProvider(cellToolTipProvider).name("Value").align(SWT.LEFT).weight(2).minWidth(100)
                .buildColumn().buildViewer();
        viewer.setComparator(new ParameterNameViewerComparator());

        viewer.addDoubleClickListener(onDoubleClick(table));
        return viewer;
    }

    private IDoubleClickListener onDoubleClick(final Control control) {
        return new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                IParameter param = (IParameter) selection.getFirstElement();
                if (param != null) {
                    String text = param.getValue();
                    if (StringUtils.isNotBlank(text)) {
                        String notification = param.getName() + " value copied to clipboard";
                        copyToClipBoard(control, text, notification);
                    }
                }
            }
        };
    }
}