org.jboss.tools.windup.ui.internal.editor.launch.InputProjectsSection.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.windup.ui.internal.editor.launch.InputProjectsSection.java

Source

/*******************************************************************************
 * Copyright (c) 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.windup.ui.internal.editor.launch;

import static org.jboss.tools.windup.model.domain.ConfigurationResourceUtil.getCurrentProjects;
import static org.jboss.tools.windup.model.domain.WindupConstants.INPUT_CHANGED;
import static org.jboss.tools.windup.ui.internal.Messages.inputProjects;
import static org.jboss.tools.windup.ui.internal.Messages.inputProjectsDescription;

import java.util.Arrays;
import java.util.List;

import javax.annotation.PreDestroy;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
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.ui.dialogs.ListSelectionDialog;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.jboss.tools.windup.ui.internal.Messages;
import org.jboss.tools.windup.ui.internal.editor.AbstractSection;

import com.google.common.collect.Lists;

/**
 * Section for configuring Windup's project input option.
 */
@SuppressWarnings("restriction")
public class InputProjectsSection extends AbstractSection {

    private TableViewer table;

    private IResourceChangeListener listener = new IResourceChangeListener() {
        // TODO: This needs to be optimized. Wait until we're done prototyping.
        @Override
        public void resourceChanged(IResourceChangeEvent event) {
            if (table != null && !table.getTable().isDisposed()) {
                broker.post(INPUT_CHANGED, true);
                focus();
            }
        }
    };

    @Override
    protected void fillSection(Composite parent) {
        section.setDescription(inputProjectsDescription);
        createTable(parent);
        createButtonBar(parent);
        ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
    }

    private void createTable(Composite parent) {
        table = new TableViewer(parent, SWT.BORDER | SWT.MULTI);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(table.getTable());
        table.setLabelProvider(new WorkbenchLabelProvider());
        table.setContentProvider(new ResourceContentProvider());
        reloadTable();
    }

    private void reloadTable() {
        IProject[] projects = getCurrentProjects(configuration);
        table.setInput(projects);
        String label = projects.length > 0 ? inputProjects + " (" + projects.length + ")" : inputProjects;
        section.setText(label);
    }

    private void createButtonBar(Composite parent) {
        Composite container = toolkit.createComposite(parent);
        GridLayoutFactory.fillDefaults().applyTo(container);
        GridDataFactory.fillDefaults().grab(false, true).applyTo(container);

        Button addButton = toolkit.createButton(container, Messages.windupAdd, SWT.PUSH);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(addButton);
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                List<IProject> projects = Lists
                        .newArrayList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
                projects.removeAll(Lists.newArrayList(getCurrentProjects(configuration)));
                ListSelectionDialog dialog = new ListSelectionDialog(parent.getShell(), projects,
                        new ArrayContentProvider(), new JavaUILabelProvider(), Messages.windupProjects);
                dialog.setTitle(Messages.windupProjects);
                dialog.setHelpAvailable(false);
                if (dialog.open() == Window.OK) {
                    Object[] selected = (Object[]) dialog.getResult();
                    if (selected.length > 0) {
                        List<IProject> newProjects = Lists.newArrayList();
                        Arrays.stream(selected).forEach(p -> newProjects.add((IProject) p));
                        modelService.createInput(configuration, newProjects);
                        reloadTable();
                    }
                }
            }
        });

        Button removeButton = toolkit.createButton(container, Messages.windupRemove, SWT.PUSH);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(removeButton);
        removeButton.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings("unchecked")
            @Override
            public void widgetSelected(SelectionEvent e) {
                ISelection selection = table.getSelection();
                if (!selection.isEmpty()) {
                    StructuredSelection ss = (StructuredSelection) selection;
                    List<IProject> projects = (List<IProject>) ss.toList();
                    modelService.deleteInput(configuration, projects);
                    broker.post(INPUT_CHANGED, true);
                    reloadTable();
                }
            }
        });
    }

    public void focus() {
        modelService.synch(configuration);
        reloadTable();
    }

    @PreDestroy
    private void dispose() {
        ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
    }
}