/*******************************************************************************
* Copyright (c) 2006, 2010 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:
* Ted R Williams (Wind River Systems, Inc.) - initial implementation
*******************************************************************************/
package org.eclipse.cdt.debug.ui.memory.transport;
import java.math.BigInteger;
import java.text.MessageFormat;
import java.util.Vector;
import org.eclipse.cdt.debug.ui.memory.transport.model.IMemoryImporter;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.ui.memory.IMemoryRendering;
import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
import org.eclipse.debug.ui.memory.IRepositionableMemoryRendering;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.progress.UIJob;
public class ImportMemoryDialog extends SelectionDialog
{
private static final String IMPORT_SETTINGS = "IMPORT_DIALOG"; //$NON-NLS-1$
private static final String SELECTED_IMPORTER = "SELECTED_IMPORTER"; //$NON-NLS-1$
private Combo fFormatCombo;
private IMemoryBlock fMemoryBlock;
private Control fCurrentControl = null;
private IMemoryImporter fFormatImporters[];
private String fFormatNames[];
private IDialogSettings fProperties = MemoryTransportPlugin.getDefault().getDialogSettings(IMPORT_SETTINGS);
private IMemoryRenderingSite fMemoryView;
private final String INITIAL_ADDRESS = "Initial address";
public ImportMemoryDialog(Shell parent, IMemoryBlock memoryBlock, BigInteger initialStartAddr, IMemoryRenderingSite renderingSite)
{
super(parent);
super.setTitle(Messages.getString("ImportMemoryDialog.Title")); //$NON-NLS-1$
setShellStyle(getShellStyle() | SWT.RESIZE);
fMemoryBlock = memoryBlock;
fMemoryView = renderingSite;
String initialAddress = fProperties.get(INITIAL_ADDRESS);
if ( initialAddress == null ) {
String addrstr = "0x" + initialStartAddr.toString(16); //$NON-NLS-1$
fProperties.put(IMemoryImporter.TRANSFER_START, addrstr);
fProperties.put(INITIAL_ADDRESS , addrstr);
}
else {
String addrstr = "0x" + initialStartAddr.toString(16); //$NON-NLS-1$
if ( ! initialAddress.equals(addrstr) ) {
fProperties.put(IMemoryImporter.TRANSFER_START, addrstr);
fProperties.put(INITIAL_ADDRESS , addrstr);
}
else {
String startAddr = fProperties.get(IMemoryImporter.TRANSFER_START);
if ( startAddr == null ) {
fProperties.put(IMemoryImporter.TRANSFER_START, addrstr);
fProperties.put(INITIAL_ADDRESS , addrstr);
}
}
}
}
public void scrollRenderings(final BigInteger address)
{
UIJob job = new UIJob("repositionRenderings"){ //$NON-NLS-1$
public IStatus runInUIThread(IProgressMonitor monitor) {
for (IMemoryRenderingContainer container : fMemoryView.getMemoryRenderingContainers()) {
IMemoryRendering rendering = container.getActiveRendering();
if(rendering instanceof IRepositionableMemoryRendering) {
try {
((IRepositionableMemoryRendering) rendering).goToAddress(address);
}
catch (DebugException ex) {
MemoryTransportPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MemoryTransportPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(Messages.getString("ImportMemoryDialog.ErrRepositioningRendering"), address.toString(16)), ex)); //$NON-NLS-1$
}
}
}
return Status.OK_STATUS;
}};
job.setSystem(true);
job.setThread(Display.getDefault().getThread());
job.schedule();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
}
/* (non-Javadoc)
* @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
*/
public Object[] getResult() {
Object[] results = super.getResult();
if (results != null)
{
return results;
}
return new Object[0];
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
*/
protected void cancelPressed() {
setResult(null);
super.cancelPressed();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
if(fCurrentControl != null)
fCurrentControl.dispose();
IMemoryImporter currentImporter = getCurrentImporter();
currentImporter.importMemory();
fProperties.put(SELECTED_IMPORTER, currentImporter.getId());
super.okPressed();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, MemoryTransportPlugin.getUniqueIdentifier() + ".ImportMemoryDialog_context"); //$NON-NLS-1$
Composite composite = new Composite(parent, SWT.NONE);
FormLayout formLayout = new FormLayout();
formLayout.spacing = 5;
formLayout.marginWidth = formLayout.marginHeight = 9;
composite.setLayout(formLayout);
// format
Label textLabel = new Label(composite, SWT.NONE);
textLabel.setText(Messages.getString("ImportMemoryDialog.Format")); //$NON-NLS-1$
fFormatCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
FormData data = new FormData();
data.top = new FormAttachment(fFormatCombo, 0, SWT.CENTER);
textLabel.setLayoutData(data);
data = new FormData();
data.left = new FormAttachment(textLabel);
fFormatCombo.setLayoutData(data);
Vector<Object> importers = new Vector<Object>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint =
registry.getExtensionPoint("org.eclipse.cdt.debug.ui.memory.transport.memoryTransport"); //$NON-NLS-1$
IConfigurationElement points[] =
extensionPoint.getConfigurationElements();
for (int i = 0; i < points.length; i++)
{
IConfigurationElement element = points[i];
if("importer".equals(element.getName())) //$NON-NLS-1$
{
try
{
importers.addElement(element.createExecutableExtension("class")); //$NON-NLS-1$
}
catch(Exception e) {
MemoryTransportPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MemoryTransportPlugin.getUniqueIdentifier(),
DebugException.INTERNAL_ERROR, "Failure", e)); //$NON-NLS-1$
}
}
}
fFormatImporters = new IMemoryImporter[importers.size()];
fFormatNames = new String[importers.size()];
for(int i = 0; i < fFormatImporters.length; i++)
{
fFormatImporters[i] = (IMemoryImporter) importers.elementAt(i);
fFormatNames[i] = ((IMemoryImporter) importers.elementAt(i)).getName();
}
final Composite container = new Composite(composite, SWT.NONE);
data = new FormData();
data.top = new FormAttachment(fFormatCombo);
data.left = new FormAttachment(0);
container.setLayoutData(data);
fFormatCombo.setItems(fFormatNames);
fFormatCombo.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
if(fCurrentControl != null) {
fCurrentControl.dispose();
}
fCurrentControl = getCurrentImporter().createControl(container, fMemoryBlock, fProperties, ImportMemoryDialog.this);
}
});
setCurrentImporter(fProperties.get(SELECTED_IMPORTER));
fCurrentControl = getCurrentImporter().createControl(container,fMemoryBlock, fProperties, ImportMemoryDialog.this);
return composite;
}
public void setValid(boolean isValid)
{
getButton(IDialogConstants.OK_ID).setEnabled(isValid);
}
private IMemoryImporter getCurrentImporter() {
return fFormatImporters[fFormatCombo.getSelectionIndex()];
}
private void setCurrentImporter(String id) {
if ( id == null || id.length() == 0 ) {
fFormatCombo.select(0);
}
for (int index = 0; index< fFormatImporters.length; ++index) {
if (fFormatImporters[index].getId().equals(id)){
fFormatCombo.select(index);
return;
}
}
fFormatCombo.select(0);
}
}