/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.projectimport.wizard.presenter;
import org.eclipse.che.api.project.shared.dto.ProjectImporterDescriptor;
import org.eclipse.che.ide.CoreLocalizationConstant;
import org.eclipse.che.ide.api.project.MutableProjectConfig;
import org.eclipse.che.ide.api.project.wizard.ImportWizardRegistrar;
import org.eclipse.che.ide.api.project.wizard.ImportWizardRegistry;
import org.eclipse.che.ide.api.wizard.Wizard;
import org.eclipse.che.ide.api.wizard.WizardPage;
import org.eclipse.che.ide.projectimport.wizard.ImportWizardFactory;
import org.eclipse.che.ide.projectimport.wizard.ImportWizard;
import org.eclipse.che.ide.projectimport.wizard.mainpage.MainPagePresenter;
import org.eclipse.che.ide.api.dialogs.DialogFactory;
import com.google.inject.Inject;
import com.google.inject.Provider;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Presenter for import project wizard dialog.
*
* @author Ann Shumilova
* @author Sergii Leschenko
*/
public class ImportProjectWizardPresenter implements Wizard.UpdateDelegate,
ImportProjectWizardView.ActionDelegate,
ImportProjectWizardView.EnterPressedDelegate,
MainPagePresenter.ImporterSelectionListener {
private final DialogFactory dialogFactory;
private final ImportWizardFactory importWizardFactory;
private final ImportProjectWizardView view;
private final Provider<MainPagePresenter> mainPageProvider;
private final CoreLocalizationConstant locale;
private final ImportWizardRegistry wizardRegistry;
private final Map<ProjectImporterDescriptor, ImportWizard> wizardsCache;
private MainPagePresenter mainPage;
private WizardPage currentPage;
private ImportWizard wizard;
@Inject
public ImportProjectWizardPresenter(ImportProjectWizardView view,
MainPagePresenter mainPage,
CoreLocalizationConstant locale,
Provider<MainPagePresenter> mainPageProvider,
ImportWizardRegistry wizardRegistry,
DialogFactory dialogFactory,
ImportWizardFactory importWizardFactory) {
this.view = view;
this.locale = locale;
this.wizardRegistry = wizardRegistry;
this.mainPage = mainPage;
this.mainPageProvider = mainPageProvider;
this.dialogFactory = dialogFactory;
this.importWizardFactory = importWizardFactory;
wizardsCache = new HashMap<>();
view.setDelegate(this);
}
@Override
public void onNextClicked() {
final WizardPage nextPage = wizard.navigateToNext();
if (nextPage != null) {
showPage(nextPage);
}
}
@Override
public void onBackClicked() {
final WizardPage prevPage = wizard.navigateToPrevious();
if (prevPage != null) {
showPage(prevPage);
}
}
@Override
public void onImportClicked() {
view.setLoaderVisibility(true);
wizard.complete(new Wizard.CompleteCallback() {
@Override
public void onCompleted() {
view.close();
}
@Override
public void onFailure(Throwable e) {
view.setLoaderVisibility(false);
dialogFactory.createMessageDialog(locale.importProjectViewTitle(), e.getMessage(), null).show();
}
});
}
@Override
public void onCancelClicked() {
view.close();
}
@Override
public void updateControls() {
view.setBackButtonEnabled(false);
view.setNextButtonEnabled(wizard.hasNext() && currentPage.isCompleted());
view.setImportButtonEnabled(wizard.canComplete());
}
public void show() {
resetState();
wizard = createDefaultWizard();
final WizardPage<MutableProjectConfig> firstPage = wizard.navigateToFirst();
if (firstPage != null) {
showPage(firstPage);
view.showDialog();
}
}
private void resetState() {
wizardsCache.clear();
mainPage = mainPageProvider.get();
mainPage.setUpdateDelegate(this);
mainPage.setImporterSelectionListener(this);
mainPage.setEnterPressedDelegate(this);
}
/** Creates or returns import wizard for the specified importer. */
private ImportWizard getWizardForImporter(@NotNull ProjectImporterDescriptor importer) {
if (wizardsCache.containsKey(importer)) {
return wizardsCache.get(importer);
}
final ImportWizardRegistrar wizardRegistrar = wizardRegistry.getWizardRegistrar(importer.getId());
if (wizardRegistrar == null) {
// should never occur
throw new IllegalStateException("WizardRegistrar for the importer " + importer.getId() + " isn't registered.");
}
List<Provider<? extends WizardPage<MutableProjectConfig>>> pageProviders = wizardRegistrar.getWizardPages();
final ImportWizard importWizard = createDefaultWizard();
for (Provider<? extends WizardPage<MutableProjectConfig>> provider : pageProviders) {
importWizard.addPage(provider.get(), 1, false);
}
wizardsCache.put(importer, importWizard);
return importWizard;
}
/** Creates and returns 'default' project wizard with pre-defined pages only. */
private ImportWizard createDefaultWizard() {
final MutableProjectConfig dataObject = new MutableProjectConfig();
final ImportWizard importWizard = importWizardFactory.newWizard(dataObject);
importWizard.setUpdateDelegate(this);
// add pre-defined first page
importWizard.addPage(mainPage);
return importWizard;
}
private void showPage(@NotNull WizardPage wizardPage) {
currentPage = wizardPage;
updateControls();
view.showPage(currentPage);
}
@Override
public void onEnterKeyPressed() {
if (wizard.hasNext() && currentPage.isCompleted()) {
onNextClicked();
} else if (wizard.canComplete()) {
onImportClicked();
}
}
@Override
public void onImporterSelected(ProjectImporterDescriptor importer) {
final MutableProjectConfig prevData = wizard.getDataObject();
wizard = getWizardForImporter(importer);
final MutableProjectConfig dataObject = wizard.getDataObject();
dataObject.getSource().setType(importer.getId());
// some values should be shared between wizards for different project types
dataObject.setName(prevData.getName());
dataObject.setDescription(prevData.getDescription());
WizardPage<MutableProjectConfig> firstPage = wizard.navigateToFirst();
if (firstPage != null) {
firstPage.init(dataObject);
}
WizardPage<MutableProjectConfig> importerPage = wizard.navigateToNext();
importerPage.go(mainPage.getImporterPanel());
}
}