blob: ddb4423a4759d4043eda378a4fcca981c9187d3f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2016 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.launch.ui.remote.app;
import org.eclipse.core.runtime.Assert;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.tcf.te.launch.core.persistence.DefaultPersistenceDelegate;
import org.eclipse.tcf.te.launch.core.persistence.launchcontext.LaunchContextsPersistenceDelegate;
import org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart;
import org.eclipse.tcf.te.launch.ui.tabs.AbstractLaunchConfigurationTab;
import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode;
import org.eclipse.tcf.te.tcf.filesystem.ui.dialogs.FSOpenFileDialog;
import org.eclipse.tcf.te.tcf.launch.ui.nls.Messages;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.steps.IProcessesStepAttributes;
import org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl;
import org.eclipse.tcf.te.ui.forms.parts.AbstractSection;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
/**
* Remote application launch configuration main tab section implementation.
*/
public class LaunchConfigurationMainTabSection extends AbstractSection implements ILaunchConfigurationTabFormPart {
/* default */ BaseEditBrowseTextControl processImage;
/* default */ BaseEditBrowseTextControl processArguments;
private Button stopAtEntry;
private Button stopAtMain;
private Button attachChildren;
/* default */ IModelNode firstSelection = null;
/**
* Constructor.
*
* @param form The parent managed form. Must not be <code>null</code>.
* @param parent The parent composite. Must not be <code>null</code>.
*/
public LaunchConfigurationMainTabSection(IManagedForm form, Composite parent) {
super(form, parent, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
getSection().setBackground(parent.getBackground());
createClient(getSection(), form.getToolkit());
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.forms.parts.AbstractSection#createClient(org.eclipse.ui.forms.widgets.Section, org.eclipse.ui.forms.widgets.FormToolkit)
*/
@Override
protected void createClient(final Section section, FormToolkit toolkit) {
Assert.isNotNull(section);
Assert.isNotNull(toolkit);
// Configure the section
section.setText(Messages.LaunchConfigurationMainTabSection_title);
if (section.getParent().getLayout() instanceof GridLayout) {
section.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL, SWT.CENTER, true, false));
}
// Create the section client
Composite client = createClientContainer(section, 3, toolkit);
Assert.isNotNull(client);
section.setClient(client);
client.setBackground(section.getBackground());
// Create a toolbar for the section
createSectionToolbar(section, toolkit);
// Create the section sub controls
processImage = new BaseEditBrowseTextControl(null) {
@Override
protected void onButtonControlSelected() {
if (firstSelection != null) {
FSOpenFileDialog dialog = new FSOpenFileDialog(section.getShell());
dialog.setFilterPath(getEditFieldControlText());
dialog.setInput(firstSelection);
if (dialog.open() == Window.OK) {
Object candidate = dialog.getFirstResult();
if (candidate instanceof IFSTreeNode) {
String absPath = ((IFSTreeNode) candidate).getLocation();
if (absPath != null) {
processImage.setEditFieldControlText(absPath);
}
}
}
}
}
@Override
public void modifyText(ModifyEvent e) {
super.modifyText(e);
getManagedForm().dirtyStateChanged();
}
@Override
protected boolean isAdjustEditFieldControlWidthHint() {
return true;
}
};
processImage.setEditFieldLabel(Messages.LaunchConfigurationMainTabSection_processImage_label);
processImage.setIsGroup(false);
processImage.setHideBrowseButton(false);
processImage.setAdjustBackgroundColor(true);
processImage.setParentControlIsInnerPanel(true);
processImage.setFormToolkit(toolkit);
processImage.setupPanel(client);
processImage.doCreateControlDecoration(processImage.getEditFieldControl(), client);
processArguments = new BaseEditBrowseTextControl(null) {
@Override
public void modifyText(ModifyEvent e) {
super.modifyText(e);
getManagedForm().dirtyStateChanged();
}
@Override
protected boolean isAdjustEditFieldControlWidthHint() {
return true;
}
};
processArguments.setEditFieldLabel(Messages.LaunchConfigurationMainTabSection_processArguments_label);
processArguments.setIsGroup(false);
processArguments.setHideBrowseButton(true);
processArguments.setAdjustBackgroundColor(true);
processArguments.setParentControlIsInnerPanel(true);
processArguments.setFormToolkit(toolkit);
processArguments.setupPanel(client);
Object container = getManagedForm().getContainer();
if (container instanceof AbstractLaunchConfigurationTab) {
ILaunchConfigurationDialog dialog = ((AbstractLaunchConfigurationTab)container).getLaunchConfigurationDialog();
String mode = dialog != null ? dialog.getMode() : null;
if (ILaunchManager.DEBUG_MODE.equals(mode)) {
// Add the debug options to the launch tab
Label label = new Label(client, SWT.HORIZONTAL);
GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
layoutData.horizontalSpan = 3;
label.setLayoutData(layoutData);
stopAtEntry = toolkit.createButton(client, Messages.LaunchConfigurationMainTabSection_stopAtEntry_label, SWT.CHECK);
layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
layoutData.horizontalSpan = 3;
stopAtEntry.setLayoutData(layoutData);
stopAtEntry.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
getManagedForm().dirtyStateChanged();
}
});
stopAtMain = toolkit.createButton(client, Messages.LaunchConfigurationMainTabSection_stopAtMain_label, SWT.CHECK);
layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
layoutData.horizontalSpan = 3;
stopAtMain.setLayoutData(layoutData);
stopAtMain.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
getManagedForm().dirtyStateChanged();
}
});
attachChildren = toolkit.createButton(client, Messages.LaunchConfigurationMainTabSection_attachChildren_label, SWT.CHECK);
layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
layoutData.horizontalSpan = 3;
attachChildren.setLayoutData(layoutData);
attachChildren.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
getManagedForm().dirtyStateChanged();
}
});
}
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
*/
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
Assert.isNotNull(configuration);
if (processImage != null) {
String image = DefaultPersistenceDelegate.getAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_IMAGE, ""); //$NON-NLS-1$
processImage.setEditFieldControlText(image);
}
if (processArguments != null) {
String arguments = DefaultPersistenceDelegate.getAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_ARGUMENTS, ""); //$NON-NLS-1$
processArguments.setEditFieldControlText(arguments);
}
if (stopAtEntry != null) {
boolean selected = DefaultPersistenceDelegate.getAttribute(configuration, IProcessesStepAttributes.ATTR_STOP_AT_ENTRY, false);
stopAtEntry.setSelection(selected);
}
if (stopAtMain != null) {
boolean selected = DefaultPersistenceDelegate.getAttribute(configuration, IProcessesStepAttributes.ATTR_STOP_AT_MAIN, false);
stopAtMain.setSelection(selected);
}
if (attachChildren != null) {
boolean selected = DefaultPersistenceDelegate.getAttribute(configuration, IProcessesStepAttributes.ATTR_ATTACH_CHILDREN, false);
attachChildren.setSelection(selected);
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.launch.ui.interfaces.ILaunchConfigurationTabFormPart#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
Assert.isNotNull(configuration);
if (processImage != null) {
String image = processImage.getEditFieldControlText();
if (image != null && image.trim().length() > 0) {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_IMAGE, image);
} else {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_IMAGE, (String)null);
}
} else {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_IMAGE, (String)null);
}
if (processArguments != null) {
String arguments = processArguments.getEditFieldControlText();
if (arguments != null && arguments.trim().length() > 0) {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_ARGUMENTS, arguments);
} else {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_ARGUMENTS, (String)null);
}
} else {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_PROCESS_ARGUMENTS, (String)null);
}
if (stopAtEntry != null) {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_STOP_AT_ENTRY, stopAtEntry.getSelection());
}
if (stopAtMain != null) {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_STOP_AT_MAIN, stopAtMain.getSelection());
}
if (attachChildren != null) {
DefaultPersistenceDelegate.setAttribute(configuration, IProcessesStepAttributes.ATTR_ATTACH_CHILDREN, attachChildren.getSelection());
}
}
@Override
public boolean isValid(ILaunchConfiguration configuration) {
firstSelection = null;
IModelNode[] contexts = LaunchContextsPersistenceDelegate.getLaunchContexts(configuration);
if (contexts != null && contexts.length > 0) {
firstSelection = contexts[0];
}
processImage.getButtonControl().setEnabled(firstSelection != null);
if (processImage.getEditFieldControlText().trim().length() > 0) {
setMessage(null, IMessageProvider.NONE);
}
else {
setMessage(Messages.LaunchConfigurationMainTabSection_error_missingProcessImage, IMessageProvider.ERROR);
}
processImage.updateControlDecoration(getMessage(), getMessageType());
return processImage.getEditFieldControlText().trim().length() > 0;
}
}