blob: 92564c0d1ad32d2d58171590b203b4a9d7e619a6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.bugs.wizards;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.mylyn.internal.tasks.bugs.AbstractSupportElement;
import org.eclipse.mylyn.internal.tasks.bugs.AttributeTaskMapper;
import org.eclipse.mylyn.internal.tasks.bugs.SupportCategory;
import org.eclipse.mylyn.internal.tasks.bugs.SupportProduct;
import org.eclipse.mylyn.internal.tasks.bugs.SupportProvider;
import org.eclipse.mylyn.internal.tasks.bugs.SupportProviderManager;
import org.eclipse.mylyn.internal.tasks.bugs.SupportRequest;
import org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter;
import org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.bugs.IProduct;
import org.eclipse.mylyn.tasks.bugs.IProvider;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
/**
* @author Steffen Pingel
*/
public class ReportBugOrEnhancementWizard extends Wizard {
private class SupportContentProvider implements IStructuredContentProvider {
private SupportProviderManager providerManager;
private Object input;
public Object[] getElements(Object inputElement) {
if (inputElement instanceof SupportProvider) {
List<SupportProduct> providerProducts = getProducts((SupportProvider) inputElement);
return providerProducts.toArray();
} else if (input == inputElement) {
List<AbstractSupportElement> elements = new ArrayList<AbstractSupportElement>();
Collection<SupportCategory> categories = providerManager.getCategories();
for (SupportCategory category : categories) {
List<IProvider> providers = category.getProviders();
// filter valid providers
List<IProvider> validProviders = new ArrayList<IProvider>();
for (IProvider provider : providers) {
if (isValid((SupportProvider) provider)) {
validProviders.add(provider);
}
}
if (!validProviders.isEmpty()) {
elements.add(category);
for (IProvider provider : validProviders) {
elements.add((AbstractSupportElement) provider);
}
}
}
return elements.toArray();
} else {
return new Object[0];
}
}
private boolean isValid(SupportProvider provider) {
Collection<SupportProduct> products = providerManager.getProducts();
for (SupportProduct product : products) {
if (provider.equals(product.getProvider()) && product.isInstalled()) {
return true;
}
}
return false;
}
private List<SupportProduct> getProducts(SupportProvider provider) {
Collection<SupportProduct> products = providerManager.getProducts();
List<SupportProduct> providerProducts = new ArrayList<SupportProduct>();
for (SupportProduct product : products) {
if (provider.equals(product.getProvider()) && product.isInstalled()) {
providerProducts.add(product);
}
}
return providerProducts;
}
public void dispose() {
// ignore
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.input = newInput;
this.providerManager = TasksBugsPlugin.getTaskErrorReporter().getProviderManager();
}
}
private SupportContentProvider contentProvider;
private boolean inFinish;
public ReportBugOrEnhancementWizard() {
setForcePreviousAndNextButtons(true);
setNeedsProgressMonitor(true);
setWindowTitle(Messages.ReportBugOrEnhancementWizard_Report_Bug_or_Enhancement);
setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPORT_BUG);
}
@Override
public void addPages() {
contentProvider = new SupportContentProvider();
SelectSupportElementPage page = new SelectSupportElementPage("selectProvider", contentProvider); //$NON-NLS-1$
page.setInput(new Object());
addPage(page);
}
@Override
public boolean canFinish() {
return getSelectedElement() instanceof SupportProduct;
}
public AbstractSupportElement getSelectedElement() {
IWizardPage page = getContainer().getCurrentPage();
if (page != null) {
AbstractSupportElement element = ((SelectSupportElementPage) page).getSelectedElement();
if (!(element instanceof SupportProduct)) {
Object[] elements = contentProvider.getElements(element);
if (elements.length == 1) {
return (AbstractSupportElement) elements[0];
}
}
return element;
}
return null;
}
@Override
public boolean performFinish() {
final AbstractSupportElement product = getSelectedElement();
if (!(product instanceof SupportProduct)) {
return false;
}
// bug 341886: avoid executing finish twice
if (inFinish) {
return false;
}
try {
inFinish = true;
TaskErrorReporter reporter = TasksBugsPlugin.getTaskErrorReporter();
IStatus status = new ProductStatus((IProduct) product);
SupportRequest request = reporter.preProcess(status, ((ProductStatus) status).getProduct());
if (!((AttributeTaskMapper) request.getDefaultContribution()).isMappingComplete()) {
TasksUiInternal.displayStatus(
Messages.ReportBugOrEnhancementWizard_Report_Bug_or_Enhancement,
new Status(
IStatus.ERROR,
TasksBugsPlugin.ID_PLUGIN,
Messages.ReportBugOrEnhancementWizard_Support_request_faild_Information_incomplete_Error));
return false;
}
return reporter.process(request.getDefaultContribution(), getContainer());
} finally {
inFinish = false;
}
}
}