org.jboss.tools.openshift.express.internal.ui.wizard.embed.EmbedCartridgeWizardPage.java Source code

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2012 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.embed;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
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.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.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IElementComparer;
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.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.jboss.tools.common.ui.WizardUtils;
import org.jboss.tools.openshift.express.internal.ui.OpenShiftUIActivator;
import org.jboss.tools.openshift.express.internal.ui.job.EmbedCartridgesJob;
import org.jboss.tools.openshift.express.internal.ui.wizard.AbstractOpenShiftWizardPage;
import org.jboss.tools.openshift.express.internal.ui.wizard.CreationLogDialog;
import org.jboss.tools.openshift.express.internal.ui.wizard.application.ApplicationWizardModel;

import com.openshift.client.IEmbeddableCartridge;
import com.openshift.client.IEmbeddedCartridge;

/**
 * @author Andr Dietisheim
 */
public class EmbedCartridgeWizardPage extends AbstractOpenShiftWizardPage {

    private static final long EMBED_CARTRIDGES_TIMEOUT = 2 * 60 * 1000;
    private EmbedCartridgeWizardPageModel pageModel;
    private CheckboxTableViewer viewer;

    public EmbedCartridgeWizardPage(ApplicationWizardModel wizardModel, IWizard wizard) {
        super("Embed Cartridges", "Please select the cartridges to embed into your application",
                "EmbedCartridgePage", wizard);
        this.pageModel = new EmbedCartridgeWizardPageModel(wizardModel);
    }

    @Override
    protected void doCreateControls(Composite parent, DataBindingContext dbc) {
        GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(parent);

        Group embedGroup = new Group(parent, SWT.NONE);
        embedGroup.setText("Embeddable Cartridges");
        GridDataFactory.fillDefaults().hint(200, 300).align(SWT.FILL, SWT.FILL).grab(true, true)
                .applyTo(embedGroup);
        GridLayoutFactory.fillDefaults().numColumns(3).margins(6, 6).applyTo(embedGroup);

        Composite tableContainer = new Composite(embedGroup, SWT.NONE);
        this.viewer = createTable(tableContainer);
        GridDataFactory.fillDefaults().span(3, 1).align(SWT.FILL, SWT.FILL).grab(true, true)
                .applyTo(tableContainer);
        dbc.bindSet(ViewerProperties.checkedElements(IEmbeddableCartridge.class).observe(viewer), BeanProperties
                .set(EmbedCartridgeWizardPageModel.PROPERTY_SELECTED_EMBEDDABLE_CARTRIDGES).observe(pageModel));
        ;
        // strategy has to be attached after the binding, so that the binding
        // can still add the checked cartridge and the strategy can correct
        viewer.addCheckStateListener(new EmbedCartridgeStrategyAdapter(pageModel, this));

        // hiding buttons for now: https://issues.jboss.org/browse/JBIDE-10399
        // Button checkAllButton = new Button(embedGroup, SWT.PUSH);
        // checkAllButton.setText("Embed A&ll");
        // GridDataFactory.fillDefaults()
        // .hint(110, SWT.DEFAULT).align(SWT.FILL,
        // SWT.CENTER).applyTo(checkAllButton);
        // checkAllButton.addSelectionListener(onCheckAll());

        // Button uncheckAllButton = new Button(embedGroup, SWT.PUSH);
        // uncheckAllButton.setText("Embed N&one");
        // GridDataFactory.fillDefaults()
        // .hint(110, SWT.DEFAULT).align(SWT.FILL,
        // SWT.CENTER).applyTo(uncheckAllButton);
        // uncheckAllButton.addSelectionListener(onUncheckAll());
    }

    protected CheckboxTableViewer createTable(Composite tableContainer) {
        Table table = new Table(tableContainer,
                SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL | SWT.CHECK);
        table.setLinesVisible(true);
        TableColumnLayout tableLayout = new TableColumnLayout();
        tableContainer.setLayout(tableLayout);
        CheckboxTableViewer viewer = new CheckboxTableViewer(table);
        viewer.setComparer(new EqualityComparer());
        viewer.setContentProvider(new ArrayContentProvider());

        viewer.setSorter(new ViewerSorter() {

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

        });

        createTableColumn("Embeddable Cartridge", 1, new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                IEmbeddableCartridge cartridge = (IEmbeddableCartridge) cell.getElement();
                cell.setText(cartridge.getName());
            }
        }, 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.setLabelProvider(cellLabelProvider);
        layout.setColumnData(column.getColumn(), new ColumnWeightData(weight, true));
    }

    // private SelectionListener onCheckAll() {
    // return new SelectionAdapter() {
    //
    // @Override
    // public void widgetSelected(SelectionEvent e) {
    // viewer.setAllChecked(true);
    // try {
    // addJenkinsCartridge(IEmbeddedCartridge.JENKINS_14);
    // } catch (OpenShiftException ex) {
    // OpenShiftUIActivator.log("Could not select jenkins cartridge", ex);
    // } catch (SocketTimeoutException ex) {
    // OpenShiftUIActivator.log("Could not select jenkins cartridge", ex);
    // }
    // }
    //
    // };
    // }

    // private SelectionListener onUncheckAll() {
    // return new SelectionAdapter() {
    //
    // @Override
    // public void widgetSelected(SelectionEvent e) {
    // viewer.setAllChecked(false);
    // }
    //
    // };
    // }

    @Override
    protected void onPageActivated(DataBindingContext dbc) {
        try {
            WizardUtils.runInWizard(new Job("Loading embeddable cartridges...") {

                @Override
                protected IStatus run(IProgressMonitor monitor) {
                    try {
                        setViewerInput(pageModel.loadEmbeddableCartridges());
                        setViewerCheckedElements(pageModel.getSelectedEmbeddableCartridges());
                        return Status.OK_STATUS;
                    } catch (Exception e) {
                        clearViewer();
                        return OpenShiftUIActivator.createErrorStatus("Could not load embeddable cartridges", e);
                    }
                }

            }, getContainer(), getDataBindingContext());
        } catch (Exception e) {
            // ignore
        }
    }

    private void clearViewer() {
        setViewerInput(new ArrayList<IEmbeddableCartridge>());
    }

    private void setViewerCheckedElements(final Collection<IEmbeddableCartridge> cartridges) {
        getShell().getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                viewer.setCheckedElements(cartridges.toArray());
            }
        });
    }

    private void safeRefreshSelectedEmbeddedCartridges() {
        getShell().getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                try {
                    Set<IEmbeddableCartridge> selectedEmbeddableCartridges = pageModel
                            .refreshSelectedEmbeddedCartridges();
                    viewer.setCheckedElements(selectedEmbeddableCartridges.toArray());
                } catch (Exception e) {
                    OpenShiftUIActivator.log(e);
                }
            }
        });
    }

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

            @Override
            public void run() {
                viewer.setInput(cartridges);
            }
        });
    }

    public boolean processCartridges() {
        try {
            EmbedCartridgesJob job = new EmbedCartridgesJob(
                    new ArrayList<IEmbeddableCartridge>(pageModel.getSelectedEmbeddableCartridges()),
                    pageModel.getApplication());
            IStatus result = WizardUtils.runInWizard(job, job.getDelegatingProgressMonitor(), getContainer(),
                    EMBED_CARTRIDGES_TIMEOUT);
            if (!result.isOK()) {
                safeRefreshSelectedEmbeddedCartridges();
            } else {
                openLogDialog(job.getAddedCartridges());
            }
            return result.isOK();
        } catch (Exception e) {
            return false;
        }
    }

    private void openLogDialog(final List<IEmbeddedCartridge> cartridges) {
        if (cartridges.size() == 0) {
            return;
        }

        getShell().getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                new CreationLogDialog(getShell(), cartridges).open();

            }
        });
    }

    /**
     * Viewer element comparer based on #equals(). The default implementation in
     * CheckboxTableViewer compares elements based on instance identity.
     * <p>
     * We need this since the available cartridges (item listed in the viewer)
     * are not the same instance as the ones in the embedded application (items
     * to check in the viewer).
     */
    private static class EqualityComparer implements IElementComparer {

        @Override
        public boolean equals(Object thisObject, Object thatObject) {
            if (thisObject == null) {
                return thatObject != null;
            }

            if (thatObject == null) {
                return false;
            }

            return thisObject.equals(thatObject);
        }

        @Override
        public int hashCode(Object element) {
            return element.hashCode();
        }

    }
}