blob: e2da364a07b9d19bbe9fd2e4f9a24d3143e5596a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Sierra Wireless 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:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.koneki.ldt.remote.debug.ui.internal.launch.tab;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.dltk.debug.ui.messages.DLTKLaunchConfigurationsMessages;
import org.eclipse.dltk.debug.ui.preferences.ScriptDebugPreferencesMessages;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.koneki.ldt.core.LuaConstants;
import org.eclipse.koneki.ldt.core.LuaNature;
import org.eclipse.koneki.ldt.remote.core.internal.RSEUtil;
import org.eclipse.koneki.ldt.remote.core.internal.lua.LuaRSEUtil;
import org.eclipse.koneki.ldt.remote.debug.core.internal.LuaRemoteDebugConstant;
import org.eclipse.koneki.ldt.remote.debug.core.internal.launch.LuaRemoteLaunchConfigurationUtil;
import org.eclipse.koneki.ldt.remote.debug.ui.internal.Activator;
import org.eclipse.koneki.ldt.ui.LuaDialogUtil;
import org.eclipse.koneki.ldt.ui.SWTUtil;
import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.ui.widgets.SystemHostCombo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
public class LuaRemoteLaunchConfigurationMainTab extends AbstractLaunchConfigurationTab {
/**
* Commons listener for Textfield (used to update dialog buttons)
*/
private final class TextModifyListener implements ModifyListener {
@Override
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
}
/**
* Commons listener for UI (used to update dialog buttons)
*/
private final class SelectionChangeListener extends SelectionAdapter {
@Override
public void widgetSelected(SelectionEvent e) {
updateLaunchConfigurationDialog();
}
}
private SystemHostCombo hostCombo;
private TextModifyListener textModifyListener = new TextModifyListener();
private SelectionListener selectionChangeListener = new SelectionChangeListener();
private Text projectNameText;
private Button projectSelectionButton;
private Text scriptNameText;
private Button scriptSelectionButton;
private Button breakOnFirstLineButton;
private Button enableLoggingButton;
private String mode;
public LuaRemoteLaunchConfigurationMainTab(String mode) {
this.mode = mode;
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
GridLayoutFactory.swtDefaults().spacing(SWT.DEFAULT, 1).applyTo(comp);
comp.setFont(parent.getFont());
// TODO not sure this is the good way to wait for init everywhere in the code
RSEUtil.waitForRSEInitialization();
createProjectConfigComponent(comp);
createScriptConfigComponent(comp);
createTargetConfigComponent(comp);
if (ILaunchManager.DEBUG_MODE.equals(mode)) {
createDebugConfigComponent(comp);
}
}
/**
* create the composite used to configure the target information
*
* @param comp
*/
private void createProjectConfigComponent(Composite comp) {
// create group
Group group = new Group(comp, SWT.None);
group.setText(DLTKLaunchConfigurationsMessages.mainTab_projectGroup);
GridDataFactory.fillDefaults().grab(true, false).applyTo(group);
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(group);
// create project choice :
projectNameText = new Text(group, SWT.SINGLE | SWT.BORDER);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(projectNameText);
projectSelectionButton = new Button(group, SWT.PUSH);
projectSelectionButton.setText(Messages.LuaRemoteMainTab_projectgroup_browseprojectbutton);
final int browseButtonHorizontalHint = SWTUtil.getButtonWidthHint(projectSelectionButton);
GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).hint(browseButtonHorizontalHint, SWT.DEFAULT).applyTo(projectSelectionButton);
}
private void createScriptConfigComponent(Composite comp) {
// create group
Group group = new Group(comp, SWT.None);
group.setText(DLTKLaunchConfigurationsMessages.mainTab_mainModule);
GridDataFactory.fillDefaults().grab(true, false).applyTo(group);
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(group);
// create script choice :
scriptNameText = new Text(group, SWT.SINGLE | SWT.BORDER);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(scriptNameText);
scriptSelectionButton = new Button(group, SWT.PUSH);
scriptSelectionButton.setText(Messages.LuaRemoteMainTab_projectgroup_browseprojectbutton);
final int browseButtonHorizontalHint = SWTUtil.getButtonWidthHint(projectSelectionButton);
GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).hint(browseButtonHorizontalHint, SWT.DEFAULT).applyTo(scriptSelectionButton);
}
/**
* create the composite used to configure the target information
*/
private void createTargetConfigComponent(Composite comp) {
// create group
Group group = new Group(comp, SWT.None);
group.setText(Messages.LuaRemoteMainTab_targetgroup_title);
GridDataFactory.fillDefaults().grab(true, false).applyTo(group);
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(group);
// create target combo
Label hostLabel = new Label(group, SWT.None);
hostLabel.setText(Messages.LuaRemoteMainTab_targetgroup_hostlabel);
IHost selectfirstHost = null;
hostCombo = new SystemHostCombo(group, SWT.None, selectfirstHost, true, "files", false); //$NON-NLS-1$
final int newSystemHint = SWTUtil.getButtonWidthHint(hostCombo.getNewButton());
hostCombo.setButtonWidthHint(newSystemHint);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(hostCombo);
}
/**
* @param comp
*/
private void createDebugConfigComponent(Composite comp) {
// create group
Group group = new Group(comp, SWT.None);
group.setText(Messages.LuaRemoteLaunchConfigurationMainTab_debuggroup_title);
GridDataFactory.fillDefaults().grab(true, false).applyTo(group);
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(group);
breakOnFirstLineButton = createCheckButton(group, ScriptDebugPreferencesMessages.BreakOnFirstLineLabel);
createVerticalSpacer(group, 1);
enableLoggingButton = createCheckButton(group, ScriptDebugPreferencesMessages.EnableDbgpLoggingLabel);
createVerticalSpacer(group, 1);
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
IProject defaultProject = null;
try {
IProject[] avilableProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for (IProject project : avilableProjects) {
if (project.hasNature(LuaNature.ID) && defaultProject == null) {
defaultProject = project;
}
}
// CHECKSTYLE:OFF
} catch (CoreException e) {
// nothing to do, continue trying to find a default project
}
// CHECKSTYLE:ON
configuration.setAttribute(LuaRemoteDebugConstant.PROJECT_NAME, defaultProject == null ? "" : defaultProject.getName()); //$NON-NLS-1$
String defaultScript = ""; //$NON-NLS-1$
if (defaultProject != null) {
IPath standardPath = new Path(LuaConstants.SOURCE_FOLDER).append(LuaConstants.DEFAULT_MAIN_FILE);
IFile standardFile = defaultProject.getFile(standardPath);
if (standardFile.exists()) {
defaultScript = standardFile.getProjectRelativePath().toPortableString();
}
}
configuration.setAttribute(LuaRemoteDebugConstant.SCRIPT_NAME, defaultScript);
// get first available target with luaSsh subsystem
final IHost[] hosts = RSECorePlugin.getTheSystemRegistry().getHosts();
for (int i = 0; i < hosts.length && LuaRemoteLaunchConfigurationUtil.getHost(configuration) == null; i++) {
final IHost host = hosts[i];
if (LuaRSEUtil.getLuaSubSystem(host) != null) {
LuaRemoteLaunchConfigurationUtil.setConnectionId(configuration, host);
}
}
configuration.setAttribute(LuaRemoteDebugConstant.DBGP_LOGGING, false);
configuration.setAttribute(LuaRemoteDebugConstant.BREAK_ON_FIRST_LINE, false);
}
/**
* add listeners to be aware of tab modification (to update dialog buttons)
*/
private void addListeners() {
if (!projectNameText.isListening(SWT.Modify))
projectNameText.addModifyListener(textModifyListener);
if (!scriptNameText.isListening(SWT.Modify))
scriptNameText.addModifyListener(textModifyListener);
if (!projectSelectionButton.isListening(SWT.Selection))
projectSelectionButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectLuaEmbeddedProject();
}
});
if (!scriptSelectionButton.isListening(SWT.Selection))
scriptSelectionButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectScript();
}
});
if (!hostCombo.isListening(SWT.Selection))
hostCombo.addSelectionListener(selectionChangeListener);
if (breakOnFirstLineButton != null && !breakOnFirstLineButton.isListening(SWT.Selection))
breakOnFirstLineButton.addSelectionListener(selectionChangeListener);
if (enableLoggingButton != null && !enableLoggingButton.isListening(SWT.Selection))
enableLoggingButton.addSelectionListener(selectionChangeListener);
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
*/
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
try {
String projectName = configuration.getAttribute(LuaRemoteDebugConstant.PROJECT_NAME, ""); //$NON-NLS-1$
if (!projectName.equals(projectNameText.getText()))
projectNameText.setText(projectName);
String scriptName = configuration.getAttribute(LuaRemoteDebugConstant.SCRIPT_NAME, ""); //$NON-NLS-1$
if (!scriptName.equals(scriptNameText.getText()))
scriptNameText.setText(scriptName);
IHost host = LuaRemoteLaunchConfigurationUtil.getHost(configuration);
if (hostCombo.getHost() != host)
hostCombo.select(host);
if (breakOnFirstLineButton != null) {
boolean breakOnFirstLine = configuration.getAttribute(LuaRemoteDebugConstant.BREAK_ON_FIRST_LINE, false);
breakOnFirstLineButton.setSelection(breakOnFirstLine);
}
if (enableLoggingButton != null) {
boolean enableDBGPLogging = configuration.getAttribute(LuaRemoteDebugConstant.DBGP_LOGGING, false);
enableLoggingButton.setSelection(enableDBGPLogging);
}
addListeners();
} catch (CoreException e) {
Activator.logError("Launch Configuration main tab for lua embedded failed at initialization", e); //$NON-NLS-1$
}
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
// Save attributes
configuration.setAttribute(LuaRemoteDebugConstant.PROJECT_NAME, projectNameText.getText());
configuration.setAttribute(LuaRemoteDebugConstant.SCRIPT_NAME, scriptNameText.getText());
IHost host = hostCombo.getHost();
if (host != null)
LuaRemoteLaunchConfigurationUtil.setConnectionId(configuration, hostCombo.getHost());
else
configuration.removeAttribute(LuaRemoteDebugConstant.HOST_ID);
if (breakOnFirstLineButton != null) {
configuration.setAttribute(LuaRemoteDebugConstant.BREAK_ON_FIRST_LINE, breakOnFirstLineButton.getSelection());
}
if (enableLoggingButton != null) {
configuration.setAttribute(LuaRemoteDebugConstant.DBGP_LOGGING, enableLoggingButton.getSelection());
}
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
*/
@Override
public String getName() {
return Messages.LuaRemoteMainTab_tabname;
}
/**
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
*/
@Override
public Image getImage() {
return org.eclipse.koneki.ldt.ui.internal.Activator.getDefault().getImageRegistry()
.get(org.eclipse.koneki.ldt.ui.internal.ImageConstants.MODULE_OBJ16);
}
/**
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
*/
@Override
public boolean isValid(ILaunchConfiguration configuration) {
String projectName = projectNameText.getText();
String scriptName = scriptNameText.getText();
IHost host = hostCombo.getHost();
return innerIsValuesValid(projectName, scriptName, host);
}
/**
* internal method to validate the value of the current tab
*
* @param luaInspectorPort
*
* @return true if value is valid
*/
private boolean innerIsValuesValid(String projectName, String scriptName, IHost host) {
String error = LuaRemoteLaunchConfigurationUtil.validateRemoteLaunchConfiguration(projectName, scriptName, host);
setErrorMessage(error);
return error == null;
}
/**
* Open project selection dialog
*/
private void selectLuaEmbeddedProject() {
String currentProjectName = projectNameText.getText();
IProject selectedProject = LuaDialogUtil.openSelectLuaProjectDialog(getShell(), projectNameText.getText(),
DLTKLaunchConfigurationsMessages.mainTab_chooseProject_title, DLTKLaunchConfigurationsMessages.mainTab_chooseProject_message);
if (selectedProject != null && !selectedProject.getName().equals(currentProjectName))
projectNameText.setText(selectedProject.getName());
}
/**
* Open Script selection dialog
*/
private void selectScript() {
String currentProjectName = projectNameText.getText();
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(currentProjectName);
IFile selectedScript = LuaDialogUtil.openSelectScriptFromProjectDialog(getShell(), project,
DLTKLaunchConfigurationsMessages.mainTab_searchButton_title, DLTKLaunchConfigurationsMessages.mainTab_searchButton_message);
if (selectedScript != null && !selectedScript.getName().equals(scriptNameText.getText())) {
scriptNameText.setText(selectedScript.getProjectRelativePath().toPortableString());
}
}
}