/*******************************************************************************
* Copyright (c) 2004, 2005 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.propertypages;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.model.ICModule;
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PropertyPage;
/**
* The property page for a module.
*/
public class ModulePropertyPage extends PropertyPage {
private Label fTypeField;
private Label fCPUField;
private Label fBaseAddressField;
private Label fSizeField;
private Label fSymbolsField;
protected Text fSymbolsFileField;
protected Button fBrowseButton;
private ModuleProperties fProperties = null;
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
protected Control createContents( Composite parent ) {
noDefaultAndApplyButton();
Composite composite = new Composite( parent, SWT.NONE );
Font font = parent.getFont();
composite.setFont( font );
GridLayout topLayout = new GridLayout();
topLayout.numColumns = 2;
composite.setLayout( topLayout );
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
createFields( composite );
initializeFields();
setValid( true );
return composite;
}
protected ICModule getModule() {
return (ICModule)getElement();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
public boolean performOk() {
if ( getModuleProperties() != null && getModuleProperties().isDirty() ) {
final IPath path = (IPath)getModuleProperties().getProperty( ModuleProperties.SYMBOLS_FILE );
final ICModule module = getModule();
if ( module != null ) {
DebugPlugin.getDefault().asyncExec(
new Runnable() {
public void run() {
try {
module.setSymbolsFileName( path );
}
catch( DebugException e ) {
failed( PropertyPageMessages.getString( "ModulePropertyPage.15" ), e ); //$NON-NLS-1$
}
}
} );
}
}
return super.performOk();
}
protected ModuleProperties getModuleProperties() {
if ( fProperties == null ) {
fProperties = ModuleProperties.create( getModule() );
}
return fProperties;
}
protected void failed( String message, Throwable e ) {
MultiStatus ms = new MultiStatus( CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, message, null );
ms.add( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), null ) );
CDebugUtils.error( ms, getModule() );
}
private void createFields( Composite parent ) {
fTypeField = createField( parent, PropertyPageMessages.getString( "ModulePropertyPage.0" ) ); //$NON-NLS-1$
fCPUField = createField( parent, PropertyPageMessages.getString( "ModulePropertyPage.4" ) ); //$NON-NLS-1$
fBaseAddressField = createField( parent, PropertyPageMessages.getString( "ModulePropertyPage.6" ) ); //$NON-NLS-1$
fSizeField = createField( parent, PropertyPageMessages.getString( "ModulePropertyPage.8" ) ); //$NON-NLS-1$
fSymbolsField = createField( parent, PropertyPageMessages.getString( "ModulePropertyPage.10" ) ); //$NON-NLS-1$
createSymbolsFileField( parent );
}
private Label createField( Composite parent, String label ) {
Font font = parent.getFont();
Label l = new Label( parent, SWT.LEFT );
l.setText( label );
GridData gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL );
l.setLayoutData( gd );
l.setFont( font );
Label v = new Label( parent, SWT.LEFT );
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL );
v.setLayoutData( gd );
v.setFont( font );
return v;
}
private void createSymbolsFileField( Composite parent ) {
Font font = parent.getFont();
// Separator
Label l = new Label( parent, SWT.LEFT );
GridData gd = new GridData( GridData.FILL_HORIZONTAL );
gd.horizontalSpan = 2;
l.setLayoutData( gd );
l = new Label( parent, SWT.LEFT );
l.setText( PropertyPageMessages.getString( "ModulePropertyPage.13" ) ); //$NON-NLS-1$
gd = new GridData( GridData.FILL_HORIZONTAL );
gd.horizontalSpan = 2;
l.setLayoutData( gd );
l.setFont( font );
Composite composite = new Composite( parent, SWT.NONE );
composite.setFont( font );
GridLayout layout = new GridLayout();
layout.numColumns = 5;
composite.setLayout( layout );
gd = new GridData( GridData.FILL_BOTH );
gd.horizontalSpan = 2;
composite.setLayoutData( gd );
// Text
fSymbolsFileField = new Text( composite, SWT.SINGLE | SWT.BORDER );
gd = new GridData( GridData.FILL_HORIZONTAL );
gd.horizontalSpan = 4;
fSymbolsFileField.setLayoutData( gd );
fBrowseButton = new Button( composite, SWT.PUSH );
fBrowseButton.setText( PropertyPageMessages.getString( "ModulePropertyPage.3" ) ); //$NON-NLS-1$
fBrowseButton.addSelectionListener(
new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
FileDialog dialog = new FileDialog( fBrowseButton.getShell() );
dialog.setFileName( ((IPath)getModuleProperties().getProperty( ModuleProperties.SYMBOLS_FILE )).toOSString() );
String fn = dialog.open();
if ( fn != null ) {
IPath path = new Path( fn );
fSymbolsFileField.setText( path.toOSString() );
getModuleProperties().setProperty( ModuleProperties.SYMBOLS_FILE, path );
}
}
public void widgetDefaultSelected( SelectionEvent e ) {
}
} );
}
private void initializeFields() {
// Type
Integer type = (Integer)getModuleProperties().getProperty( ModuleProperties.TYPE );
String value = PropertyPageMessages.getString( "ModulePropertyPage.16" ); //$NON-NLS-1$
if ( type.intValue() == ICModule.EXECUTABLE ) {
value = PropertyPageMessages.getString( "ModulePropertyPage.1" ); //$NON-NLS-1$
}
if ( type.intValue() == ICModule.SHARED_LIBRARY ) {
value = PropertyPageMessages.getString( "ModulePropertyPage.2" ); //$NON-NLS-1$
}
fTypeField.setText( value );
// CPU
String cpu = (String)getModuleProperties().getProperty( ModuleProperties.CPU );
value = ( cpu != null ) ? cpu : PropertyPageMessages.getString( "ModulePropertyPage.5" ); //$NON-NLS-1$
fCPUField.setText( value );
// Base address
IAddress address = (IAddress)getModuleProperties().getProperty( ModuleProperties.BASE_ADDRESS );
value = ( address != null && !address.isZero() ) ? address.toHexAddressString() : PropertyPageMessages.getString( "ModulePropertyPage.7" ); //$NON-NLS-1$
fBaseAddressField.setText( value );
// Size
Long size = (Long)getModuleProperties().getProperty( ModuleProperties.SIZE );
value = ( size != null && size.longValue() > 0 ) ? size.toString() : PropertyPageMessages.getString( "ModulePropertyPage.9" ); //$NON-NLS-1$
fSizeField.setText( value );
// Symbols flag
Boolean loaded = (Boolean)getModuleProperties().getProperty( ModuleProperties.SYMBOLS_LOADED );
value = ( loaded != null && loaded.booleanValue() ) ? PropertyPageMessages.getString( "ModulePropertyPage.11" ) : PropertyPageMessages.getString( "ModulePropertyPage.12" ); //$NON-NLS-1$ //$NON-NLS-2$
fSymbolsField.setText( value );
// Symbols file:
IPath path = (IPath)getModuleProperties().getProperty( ModuleProperties.SYMBOLS_FILE );
value = ( path != null ) ? path.toOSString() : PropertyPageMessages.getString( "ModulePropertyPage.14" ); //$NON-NLS-1$
fSymbolsFileField.setText( value );
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#dispose()
*/
public void dispose() {
if ( getModuleProperties() != null ) {
getModuleProperties().dispose();
}
super.dispose();
}
}