blob: 2f208e34cc652ecfd4bb9901ff9b9aac5d7a6b4b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Xilinx, 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:
* Xilinx - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.internal.debug.ui.launch;
import java.math.BigInteger;
import java.util.Map;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.window.Window;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
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.launch.TCFLaunchDelegate;
import org.eclipse.tcf.internal.debug.ui.ImageCache;
import org.eclipse.tcf.internal.debug.ui.model.TCFModel;
import org.eclipse.tcf.protocol.JSON;
class DownloadFileDialog extends Dialog {
private final Image image;
private final String peer_id;
private final Map<String,Object> map;
private Text context_text;
private Text file_text;
private Text addr_text;
private Text size_text;
private Text offs_text;
private Button file_button;
private Button context_button;
private Button load_syms_button;
private Button relocate_button;
private Button download_button;
private Button set_pc_button;
private Button osa_button;
DownloadFileDialog(Shell parentShell, String peer_id, Map<String,Object> map) {
super(parentShell);
this.image = ImageCache.getImage(ImageCache.IMG_DOWNLOAD_TAB);
this.peer_id = peer_id;
this.map = map;
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Download File"); //$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) {
Composite composite = (Composite)super.createDialogArea(parent);
createFileFields(composite);
setData();
composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
return composite;
}
private void createFileFields(Composite parent) {
Font font = parent.getFont();
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
composite.setFont(font);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label context_label = new Label(composite, SWT.NONE);
context_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
context_label.setFont(font);
context_label.setText("Context:"); //$NON-NLS-1$
context_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 400;
context_text.setLayoutData(gd);
context_text.setFont(font);
context_text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtons();
}
});
context_button = new Button(composite, SWT.PUSH);
context_button.setText("Select..."); //$NON-NLS-1$
context_button.setFont(font);
context_button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
context_button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String context = context_text.getText().trim();
ContextSelection selection = new ContextSelection();
selection.fPeerId = peer_id;
selection.fContextFullName = context;
ContextSelectionDialog diag = new ContextSelectionDialog(DownloadFileDialog.this, false);
diag.setSelection(selection);
if (diag.open() == Window.OK) {
selection = diag.getSelection();
context_text.setText(selection.fContextFullName);
}
}
});
Label file_label = new Label(composite, SWT.NONE);
file_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
file_label.setFont(font);
file_label.setText("File:"); //$NON-NLS-1$
file_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
file_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
file_text.setFont(font);
file_text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtons();
}
});
file_button = new Button(composite, SWT.PUSH);
file_button.setText("Browse..."); //$NON-NLS-1$
file_button.setFont(font);
file_button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
file_button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String path = file_text.getText().trim();
if (path.length() == 0) path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
dialog.setFilterPath(path);
path = dialog.open();
if (path != null) file_text.setText(path);
}
});
load_syms_button = new Button(composite, SWT.CHECK);
load_syms_button.setText("Load symbols");
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
load_syms_button.setLayoutData(gd);
load_syms_button.setFont(font);
load_syms_button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
updateButtons();
}
});
load_syms_button.setEnabled(true);
relocate_button = new Button(composite, SWT.CHECK);
relocate_button.setText("Relocate the file");
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
relocate_button.setLayoutData(gd);
relocate_button.setFont(font);
relocate_button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
updateButtons();
}
});
relocate_button.setEnabled(true);
Composite rel_group = createRelocateGroup(composite);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
rel_group.setLayoutData(gd);
download_button = new Button(composite, SWT.CHECK);
download_button.setText("Download the file into the context memory");
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
download_button.setLayoutData(gd);
download_button.setFont(font);
download_button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
updateButtons();
}
});
download_button.setEnabled(true);
set_pc_button = new Button(composite, SWT.CHECK);
set_pc_button.setText("Set PC to program entry address");
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
set_pc_button.setLayoutData(gd);
set_pc_button.setFont(font);
set_pc_button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
updateButtons();
}
});
set_pc_button.setEnabled(true);
osa_button = new Button(composite, SWT.CHECK);
osa_button.setText("Enable OS awareness - the file is an OS kernel");
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
osa_button.setLayoutData(gd);
osa_button.setFont(font);
osa_button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
updateButtons();
}
});
osa_button.setEnabled(true);
}
private Composite createRelocateGroup(Composite parent) {
Font font = parent.getFont();
Group group = new Group(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.verticalSpacing = 0;
layout.numColumns = 2;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
group.setFont(font);
group.setText("File location in the context memory");
Label addr_label = new Label(group, SWT.WRAP);
addr_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
addr_label.setFont(font);
addr_label.setText("Address:");
addr_text = new Text(group, SWT.SINGLE | SWT.BORDER);
addr_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
addr_text.setFont(font);
Label size_label = new Label(group, SWT.WRAP);
size_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
size_label.setFont(font);
size_label.setText("Size:");
size_text = new Text(group, SWT.SINGLE | SWT.BORDER);
size_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
size_text.setFont(font);
Label offset_label = new Label(group, SWT.WRAP);
offset_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
offset_label.setFont(font);
offset_label.setText("File offset:");
offs_text = new Text(group, SWT.SINGLE | SWT.BORDER);
offs_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
offs_text.setFont(font);
return group;
}
private String toHex(Number n) {
if (n == null) return null;
BigInteger x = JSON.toBigInteger(n);
String s = x.toString(16);
int l = 16 - s.length();
if (l < 0) l = 0;
if (l > 16) l = 16;
return "0x0000000000000000".substring(0, 2 + l) + s;
}
private void setString(Text text, String key) {
String s = (String)map.get(key);
if (s == null) s = "";
text.setText(s);
}
private void setBoolean(Button btn, String key) {
Boolean b = (Boolean)map.get(key);
if (b == null) btn.setSelection(false);
else btn.setSelection(b.booleanValue());
}
private void setNumber(Text text, String key) {
Number n = (Number)map.get(key);
if (n == null) text.setText("");
else text.setText(toHex(n));
}
private void setData() {
setString(context_text, TCFLaunchDelegate.FILES_CONTEXT_FULL_NAME);
setString(file_text, TCFLaunchDelegate.FILES_FILE_NAME);
setBoolean(load_syms_button, TCFLaunchDelegate.FILES_LOAD_SYMBOLS);
setBoolean(relocate_button, TCFLaunchDelegate.FILES_RELOCATE);
setBoolean(download_button, TCFLaunchDelegate.FILES_DOWNLOAD);
setBoolean(set_pc_button, TCFLaunchDelegate.FILES_SET_PC);
setBoolean(osa_button, TCFLaunchDelegate.FILES_ENABLE_OSA);
setNumber(addr_text, TCFLaunchDelegate.FILES_ADDRESS);
setNumber(offs_text, TCFLaunchDelegate.FILES_OFFSET);
setNumber(size_text, TCFLaunchDelegate.FILES_SIZE);
updateButtons();
}
private void getBoolean(Button btn, String key) {
boolean b = btn.getSelection();
if (!b) {
map.remove(key);
}
else {
map.put(key, Boolean.TRUE);
}
}
private void getString(Text text, String key) {
String s = text.getText().trim();
if (s == null || s.length() == 0) {
map.remove(key);
}
else {
map.put(key, s);
}
}
private void getNumber(Text text, String key) {
String s = text.getText().trim();
if (s == null || s.length() == 0) {
map.remove(key);
}
else if (s.startsWith("0x")) {
map.put(key, new BigInteger(s.substring(2), 16));
}
else {
map.put(key, new BigInteger(s));
}
}
private void getData() {
getString(context_text, TCFLaunchDelegate.FILES_CONTEXT_FULL_NAME);
getString(file_text, TCFLaunchDelegate.FILES_FILE_NAME);
getBoolean(load_syms_button, TCFLaunchDelegate.FILES_LOAD_SYMBOLS);
getBoolean(relocate_button, TCFLaunchDelegate.FILES_RELOCATE);
getBoolean(download_button, TCFLaunchDelegate.FILES_DOWNLOAD);
getBoolean(set_pc_button, TCFLaunchDelegate.FILES_SET_PC);
getBoolean(osa_button, TCFLaunchDelegate.FILES_ENABLE_OSA);
getNumber(addr_text, TCFLaunchDelegate.FILES_ADDRESS);
getNumber(offs_text, TCFLaunchDelegate.FILES_OFFSET);
getNumber(size_text, TCFLaunchDelegate.FILES_SIZE);
}
private void updateButtons() {
Button btn = getButton(IDialogConstants.OK_ID);
if (btn != null && context_text != null && file_text != null) {
String context = context_text.getText().trim();
String file = file_text.getText().trim();
btn.setEnabled(context.length() > 0 && file.length() > 0);
}
if (relocate_button != null) {
boolean reloc = relocate_button.getSelection();
addr_text.setEnabled(reloc);
size_text.setEnabled(reloc);
offs_text.setEnabled(reloc);
}
}
@Override
protected void okPressed() {
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();
}
}