blob: 0066cc08a260f7f282eec3ff1a0be9684e06ed5c [file] [log] [blame]
/*
* Copyright (c) 2014 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.ui.wizards;
import org.eclipse.oomph.base.Annotation;
import org.eclipse.oomph.base.provider.BaseEditUtil;
import org.eclipse.oomph.internal.ui.AccessUtil;
import org.eclipse.oomph.jreinfo.JRE;
import org.eclipse.oomph.jreinfo.JREManager;
import org.eclipse.oomph.jreinfo.ui.JREController;
import org.eclipse.oomph.jreinfo.ui.JREInfoUIPlugin;
import org.eclipse.oomph.p2.core.AgentManager;
import org.eclipse.oomph.p2.core.BundlePool;
import org.eclipse.oomph.p2.core.P2Util;
import org.eclipse.oomph.p2.internal.ui.AgentManagerDialog;
import org.eclipse.oomph.p2.internal.ui.P2ContentProvider;
import org.eclipse.oomph.p2.internal.ui.P2LabelProvider;
import org.eclipse.oomph.p2.internal.ui.P2UIPlugin;
import org.eclipse.oomph.setup.AnnotationConstants;
import org.eclipse.oomph.setup.CatalogSelection;
import org.eclipse.oomph.setup.Product;
import org.eclipse.oomph.setup.ProductVersion;
import org.eclipse.oomph.setup.SetupFactory;
import org.eclipse.oomph.setup.SetupPackage;
import org.eclipse.oomph.setup.internal.core.SetupContext;
import org.eclipse.oomph.setup.internal.core.util.CatalogManager;
import org.eclipse.oomph.setup.provider.CatalogSelectionItemProvider;
import org.eclipse.oomph.setup.provider.IndexItemProvider;
import org.eclipse.oomph.setup.provider.InstallationItemProvider;
import org.eclipse.oomph.setup.provider.ProductCatalogItemProvider;
import org.eclipse.oomph.setup.provider.ProductItemProvider;
import org.eclipse.oomph.setup.provider.SetupItemProviderAdapterFactory;
import org.eclipse.oomph.setup.ui.JREDownloadHandler;
import org.eclipse.oomph.setup.ui.SetupUIPlugin;
import org.eclipse.oomph.ui.PersistentButton;
import org.eclipse.oomph.ui.PersistentButton.DialogSettingsPersistence;
import org.eclipse.oomph.ui.ToolButton;
import org.eclipse.oomph.ui.UIUtil;
import org.eclipse.oomph.util.IOUtil;
import org.eclipse.oomph.util.OS;
import org.eclipse.oomph.util.OomphPlugin;
import org.eclipse.oomph.util.OomphPlugin.BundleFile;
import org.eclipse.oomph.util.PropertiesUtil;
import org.eclipse.oomph.util.StringUtil;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.LocationAdapter;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author Eike Stepper
*/
public class ProductPage extends SetupWizardPage
{
public static final String PAGE_NAME = "ProductPage";
private static final boolean SHOW_BUNDLE_POOL_UI = PropertiesUtil.getProperty(AgentManager.PROP_BUNDLE_POOL_LOCATION) == null;
private static final Product NO_PRODUCT = createNoProduct();
private static boolean OVERWRITE_TMP_IMAGES = true;
private ComposedAdapterFactory adapterFactory;
private CatalogSelector catalogSelector;
private TreeViewer productViewer;
private Browser descriptionBrowser;
private Label versionLabel;
private ComboViewer versionComboViewer;
private ToolButton bitness32Button;
private ToolButton bitness64Button;
private JREController javaController;
private Label javaLabel;
private ComboViewer javaViewer;
private ToolButton javaButton;
private Button poolButton;
private ComboViewer poolComboViewer;
private ToolButton managePoolsButton;
private BundlePool currentBundlePool;
private boolean currentBundlePoolChanging;
public ProductPage()
{
super(PAGE_NAME);
setTitle("Product");
setDescription("Select the product and choose the version you want to install.");
}
@Override
public void dispose()
{
super.dispose();
adapterFactory.dispose();
}
@Override
protected Control createUI(final Composite parent)
{
adapterFactory = new ComposedAdapterFactory(getAdapterFactory());
adapterFactory.insertAdapterFactory(new ItemProviderAdapterFactory());
BaseEditUtil.replaceReflectiveItemProvider(adapterFactory);
ResourceSet resourceSet = getResourceSet();
resourceSet.eAdapters().add(new AdapterFactoryEditingDomain.EditingDomainProvider(new AdapterFactoryEditingDomain(adapterFactory, null, resourceSet)));
Composite mainComposite = new Composite(parent, SWT.NONE);
mainComposite.setLayout(UIUtil.createGridLayout(1));
Control productSash = createProductSash(mainComposite);
productSash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Composite lowerComposite = new Composite(mainComposite, SWT.NONE);
lowerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
lowerComposite.setLayout(UIUtil.createGridLayout(4));
versionLabel = new Label(lowerComposite, SWT.NONE);
versionLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
versionLabel.setText("Product Version:");
AccessUtil.setKey(versionLabel, "productVersion");
versionComboViewer = new ComboViewer(lowerComposite, SWT.READ_ONLY);
versionComboViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
versionComboViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)
{
@Override
public Object[] getElements(Object object)
{
return getValidProductVersions((Product)object).toArray();
}
});
versionComboViewer.setInput(NO_PRODUCT);
Combo versionCombo = versionComboViewer.getCombo();
versionCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
AccessUtil.setKey(versionCombo, "versionChoice");
if (JREManager.BITNESS_CHANGEABLE)
{
bitness32Button = new ToolButton(lowerComposite, SWT.RADIO, SetupUIPlugin.INSTANCE.getSWTImage("32bit.png"), true);
bitness32Button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
bitness32Button.setSelection(false);
bitness32Button.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
bitness32Button.setSelection(true);
bitness64Button.setSelection(false);
javaController.setBitness(32);
}
});
bitness64Button = new ToolButton(lowerComposite, SWT.RADIO, SetupUIPlugin.INSTANCE.getSWTImage("64bit.png"), true);
bitness64Button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
bitness64Button.setSelection(true);
bitness64Button.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
bitness32Button.setSelection(false);
bitness64Button.setSelection(true);
javaController.setBitness(64);
}
});
}
else
{
new Label(lowerComposite, SWT.NONE);
new Label(lowerComposite, SWT.NONE);
}
javaLabel = new Label(lowerComposite, SWT.RIGHT);
javaLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
javaLabel.setText("Java VM:");
javaViewer = new ComboViewer(lowerComposite, SWT.READ_ONLY);
javaViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
javaViewer.setContentProvider(new ArrayContentProvider());
javaViewer.setLabelProvider(new LabelProvider());
javaViewer.setInput(Collections.singletonList(new JRE(new File(""), 0, 0, 0, 0, false, 0)));
javaButton = new ToolButton(lowerComposite, SWT.PUSH, JREInfoUIPlugin.INSTANCE.getSWTImage("jre"), true);
javaButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
javaButton.setToolTipText("Manage Virtual Machines...");
javaButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
javaController.configureJREs();
}
});
JREDownloadHandler downloadHandler = new JREDownloadHandler()
{
@Override
protected Product getProduct()
{
return getSelectedProduct();
}
};
javaController = new JREController(javaLabel, javaViewer, downloadHandler)
{
@Override
protected void modelEmpty(boolean empty)
{
super.modelEmpty(empty);
setPageComplete(!empty);
}
@Override
protected void jreChanged(JRE jre)
{
String vmPath = jre == null ? null : new File(jre.getJavaHome(), "bin").getAbsolutePath();
getWizard().setVMPath(vmPath);
}
@Override
protected void setLabel(String text)
{
super.setLabel(text + ":");
}
};
if (SHOW_BUNDLE_POOL_UI)
{
initBundlePool();
poolButton = new PersistentButton(lowerComposite, SWT.CHECK | SWT.RIGHT, true, new DialogSettingsPersistence(getDialogSettings(), "useBundlePool"));
AccessUtil.setKey(poolButton, "pools");
poolButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
poolButton.setText("Bundle Pool:");
poolButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
if (poolButton.getSelection())
{
IStructuredSelection selection = (IStructuredSelection)poolComboViewer.getSelection();
BundlePool pool = (BundlePool)selection.getFirstElement();
if (pool != null)
{
setCurrentBundlePool(pool);
}
else
{
initBundlePool();
}
}
else
{
setCurrentBundlePool(null);
}
updateDetails(false);
}
});
// Composite poolComposite = new Composite(lowerComposite, SWT.NONE);
// poolComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
// poolComposite.setLayout(UIUtil.createGridLayout(2));
P2LabelProvider labelProvider = new P2LabelProvider();
labelProvider.setAbsolutePools(true);
poolComboViewer = new ComboViewer(lowerComposite, SWT.READ_ONLY);
poolComboViewer.setLabelProvider(labelProvider);
poolComboViewer.setContentProvider(new P2ContentProvider.AllBundlePools());
poolComboViewer.setInput(P2Util.getAgentManager());
poolComboViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
if (currentBundlePoolChanging)
{
return;
}
if (poolButton.getSelection())
{
IStructuredSelection selection = (IStructuredSelection)poolComboViewer.getSelection();
BundlePool pool = (BundlePool)selection.getFirstElement();
if (pool != currentBundlePool)
{
setCurrentBundlePool(pool);
updateDetails(false);
}
}
}
});
Combo poolCombo = poolComboViewer.getCombo();
poolCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
AccessUtil.setKey(poolCombo, "poolChoice");
managePoolsButton = new ToolButton(lowerComposite, SWT.PUSH, P2UIPlugin.INSTANCE.getSWTImage("obj16/agent"), true);
managePoolsButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
managePoolsButton.setToolTipText("Manage Bundle Pools...");
managePoolsButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
manageBundlePools();
}
});
AccessUtil.setKey(managePoolsButton, "managePools");
}
versionComboViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
ProductVersion version = getSelectedProductVersion();
if (version != null)
{
String requiredJavaVersion = version.getRequiredJavaVersion();
javaController.setJavaVersion(requiredJavaVersion);
saveProductVersionSelection(catalogSelector.getCatalogManager(), version);
}
}
});
updateDetails(true);
return mainComposite;
}
private SashForm createProductSash(Composite composite)
{
SashForm sashForm = new SashForm(composite, SWT.SMOOTH | SWT.VERTICAL);
Composite treeComposite = new Composite(sashForm, SWT.NONE);
treeComposite.setLayout(UIUtil.createGridLayout(1));
final CatalogManager catalogManager = getCatalogManager();
catalogSelector = new CatalogSelector(catalogManager, true);
Composite filterComposite = new Composite(treeComposite, SWT.NONE);
filterComposite.setLayout(UIUtil.createGridLayout(2));
filterComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
Composite filterPlaceholder = new Composite(filterComposite, SWT.NONE);
filterPlaceholder.setLayout(UIUtil.createGridLayout(1));
filterPlaceholder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
ToolBar filterToolBar = new ToolBar(filterComposite, SWT.FLAT | SWT.RIGHT);
final ToolItem collapseAllButton = new ToolItem(filterToolBar, SWT.NONE);
collapseAllButton.setToolTipText("Collapse All");
collapseAllButton.setImage(SetupUIPlugin.INSTANCE.getSWTImage("collapse-all"));
AccessUtil.setKey(collapseAllButton, "collapse");
final ToolItem catalogsButton = new ToolItem(filterToolBar, SWT.DROP_DOWN);
catalogsButton.setToolTipText("Select Catalogs");
catalogsButton.setImage(SetupUIPlugin.INSTANCE.getSWTImage("catalogs"));
catalogSelector.configure(catalogsButton);
AccessUtil.setKey(catalogsButton, "catalogs");
final FilteredTreeWithoutWorkbench filteredTree = new FilteredTreeWithoutWorkbench(treeComposite, SWT.BORDER);
Control filterControl = filteredTree.getChildren()[0];
filterControl.setParent(filterPlaceholder);
AccessUtil.setKey(filteredTree.getFilterControl(), "filter");
addHelpCallout(filteredTree.getViewer().getTree(), 1);
productViewer = filteredTree.getViewer();
productViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
productViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)
{
@Override
public void notifyChanged(Notification notification)
{
super.notifyChanged(notification);
getShell().getDisplay().asyncExec(new Runnable()
{
public void run()
{
try
{
Job.getJobManager().join(filteredTree.getRefreshJobFamily(), new NullProgressMonitor());
}
catch (OperationCanceledException ex)
{
// Ignore.
}
catch (InterruptedException ex)
{
// Ignore.
}
if (productViewer.getExpandedElements().length == 0)
{
final Object[] elements = getElements(productViewer.getInput());
if (elements.length > 0)
{
productViewer.expandToLevel(elements[0], 1);
if (productViewer.getSelection().isEmpty())
{
EMap<Product, ProductVersion> defaultProductVersions = catalogManager.getSelection().getDefaultProductVersions();
if (!defaultProductVersions.isEmpty())
{
Product defaultProduct = defaultProductVersions.get(0).getKey();
viewer.setSelection(new StructuredSelection(defaultProduct), true);
}
}
}
}
}
});
}
});
final Tree productTree = productViewer.getTree();
productTree.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite descriptionComposite = new Composite(sashForm, SWT.BORDER);
descriptionComposite.setLayout(new FillLayout());
descriptionBrowser = new Browser(descriptionComposite, SWT.NONE);
descriptionBrowser.addLocationListener(new LocationAdapter()
{
@Override
public void changing(LocationEvent event)
{
if (!"about:blank".equals(event.location))
{
OS.INSTANCE.openSystemBrowser(event.location);
event.doit = false;
}
}
});
AccessUtil.setKey(descriptionBrowser, "description");
sashForm.setWeights(new int[] { 7, 2 });
final CatalogSelection selection = catalogManager.getSelection();
productViewer.setInput(selection);
// productTree.setFocus();
// UIUtil.timerExec(1000, new Runnable()
// {
// public void run()
// {
// ITreeContentProvider contentProvider = (ITreeContentProvider)productViewer.getContentProvider();
// selectFirstLeaf(selection, contentProvider);
// }
// });
collapseAllButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
productViewer.collapseAll();
}
});
productViewer.addDoubleClickListener(new IDoubleClickListener()
{
public void doubleClick(DoubleClickEvent event)
{
IStructuredSelection selection = (IStructuredSelection)productViewer.getSelection();
Object element = selection.getFirstElement();
if (element instanceof Product)
{
if (isPageComplete())
{
advanceToNextPage();
}
return;
}
boolean expanded = productViewer.getExpandedState(element);
productViewer.setExpandedState(element, !expanded);
}
});
productViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
updateDetails(false);
}
});
return sashForm;
}
// private void selectFirstLeaf(Object object, ITreeContentProvider contentProvider)
// {
// Object[] children = contentProvider.getChildren(object);
// if (children != null && children.length != 0)
// {
// Object firstChild = children[0];
// selectFirstLeaf(firstChild, contentProvider);
// }
// else
// {
// productViewer.setSelection(new StructuredSelection(object));
// }
// }
@Override
public void leavePage(boolean forward)
{
if (forward)
{
ProductVersion productVersion = getSelectedProductVersion();
getWizard().setSetupContext(SetupContext.create(getResourceSet(), productVersion));
}
}
public boolean refreshJREs()
{
if (javaController != null)
{
javaController.refresh();
return true;
}
return false;
}
private void updateDetails(boolean initial)
{
Product product = getSelectedProduct();
if (product == null)
{
product = NO_PRODUCT;
}
versionComboViewer.setInput(product);
boolean productSelected = product != NO_PRODUCT;
String error = productSelected ? null : "Select a product from the catalogs and choose the product version.";
if (productSelected)
{
ProductVersion version = getDefaultProductVersion(catalogSelector.getCatalogManager(), product);
if (version != null)
{
versionComboViewer.setSelection(new StructuredSelection(version));
}
else
{
error = "The selected product has no versions that can be installed on this platform.";
}
}
descriptionBrowser.setEnabled(productSelected);
descriptionBrowser.setText(safe(productSelected ? getDescriptionHTML(product) : null));
versionLabel.setEnabled(productSelected);
versionComboViewer.getControl().setEnabled(productSelected);
if (JREManager.BITNESS_CHANGEABLE)
{
bitness32Button.setEnabled(productSelected);
bitness64Button.setEnabled(productSelected);
}
javaLabel.setEnabled(productSelected);
javaViewer.getControl().setEnabled(productSelected);
javaButton.setEnabled(productSelected);
if (poolButton != null)
{
poolButton.setEnabled(productSelected);
boolean poolNeeded = productSelected && poolButton.getSelection();
poolComboViewer.getControl().setEnabled(poolNeeded);
managePoolsButton.setEnabled(poolNeeded);
currentBundlePoolChanging = true;
if (poolNeeded)
{
if (currentBundlePool != null)
{
poolComboViewer.setSelection(new StructuredSelection(currentBundlePool));
}
else
{
if (error == null)
{
error = "Select a bundle pool or disable the use of a bundle pool.";
}
poolComboViewer.setSelection(StructuredSelection.EMPTY);
}
}
else
{
poolComboViewer.setSelection(StructuredSelection.EMPTY);
}
currentBundlePoolChanging = false;
}
if (!initial)
{
setErrorMessage(error);
setPageComplete(error == null);
}
}
private String getDescriptionHTML(Product product)
{
String imageURI = getProductImageURI(product);
String description = product.getDescription();
String label = product.getLabel();
if (StringUtil.isEmpty(label))
{
label = product.getName();
}
return "<html><body style=\"margin:5px;\"><img src=\"" + imageURI
+ "\" width=\"42\" height=\"42\" align=\"absmiddle\"></img><b>&nbsp;&nbsp;&nbsp;<span style=\"font-family:'Arial',Verdana,sans-serif; font-size:100%\">"
+ safe(label) + "</b><br/><hr/></span><span style=\"font-family:'Arial',Verdana,sans-serif; font-size:75%\">" + safe(description)
+ "</span></body></html>";
}
private void setCurrentBundlePool(BundlePool pool)
{
if (pool != null)
{
P2Util.getAgentManager().setDefaultBundlePool(SetupUIPlugin.INSTANCE.getSymbolicName(), pool);
System.setProperty(AgentManager.PROP_BUNDLE_POOL_LOCATION, pool.getLocation().getAbsolutePath());
}
else
{
System.clearProperty(AgentManager.PROP_BUNDLE_POOL_LOCATION);
}
currentBundlePool = pool;
}
private void initBundlePool()
{
BundlePool pool = P2Util.getAgentManager().getDefaultBundlePool(SetupUIPlugin.INSTANCE.getSymbolicName());
setCurrentBundlePool(pool);
}
private void manageBundlePools()
{
AgentManagerDialog dialog = new AgentManagerDialog(getShell())
{
@Override
protected void createButtonsForButtonBar(Composite parent)
{
super.createButtonsForButtonBar(parent);
Button button = getButton(IDialogConstants.OK_ID);
if (button != null)
{
button.setEnabled(false);
}
}
@Override
protected void elementChanged(Object element)
{
Button button = getButton(IDialogConstants.OK_ID);
if (button != null)
{
button.setEnabled(element instanceof BundlePool);
}
}
};
IStructuredSelection selection = (IStructuredSelection)poolComboViewer.getSelection();
BundlePool pool = (BundlePool)selection.getFirstElement();
if (pool != null)
{
dialog.setSelectedElement(pool);
}
int result = dialog.open();
poolComboViewer.refresh();
if (result == AgentManagerDialog.OK)
{
pool = (BundlePool)dialog.getSelectedElement();
poolComboViewer.setSelection(pool == null ? StructuredSelection.EMPTY : new StructuredSelection(pool));
}
}
private Product getSelectedProduct()
{
IStructuredSelection selection = (IStructuredSelection)productViewer.getSelection();
Object element = selection.getFirstElement();
if (element instanceof Product)
{
return (Product)element;
}
return null;
}
private ProductVersion getSelectedProductVersion()
{
IStructuredSelection selection = (IStructuredSelection)versionComboViewer.getSelection();
Object element = selection.getFirstElement();
if (element instanceof ProductVersion)
{
return (ProductVersion)element;
}
return null;
}
public static ProductVersion getDefaultProductVersion(CatalogManager catalogManager, Product product)
{
ProductVersion version = catalogManager.getSelection().getDefaultProductVersions().get(product);
List<ProductVersion> validProductVersions = getValidProductVersions(product);
if (!validProductVersions.contains(version))
{
ProductVersion firstReleasedProductVersion = null;
ProductVersion latestProductVersion = null;
ProductVersion latestReleasedProductVersion = null;
for (ProductVersion productVersion : validProductVersions)
{
String versionName = productVersion.getName();
if ("latest.released".equals(versionName))
{
latestReleasedProductVersion = productVersion;
}
else if ("latest".equals(versionName))
{
latestProductVersion = productVersion;
}
else if (firstReleasedProductVersion == null)
{
firstReleasedProductVersion = productVersion;
}
}
if (latestReleasedProductVersion != null)
{
version = latestReleasedProductVersion;
}
else if (firstReleasedProductVersion != null)
{
version = firstReleasedProductVersion;
}
else
{
version = latestProductVersion;
}
if (version != null)
{
saveProductVersionSelection(catalogManager, version);
}
}
return version;
}
public static void saveProductVersionSelection(CatalogManager catalogManager, ProductVersion version)
{
EMap<Product, ProductVersion> defaultProductVersions = catalogManager.getSelection().getDefaultProductVersions();
Product product = version.getProduct();
defaultProductVersions.put(product, version);
defaultProductVersions.move(0, defaultProductVersions.indexOfKey(product));
catalogManager.saveSelection();
}
private static Product createNoProduct()
{
Product product = SetupFactory.eINSTANCE.createProduct();
product.setName("<no product selected>");
product.setLabel(product.getName());
ProductVersion version = SetupFactory.eINSTANCE.createProductVersion();
version.setName("<no product version selected");
version.setName(version.getName());
product.getVersions().add(version);
return product;
}
private static String safe(String string)
{
if (string == null)
{
return "";
}
return string;
}
public static List<ProductVersion> getValidProductVersions(Product product)
{
EList<ProductVersion> versions = product.getVersions();
if (OS.INSTANCE.isMac())
{
// Filter out the older releases because the latest p2, with it's layout changes for the Mac, can't install a correct image from older repositories.
List<ProductVersion> filteredProductVersions = new ArrayList<ProductVersion>();
for (ProductVersion version : versions)
{
String label = version.getLabel();
if (label == null || !label.contains("Luna") && !label.contains("Kepler") && !label.contains("Juno"))
{
filteredProductVersions.add(version);
}
}
return filteredProductVersions;
}
return versions;
}
public static String getProductImageURI(Product product)
{
String imageURI = null;
Annotation annotation = product.getAnnotation(AnnotationConstants.ANNOTATION_BRANDING_INFO);
if (annotation != null)
{
imageURI = annotation.getDetails().get(AnnotationConstants.KEY_IMAGE_URI);
}
if (imageURI == null)
{
imageURI = getImageURI(SetupUIPlugin.INSTANCE, "classic2.jpg");
}
else
{
imageURI = IOUtil.decodeImageData(imageURI);
}
return imageURI;
}
public static String getImageURI(OomphPlugin plugin, String iconName)
{
File iconFile = new File(PropertiesUtil.getProperty("java.io.tmpdir"), iconName);
if (OVERWRITE_TMP_IMAGES || !iconFile.exists())
{
iconFile.getParentFile().mkdirs();
BundleFile bundleFile = plugin.getRootFile().getChild("icons/" + iconName);
bundleFile.export(iconFile);
}
return iconFile.toURI().toString();
}
/**
* @author Eike Stepper
*/
private static final class ItemProviderAdapterFactory extends SetupItemProviderAdapterFactory implements SetupPackage.Literals
{
@Override
public Adapter createCatalogSelectionAdapter()
{
if (catalogSelectionItemProvider == null)
{
catalogSelectionItemProvider = new CatalogSelectionItemProvider(this)
{
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
{
if (childrenFeatures == null)
{
childrenFeatures = new ArrayList<EStructuralFeature>();
childrenFeatures.add(CATALOG_SELECTION__PRODUCT_CATALOGS);
}
return childrenFeatures;
}
@Override
protected Object overlayImage(Object object, Object image)
{
return image;
}
};
}
return catalogSelectionItemProvider;
}
@Override
public Adapter createIndexAdapter()
{
if (indexItemProvider == null)
{
indexItemProvider = new IndexItemProvider(this)
{
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
{
if (childrenFeatures == null)
{
childrenFeatures = new ArrayList<EStructuralFeature>();
childrenFeatures.add(INDEX__PRODUCT_CATALOGS);
}
return childrenFeatures;
}
@Override
protected Object overlayImage(Object object, Object image)
{
return image;
}
};
}
return indexItemProvider;
}
@Override
public Adapter createProductCatalogAdapter()
{
if (productCatalogItemProvider == null)
{
productCatalogItemProvider = new ProductCatalogItemProvider(this)
{
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
{
if (childrenFeatures == null)
{
childrenFeatures = new ArrayList<EStructuralFeature>();
childrenFeatures.add(PRODUCT_CATALOG__PRODUCTS);
}
return childrenFeatures;
}
@Override
protected Object overlayImage(Object object, Object image)
{
return image;
}
};
}
return productCatalogItemProvider;
}
@Override
public Adapter createProductAdapter()
{
if (productItemProvider == null)
{
productItemProvider = new ProductItemProvider(this)
{
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
{
if (childrenFeatures == null)
{
childrenFeatures = new ArrayList<EStructuralFeature>();
}
return childrenFeatures;
}
@Override
protected Object overlayImage(Object object, Object image)
{
return image;
}
};
}
return productItemProvider;
}
@Override
public Adapter createInstallationAdapter()
{
if (installationItemProvider == null)
{
installationItemProvider = new InstallationItemProvider(this)
{
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
{
if (childrenFeatures == null)
{
childrenFeatures = new ArrayList<EStructuralFeature>();
childrenFeatures.add(INSTALLATION__PRODUCT_VERSION);
}
return childrenFeatures;
}
@Override
protected Object overlayImage(Object object, Object image)
{
return image;
}
};
}
return installationItemProvider;
}
}
}