/*******************************************************************************
* 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.plugin.debugger.ide.configuration;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.ide.CoreLocalizationConstant;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationPage;
import org.eclipse.che.ide.api.debug.DebugConfigurationPage.DirtyStateListener;
import org.eclipse.che.ide.api.debug.DebugConfigurationType;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.plugin.debugger.ide.DebuggerLocalizationConstant;
import org.eclipse.che.ide.api.dialogs.ConfirmCallback;
import org.eclipse.che.ide.api.dialogs.DialogFactory;
import org.eclipse.che.ide.api.dialogs.ChoiceDialog;
import org.eclipse.che.ide.api.dialogs.ConfirmDialog;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Presenter for managing debug configurations.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class EditDebugConfigurationsPresenter implements EditDebugConfigurationsView.ActionDelegate {
private final EditDebugConfigurationsView view;
private final DebugConfigurationTypeRegistry debugConfigurationTypeRegistry;
private final DialogFactory dialogFactory;
private final DebuggerLocalizationConstant locale;
private final CoreLocalizationConstant coreLocale;
private final DebugConfigurationsManager debugConfigurationsManager;
private DebugConfiguration editedConfiguration;
private String editedConfigurationOriginName;
private DebugConfigurationPage<DebugConfiguration> editedPage;
@Inject
protected EditDebugConfigurationsPresenter(EditDebugConfigurationsView view,
DebugConfigurationTypeRegistry debugConfigurationTypeRegistry,
DialogFactory dialogFactory,
DebuggerLocalizationConstant locale,
CoreLocalizationConstant coreLocale,
DebugConfigurationsManager debugConfigurationsManager) {
this.view = view;
this.debugConfigurationTypeRegistry = debugConfigurationTypeRegistry;
this.dialogFactory = dialogFactory;
this.locale = locale;
this.coreLocale = coreLocale;
this.debugConfigurationsManager = debugConfigurationsManager;
view.setDelegate(this);
}
@Override
public void onCloseClicked() {
final DebugConfiguration selectedConfiguration = view.getSelectedConfiguration();
onNameChanged();
if (selectedConfiguration != null && isViewModified()) {
onConfigurationSelected(selectedConfiguration);
}
view.close();
}
@Override
public void onSaveClicked() {
final DebugConfiguration selectedConfiguration;
if (view.getSelectedConfiguration() == null) {
return;
}
onNameChanged();
selectedConfiguration = view.getSelectedConfiguration();
updateConfiguration(selectedConfiguration);
fetchConfigurations();
}
private void updateConfiguration(DebugConfiguration selectedConfiguration) {
if (editedConfigurationOriginName.trim().equals(selectedConfiguration.getName())) {
debugConfigurationsManager.removeConfiguration(selectedConfiguration);
debugConfigurationsManager.createConfiguration(selectedConfiguration.getType().getId(),
selectedConfiguration.getName(),
selectedConfiguration.getHost(),
selectedConfiguration.getPort(),
selectedConfiguration.getConnectionProperties());
} else {
onNameChanged();
debugConfigurationsManager.removeConfiguration(editedConfiguration);
DebugConfiguration conf = debugConfigurationsManager.createConfiguration(selectedConfiguration.getType().getId(),
selectedConfiguration.getName(),
selectedConfiguration.getHost(),
selectedConfiguration.getPort(),
selectedConfiguration.getConnectionProperties());
if (selectedConfiguration.equals(view.getSelectedConfiguration())) {
//update selected configuration name
view.getSelectedConfiguration().setName(conf.getName());
}
}
}
@Override
public void onCancelClicked() {
fetchConfigurations();
}
@Override
public void onDebugClicked() {
DebugConfiguration selectedConfiguration = view.getSelectedConfiguration();
if (selectedConfiguration != null) {
debugConfigurationsManager.setCurrentDebugConfiguration(selectedConfiguration);
debugConfigurationsManager.apply(selectedConfiguration);
onCloseClicked();
}
}
@Override
public void onDuplicateClicked() {
final DebugConfiguration selectedConfiguration = view.getSelectedConfiguration();
if (selectedConfiguration != null) {
createNewConfiguration(selectedConfiguration.getType(),
selectedConfiguration.getName(),
selectedConfiguration.getConnectionProperties());
}
}
@Override
public void onAddClicked() {
final DebugConfigurationType selectedType = view.getSelectedConfigurationType();
if (selectedType != null) {
createNewConfiguration(selectedType, null, new HashMap<String, String>());
}
}
private void createNewConfiguration(final DebugConfigurationType type,
final String customName,
final Map<String, String> attributes) {
if (!isViewModified()) {
reset();
createConfiguration(type, customName, attributes);
return;
}
final ConfirmCallback saveCallback = new ConfirmCallback() {
@Override
public void accepted() {
updateConfiguration(editedConfiguration);
reset();
createConfiguration(type, customName, attributes);
}
};
final ConfirmCallback discardCallback = new ConfirmCallback() {
@Override
public void accepted() {
fetchConfigurations();
reset();
createConfiguration(type, customName, attributes);
}
};
final ChoiceDialog dialog = dialogFactory.createChoiceDialog(
locale.editConfigurationsSaveChangesTitle(),
locale.editConfigurationsSaveChangesConfirmation(editedConfiguration.getName()),
coreLocale.save(),
locale.editConfigurationsSaveChangesDiscard(),
saveCallback,
discardCallback);
dialog.show();
}
private void createConfiguration(DebugConfigurationType type,
String customName,
Map<String, String> connectionProperties) {
final DebugConfiguration configuration = debugConfigurationsManager.createConfiguration(type.getId(),
customName,
"localhost",
8000,
connectionProperties);
fetchConfigurations();
view.setSelectedConfiguration(configuration);
}
@Override
public void onRemoveClicked(final DebugConfiguration selectedConfiguration) {
if (selectedConfiguration == null) {
return;
}
final ConfirmCallback confirmCallback = new ConfirmCallback() {
@Override
public void accepted() {
debugConfigurationsManager.removeConfiguration(selectedConfiguration);
view.selectNextItem();
fetchConfigurations();
}
};
final ConfirmDialog confirmDialog = dialogFactory.createConfirmDialog(
locale.editConfigurationsViewRemoveTitle(),
locale.editConfigurationsRemoveConfirmation(selectedConfiguration.getName()),
confirmCallback,
null);
confirmDialog.show();
}
@Override
public void onEnterPressed() {
if (view.isCancelButtonFocused()) {
onCancelClicked();
return;
}
if (view.isCloseButtonFocused()) {
onCloseClicked();
return;
}
onSaveClicked();
}
private void reset() {
editedConfiguration = null;
editedConfigurationOriginName = null;
editedPage = null;
view.setConfigurationName("");
view.clearDebugConfigurationPageContainer();
}
@Override
public void onConfigurationSelected(final DebugConfiguration configuration) {
if (!isViewModified()) {
handleConfigurationSelection(configuration);
return;
}
final ConfirmCallback saveCallback = new ConfirmCallback() {
@Override
public void accepted() {
updateConfiguration(editedConfiguration);
fetchConfigurations();
handleConfigurationSelection(configuration);
}
};
final ConfirmCallback discardCallback = new ConfirmCallback() {
@Override
public void accepted() {
reset();
fetchConfigurations();
handleConfigurationSelection(configuration);
}
};
final ChoiceDialog dialog = dialogFactory.createChoiceDialog(
locale.editConfigurationsSaveChangesTitle(),
locale.editConfigurationsSaveChangesConfirmation(editedConfiguration.getName()),
coreLocale.save(),
locale.editConfigurationsSaveChangesDiscard(),
saveCallback,
discardCallback);
dialog.show();
}
private void handleConfigurationSelection(DebugConfiguration configuration) {
editedConfiguration = configuration;
editedConfigurationOriginName = configuration.getName();
view.setConfigurationName(configuration.getName());
view.setDebugButtonState(true);
final DebugConfigurationPage<? extends DebugConfiguration> page = configuration.getType().getConfigurationPage();
final DebugConfigurationPage<DebugConfiguration> p = ((DebugConfigurationPage<DebugConfiguration>)page);
editedPage = p;
p.setDirtyStateListener(new DirtyStateListener() {
@Override
public void onDirtyStateChanged() {
view.setCancelButtonState(isViewModified());
view.setSaveButtonState(isViewModified());
view.setDebugButtonState(!isViewModified());
}
});
p.resetFrom(configuration);
p.go(view.getDebugConfigurationPageContainer());
}
@Override
public void onNameChanged() {
DebugConfiguration selectedConfiguration = view.getSelectedConfiguration();
if (selectedConfiguration == null || !selectedConfiguration.equals(editedConfiguration)) {
return;
}
selectedConfiguration.setName(view.getConfigurationName());
view.setCancelButtonState(isViewModified());
view.setSaveButtonState(isViewModified());
view.setDebugButtonState(!isViewModified());
}
/** Show dialog. */
public void show() {
view.show();
fetchConfigurations();
}
/** Fetch configurations and update view. */
private void fetchConfigurations() {
final String originName = editedConfigurationOriginName;
reset();
view.setCancelButtonState(false);
view.setSaveButtonState(false);
view.setDebugButtonState(view.getSelectedConfiguration() != null);
final List<DebugConfiguration> configurationsList = debugConfigurationsManager.getConfigurations();
final Map<DebugConfigurationType, List<DebugConfiguration>> categories = new HashMap<>();
for (DebugConfigurationType type : debugConfigurationTypeRegistry.getTypes()) {
final List<DebugConfiguration> settingsCategory = new ArrayList<>();
for (DebugConfiguration configuration : configurationsList) {
if (type.getId().equals(configuration.getType().getId())) {
settingsCategory.add(configuration);
if (configuration.getName().equals(originName)) {
view.setSelectedConfiguration(configuration);
}
}
}
Collections.sort(settingsCategory, new Comparator<DebugConfiguration>() {
@Override
public int compare(DebugConfiguration o1, DebugConfiguration o2) {
return o1.getName().compareTo(o2.getName());
}
});
categories.put(type, settingsCategory);
}
view.setData(categories);
view.setFilterState(!configurationsList.isEmpty());
view.focusCloseButton();
}
private boolean isViewModified() {
if (editedConfiguration == null || editedPage == null) {
return false;
}
return editedPage.isDirty() || !editedConfigurationOriginName.equals(view.getConfigurationName());
}
}