blob: e9c81404ff32451f1dfabea2a16affb32ab6a443 [file] [log] [blame]
/*
* 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;
}
}