package org.rubypeople.rdt.internal.debug.ui.launcher;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
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.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.rubypeople.rdt.debug.ui.RdtDebugUiConstants;
import org.rubypeople.rdt.debug.ui.RdtDebugUiImages;
import org.rubypeople.rdt.internal.debug.ui.RdtDebugUiMessages;
import org.rubypeople.rdt.internal.debug.ui.RdtDebugUiPlugin;
import org.rubypeople.rdt.internal.launching.RubyLaunchConfigurationAttribute;
import org.rubypeople.rdt.internal.ui.util.DirectorySelector;
import org.rubypeople.rdt.launching.IRubyLaunchConfigurationConstants;
public class RubyArgumentsTab extends AbstractLaunchConfigurationTab
{
protected Text interpreterArgsText, programArgsText;
protected DirectorySelector workingDirectorySelector;
protected Button useDefaultWorkingDirectoryButton;
public RubyArgumentsTab()
{
super();
}
public void createControl(Composite parent)
{
Composite composite = createPageRoot(parent);
new Label(composite, SWT.NONE).setText(RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_working_dir);
workingDirectorySelector = new DirectorySelector(composite);
workingDirectorySelector
.setBrowseDialogMessage(RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_working_dir_browser_message);
workingDirectorySelector.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
workingDirectorySelector.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
updateLaunchConfigurationDialog();
}
});
Composite defaultWorkingDirectoryComposite = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
defaultWorkingDirectoryComposite.setLayout(layout);
useDefaultWorkingDirectoryButton = new Button(defaultWorkingDirectoryComposite, SWT.CHECK);
useDefaultWorkingDirectoryButton.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
setUseDefaultWorkingDirectory(((Button) e.getSource()).getSelection());
}
});
new Label(defaultWorkingDirectoryComposite, SWT.NONE)
.setText(RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_working_dir_use_default_message);
defaultWorkingDirectoryComposite.pack();
Label verticalSpacer = new Label(composite, SWT.NONE);
new Label(composite, SWT.NONE)
.setText(RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_interpreter_args_box_title);
interpreterArgsText = new Text(composite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
interpreterArgsText.setLayoutData(new GridData(GridData.FILL_BOTH));
interpreterArgsText.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent evt)
{
updateLaunchConfigurationDialog();
}
});
new Label(composite, SWT.NONE)
.setText(RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_program_args_box_title);
programArgsText = new Text(composite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
programArgsText.setLayoutData(new GridData(GridData.FILL_BOTH));
programArgsText.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent evt)
{
updateLaunchConfigurationDialog();
}
});
}
protected void setUseDefaultWorkingDirectory(boolean useDefault)
{
if (useDefaultWorkingDirectoryButton.getSelection() != useDefault)
useDefaultWorkingDirectoryButton.setSelection(useDefault);
if (useDefault)
{
workingDirectorySelector.setSelectionText((String) "");
}
workingDirectorySelector.setEnabled(!useDefault);
}
public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
{
configuration.setAttribute(RubyLaunchConfigurationAttribute.USE_DEFAULT_WORKING_DIRECTORY, true);
configuration.setAttribute(IRubyLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String) null);
// set hidden attribute
configuration
.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, RdtDebugUiConstants.RUBY_SOURCE_LOCATOR);
}
public void initializeFrom(ILaunchConfiguration configuration)
{
String workingDirectory = "", interpreterArgs = "", programArgs = "";
boolean useDefaultWorkDir = true;
try
{
workingDirectory = configuration.getAttribute(IRubyLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, "");
interpreterArgs = configuration.getAttribute(IRubyLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "");
programArgs = configuration.getAttribute(IRubyLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, "");
useDefaultWorkDir = configuration.getAttribute(
RubyLaunchConfigurationAttribute.USE_DEFAULT_WORKING_DIRECTORY, true);
}
catch (CoreException e)
{
log(e);
}
workingDirectorySelector.setSelectionText(workingDirectory);
interpreterArgsText.setText(interpreterArgs);
programArgsText.setText(programArgs);
setUseDefaultWorkingDirectory(useDefaultWorkDir);
}
public void performApply(ILaunchConfigurationWorkingCopy configuration)
{
configuration.setAttribute(IRubyLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, workingDirectorySelector
.getValidatedSelectionText());
configuration.setAttribute(IRubyLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, interpreterArgsText.getText());
configuration.setAttribute(IRubyLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, programArgsText.getText());
configuration.setAttribute(RubyLaunchConfigurationAttribute.USE_DEFAULT_WORKING_DIRECTORY,
useDefaultWorkingDirectoryButton.getSelection());
}
protected Composite createPageRoot(Composite parent)
{
Composite composite = new Composite(parent, SWT.NONE);
GridLayout compositeLayout = new GridLayout();
compositeLayout.marginWidth = 0;
compositeLayout.numColumns = 1;
composite.setLayout(compositeLayout);
setControl(composite);
return composite;
}
public String getName()
{
return RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_name;
}
public boolean isValid(ILaunchConfiguration launchConfig)
{
try
{
String workingDirectory = launchConfig.getAttribute(
IRubyLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, "");
if (!useDefaultWorkingDirectoryButton() && workingDirectory.length() == 0)
{
setErrorMessage(RdtDebugUiMessages.LaunchConfigurationTab_RubyArguments_working_dir_error_message);
return false;
}
}
catch (CoreException e)
{
log(e);
}
setErrorMessage(null);
return true;
}
private boolean useDefaultWorkingDirectoryButton()
{
if (useDefaultWorkingDirectoryButton == null)
return false;
return useDefaultWorkingDirectoryButton.getSelection();
}
protected void log(Throwable t)
{
RdtDebugUiPlugin.log(t);
}
public Image getImage()
{
return RdtDebugUiImages.get(RdtDebugUiImages.IMG_EVIEW_ARGUMENTS_TAB);
}
}