org.eclipse.oomph.setup.presentation.EnablementDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.oomph.setup.presentation.EnablementDialog.java

Source

/*
 * Copyright (c) 2015 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.oomph.setup.presentation;

import org.eclipse.oomph.base.provider.BaseEditUtil;
import org.eclipse.oomph.base.util.EAnnotations;
import org.eclipse.oomph.internal.setup.SetupProperties;
import org.eclipse.oomph.p2.Repository;
import org.eclipse.oomph.p2.Requirement;
import org.eclipse.oomph.setup.SetupTask;
import org.eclipse.oomph.setup.VariableTask;
import org.eclipse.oomph.setup.internal.core.SetupCorePlugin;
import org.eclipse.oomph.setup.p2.P2Task;
import org.eclipse.oomph.setup.ui.AbstractSetupDialog;
import org.eclipse.oomph.ui.UIUtil;
import org.eclipse.oomph.util.CollectionUtil;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ItemProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;

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.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Eike Stepper
 */
public class EnablementDialog extends AbstractSetupDialog {
    private static final String TITLE = "Oomph Extension Installation";

    private final EClass eClass;

    private final String typeText;

    private final EList<SetupTask> enablementTasks;

    private final String defaultImageKey;

    private ComposedAdapterFactory adapterFactory;

    public EnablementDialog(Shell parentShell, EClass eClass, String typeText, EList<SetupTask> enablementTasks,
            String defaultImageKey) {
        super(parentShell, TITLE, 650, 400, SetupEditorPlugin.INSTANCE, false);
        this.eClass = eClass;
        this.typeText = typeText;
        this.enablementTasks = enablementTasks;
        this.defaultImageKey = defaultImageKey;

        adapterFactory = BaseEditUtil.createAdapterFactory();
    }

    @Override
    public boolean close() {
        adapterFactory.dispose();
        return super.close();
    }

    @Override
    protected String getShellText() {
        return TITLE;
    }

    @Override
    protected String getDefaultMessage() {
        return "Review the extension details and press Install to proceed with the installation.";
    }

    @Override
    protected int getContainerMargin() {
        return 10;
    }

    @Override
    protected void createUI(Composite parent) {
        initializeDialogUnits(parent);

        ItemProvider input = createTreeViewerInput();

        Composite mainComposite = new Composite(parent, SWT.NONE);
        mainComposite.setLayout(UIUtil.createGridLayout(2));
        mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Label extensionImageLabel = new Label(mainComposite, SWT.NONE);
        extensionImageLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
        extensionImageLabel.setImage(SetupEditorPlugin.INSTANCE.getSWTImage(defaultImageKey));

        Label extensionTextLabel = new Label(mainComposite, SWT.NONE);
        extensionTextLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
        extensionTextLabel.setText("Install " + typeText + " extension:");

        final TreeViewer treeViewer = new TreeViewer(mainComposite, SWT.BORDER);
        treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
        treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
        treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
        treeViewer.setInput(input);

        UIUtil.asyncExec(new Runnable() {
            public void run() {
                treeViewer.expandAll();

                Job iconLoader = new Job("IconLoader") {
                    @Override
                    protected IStatus run(IProgressMonitor monitor) {
                        URI imageURI = EAnnotations.getImageURI(eClass);
                        if (imageURI != null) {
                            final Image image = ExtendedImageRegistry.INSTANCE
                                    .getImage(BaseEditUtil.getImage(imageURI));

                            UIUtil.asyncExec(new Runnable() {
                                public void run() {
                                    extensionImageLabel.setImage(image);
                                }
                            });
                        }

                        return Status.OK_STATUS;
                    }
                };

                iconLoader.setSystem(true);
                iconLoader.schedule();
            }
        });
    }

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

    private ItemProvider createTreeViewerInput() {
        Map<String, Set<Requirement>> requirements = new HashMap<String, Set<Requirement>>();
        List<Requirement> extraRequirements = new ArrayList<Requirement>();

        int size = enablementTasks.size();
        for (int i = 0; i < size; i++) {
            SetupTask task = enablementTasks.get(i);
            if (task instanceof P2Task) {
                P2Task p2Task = (P2Task) task;
                EList<Repository> repositories = p2Task.getRepositories();
                if (repositories.isEmpty()) {
                    extraRequirements.addAll(p2Task.getRequirements());
                } else {
                    Repository repository = repositories.get(0);
                    String url = repository.getURL();

                    if (url.startsWith("${") && i + 1 < size) {
                        SetupTask nextTask = enablementTasks.get(i + 1);
                        if (nextTask instanceof VariableTask) {
                            VariableTask variableTask = (VariableTask) nextTask;
                            if (url.equals("${" + variableTask.getName() + "}")) {
                                url = variableTask.getValue();
                            }
                        }
                    }

                    if (url.equals("${" + SetupProperties.PROP_UPDATE_URL + "}")) {
                        url = SetupCorePlugin.UPDATE_URL;
                    }

                    CollectionUtil.addAll(requirements, url, p2Task.getRequirements());
                }
            }
        }

        List<String> urls = new ArrayList<String>(requirements.keySet());
        Collections.sort(urls);

        ItemProvider input = new ItemProvider(adapterFactory);
        EList<Object> children = input.getChildren();
        Image repositoryImage = SetupEditorPlugin.INSTANCE.getSWTImage("full/obj16/Repository");

        for (String url : urls) {
            ItemProvider repository = new ItemProvider(url, repositoryImage);
            repository.getChildren().addAll(requirements.get(url));
            children.add(repository);
        }

        children.addAll(extraRequirements);
        return input;
    }
}