blob: 9efbc122abff5a55ce117eb6832cb025131cdf71 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font should be
* activated and used by other components.
*******************************************************************************/
package org.eclipse.ui.internal.ide.dialogs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ICapabilityInstallWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.internal.ide.Category;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.registry.Capability;
import org.eclipse.ui.internal.ide.registry.CapabilityRegistry;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class ProjectCapabilitySimpleSelectionPage extends WizardPage {
private IWorkbench workbench;
private IStructuredSelection selection;
private IProject project;
private TreeViewer viewer;
private CapabilityRegistry reg;
private Capability chosenCapability;
private HashMap mapCapToWizard = new HashMap();
/**
* Creates an instance of this page.
*/
public ProjectCapabilitySimpleSelectionPage(String pageName,
IWorkbench workbench, IStructuredSelection selection,
IProject project) {
super(pageName);
this.workbench = workbench;
this.selection = selection;
this.project = project;
this.reg = IDEWorkbenchPlugin.getDefault().getCapabilityRegistry();
}
/* (non-Javadoc)
* Method declared on IWizardPage
*/
public boolean canFlipToNextPage() {
return isPageComplete();
}
/* (non-Javadoc)
* Method declared on IDialogPage
*/
public void createControl(Composite parent) {
Font font = parent.getFont();
Composite topContainer = new Composite(parent, SWT.NONE);
topContainer.setLayout(new GridLayout());
topContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
Label label = new Label(topContainer, SWT.LEFT);
label.setText(IDEWorkbenchMessages.ProjectCapabilitySelectionGroup_capabilities);
GridData data = new GridData();
data.verticalAlignment = SWT.TOP;
label.setLayoutData(data);
label.setFont(font);
viewer = new TreeViewer(topContainer, SWT.SINGLE | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER);
viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
viewer.getTree().setFont(font);
viewer.setLabelProvider(new WorkbenchLabelProvider());
viewer.setContentProvider(getContentProvider());
viewer.setInput(reg);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
chosenCapability = null;
if (event.getSelection() instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) event
.getSelection();
if (sel != null && !sel.isEmpty()) {
Object result = sel.getFirstElement();
if (result instanceof Capability) {
chosenCapability = (Capability) result;
}
}
}
setPageComplete(validateChosenCapability());
}
});
setControl(topContainer);
}
/**
* Returns the content provider for the viewer
*/
private IContentProvider getContentProvider() {
return new WorkbenchContentProvider() {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof CapabilityRegistry) {
ArrayList cats = reg.getUsedCategories();
if (reg.getMiscCategory() != null)
cats.add(reg.getMiscCategory());
return cats.toArray();
}
if (parentElement instanceof Category)
return ((Category) parentElement)
.getChildren(parentElement);
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof CapabilityRegistry)
return true;
if (element instanceof Category)
return ((Category) element).hasElements();
return false;
}
};
}
/* (non-Javadoc)
* Method declared on IWizardPage.
*/
public IWizardPage getNextPage() {
if (chosenCapability == null)
return null;
final IWizard[] wizard = new IWizard[1];
wizard[0] = (IWizard) mapCapToWizard.get(chosenCapability);
if (wizard[0] == null) {
BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
public void run() {
ICapabilityInstallWizard wiz;
wiz = chosenCapability.getInstallWizard();
if (wiz != null) {
wiz.init(workbench, selection, project);
wiz.addPages();
mapCapToWizard.put(chosenCapability, wiz);
wizard[0] = wiz;
}
}
});
}
if (wizard[0] == null)
return null;
IWizardPage page = wizard[0].getStartingPage();
wizard[0] = null;
return page;
}
private boolean validateChosenCapability() {
if (chosenCapability == null) {
setErrorMessage(null);
return false;
}
Capability[] caps = reg.getProjectCapabilities(project);
List existingCaps = Arrays.asList(caps);
if (existingCaps.contains(chosenCapability)) {
setErrorMessage(IDEWorkbenchMessages.ProjectCapabilitySimpleSelectionPage_capabilityExist);
return false;
}
String[] ids = reg.getPrerequisiteIds(chosenCapability);
Capability[] prereqs = reg.findCapabilities(ids);
for (int i = 0; i < prereqs.length; i++) {
if (prereqs[i] == null) {
setErrorMessage(NLS.bind(IDEWorkbenchMessages.ProjectCapabilitySimpleSelectionPage_capabilityMissing, ids[i]));
return false;
}
if (!existingCaps.contains(prereqs[i])) {
setErrorMessage(NLS.bind(IDEWorkbenchMessages.ProjectCapabilitySimpleSelectionPage_capabilityRequired, prereqs[i].getName()));
return false;
}
}
ids = reg.getMembershipSetIds(chosenCapability);
List idsList = Arrays.asList(ids);
for (int i = 0; i < caps.length; i++) {
String[] setIds = reg.getMembershipSetIds(caps[i]);
for (int j = 0; j < setIds.length; j++) {
if (idsList.contains(setIds[j])) {
setErrorMessage(NLS.bind(IDEWorkbenchMessages.ProjectCapabilitySimpleSelectionPage_capabilitySet, caps[i].getName()));
return false;
}
}
}
Capability[] newCaps = new Capability[caps.length + 1];
System.arraycopy(caps, 0, newCaps, 0, caps.length);
newCaps[caps.length] = chosenCapability;
IStatus status = reg.validateCapabilities(newCaps);
if (!status.isOK()) {
setErrorMessage(status.getMessage());
return false;
}
setErrorMessage(null);
return true;
}
}