blob: c9ba0e4247cec2976e654d75741699b5233dab8d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2020 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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.internal.debug.ui.launch;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
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.Font;
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.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.tcf.internal.debug.ui.ImageCache;
import org.eclipse.tcf.internal.debug.ui.model.TCFModel;
import org.eclipse.tcf.services.IPathMap;
public class PathMapRuleDialog extends TitleAreaDialog {
private final IPathMap.PathMapRule pathMapRule;
private final boolean enable_editing;
private final boolean showContextQuery;
private final Image image;
private Text source_text;
private Text destination_text;
private Text context_query_text;
private Button destination_button_dir;
private Button destination_button_file;
public PathMapRuleDialog(Shell parent, Image image, IPathMap.PathMapRule pathMapRule, boolean enable_editing, boolean showContextQuery) {
super(parent);
this.image = image != null ? image : ImageCache.getImage(ImageCache.IMG_PATH);
this.pathMapRule = pathMapRule;
this.enable_editing = enable_editing;
this.showContextQuery = showContextQuery;
setHelpAvailable(false);
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("File Path Map Rule"); //$NON-NLS-1$
shell.setImage(image);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
updateButtons();
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle("Add or edit source and destination path mapping rule"); //$NON-NLS-1$
setMessage("Source and destination are absolute path fragments.\nThe rule is applied if the source path fragment matches or is a prefix of a path to map."); //$NON-NLS-1$
Composite composite = (Composite)super.createDialogArea(parent);
createFileNameFields(composite);
setData();
composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
//PlatformUI.getWorkbench().getHelpSystem().setHelp(getShell(), "org.eclipse.tcf.debug.ui.add_path_map_rule"); //$NON-NLS-1$
return composite;
}
private void createFileNameFields(Composite parent) {
Font font = parent.getFont();
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(4, false);
composite.setFont(font);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label source_label = new Label(composite, SWT.NONE);
source_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
source_label.setFont(font);
source_label.setText("Source:"); //$NON-NLS-1$
source_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = convertWidthInCharsToPixels(40);
gd.horizontalSpan = 3;
source_text.setLayoutData(gd);
source_text.setFont(font);
if (!enable_editing) {
source_text.setEditable(false);
source_text.setBackground(parent.getBackground());
}
source_text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtons();
}
});
Label destination_label = new Label(composite, SWT.NONE);
destination_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
destination_label.setFont(font);
destination_label.setText("Destination:"); //$NON-NLS-1$
destination_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = convertWidthInCharsToPixels(40);
destination_text.setLayoutData(gd);
destination_text.setFont(font);
if (!enable_editing) {
destination_text.setEditable(false);
destination_text.setBackground(parent.getBackground());
}
destination_text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtons();
}
});
destination_button_dir = new Button(composite, SWT.PUSH);
destination_button_dir.setImage(ImageCache.getImage(ImageCache.IMG_FOLDER));
destination_button_dir.setFont(font);
destination_button_dir.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
destination_button_dir.setEnabled(enable_editing);
destination_button_dir.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE);
dialog.setFilterPath(destination_text.getText());
String path = dialog.open();
if (path != null) destination_text.setText(path);
}
});
destination_button_file = new Button(composite, SWT.PUSH);
destination_button_file.setImage(ImageCache.getImage(ImageCache.IMG_FILE));
destination_button_file.setFont(font);
destination_button_file.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
destination_button_file.setEnabled(enable_editing);
destination_button_file.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
dialog.setFilterPath(destination_text.getText());
String path = dialog.open();
if (path != null) destination_text.setText(path);
}
});
if (showContextQuery) {
Label context_query_label = new Label(composite, SWT.NONE);
context_query_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
context_query_label.setFont(font);
context_query_label.setText("Context Query:"); //$NON-NLS-1$
context_query_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 200;
gd.horizontalSpan = 2;
context_query_text.setLayoutData(gd);
context_query_text.setFont(font);
if (!enable_editing) {
context_query_text.setEditable(false);
context_query_text.setBackground(parent.getBackground());
}
context_query_text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtons();
}
});
}
}
private void setData() {
source_text.setText(pathMapRule.getSource() != null ? pathMapRule.getSource() : ""); //$NON-NLS-1$
destination_text.setText(pathMapRule.getDestination() != null ? pathMapRule.getDestination() : ""); //$NON-NLS-1$
if (context_query_text != null)
context_query_text.setText(pathMapRule.getContextQuery() != null ? pathMapRule.getContextQuery() : ""); //$NON-NLS-1$
updateButtons();
}
private void getData() {
if (source_text.getText().trim().length() > 0)
pathMapRule.getProperties().put(IPathMap.PROP_SOURCE, source_text.getText());
else
pathMapRule.getProperties().remove(IPathMap.PROP_SOURCE);
if (destination_text.getText().trim().length() > 0)
pathMapRule.getProperties().put(IPathMap.PROP_DESTINATION, destination_text.getText());
else
pathMapRule.getProperties().remove(IPathMap.PROP_DESTINATION);
if (context_query_text != null && context_query_text.getText().trim().length() > 0)
pathMapRule.getProperties().put(IPathMap.PROP_CONTEXT_QUERY, context_query_text.getText());
else
pathMapRule.getProperties().remove(IPathMap.PROP_CONTEXT_QUERY);
}
private void updateButtons() {
Button btn = getButton(IDialogConstants.OK_ID);
if (btn != null && source_text != null) btn.setEnabled(!enable_editing || source_text.getText().trim().length() > 0);
}
@Override
protected void okPressed() {
if (enable_editing) {
try {
getData();
}
catch (Throwable x) {
MessageBox mb = new MessageBox(getShell(), SWT.ICON_ERROR | SWT.OK);
mb.setText("Invalid data"); //$NON-NLS-1$
mb.setMessage(TCFModel.getErrorMessage(x, true));
mb.open();
return;
}
}
super.okPressed();
}
}