org.jboss.tools.openshift.express.internal.ui.wizard.application.ApplicationSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.openshift.express.internal.ui.wizard.application.ApplicationSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2011 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.express.internal.ui.wizard.application;

import java.util.Collection;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.jboss.tools.common.ui.WizardUtils;
import org.jboss.tools.common.ui.databinding.DataBindingUtils;
import org.jboss.tools.openshift.express.internal.ui.OpenShiftImages;
import org.jboss.tools.openshift.express.internal.ui.utils.Logger;
import org.jboss.tools.openshift.express.internal.ui.wizard.application.details.ApplicationDetailsDialog;

import com.openshift.client.IApplication;

/**
 * @author Andre Dietisheim
 * @author Xavier Coulon
 */
public class ApplicationSelectionDialog extends TitleAreaDialog {

    private final ApplicationSelectionDialogModel dialogModel;
    private final DataBindingContext dbc;
    private final IWizard wizard;
    private TableViewer tableViewer;

    public ApplicationSelectionDialog(OpenShiftExpressApplicationWizard wizard, IApplication selectedApplication,
            Shell parentShell) {
        super(parentShell);
        this.dialogModel = new ApplicationSelectionDialogModel(wizard.getWizardModel());
        this.dialogModel.setSelectedApplication(selectedApplication);
        this.wizard = wizard;
        this.dbc = new DataBindingContext();
    }

    @Override
    protected Control createContents(Composite parent) {
        Control control = super.createContents(parent);
        setupDialog(parent);
        return control;
    }

    private void setupDialog(Composite parent) {
        parent.getShell().setText("Application selection");
        setTitle("Select an application in the list");
        setTitleImage(OpenShiftImages.OPENSHIFT_LOGO_WHITE_MEDIUM_IMG);
        setDialogHelpAvailable(false);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Creates the SWT Group in which a table which will display the existing applications with their corresponding
     * type. Before each application, a radio button will let the user choose which application to import in his
     * workspace.
     * 
     * @param container
     * @param dbc
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Label titleSeparator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(titleSeparator);

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

        Label applicationLabel = new Label(dialogArea, SWT.NONE);
        applicationLabel.setText("Existing Applications on OpenShift");
        GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.FILL).span(5, 1)
                .applyTo(applicationLabel);
        GridLayoutFactory.fillDefaults().numColumns(2).margins(6, 6).applyTo(dialogArea);

        Composite tableContainer = new Composite(dialogArea, SWT.NONE);
        tableViewer = createTable(tableContainer);
        tableViewer.setInput(dialogModel.getApplications());
        GridDataFactory.fillDefaults().span(1, 2).align(SWT.FILL, SWT.FILL).grab(true, false).hint(SWT.DEFAULT, 200)
                .applyTo(tableContainer);
        tableViewer.addDoubleClickListener(onApplicationDoubleClick());
        Binding selectedApplicationBinding = dbc.bindValue(
                ViewerProperties.singleSelection().observe(tableViewer), BeanProperties
                        .value(ApplicationSelectionDialogModel.PROPERTY_SELECTED_APPLICATION).observe(dialogModel),
                new UpdateValueStrategy().setAfterGetValidator(new IValidator() {
                    @Override
                    public IStatus validate(Object value) {
                        if (value != null) {
                            return ValidationStatus.ok();
                        } else {
                            return ValidationStatus.cancel("Select an application in the list below.");
                        }
                    }
                }), null);

        tableViewer.setSorter(new ViewerSorter() {

            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof IApplication && e2 instanceof IApplication) {
                    return ((IApplication) e1).getName().compareTo(((IApplication) e2).getName());
                }
                return super.compare(viewer, e1, e2);
            }

        });
        Button refreshButton = new Button(dialogArea, SWT.PUSH);
        refreshButton.setText("R&efresh");
        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.TOP).grab(false, false).hint(80, SWT.DEFAULT)
                .applyTo(refreshButton);
        refreshButton.addSelectionListener(onRefresh(dbc));

        Button detailsButton = new Button(dialogArea, SWT.PUSH);
        detailsButton.setText("De&tails...");
        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.TOP).grab(false, true).hint(80, SWT.DEFAULT)
                .applyTo(detailsButton);
        DataBindingUtils.bindEnablementToValidationStatus(detailsButton, IStatus.OK, dbc,
                selectedApplicationBinding);
        detailsButton.addSelectionListener(onDetails(dbc));
        // bottom filler
        Composite spacer = new Composite(dialogArea, SWT.NONE);
        GridDataFactory.fillDefaults().span(2, 1).align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(spacer);
        // horizontal line to separate content from buttons
        Label buttonsSeparator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(buttonsSeparator);

        return dialogArea;
    }

    private IDoubleClickListener onApplicationDoubleClick() {
        return new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                //            openDetailsDialog();
                setApplicationSelected(event.getSelection());
            }
        };
    }

    private void setApplicationSelected(ISelection selection) {
        if (selection instanceof StructuredSelection) {
            final Object firstElement = ((StructuredSelection) selection).getFirstElement();
            if (firstElement instanceof IApplication) {
                IApplication application = (IApplication) firstElement;
                dialogModel.setSelectedApplication(application);
                close();
            }
        }
    }

    protected TableViewer createTable(Composite tableContainer) {
        Table table = new Table(tableContainer, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL);
        int desiredHeight = table.getItemHeight() * 10 + table.getHeaderHeight();
        GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, desiredHeight).applyTo(table);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        TableColumnLayout tableLayout = new TableColumnLayout();
        tableContainer.setLayout(tableLayout);
        TableViewer viewer = new TableViewer(table);
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setSorter(new ViewerSorter());
        createTableColumn("Name", 1, new CellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                final IApplication application = (IApplication) cell.getElement();
                cell.setText(application.getName());
            }
        }, viewer, tableLayout);

        createTableColumn("Type", 1, new CellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                final IApplication application = (IApplication) cell.getElement();
                cell.setText(application.getCartridge().getName());
            }
        }, viewer, tableLayout);

        createTableColumn("URL", 3, new CellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                final IApplication application = (IApplication) cell.getElement();
                cell.setText(application.getApplicationUrl());
            }
        }, viewer, tableLayout);

        return viewer;
    }

    private void createTableColumn(String name, int weight, CellLabelProvider cellLabelProvider, TableViewer viewer,
            TableColumnLayout layout) {
        TableViewerColumn column = new TableViewerColumn(viewer, SWT.LEFT);
        column.getColumn().setText(name);
        column.getColumn().setResizable(true);
        column.setLabelProvider(cellLabelProvider);
        layout.setColumnData(column.getColumn(), new ColumnWeightData(weight, true));
    }

    @SuppressWarnings("unused")
    private SelectionAdapter onRefresh(final DataBindingContext dbc) {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent event) {
                try {
                    WizardUtils.runInWizard(new Job("Loading applications...") {
                        @Override
                        protected IStatus run(IProgressMonitor monitor) {
                            dialogModel.refresh();
                            final Collection<IApplication> applications = dialogModel.getApplications();
                            setViewerInput(applications);
                            return Status.OK_STATUS;
                        }

                    }, wizard.getContainer(), dbc);
                } catch (Exception e) {
                    Logger.error("Failed to refresh applications list", e);
                    // ignore
                }
            }
        };
    }

    private SelectionAdapter onDetails(DataBindingContext dbc) {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                openDetailsDialog();
            }
        };
    }

    private void openDetailsDialog() {
        new ApplicationDetailsDialog(dialogModel.getSelectedApplication(), getShell()).open();
    }

    private void setViewerInput(final Collection<IApplication> applications) {
        getShell().getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                Logger.debug("Setting {} application(s) in the viewer", applications.size());
                tableViewer.setInput(applications);
            }
        });
    }

    public IApplication getSelectedApplication() {
        return dialogModel.getSelectedApplication();
    }
}