org.jboss.tools.openshift.internal.ui.wizard.project.ManageProjectsWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.openshift.internal.ui.wizard.project.ManageProjectsWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2015-2016 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.project;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Objects;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.osgi.util.NLS;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.jboss.tools.common.ui.DelegatingProgressMonitor;
import org.jboss.tools.common.ui.WizardUtils;
import org.jboss.tools.common.ui.databinding.ParametrizableWizardPageSupport;
import org.jboss.tools.common.ui.databinding.ValueBindingBuilder;
import org.jboss.tools.foundation.core.plugin.log.IPluginLog;
import org.jboss.tools.openshift.internal.common.core.job.AbstractDelegatingMonitorJob;
import org.jboss.tools.openshift.internal.common.ui.databinding.IsNotNull2BooleanConverter;
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.common.ui.utils.UIUtils;
import org.jboss.tools.openshift.internal.common.ui.wizard.AbstractOpenShiftWizardPage;
import org.jboss.tools.openshift.internal.ui.OpenShiftUIActivator;
import org.jboss.tools.openshift.internal.ui.OpenShiftUIMessages;
import org.jboss.tools.openshift.internal.ui.comparators.ProjectViewerComparator;
import org.jboss.tools.openshift.internal.ui.job.DeleteResourceJob;
import org.jboss.tools.openshift.internal.ui.job.OpenShiftJobs;

import com.openshift.restclient.model.IProject;

/**
 * @author jeff.cantrill
 * @author Jeff Maury
 */
public class ManageProjectsWizardPage extends AbstractOpenShiftWizardPage {

    private static final IPluginLog LOG = OpenShiftUIActivator.getDefault().getLogger();
    private ManageProjectsWizardPageModel pageModel;
    private TableViewer viewer;

    private List<IProject> initialProjects;

    public ManageProjectsWizardPage(String title, String description, ManageProjectsWizardPageModel pageModel,
            IWizard wizard) {
        super(title, description, title, wizard);
        this.pageModel = pageModel;
    }

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

        Group group = new Group(parent, SWT.NONE);
        group.setText("OpenShift Projects");
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(group);
        GridLayoutFactory.fillDefaults().numColumns(2).margins(6, 6).applyTo(group);

        // table
        Composite tableContainer = new Composite(group, SWT.NONE);
        this.viewer = createTable(tableContainer);
        GridDataFactory.fillDefaults().span(1, 5).align(SWT.FILL, SWT.FILL).grab(true, true)
                .applyTo(tableContainer);
        viewer.setContentProvider(new ObservableListContentProvider());
        viewer.setInput(BeanProperties.list(ManageProjectsWizardPageModel.PROPERTY_PROJECTS).observe(pageModel));
        loadProjects(dbc);
        initialProjects = getProjects();
        viewer.setComparator(new ProjectViewerComparator());

        IObservableValue viewerSingleSelection = ViewerProperties.singleSelection().observe(viewer);
        ValueBindingBuilder.bind(viewerSingleSelection).to(
                BeanProperties.value(ManageProjectsWizardPageModel.PROPERTY_SELECTED_PROJECT).observe(pageModel))
                .in(dbc);

        // new 
        Button newButton = new Button(group, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(newButton);
        newButton.setText("New...");
        newButton.addSelectionListener(onNew());
        UIUtils.setDefaultButtonWidth(newButton);

        // remove
        Button removeButton = new Button(group, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(removeButton);
        removeButton.setText("Remove...");
        removeButton.addSelectionListener(onRemove(dbc));
        ValueBindingBuilder.bind(WidgetProperties.enabled().observe(removeButton)).notUpdatingParticipant()
                .to(viewerSingleSelection).converting(new IsNotNull2BooleanConverter()).in(dbc);
        UIUtils.setDefaultButtonWidth(removeButton);

        Composite filler = new Composite(group, SWT.None);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(filler);

        // refresh
        Button refreshButton = new Button(group, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.END).applyTo(refreshButton);
        refreshButton.setText("Refresh...");
        refreshButton.addSelectionListener(onRefresh(dbc));
        UIUtils.setDefaultButtonWidth(refreshButton);
    }

    private void loadProjects(DataBindingContext dbc) {
        try {
            WizardUtils.runInWizard(new AbstractDelegatingMonitorJob("Loading OpenShift projects...") {

                @Override
                protected IStatus doRun(IProgressMonitor monitor) {
                    pageModel.loadProjects();
                    return Status.OK_STATUS;
                }
            }, new DelegatingProgressMonitor(), getContainer(), dbc);
        } catch (InvocationTargetException | InterruptedException e) {
            LOG.logError(
                    NLS.bind("Could not load projects for connection {0}", pageModel.getConnection().toString()),
                    e);
        }
    }

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

            @Override
            public void widgetSelected(SelectionEvent e) {
                NewProjectWizard newProjectWizard = new NewProjectWizard(pageModel.getConnection(),
                        pageModel.getProjects());
                int res = WizardUtils.openWizardDialog(newProjectWizard, getShell());
                if (res == IDialogConstants.OK_ID) {
                    IProject newOrSelectedProject = newProjectWizard.getProject();
                    if (newOrSelectedProject != null) {
                        pageModel.setSelectedProject(newOrSelectedProject);
                    }
                }
            }
        };
    }

    private SelectionListener onRemove(final DataBindingContext dbc) {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                IProject project = pageModel.getSelectedProject();
                if (project == null) {
                    return;
                }
                boolean confirm = MessageDialog.openConfirm(getShell(),
                        OpenShiftUIMessages.ResourceDeletionDialogTitle,
                        NLS.bind(OpenShiftUIMessages.ResourceDeletionConfirmation, project.getName()));
                if (!confirm) {
                    return;
                }
                DeleteResourceJob job = OpenShiftJobs.createDeleteResourceJob(project);
                try {
                    org.jboss.tools.common.ui.WizardUtils.runInWizard(job, job.getDelegatingProgressMonitor(),
                            getContainer(), dbc);
                } catch (InvocationTargetException | InterruptedException ex) {
                    OpenShiftUIActivator.getDefault().getLogger()
                            .logError(NLS.bind("Could not delete OpenShift project {0}", project.getName()), ex);
                }
            }
        };
    }

    private SelectionListener onRefresh(final DataBindingContext dbc) {
        return new SelectionAdapter() {

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

    @Override
    protected void setupWizardPageSupport(DataBindingContext dbc) {
        ParametrizableWizardPageSupport.create(IStatus.ERROR | IStatus.CANCEL, this, dbc);
    }

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

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

            @Override
            public int getToolTipDisplayDelayTime(IProject object) {
                return 0;
            }
        };

        this.viewer = new TableViewerBuilder(table, tableContainer).contentProvider(new ArrayContentProvider())
                .column(new IColumnLabelProvider<IProject>() {

                    @Override
                    public String getValue(IProject project) {
                        return project.getName();
                    }
                }).cellToolTipProvider(cellToolTipProvider).name("Name").align(SWT.LEFT).weight(1).minWidth(75)
                .buildColumn().column(new IColumnLabelProvider<IProject>() {

                    @Override
                    public String getValue(IProject project) {
                        return project.getDisplayName();
                    }
                }).cellToolTipProvider(cellToolTipProvider).name("Display Name").align(SWT.LEFT).weight(2)
                .minWidth(100).buildColumn().buildViewer();

        return viewer;
    }

    private void refreshModel(final DataBindingContext dbc) {
        try {
            WizardUtils.runInWizard(new AbstractDelegatingMonitorJob("Refreshing Projects...") {

                @Override
                protected IStatus doRun(IProgressMonitor monitor) {
                    pageModel.refresh();
                    return Status.OK_STATUS;
                }
            }, new DelegatingProgressMonitor(), getContainer(), dbc);
        } catch (InvocationTargetException | InterruptedException e) {
            LOG.logError(
                    NLS.bind("Could not refresh projects for connection {0}", pageModel.getConnection().toString()),
                    e);
        }
    }

    public IProject getSelectedProject() {
        return pageModel.getSelectedProject();
    }

    public List<IProject> getProjects() {
        return pageModel.getProjects();
    }

    @Override
    public void dispose() {
        pageModel.dispose();
        super.dispose();
    }

    public boolean hasChanged() {
        return !Objects.deepEquals(initialProjects, getProjects());
    }
}