Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CHE-1004: Improve experience on Debugger configuration selection #1094

Merged
merged 1 commit into from
Apr 20, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*******************************************************************************
* Copyright (c) 2012-2016 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.api.debug;

import com.google.common.base.Optional;

import org.eclipse.che.commons.annotation.Nullable;

import java.util.List;
import java.util.Map;

/**
* Facade for debug configuration related operations.
* <p>Also holds the current debug configuration.
* Current means the configuration which should be used for connecting to the debugger.
*
* @author Artem Zatsarynnyi
*/
public interface DebugConfigurationsManager {

/** Returns current debug configuration. */
Optional<DebugConfiguration> getCurrentDebugConfiguration();

/** Set current debug configuration. */
void setCurrentDebugConfiguration(@Nullable DebugConfiguration debugConfiguration);

/** Returns all debug configurations. */
List<DebugConfiguration> getConfigurations();

/**
* Creates new configuration with the given parameters.
*
* @return created {@link DebugConfiguration}
*/
DebugConfiguration createConfiguration(String typeId,
String name,
String host,
int port,
Map<String, String> connectionProperties);

/** Remove the given debug configuration. */
void removeConfiguration(DebugConfiguration configuration);

/** Add listener to be notified when some debug configuration has been changed. */
void addConfigurationsChangedListener(ConfigurationChangedListener listener);

/** Remove the given listener. */
void removeConfigurationsChangedListener(ConfigurationChangedListener listener);

/** Listener that will be called when debug configuration has been changed. */
interface ConfigurationChangedListener {
void onConfigurationAdded(DebugConfiguration configuration);

void onConfigurationRemoved(DebugConfiguration configuration);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,16 @@
import org.eclipse.che.ide.ext.debugger.client.actions.EditConfigurationsAction;
import org.eclipse.che.ide.ext.debugger.client.actions.EvaluateExpressionAction;
import org.eclipse.che.ide.ext.debugger.client.actions.ResumeExecutionAction;
import org.eclipse.che.ide.ext.debugger.client.actions.SelectDebugConfigurationComboBoxAction;
import org.eclipse.che.ide.ext.debugger.client.actions.ShowHideDebuggerPanelAction;
import org.eclipse.che.ide.ext.debugger.client.actions.StepIntoAction;
import org.eclipse.che.ide.ext.debugger.client.actions.StepOutAction;
import org.eclipse.che.ide.ext.debugger.client.actions.StepOverAction;
import org.eclipse.che.ide.ext.debugger.client.configuration.DebugConfigurationsGroup;
import org.eclipse.che.ide.ext.debugger.client.debug.DebuggerPresenter;
import org.eclipse.che.ide.util.input.KeyCodeMap;

import static org.eclipse.che.ide.api.action.IdeActions.GROUP_CENTER_TOOLBAR;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_DEBUG_CONTEXT_MENU;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_RUN;
import static org.eclipse.che.ide.api.constraints.Constraints.FIRST;
import static org.eclipse.che.ide.api.constraints.Constraints.LAST;

/**
Expand All @@ -52,23 +50,20 @@
@Extension(title = "Debugger", version = "4.1.0")
public class DebuggerExtension {

public static final String GROUP_DEBUG_CONFIGURATIONS_LIST = "DebugConfigurationsListGroup";

private static final String GROUP_DEBUG_TOOLBAR = "DebugGroupToolbar";
private static final String GROUP_DEBUG_CONFIGURATIONS_LIST_DISPLAY_NAME = "Debug";
private static final String EDIT_DEBUG_CONF_ID = "editDebugConfigurations";
private static final String DEBUG_ID = "debug";
private static final String DISCONNECT_DEBUG_ID = "disconnectDebug";
private static final String STEP_INTO_ID = "stepInto";
private static final String STEP_OVER_ID = "stepOver";
private static final String STEP_OUT_ID = "stepOut";
private static final String RESUME_EXECUTION_ID = "resumeExecution";
private static final String EVALUATE_EXPRESSION_ID = "evaluateExpression";
private static final String CHANGE_VARIABLE_VALUE_ID = "changeVariableValue";
private static final String SHOW_HIDE_DEBUGGER_PANEL_ID = "showHideDebuggerPanel";
private static final String EDIT_DEBUG_CONF_ID = "editDebugConfigurations";
private static final String DEBUG_ID = "debug";
private static final String DISCONNECT_DEBUG_ID = "disconnectDebug";
private static final String STEP_INTO_ID = "stepInto";
private static final String STEP_OVER_ID = "stepOver";
private static final String STEP_OUT_ID = "stepOut";
private static final String RESUME_EXECUTION_ID = "resumeExecution";
private static final String EVALUATE_EXPRESSION_ID = "evaluateExpression";
private static final String CHANGE_VARIABLE_VALUE_ID = "changeVariableValue";
private static final String SHOW_HIDE_DEBUGGER_PANEL_ID = "showHideDebuggerPanel";

@Inject
public DebuggerExtension(DebuggerResources debuggerResources,
DebuggerLocalizationConstant localizationConstants,
ActionManager actionManager,
DebugAction debugAction,
DisconnectDebuggerAction disconnectDebuggerAction,
Expand All @@ -81,15 +76,14 @@ public DebuggerExtension(DebuggerResources debuggerResources,
ChangeVariableValueAction changeVariableValueAction,
ShowHideDebuggerPanelAction showHideDebuggerPanelAction,
EditConfigurationsAction editConfigurationsAction,
SelectDebugConfigurationComboBoxAction selectDebugConfigurationComboBoxAction,
DebugConfigurationsGroup configurationsGroup,
DebuggerPresenter debuggerPresenter,
KeyBindingAgent keyBinding) {
debuggerResources.getCss().ensureInjected();

final DefaultActionGroup runMenu = (DefaultActionGroup)actionManager.getAction(GROUP_RUN);

// register actions
actionManager.registerAction("selectDebugConfigurationComboBox", selectDebugConfigurationComboBoxAction);
actionManager.registerAction(EDIT_DEBUG_CONF_ID, editConfigurationsAction);
actionManager.registerAction(DEBUG_ID, debugAction);
actionManager.registerAction(DISCONNECT_DEBUG_ID, disconnectDebuggerAction);
Expand All @@ -101,9 +95,17 @@ public DebuggerExtension(DebuggerResources debuggerResources,
actionManager.registerAction(CHANGE_VARIABLE_VALUE_ID, changeVariableValueAction);
actionManager.registerAction(SHOW_HIDE_DEBUGGER_PANEL_ID, showHideDebuggerPanelAction);

// create group for selecting (changing) debug configurations
final DefaultActionGroup debugConfigurationsGroup = new DefaultActionGroup(localizationConstants.debugConfigurationsActionTitle(),
true,
actionManager);
debugConfigurationsGroup.add(editConfigurationsAction);
debugConfigurationsGroup.addSeparator();
debugConfigurationsGroup.add(configurationsGroup);

// add actions in main menu
runMenu.addSeparator();
runMenu.add(editConfigurationsAction, LAST);
runMenu.add(debugConfigurationsGroup, LAST);
runMenu.add(debugAction, LAST);
runMenu.add(disconnectDebuggerAction, LAST);
runMenu.addSeparator();
Expand All @@ -114,23 +116,6 @@ public DebuggerExtension(DebuggerResources debuggerResources,
runMenu.addSeparator();
runMenu.add(evaluateExpressionAction, LAST);

// add actions on central toolbar
final DefaultActionGroup debugToolbarGroup = new DefaultActionGroup(GROUP_DEBUG_TOOLBAR, false, actionManager);
actionManager.registerAction(GROUP_DEBUG_TOOLBAR, debugToolbarGroup);
debugToolbarGroup.add(selectDebugConfigurationComboBoxAction);
final DefaultActionGroup debugGroup = new DefaultActionGroup(actionManager);
debugGroup.add(debugAction);
debugToolbarGroup.add(debugGroup);
final DefaultActionGroup centralToolbarGroup = (DefaultActionGroup)actionManager.getAction(GROUP_CENTER_TOOLBAR);
centralToolbarGroup.add(debugToolbarGroup);

// add group for debug configurations list
final DefaultActionGroup debugConfigurationsList = new DefaultActionGroup(GROUP_DEBUG_CONFIGURATIONS_LIST_DISPLAY_NAME,
true,
actionManager);
actionManager.registerAction(GROUP_DEBUG_CONFIGURATIONS_LIST, debugConfigurationsList);
debugConfigurationsList.add(editConfigurationsAction, FIRST);

// create debugger toolbar action group
DefaultActionGroup debuggerToolbarActionGroup = new DefaultActionGroup(actionManager);
debuggerToolbarActionGroup.add(resumeExecutionAction);
Expand All @@ -145,7 +130,7 @@ public DebuggerExtension(DebuggerResources debuggerResources,

// add actions in 'Debug' context menu
final DefaultActionGroup debugContextMenuGroup = (DefaultActionGroup)actionManager.getAction(GROUP_DEBUG_CONTEXT_MENU);
debugContextMenuGroup.add(debugConfigurationsList);
debugContextMenuGroup.add(debugAction);
debugContextMenuGroup.addSeparator();

// keys binding
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,12 @@
public interface DebuggerLocalizationConstant extends com.google.gwt.i18n.client.Messages {

/* actions */
@Key("debugConfigurationsActionTitle")
String debugConfigurationsActionTitle();

@Key("editDebugConfigurationsActionTitle")
String editDebugConfigurationsActionTitle();

@Key("selectConfigurationActionText")
String selectConfigurationActionText();

@Key("selectConfigurationActionDescription")
String selectConfigurationActionDescription();

@Key("breakpoints")
String breakpoints();

Expand Down Expand Up @@ -73,6 +70,9 @@ public interface DebuggerLocalizationConstant extends com.google.gwt.i18n.client
@Key("editDebugConfigurationsActionDescription")
String editDebugConfigurationsActionDescription();

@Key("debugConfigurationActionDescription")
String debugConfigurationActionDescription();

@Key("resumeExecutionDescription")
String resumeExecutionDescription();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.che.ide.ext.debugger.client.actions;

import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.google.inject.Singleton;

Expand All @@ -19,6 +20,7 @@
import org.eclipse.che.ide.api.action.AbstractPerspectiveAction;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.debug.DebugConfiguration;
import org.eclipse.che.ide.api.debug.DebugConfigurationsManager;
import org.eclipse.che.ide.debug.Debugger;
import org.eclipse.che.ide.debug.DebuggerManager;
import org.eclipse.che.ide.ext.debugger.client.DebuggerLocalizationConstant;
Expand All @@ -32,45 +34,52 @@
import static org.eclipse.che.ide.workspace.perspectives.project.ProjectPerspective.PROJECT_PERSPECTIVE_ID;

/**
* Action that allows to connect to the debugger with the selected debug configuration.
* Action that allows to connect to the debugger with the current debug configuration.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class DebugAction extends AbstractPerspectiveAction {

private final SelectDebugConfigurationComboBoxAction selectConfigurationAction;
private final DebuggerLocalizationConstant localizationConstants;
private final DebuggerManager debuggerManager;
private final DialogFactory dialogFactory;
private final DebuggerLocalizationConstant localizationConstants;
private final DebuggerManager debuggerManager;
private final DialogFactory dialogFactory;
private final DebugConfigurationsManager configurationsManager;

@Inject
public DebugAction(SelectDebugConfigurationComboBoxAction selectConfigurationAction,
DebuggerLocalizationConstant localizationConstants,
public DebugAction(DebuggerLocalizationConstant localizationConstants,
DebuggerResources resources,
DebuggerManager debuggerManager,
DialogFactory dialogFactory) {
DialogFactory dialogFactory,
DebugConfigurationsManager debugConfigurationsManager) {
super(Collections.singletonList(PROJECT_PERSPECTIVE_ID),
localizationConstants.debugActionTitle(),
localizationConstants.debugActionDescription(),
null,
resources.debug());
this.selectConfigurationAction = selectConfigurationAction;
this.localizationConstants = localizationConstants;
this.debuggerManager = debuggerManager;
this.dialogFactory = dialogFactory;
this.configurationsManager = debugConfigurationsManager;
}

@Override
public void updateInPerspective(ActionEvent event) {
event.getPresentation().setVisible(selectConfigurationAction.getSelectedConfiguration() != null);
Optional<DebugConfiguration> configurationOptional = configurationsManager.getCurrentDebugConfiguration();

event.getPresentation().setEnabled(configurationOptional.isPresent());
if (configurationOptional.isPresent()) {
event.getPresentation().setText(localizationConstants.debugActionTitle() + " '" + configurationOptional.get().getName() + "'");
} else {
event.getPresentation().setText(localizationConstants.debugActionTitle());
}
}

@Override
public void actionPerformed(ActionEvent actionEvent) {
final DebugConfiguration debugConfiguration = selectConfigurationAction.getSelectedConfiguration();
if (debugConfiguration != null) {
connect(debugConfiguration);
Optional<DebugConfiguration> configurationOptional = configurationsManager.getCurrentDebugConfiguration();
if (configurationOptional.isPresent()) {
connect(configurationOptional.get());
}
}

Expand Down
Loading