Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Khodjaiants2005-04-21 19:41:01 +0000
committerMikhail Khodjaiants2005-04-21 19:41:01 +0000
commitaf37524c7ae90496885c26ddfc66724b26d89db9 (patch)
treeff6d928c5031ed83b1d4be4c1af3601a1774b5cd /debug/org.eclipse.cdt.debug.ui
parentf9c9df1db7ee3f2cd67a72be32a02260c8337c8f (diff)
downloadorg.eclipse.cdt-af37524c7ae90496885c26ddfc66724b26d89db9.tar.gz
org.eclipse.cdt-af37524c7ae90496885c26ddfc66724b26d89db9.tar.xz
org.eclipse.cdt-af37524c7ae90496885c26ddfc66724b26d89db9.zip
Bug 80175: Replace the CDT source lookup by the source lookup provided by Eclipse platform.
Diffstat (limited to 'debug/org.eclipse.cdt.debug.ui')
-rw-r--r--debug/org.eclipse.cdt.debug.ui/ChangeLog26
-rw-r--r--debug/org.eclipse.cdt.debug.ui/plugin.properties2
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java17
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java1
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/CDebugPreferencePage.java10
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties5
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java276
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddContainerAction.java52
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java155
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/DownAction.java57
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/EditContainerAction.java89
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/MappingSourceContainerBrowser.java25
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/PathMappingDialog.java158
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/RemoveAction.java45
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerAction.java176
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java86
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerViewer.java188
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java7
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java34
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties26
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/UpAction.java62
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java5
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/DefaultSourceLocator.java429
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/OldDefaultSourceLocator.java382
24 files changed, 1747 insertions, 566 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog
index 5858779e153..394a3751052 100644
--- a/debug/org.eclipse.cdt.debug.ui/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog
@@ -1,3 +1,29 @@
+2005-04-21 Mikhail Khodjaiants
+ Bug 80175: Replace the CDT source lookup by the source lookup provided by Eclipse platform.
+ * CDebugModelPresentation.java
+ * ICDebugHelpContextIds.java
+ * CDebugPreferencePage.java
+ * PreferenceMessages.properties
+ * SourcePreferencePage.java
+ * AddContainerAction.java: new
+ * AddSourceContainerDialog.java: new
+ * DownAction.java: new
+ * EditContainerAction.java: new
+ * MappingSourceContainerBrowser.java
+ * PathMappingDialog.java
+ * RemoveAction.java: new
+ * SourceContainerAction.java: new
+ * SourceContainerLabelProvider.java: new
+ * SourceContainerViewer.java: new
+ * SourceContainerWorkbenchAdapter.java
+ * SourceLookupUIMessages.java: new
+ * SourceLookupUIMessages.properties: new
+ * UpAction.java: new
+ * CDebugUIPlugin.java
+ * DefaultSourceLocator.java
+ * OldDefaultSourceLocator.java: new
+ * plugin.properties
+
2005-04-12 Mikhail Khodjaiants
Bug 91155: Wrong icon for "Restart".
* icons/dlcl16/restart.gif
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.properties b/debug/org.eclipse.cdt.debug.ui/plugin.properties
index 909018d7747..1cf09944e98 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.properties
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.properties
@@ -19,7 +19,7 @@ SignalsView.name=Signals
CDebuggerPage.name=C Debugger UI Page
MemoryPreferencePage.name=Memory View
CDebugPreferencePage.name=Debug
-SourcePreferencePage.name=Source Code Locations
+SourcePreferencePage.name=Source Lookup Path
RunMenu.label=&Run
DebugActionSet.label=C/C++ Debug
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java
index ab625e32670..25425edead5 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugModelPresentation.java
@@ -41,7 +41,6 @@ import org.eclipse.cdt.debug.core.model.ICVariable;
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
import org.eclipse.cdt.debug.core.model.IEnableDisableTarget;
-import org.eclipse.cdt.debug.internal.ui.editors.CDebugEditor;
import org.eclipse.cdt.debug.internal.ui.editors.EditorInputDelegate;
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
@@ -153,20 +152,20 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(org.eclipse.ui.IEditorInput, java.lang.Object)
*/
public String getEditorId( IEditorInput input, Object element ) {
- if ( input instanceof EditorInputDelegate ) {
- if ( ((EditorInputDelegate)input).getDelegate() == null )
- return CDebugEditor.EDITOR_ID;
- return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
- }
+// if ( input instanceof EditorInputDelegate ) {
+// if ( ((EditorInputDelegate)input).getDelegate() == null )
+// return CDebugEditor.EDITOR_ID;
+// return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
+// }
String id = null;
if ( input != null ) {
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
id = (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
}
- if ( CUIPlugin.EDITOR_ID.equals( id ) ) {
- return CDebugEditor.EDITOR_ID;
- }
+// if ( CUIPlugin.EDITOR_ID.equals( id ) ) {
+// return CDebugEditor.EDITOR_ID;
+// }
return id;
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java
index a18f11ea12e..d06781259bd 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/ICDebugHelpContextIds.java
@@ -66,4 +66,5 @@ public interface ICDebugHelpContextIds
// dialogs
public static final String SOURCE_PATH_MAPPING_DIALOG = PREFIX + "source_path_mapping_dialog_context"; //$NON-NLS-1$
public static final String SOURCE_PATH_MAP_ENTRY_DIALOG = PREFIX + "source_path_map_entry_dialog_context"; //$NON-NLS-1$
+ public static final String ADD_SOURCE_CONTAINER_DIALOG = PREFIX + "add_source_container_dialog"; //$NON-NLS-1$
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/CDebugPreferencePage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/CDebugPreferencePage.java
index e8a220bd7c6..cbc865f945b 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/CDebugPreferencePage.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/CDebugPreferencePage.java
@@ -20,10 +20,8 @@ import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.preference.ColorFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.IPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceConverter;
@@ -186,8 +184,8 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
PreferenceConverter.setDefault( store, IInternalCDebugUIConstants.DISASSEMBLY_SOURCE_LINE_COLOR, IInternalCDebugUIConstants.DEFAULT_DISASSEMBLY_SOURCE_LINE_RGB );
}
- /**
- * @see DialogPage#dispose()
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
*/
public void dispose() {
super.dispose();
@@ -274,8 +272,8 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
label.setLayoutData( gd );
}
- /**
- * @see IPreferencePage#performOk() Also, notifies interested listeners
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
public boolean performOk() {
storeValues();
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties
index 40296cbbc26..16ec1a7249c 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/PreferenceMessages.properties
@@ -22,6 +22,5 @@ CDebugPreferencePage.10=Default register format:
CDebugPreferencePage.11=Disassembly options
CDebugPreferencePage.12=Maximum number of displayed instructions:
CDebugPreferencePage.13=The valid value range is [{0},{1}].
-SourcePreferencePage.0=Common source lookup settings.
-SourcePreferencePage.1=Source Locations
-SourcePreferencePage.2=Search for duplicate source files
+SourcePreferencePage.0=Common source lookup path settings.
+SourcePreferencePage.0=S&ource Lookup Path:
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java
index d7a411d5eb5..968d39720a3 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/preferences/SourcePreferencePage.java
@@ -1,90 +1,115 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
+ * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
+ *
+ * Contributors:
* QNX Software Systems - Initial API and implementation
- ***********************************************************************/
-package org.eclipse.cdt.debug.internal.ui.preferences;
+ ***********************************************************************/
+package org.eclipse.cdt.debug.internal.ui.preferences;
-import java.util.Arrays;
-import java.util.Observable;
-import java.util.Observer;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
-import org.eclipse.cdt.debug.core.ICDebugConstants;
-import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
-import org.eclipse.cdt.debug.internal.ui.PixelConverter;
-import org.eclipse.cdt.debug.internal.ui.dialogfields.DialogField;
-import org.eclipse.cdt.debug.internal.ui.dialogfields.IDialogFieldListener;
-import org.eclipse.cdt.debug.internal.ui.dialogfields.IListAdapter;
-import org.eclipse.cdt.debug.internal.ui.dialogfields.LayoutUtil;
-import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
-import org.eclipse.cdt.debug.internal.ui.wizards.AddSourceLocationWizard;
-import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
-import org.eclipse.cdt.debug.ui.sourcelookup.SourceListDialogField;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.AddContainerAction;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.DownAction;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.EditContainerAction;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.RemoveAction;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceContainerAction;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceContainerViewer;
+import org.eclipse.cdt.debug.internal.ui.sourcelookup.UpAction;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
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.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
/**
- * The "Source Code Locations" preference page.
+ * The "Source Lookup Path" preference page.
*/
-public class SourcePreferencePage extends PreferencePage implements IWorkbenchPreferencePage, Observer {
+public class SourcePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+ private SourceContainerViewer fPathViewer;
+ private List fActions = new ArrayList(6);
private IWorkbench fWorkbench;
+ private AddContainerAction fAddAction;
+ private EditContainerAction fEditAction;
- private SourceListDialogField fSourceListField;
-
- private SelectionButtonDialogField fSearchForDuplicateFiles;
-
- private boolean fChanged = false;
-
- public SourcePreferencePage() {
- super();
- setPreferenceStore( CDebugUIPlugin.getDefault().getPreferenceStore() );
- setDescription( PreferenceMessages.getString( "SourcePreferencePage.0" ) ); //$NON-NLS-1$
- }
-
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
protected Control createContents( Composite parent ) {
- getWorkbench().getHelpSystem().setHelp( getControl(), ICDebugHelpContextIds.SOURCE_PREFERENCE_PAGE );
- fSourceListField = createSourceListField();
- fSearchForDuplicateFiles = createSearchForDuplicateFilesButton();
- Composite control = new Composite( parent, SWT.NONE );
- GridLayout layout = new GridLayout();
- layout.numColumns = 2;
- layout.marginWidth = 5;
- layout.marginHeight = 5;
- control.setLayout( layout );
- GridData data = new GridData();
- data.verticalAlignment = GridData.FILL;
- data.horizontalAlignment = GridData.FILL;
- control.setLayoutData( data );
- control.setFont( JFaceResources.getDialogFont() );
- PixelConverter converter = new PixelConverter( control );
- fSourceListField.doFillIntoGrid( control, 3 );
- LayoutUtil.setHorizontalSpan( fSourceListField.getLabelControl( null ), 2 );
- LayoutUtil.setWidthHint( fSourceListField.getLabelControl( null ), converter.convertWidthInCharsToPixels( 40 ) );
- LayoutUtil.setHorizontalGrabbing( fSourceListField.getListControl( null ) );
- fSearchForDuplicateFiles.doFillIntoGrid( control, 3 );
- setValues();
- return control;
+ Font font = parent.getFont();
+ Composite comp = new Composite( parent, SWT.NONE );
+ GridLayout topLayout = new GridLayout();
+ topLayout.numColumns = 2;
+ comp.setLayout( topLayout );
+ GridData gd = new GridData( GridData.FILL_BOTH );
+ comp.setLayoutData( gd );
+ Label viewerLabel = new Label( comp, SWT.LEFT );
+ viewerLabel.setText( PreferenceMessages.getString( "SourcePreferencePage.0" ) ); //$NON-NLS-1$
+ gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL );
+ gd.horizontalSpan = 2;
+ viewerLabel.setLayoutData( gd );
+ viewerLabel.setFont( font );
+ fPathViewer = new SourceContainerViewer( comp );
+ gd = new GridData( GridData.FILL_BOTH );
+ fPathViewer.getControl().setLayoutData( gd );
+ fPathViewer.getControl().setFont( font );
+ Composite pathButtonComp = new Composite( comp, SWT.NONE );
+ GridLayout pathButtonLayout = new GridLayout();
+ pathButtonLayout.marginHeight = 0;
+ pathButtonLayout.marginWidth = 0;
+ pathButtonComp.setLayout( pathButtonLayout );
+ gd = new GridData( GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL );
+ pathButtonComp.setLayoutData( gd );
+ pathButtonComp.setFont( font );
+ createVerticalSpacer( comp, 2 );
+ GC gc = new GC( parent );
+ gc.setFont( parent.getFont() );
+ FontMetrics fontMetrics = gc.getFontMetrics();
+ gc.dispose();
+ fAddAction = new AddContainerAction();
+ Button button = createPushButton( pathButtonComp, fAddAction.getText(), fontMetrics );
+ fAddAction.setButton( button );
+ addAction( fAddAction );
+ fEditAction = new EditContainerAction();
+ button = createPushButton( pathButtonComp, fEditAction.getText(), fontMetrics );
+ fEditAction.setButton( button );
+ addAction( fEditAction );
+ SourceContainerAction action = new RemoveAction();
+ button = createPushButton( pathButtonComp, action.getText(), fontMetrics );
+ action.setButton( button );
+ addAction( action );
+ action = new UpAction();
+ button = createPushButton( pathButtonComp, action.getText(), fontMetrics );
+ action.setButton( button );
+ addAction( action );
+ action = new DownAction();
+ button = createPushButton( pathButtonComp, action.getText(), fontMetrics );
+ action.setButton( button );
+ addAction( action );
+ retargetActions( fPathViewer );
+ Dialog.applyDialogFont( comp );
+ getWorkbench().getHelpSystem().setHelp( comp, ICDebugHelpContextIds.SOURCE_PREFERENCE_PAGE );
+ initialize();
+ return comp;
}
/*
@@ -96,125 +121,66 @@ public class SourcePreferencePage extends PreferencePage implements IWorkbenchPr
fWorkbench = workbench;
}
- /*
- * (non-Javadoc)
- *
- * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
- */
- public void update( Observable o, Object arg ) {
- setChanged( true );
- }
-
- private SourceListDialogField createSourceListField() {
- SourceListDialogField field = new SourceListDialogField( PreferenceMessages.getString( "SourcePreferencePage.1" ), //$NON-NLS-1$
- new IListAdapter() {
-
- public void customButtonPressed( DialogField f, int index ) {
- sourceButtonPressed( index );
- }
-
- public void selectionChanged( DialogField f ) {
- }
- } );
- field.addObserver( this );
- return field;
- }
-
- private SelectionButtonDialogField createSearchForDuplicateFilesButton() {
- SelectionButtonDialogField button = new SelectionButtonDialogField( SWT.CHECK );
- button.setLabelText( PreferenceMessages.getString( "SourcePreferencePage.2" ) ); //$NON-NLS-1$
- button.setDialogFieldListener( new IDialogFieldListener() {
-
- public void dialogFieldChanged( DialogField field ) {
- setChanged( true );
- }
- } );
+ private Button createPushButton( Composite parent, String label, FontMetrics fontMetrics ) {
+ Button button = new Button( parent, SWT.PUSH );
+ button.setFont( parent.getFont() );
+ button.setText( label );
+ GridData gd = getButtonGridData( button, fontMetrics );
+ button.setLayoutData( gd );
return button;
}
- protected void sourceButtonPressed( int index ) {
- switch( index ) {
- case 0: // Add...
- if ( addSourceLocation() )
- setChanged( true );
- break;
- case 2: // Up
- case 3: // Down
- case 5: // Remove
- setChanged( true );
- break;
- }
+ private GridData getButtonGridData( Button button, FontMetrics fontMetrics ) {
+ GridData gd = new GridData( GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING );
+ int widthHint = Dialog.convertHorizontalDLUsToPixels( fontMetrics, IDialogConstants.BUTTON_WIDTH );
+ gd.widthHint = Math.max( widthHint, button.computeSize( SWT.DEFAULT, SWT.DEFAULT, true ).x );
+ return gd;
}
- protected boolean isChanged() {
- return fChanged;
+ private IWorkbench getWorkbench() {
+ return fWorkbench;
}
- protected void setChanged( boolean changed ) {
- fChanged = changed;
+ private void addAction( SourceContainerAction action ) {
+ fActions.add( action );
}
- private boolean addSourceLocation() {
- AddSourceLocationWizard wizard = new AddSourceLocationWizard( getSourceLocations() );
- WizardDialog dialog = new WizardDialog( getShell(), wizard );
- if ( dialog.open() == Window.OK ) {
- fSourceListField.addElement( wizard.getSourceLocation() );
- return true;
+ private void retargetActions( SourceContainerViewer viewer ) {
+ Iterator actions = fActions.iterator();
+ while( actions.hasNext() ) {
+ SourceContainerAction action = (SourceContainerAction)actions.next();
+ action.setViewer( viewer );
}
- return false;
}
- public ICSourceLocation[] getSourceLocations() {
- return (fSourceListField != null) ? fSourceListField.getSourceLocations() : new ICSourceLocation[0];
+ private void createVerticalSpacer( Composite comp, int colSpan ) {
+ Label label = new Label( comp, SWT.NONE );
+ GridData gd = new GridData();
+ gd.horizontalSpan = colSpan;
+ label.setLayoutData( gd );
}
- public void setSourceLocations( ICSourceLocation[] locations ) {
- if ( fSourceListField != null )
- fSourceListField.setElements( Arrays.asList( locations ) );
+ private void initialize() {
+ ISourceLookupDirector director = CDebugCorePlugin.getDefault().getCommonSourceLookupDirector();
+ fPathViewer.setEntries( director.getSourceContainers() );
+ fAddAction.setSourceLookupDirector( director );
+ fEditAction.setSourceLookupDirector( director );
}
- /*
- * (non-Javadoc)
- *
+ /* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
protected void performDefaults() {
- setSourceLocations( new ICSourceLocation[0] );
- setSearchForDuplicateFiles( false );
+ fPathViewer.setEntries( new ISourceContainer[0] );
super.performDefaults();
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
public boolean performOk() {
- storeValues();
+ CDebugCorePlugin.getDefault().getCommonSourceLookupDirector().setSourceContainers( fPathViewer.getEntries() );
CDebugCorePlugin.getDefault().savePluginPreferences();
return true;
}
-
- private boolean searchForDuplicateFiles() {
- return (fSearchForDuplicateFiles != null) ? fSearchForDuplicateFiles.isSelected() : false;
- }
-
- private void setSearchForDuplicateFiles( boolean search ) {
- if ( fSearchForDuplicateFiles != null )
- fSearchForDuplicateFiles.setSelection( search );
- }
-
- private void setValues() {
- setSourceLocations( CDebugCorePlugin.getDefault().getCommonSourceLocations() );
- setSearchForDuplicateFiles( CDebugCorePlugin.getDefault().getPluginPreferences().getBoolean( ICDebugConstants.PREF_SEARCH_DUPLICATE_FILES ) );
- }
-
- private void storeValues() {
- CDebugCorePlugin.getDefault().saveCommonSourceLocations( getSourceLocations() );
- CDebugCorePlugin.getDefault().getPluginPreferences().setValue( ICDebugConstants.PREF_SEARCH_DUPLICATE_FILES, searchForDuplicateFiles() );
- }
-
- private IWorkbench getWorkbench() {
- return fWorkbench;
- }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddContainerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddContainerAction.java
new file mode 100644
index 00000000000..f7309fa14e2
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddContainerAction.java
@@ -0,0 +1,52 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * The action to add a new source container.
+ * Used by the CommonSourceNotFoundEditor, the launch configuration source tab,
+ * and the EditSourceLookupPathDialog.
+ */
+public class AddContainerAction extends SourceContainerAction {
+
+ private ISourceLookupDirector fDirector;
+
+ public AddContainerAction() {
+ super(SourceLookupUIMessages.getString( "AddContainerAction.0" )); //$NON-NLS-1$
+ }
+
+ /**
+ * Prompts for a project to add.
+ *
+ * @see org.eclipse.jface.action.IAction#run()
+ */
+ public void run() {
+ AddSourceContainerDialog dialog = new AddSourceContainerDialog(getShell(), getViewer(), fDirector);
+ dialog.open();
+ }
+
+ public void setSourceLookupDirector(ISourceLookupDirector director) {
+ fDirector = director;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ protected boolean updateSelection(IStructuredSelection selection) {
+ if(selection == null || selection.isEmpty()) {
+ return true;
+ }
+ return getViewer().getTree().getSelection()[0].getParentItem()==null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
new file mode 100644
index 00000000000..1a2f28c172a
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.ArrayList;
+import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
+import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The dialog for adding new source containers. Presents the user with a list of
+ * source container types and allows them to select one.
+ *
+ * @since 3.0
+ */
+public class AddSourceContainerDialog extends TitleAreaDialog {
+
+ private TableViewer fViewer;
+ private SourceContainerViewer fSourceContainerViewer;
+ private boolean fDoubleClickSelects = true;
+ private ISourceLookupDirector fDirector;
+
+ /**
+ * Constructor
+ */
+ public AddSourceContainerDialog(Shell shell, SourceContainerViewer viewer, ISourceLookupDirector director) {
+ super(shell);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ fSourceContainerViewer=viewer;
+ fDirector = director;
+ }
+
+ /**
+ * Creates the dialog area to display source container types that are "browseable"
+ */
+ protected Control createDialogArea(Composite ancestor) {
+
+ getShell().setText(SourceLookupUIMessages.getString( "AddSourceContainerDialog.0" )); //$NON-NLS-1$
+ setTitle(SourceLookupUIMessages.getString( "AddSourceContainerDialog.1" )); //$NON-NLS-1$
+
+ Composite parent = new Composite(ancestor, SWT.NULL);
+ GridData gd= new GridData(GridData.FILL_BOTH);
+ GridLayout topLayout = new GridLayout();
+ topLayout.numColumns = 1;
+ parent.setLayout(topLayout);
+ parent.setLayoutData(gd);
+
+ ISourceContainerType[] types = filterTypes(DebugPlugin.getDefault().getLaunchManager().getSourceContainerTypes());
+
+ fViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE);
+ final Table table = fViewer.getTable();
+ gd = new GridData(GridData.FILL_BOTH);
+ table.setLayoutData(gd);
+
+ if (fDoubleClickSelects) {
+ table.addSelectionListener(new SelectionAdapter() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ if (table.getSelectionCount() == 1)
+ okPressed();
+ }
+ });
+ }
+
+ fViewer.setLabelProvider(new SourceContainerLabelProvider());
+ fViewer.setContentProvider(new ArrayContentProvider());
+ fViewer.setSorter(new ViewerSorter());
+ fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ String desc = null;
+ if (!selection.isEmpty()) {
+ ISourceContainerType type = (ISourceContainerType) ((IStructuredSelection)selection).getFirstElement();
+ desc = type.getDescription();
+ }
+ setMessage(desc);
+ }
+ });
+ if(types.length != 0) {
+ fViewer.setInput(types);
+ }
+ Dialog.applyDialogFont(parent);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp( getShell(), ICDebugHelpContextIds.ADD_SOURCE_CONTAINER_DIALOG );
+ return parent;
+ }
+
+ /**
+ * Removes types without browsers from the provided list of types.
+ * @param types the complete list of source container types
+ * @return the list of source container types that have browsers
+ */
+ private ISourceContainerType[] filterTypes(ISourceContainerType[] types){
+ ArrayList validTypes = new ArrayList();
+ for (int i=0; i< types.length; i++) {
+ ISourceContainerType type = types[i];
+ if (fDirector.supportsSourceContainerType(type)) {
+ ISourceContainerBrowser sourceContainerBrowser = SourceLookupUIUtils.getSourceContainerBrowser(type.getId());
+ if(sourceContainerBrowser != null && sourceContainerBrowser.canAddSourceContainers(fDirector)) {
+ validTypes.add(type);
+ }
+ }
+ }
+ return (ISourceContainerType[]) validTypes.toArray(new ISourceContainerType[validTypes.size()]);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ protected void okPressed() {
+ //single selection dialog, so take first item in array
+ //there will always be a selected item since we set it with viewer.setSelection
+ ISourceContainerType type = (ISourceContainerType) ((StructuredSelection) fViewer.getSelection()).getFirstElement();
+ ISourceContainerBrowser browser = SourceLookupUIUtils.getSourceContainerBrowser(type.getId());
+ if (browser != null) {
+ ISourceContainer[] results = browser.addSourceContainers(getShell(), fDirector);
+ if(results != null) {
+ fSourceContainerViewer.addEntries(results);
+ }
+ }
+ super.okPressed();
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/DownAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/DownAction.java
new file mode 100644
index 00000000000..bc9a532bcf9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/DownAction.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * The action for sorting the order of source containers in the dialog.
+ *
+ */
+public class DownAction extends SourceContainerAction {
+
+ public DownAction() {
+ super(SourceLookupUIMessages.getString( "DownAction.0" )); //$NON-NLS-1$
+ }
+ /**
+ * @see IAction#run()
+ */
+ public void run() {
+ List targets = getOrderedSelection();
+ if (targets.isEmpty()) {
+ return;
+ }
+ List list = getEntriesAsList();
+ int bottom = list.size() - 1;
+ int index = 0;
+ for (int i = targets.size() - 1; i >= 0; i--) {
+ Object target = targets.get(i);
+ index = list.indexOf(target);
+ if (index < bottom) {
+ bottom = index + 1;
+ Object temp = list.get(bottom);
+ list.set(bottom, target);
+ list.set(index, temp);
+ }
+ bottom = index;
+ }
+ setEntries(list);
+ }
+
+ /**
+ * @see SelectionListenerAction#updateSelection(IStructuredSelection)
+ */
+ protected boolean updateSelection(IStructuredSelection selection) {
+ return !selection.isEmpty() && !isIndexSelected(selection, getEntriesAsList().size() - 1) && getViewer().getTree().getSelection()[0].getParentItem()==null;
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/EditContainerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/EditContainerAction.java
new file mode 100644
index 00000000000..9c84a224585
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/EditContainerAction.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.Iterator;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
+import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * Action used to edit source containers on a source lookup path
+ */
+public class EditContainerAction extends SourceContainerAction {
+
+ private ISourceLookupDirector fDirector;
+ private ISourceContainer[] fContainers;
+ private ISourceContainerBrowser fBrowser;
+
+ public EditContainerAction() {
+ super(SourceLookupUIMessages.getString( "EditContainerAction.0" )); //$NON-NLS-1$
+ }
+
+ /**
+ * Prompts for a project to add.
+ *
+ * @see org.eclipse.jface.action.IAction#run()
+ */
+ public void run() {
+ ISourceContainer[] replacements = fBrowser.editSourceContainers(getShell(), fDirector, fContainers);
+ int j = 0;
+ ISourceContainer[] existing = getViewer().getEntries();
+ for (int i = 0; i < existing.length && j < replacements.length; i++) {
+ ISourceContainer toBeReplaced = fContainers[j];
+ ISourceContainer container = existing[i];
+ if (container.equals(toBeReplaced)) {
+ existing[i] = replacements[j];
+ j++;
+ }
+ }
+ getViewer().setEntries(existing);
+ }
+
+ public void setSourceLookupDirector(ISourceLookupDirector director) {
+ fDirector = director;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ protected boolean updateSelection(IStructuredSelection selection) {
+ if(selection == null || selection.isEmpty()) {
+ return false;
+ }
+ if (getViewer().getTree().getSelection()[0].getParentItem()==null) {
+ // can only edit top level items of same type
+ fContainers = new ISourceContainer[selection.size()];
+ Iterator iterator = selection.iterator();
+ ISourceContainer container = (ISourceContainer) iterator.next();
+ ISourceContainerType type = container.getType();
+ fContainers[0] = container;
+ int i = 1;
+ while (iterator.hasNext()) {
+ container = (ISourceContainer) iterator.next();
+ fContainers[i] = container;
+ i++;
+ if (!container.getType().equals(type)) {
+ return false;
+ }
+ }
+ // all the same type, see if editing is supported
+ fBrowser = SourceLookupUIUtils.getSourceContainerBrowser(type.getId());
+ if (fBrowser != null) {
+ return fBrowser.canEditSourceContainers(fDirector, fContainers);
+ }
+ }
+ return false;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/MappingSourceContainerBrowser.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/MappingSourceContainerBrowser.java
index 99b56e94bad..ddcd56ed426 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/MappingSourceContainerBrowser.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/MappingSourceContainerBrowser.java
@@ -22,11 +22,13 @@ import org.eclipse.swt.widgets.Shell;
*/
public class MappingSourceContainerBrowser extends AbstractSourceContainerBrowser {
+ private static final String MAPPING = SourceLookupUIMessages.getString( "MappingSourceContainerBrowser.0" ); //$NON-NLS-1$
+
/* (non-Javadoc)
* @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#addSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
*/
public ISourceContainer[] addSourceContainers( Shell shell, ISourceLookupDirector director ) {
- return new ISourceContainer[] { new MappingSourceContainer() };
+ return new ISourceContainer[] { new MappingSourceContainer( generateName( director ) ) };
}
/* (non-Javadoc)
@@ -55,4 +57,25 @@ public class MappingSourceContainerBrowser extends AbstractSourceContainerBrowse
}
return new ISourceContainer[0];
}
+
+ private String generateName( ISourceLookupDirector director ) {
+// int counter = 1;
+// ISourceContainer[] containers = director.getSourceContainers();
+// for ( int i = 0; i < containers.length; ++i ) {
+// if ( MappingSourceContainer.TYPE_ID.equals( containers[i].getType().getId() ) ) {
+// String name = containers[i].getName();
+// if ( name.startsWith( MAPPING ) ) {
+// try {
+// int number = Integer.valueOf( name.substring( MAPPING.length() ) ).intValue();
+// if ( number == counter )
+// ++counter;
+// }
+// catch( NumberFormatException e ) {
+// }
+// }
+// }
+// }
+// return MAPPING + counter;
+ return MAPPING;
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/PathMappingDialog.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/PathMappingDialog.java
index c22167a2e45..d3448cce343 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/PathMappingDialog.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/PathMappingDialog.java
@@ -10,6 +10,7 @@
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+import java.io.File;
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
@@ -22,9 +23,11 @@ import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
@@ -57,8 +60,9 @@ public class PathMappingDialog extends TitleAreaDialog {
class MapEntryDialog extends TitleAreaDialog {
- protected Text fBackendPathText;
+ private MapEntrySourceContainer fEntry;
+ protected Text fBackendPathText;
protected Text fLocalPathText;
/**
@@ -66,13 +70,22 @@ public class PathMappingDialog extends TitleAreaDialog {
*/
public MapEntryDialog( Shell parentShell ) {
super( parentShell );
+ fEntry = null;
}
+ /**
+ * Constructor for MapEntryDialog.
+ */
+ public MapEntryDialog( Shell parentShell, MapEntrySourceContainer entry ) {
+ super( parentShell );
+ fEntry = entry;
+ }
+
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea( Composite parent ) {
- setTitle( "Specify the mapping paths" );
+ setTitle( SourceLookupUIMessages.getString( "PathMappingDialog.0" ) ); //$NON-NLS-1$
Font font = parent.getFont();
Composite composite = new Composite( parent, SWT.NONE );
@@ -93,7 +106,7 @@ public class PathMappingDialog extends TitleAreaDialog {
setMessage( null );
Label label = new Label( composite, SWT.LEFT );
- label.setText( "Compilation path:" );
+ label.setText( SourceLookupUIMessages.getString( "PathMappingDialog.1" ) ); //$NON-NLS-1$
data = new GridData( GridData.FILL_HORIZONTAL );
data.horizontalSpan = 2;
label.setLayoutData( data );
@@ -111,7 +124,7 @@ public class PathMappingDialog extends TitleAreaDialog {
} );
label = new Label( composite, SWT.LEFT );
- label.setText( "Local file system path:" );
+ label.setText( SourceLookupUIMessages.getString( "PathMappingDialog.2" ) ); //$NON-NLS-1$
data = new GridData( GridData.FILL_HORIZONTAL );
data.horizontalSpan = 2;
label.setLayoutData( data );
@@ -129,7 +142,7 @@ public class PathMappingDialog extends TitleAreaDialog {
Button button = new Button( composite, SWT.PUSH );
button.setFont( font );
- button.setText( "&Browse..." );
+ button.setText( SourceLookupUIMessages.getString( "PathMappingDialog.3" ) ); //$NON-NLS-1$
button.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
@@ -149,15 +162,23 @@ public class PathMappingDialog extends TitleAreaDialog {
protected Control createContents( Composite parent ) {
Control control = super.createContents( parent );
+ initialize();
update();
return control;
}
protected void configureShell( Shell newShell ) {
- newShell.setText( "Path Mapping" );
+ newShell.setText( SourceLookupUIMessages.getString( "PathMappingDialog.4" ) ); //$NON-NLS-1$
super.configureShell( newShell );
}
+ private void initialize() {
+ if ( fEntry != null ) {
+ fBackendPathText.setText( fEntry.getBackendPath().toOSString() );
+ fLocalPathText.setText( fEntry.getLocalPath().toOSString() );
+ }
+ }
+
protected void update() {
boolean isOk = updateErrorMessage();
Button ok = getButton( IDialogConstants.OK_ID );
@@ -169,20 +190,29 @@ public class PathMappingDialog extends TitleAreaDialog {
setErrorMessage( null );
String backendText = fBackendPathText.getText().trim();
if ( backendText.length() == 0 ) {
- setErrorMessage( "The compilation path must not be empty" );
+ setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.5" ) ); //$NON-NLS-1$
return false;
}
if ( !new Path( backendText ).isValidPath( backendText ) ) {
- setErrorMessage( "Invalid compilation path." );
+ setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.6" ) ); //$NON-NLS-1$
return false;
}
String localText = fLocalPathText.getText().trim();
if ( localText.length() == 0 ) {
- setErrorMessage( "The local file systems path must not be empty" );
+ setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.7" ) ); //$NON-NLS-1$
return false;
}
- if ( !new Path( localText ).isValidPath( localText ) ) {
- setErrorMessage( "Invalid local file system path." );
+ File localPath = new File( localText );
+ if ( !localPath.exists() ) {
+ setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.8" ) ); //$NON-NLS-1$
+ return false;
+ }
+ if ( !localPath.isDirectory() ) {
+ setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.9" ) ); //$NON-NLS-1$
+ return false;
+ }
+ if ( !localPath.isAbsolute() ) {
+ setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.10" ) ); //$NON-NLS-1$
return false;
}
return true;
@@ -197,7 +227,12 @@ public class PathMappingDialog extends TitleAreaDialog {
}
protected void okPressed() {
- fMapping.addMapEntry( new MapEntrySourceContainer( getBackendPath(), getLocalPath() ) );
+ if ( fEntry == null ) {
+ fEntry = new MapEntrySourceContainer();
+ fMapping.addMapEntry( fEntry );
+ }
+ fEntry.setBackendPath( getBackendPath() );
+ fEntry.setLocalPath( getLocalPath() );
super.okPressed();
}
}
@@ -287,26 +322,31 @@ public class PathMappingDialog extends TitleAreaDialog {
private TableViewer fViewer;
+ private Text fNameText;
private Button fAddButton;
+ private Button fEditButton;
private Button fRemoveButton;
public PathMappingDialog( Shell parentShell, MappingSourceContainer mapping ) {
super( parentShell );
fOriginalMapping = mapping;
- fMapping = new MappingSourceContainer();
- try {
- fMapping.addMapEntries( (MapEntrySourceContainer[])mapping.getSourceContainers() );
- }
- catch( CoreException e ) {
- setErrorMessage( e.getMessage() );
- }
+ fMapping = fOriginalMapping.copy();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createContents( Composite parent ) {
+ Control control = super.createContents( parent );
+ updateButtons();
+ return control;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea( Composite parent ) {
- setTitle( "Modify the list of path mappings" );
+ setTitle( SourceLookupUIMessages.getString( "PathMappingDialog.11" ) ); //$NON-NLS-1$
//TODO Add image
Font font = parent.getFont();
@@ -325,10 +365,39 @@ public class PathMappingDialog extends TitleAreaDialog {
Dialog.applyDialogFont( composite );
PlatformUI.getWorkbench().getHelpSystem().setHelp( getShell(), ICDebugHelpContextIds.SOURCE_PATH_MAPPING_DIALOG );
+ Composite nameComp = new Composite( composite, SWT.NONE );
+ layout = new GridLayout();
+ layout.numColumns = 2;
+ nameComp.setLayout( layout );
+ data = new GridData( GridData.FILL_HORIZONTAL );
+ data.horizontalSpan = 2;
+ nameComp.setLayoutData( data );
+ nameComp.setFont( font );
+
+ Label label = new Label( nameComp, SWT.LEFT );
+ data = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING );
+ label.setLayoutData( data );
+ label.setFont( font );
+ label.setText( SourceLookupUIMessages.getString( "PathMappingDialog.12" ) ); //$NON-NLS-1$
+ fNameText = new Text( nameComp, SWT.SINGLE | SWT.BORDER );
+ data = new GridData( GridData.FILL_HORIZONTAL );
+ fNameText.setLayoutData( data );
+ fNameText.setFont( font );
+ fNameText.setText( getMapping().getName() );
+ fNameText.addModifyListener( new ModifyListener() {
+ public void modifyText( ModifyEvent e ) {
+ }
+ } );
+
fViewer = createViewer( composite );
data = new GridData( GridData.FILL_BOTH );
fViewer.getControl().setLayoutData( data );
fViewer.getControl().setFont( font );
+ fViewer.addSelectionChangedListener( new ISelectionChangedListener() {
+ public void selectionChanged( SelectionChangedEvent event ) {
+ updateButtons();
+ }
+ } );
Composite buttonComp = new Composite( composite, SWT.NONE );
GridLayout buttonLayout = new GridLayout();
@@ -344,7 +413,7 @@ public class PathMappingDialog extends TitleAreaDialog {
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
- fAddButton = createPushButton( buttonComp, "&Add...", fontMetrics );
+ fAddButton = createPushButton( buttonComp, SourceLookupUIMessages.getString( "PathMappingDialog.13" ), fontMetrics ); //$NON-NLS-1$
fAddButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent evt ) {
MapEntryDialog dialog = new MapEntryDialog( getShell() );
@@ -354,17 +423,27 @@ public class PathMappingDialog extends TitleAreaDialog {
}
} );
- fRemoveButton = createPushButton( buttonComp, "Re&move", fontMetrics );
+ fEditButton = createPushButton( buttonComp, SourceLookupUIMessages.getString( "PathMappingDialog.14" ), fontMetrics ); //$NON-NLS-1$
+ fEditButton.addSelectionListener( new SelectionAdapter() {
+ public void widgetSelected( SelectionEvent evt ) {
+ MapEntrySourceContainer[] entries = getSelection();
+ if ( entries.length > 0 ) {
+ MapEntryDialog dialog = new MapEntryDialog( getShell(), entries[0] );
+ if ( dialog.open() == Window.OK ) {
+ getViewer().refresh();
+ }
+ }
+ }
+ } );
+
+ fRemoveButton = createPushButton( buttonComp, SourceLookupUIMessages.getString( "PathMappingDialog.15" ), fontMetrics ); //$NON-NLS-1$
fRemoveButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent evt ) {
- ISelection s = getViewer().getSelection();
- if ( s instanceof IStructuredSelection ) {
- Object[] ss = ((IStructuredSelection)s).toArray();
- for ( int i = 0; i < ss.length; ++i ) {
- fMapping.removeMapEntry( (MapEntrySourceContainer)ss[i] );
+ MapEntrySourceContainer[] entries = getSelection();
+ for ( int i = 0; i < entries.length; ++i ) {
+ fMapping.removeMapEntry( entries[i] );
}
getViewer().refresh();
- }
}
} );
@@ -406,7 +485,7 @@ public class PathMappingDialog extends TitleAreaDialog {
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell( Shell newShell ) {
- newShell.setText( "Path Mappings" );
+ newShell.setText( SourceLookupUIMessages.getString( "PathMappingDialog.16" ) ); //$NON-NLS-1$
super.configureShell( newShell );
}
@@ -419,6 +498,7 @@ public class PathMappingDialog extends TitleAreaDialog {
*/
protected void okPressed() {
fOriginalMapping.clear();
+ fOriginalMapping.setName( fNameText.getText().trim() );
try {
fOriginalMapping.addMapEntries( (MapEntrySourceContainer[])fMapping.getSourceContainers() );
}
@@ -427,4 +507,24 @@ public class PathMappingDialog extends TitleAreaDialog {
fMapping.dispose();
super.okPressed();
}
+
+ protected MapEntrySourceContainer[] getSelection() {
+ MapEntrySourceContainer[] result = new MapEntrySourceContainer[0];
+ ISelection s = getViewer().getSelection();
+ if ( s instanceof IStructuredSelection ) {
+ int size = ((IStructuredSelection)s).size();
+ result = (MapEntrySourceContainer[])((IStructuredSelection)s).toList().toArray( new MapEntrySourceContainer[size] );
+ }
+ return result;
+ }
+
+ protected void updateButtons() {
+ MapEntrySourceContainer[] entries = getSelection();
+ if ( fEditButton != null ) {
+ fEditButton.setEnabled( entries.length == 1 );
+ }
+ if ( fRemoveButton != null ) {
+ fRemoveButton.setEnabled( entries.length > 0 );
+ }
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/RemoveAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/RemoveAction.java
new file mode 100644
index 00000000000..f2449434000
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/RemoveAction.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * The action used to remove source containers in the source location dialog/tab.
+ *
+ */
+public class RemoveAction extends SourceContainerAction {
+ public RemoveAction() {
+ super(SourceLookupUIMessages.getString( "RemoveAction.0" )); //$NON-NLS-1$
+ }
+ /**
+ * Removes all selected entries.
+ *
+ * @see IAction#run()
+ */
+ public void run() {
+ List targets = getOrderedSelection();
+ List list = getEntriesAsList();
+ list.removeAll(targets);
+ setEntries(list);
+ }
+
+ /**
+ * @see SelectionListenerAction#updateSelection(IStructuredSelection)
+ */
+ protected boolean updateSelection(IStructuredSelection selection) {
+ //check that something is selected and it is a root tree node.
+ return !selection.isEmpty() && getViewer().getTree().getSelection()[0].getParentItem()==null;
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerAction.java
new file mode 100644
index 00000000000..bd77e60ebac
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerAction.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.actions.SelectionListenerAction;
+
+/**
+ * The abstract class for all source lookup actions.
+ */
+public abstract class SourceContainerAction extends SelectionListenerAction {
+ //the viewer that the action is operating on
+ private SourceContainerViewer fViewer;
+ //the button that is used to invoke the action
+ private Button fButton;
+ //the shell used to realize this action's dialog (if any)
+ private Shell fShell;
+
+ /**
+ * The constructor for the action
+ * @param label the label for the action's button
+ */
+ public SourceContainerAction(String label) {
+ super(label);
+ }
+
+ /**
+ * Sets the viewer on which this action operates.
+ *
+ * @param viewer the viewer on which this action operates
+ */
+ public void setViewer(SourceContainerViewer viewer) {
+ if (fViewer != null) {
+ fViewer.removeSelectionChangedListener(this);
+ }
+ fViewer = viewer;
+ if (fViewer != null) {
+ fViewer.addSelectionChangedListener(this);
+ update();
+ }
+ }
+
+ /**
+ * Returns the viewer on which this action operates.
+ *
+ * @return the viewer on which this action operates
+ */
+ protected SourceContainerViewer getViewer() {
+ return fViewer;
+ }
+
+ /**
+ * Returns the selected items in the list, in the order they are
+ * displayed.
+ *
+ * @return targets for an action
+ */
+ protected List getOrderedSelection() {
+ List targets = new ArrayList();
+ List selection =
+ ((IStructuredSelection) getViewer().getSelection()).toList();
+ ISourceContainer[] entries = getViewer().getEntries();
+ for (int i = 0; i < entries.length; i++) {
+ ISourceContainer target = entries[i];
+ if (selection.contains(target)) {
+ targets.add(target);
+ }
+ }
+ return targets;
+ }
+
+ /**
+ * Returns a list (copy) of the entries in the viewer
+ */
+ protected List getEntriesAsList() {
+ ISourceContainer[] entries = getViewer().getEntries();
+ List list = new ArrayList(entries.length);
+ for (int i = 0; i < entries.length; i++) {
+ list.add(entries[i]);
+ }
+ return list;
+ }
+
+ /**
+ * Updates the entries to the entries in the given list
+ */
+ protected void setEntries(List list) {
+ getViewer().setEntries(
+ (ISourceContainer[]) list.toArray(new ISourceContainer[list.size()]));
+ // update all selection listeners
+ getViewer().setSelection(getViewer().getSelection());
+ }
+
+ /**
+ * Returns whether the item at the given index in the list
+ * (visually) is selected.
+ */
+ protected boolean isIndexSelected(
+ IStructuredSelection selection,
+ int index) {
+ if (selection.isEmpty()) {
+ return false;
+ }
+ Iterator entries = selection.iterator();
+ List list = getEntriesAsList();
+ while (entries.hasNext()) {
+ Object next = entries.next();
+ if (list.indexOf(next) == index) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets the button that invokes this action
+ */
+ public void setButton(Button button) {
+ fButton = button;
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ run();
+ }
+ });
+ }
+
+ /**
+ * @see IAction#setEnabled(boolean)
+ */
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ if (fButton != null) {
+ fButton.setEnabled(enabled);
+ }
+ }
+
+ /**
+ * Updates the enabled state.
+ */
+ protected void update() {
+ selectionChanged((IStructuredSelection) getViewer().getSelection());
+ }
+
+ /**
+ * Returns the shell used to realize this action's dialog (if any).
+ */
+ protected Shell getShell() {
+ if (fShell == null) {
+ fShell = getViewer().getControl().getShell();
+ }
+ return fShell;
+ }
+
+ /**
+ * Sets the shell used to realize this action's dialog (if any).
+ */
+ public void setShell(Shell shell) {
+ fShell = shell;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java
new file mode 100644
index 00000000000..a210e4c244b
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerLabelProvider.java
@@ -0,0 +1,86 @@
+/**********************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
+import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * Label provider for source containers and source container types.
+ */
+public class SourceContainerLabelProvider extends LabelProvider {
+
+ private ILabelProvider fLabelProvider = null;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+ */
+ public Image getImage(Object element) {
+ // first allow workbench adapter to provide image
+ Image image = getWorkbenchLabelProvider().getImage(element);
+ if (image == null) {
+ ISourceContainerType type = null;
+ if (element instanceof ISourceContainer) {
+ type = ((ISourceContainer)element).getType();
+ } else if (element instanceof ISourceContainerType) {
+ type = (ISourceContainerType) element;
+ }
+ if (type != null) {
+ // next consult contributed image
+ image = SourceLookupUIUtils.getSourceContainerImage(type.getId());
+ }
+ }
+ if (image != null) {
+ return image;
+ }
+ return super.getImage(element);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+ */
+ public String getText(Object element) {
+ // first, allo workbench adapter to provide label
+ String label = getWorkbenchLabelProvider().getText(element);
+ if (label == null || label.length() == 0) {
+ if (element instanceof ISourceContainer) {
+ return ((ISourceContainer) element).getName();
+ } else if (element instanceof ISourceContainerType) {
+ return ((ISourceContainerType)element).getName();
+ }
+ } else {
+ return label;
+ }
+ return super.getText(element);
+ }
+
+ private ILabelProvider getWorkbenchLabelProvider() {
+ if (fLabelProvider == null) {
+ fLabelProvider = new WorkbenchLabelProvider();
+ }
+ return fLabelProvider;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ super.dispose();
+ if (fLabelProvider != null) {
+ fLabelProvider.dispose();
+ }
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerViewer.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerViewer.java
new file mode 100644
index 00000000000..e795b09db10
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerViewer.java
@@ -0,0 +1,188 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The viewer containing the source containers.
+ * It is a tree viewer since the containers are represented in tree form.
+ */
+public class SourceContainerViewer extends TreeViewer {
+
+ /**
+ * Whether enabled/editable.
+ */
+ private boolean fEnabled = true;
+ /**
+ * The source container entries displayed in this viewer
+ */
+ protected List fEntries = new ArrayList();
+
+ class ContentProvider implements ITreeContentProvider {
+
+ /**
+ * @see IStructuredContentProvider#getElements(Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getEntries();
+ }
+
+ /**
+ * @see IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /**
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ public Object[] getChildren(Object parentElement) {
+ try {
+ return ((ISourceContainer)parentElement).getSourceContainers();
+ } catch (CoreException e) {
+ return new Object[0];
+ }
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ public boolean hasChildren(Object element) {
+ return ((ISourceContainer)element).isComposite();
+ }
+
+ }
+
+ /**
+ * Creates a runtime classpath viewer with the given parent.
+ *
+ * @param parent the parent control
+ * @param panel the panel hosting this viewer
+ */
+ public SourceContainerViewer(Composite parent) {
+ super(parent);
+ setContentProvider(new ContentProvider());
+ SourceContainerLabelProvider lp = new SourceContainerLabelProvider();
+ setLabelProvider(lp);
+ }
+
+ /**
+ * Sets the entries in this viewer
+ *
+ * @param entries source container entries
+ */
+ public void setEntries(ISourceContainer[] entries) {
+ fEntries.clear();
+ for (int i = 0; i < entries.length; i++) {
+ if(entries[i] != null)
+ fEntries.add(entries[i]);
+ }
+ if (getInput() == null) {
+ setInput(fEntries);
+ //select first item in list
+ if(!fEntries.isEmpty() && fEntries.get(0)!=null)
+ setSelection(new StructuredSelection(fEntries.get(0)));
+ } else {
+ refresh();
+ }
+ }
+
+ /**
+ * Returns the entries in this viewer
+ *
+ * @return the entries in this viewer
+ */
+ public ISourceContainer[] getEntries() {
+ return (ISourceContainer[])fEntries.toArray(new ISourceContainer[fEntries.size()]);
+ }
+
+ /**
+ * Adds the given entries to the list. If there is no selection
+ * in the list, the entries are added at the end of the list,
+ * otherwise the new entries are added before the (first) selected
+ * entry. The new entries are selected.
+ *
+ * @param entries additions
+ */
+ public void addEntries(ISourceContainer[] entries) {
+ IStructuredSelection sel = (IStructuredSelection)getSelection();
+ if (sel.isEmpty()) {
+ for (int i = 0; i < entries.length; i++) {
+ if (!fEntries.contains(entries[i])) {
+ fEntries.add(entries[i]);
+ }
+ }
+ }
+ else {
+ int index = fEntries.indexOf(sel.getFirstElement());
+ for (int i = 0; i < entries.length; i++) {
+ if (!fEntries.contains(entries[i])) {
+ fEntries.add(index, entries[i]);
+ index++;
+ }
+ }
+ }
+
+ if(!fEntries.isEmpty() && fEntries.get(0)!=null)
+ setSelection(new StructuredSelection(fEntries.get(0)));
+ refresh();
+ }
+
+ /**
+ * Enables/disables this viewer. Note the control is not disabled, since
+ * we still want the user to be able to scroll if required to see the
+ * existing entries. Just actions should be disabled.
+ */
+ public void setEnabled(boolean enabled) {
+ fEnabled = enabled;
+ // fire selection change to upate actions
+ setSelection(getSelection());
+ }
+
+ /**
+ * Returns whether this viewer is enabled
+ */
+ public boolean isEnabled() {
+ return fEnabled;
+ }
+
+ /**
+ * Returns the index of an equivalent entry, or -1 if none.
+ *
+ * @return the index of an equivalent entry, or -1 if none
+ */
+ public int indexOf(ISourceContainer entry) {
+ return fEntries.indexOf(entry);
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
index 78185f39a4b..47942de407d 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceContainerWorkbenchAdapter.java
@@ -12,6 +12,7 @@ package org.eclipse.cdt.debug.internal.ui.sourcelookup;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
@@ -44,7 +45,9 @@ public class SourceContainerWorkbenchAdapter implements IWorkbenchAdapter {
}
if ( o instanceof ProjectSourceContainer ) {
IProject project = ((ProjectSourceContainer)o).getProject();
- return getImageDescriptor( CCorePlugin.getDefault().getCoreModel().create( project ) );
+ ICProject cProject = CCorePlugin.getDefault().getCoreModel().create( project );
+ if ( cProject != null )
+ return getImageDescriptor( cProject );
}
return null;
}
@@ -62,7 +65,7 @@ public class SourceContainerWorkbenchAdapter implements IWorkbenchAdapter {
*/
public String getLabel( Object o ) {
if ( o instanceof MappingSourceContainer ) {
- return ((MappingSourceContainer)o).getName();
+ return SourceLookupUIMessages.getString( "SourceContainerWorkbenchAdapter.0" ) + ((MappingSourceContainer)o).getName(); //$NON-NLS-1$
}
if ( o instanceof MapEntrySourceContainer ) {
return ((MapEntrySourceContainer)o).getName();
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
new file mode 100644
index 00000000000..48a90e5484f
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.java
@@ -0,0 +1,34 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class SourceLookupUIMessages {
+
+ private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceLookupUIMessages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME );
+
+ private SourceLookupUIMessages() {
+ }
+
+ public static String getString( String key ) {
+ // TODO Auto-generated method stub
+ try {
+ return RESOURCE_BUNDLE.getString( key );
+ }
+ catch( MissingResourceException e ) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
new file mode 100644
index 00000000000..0338d993b41
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/SourceLookupUIMessages.properties
@@ -0,0 +1,26 @@
+AddContainerAction.0=&Add...
+AddSourceContainerDialog.0=Add Source
+AddSourceContainerDialog.1=Select the type of source to add to the source lookup path
+DownAction.0=&Down
+EditContainerAction.0=&Edit...
+MappingSourceContainerBrowser.0=New Mapping
+PathMappingDialog.0=Specify the mapping paths
+PathMappingDialog.1=Compilation path:
+PathMappingDialog.2=Local file system path:
+PathMappingDialog.3=&Browse...
+PathMappingDialog.4=Path Mapping
+PathMappingDialog.5=The compilation path must not be empty
+PathMappingDialog.6=Invalid compilation path.
+PathMappingDialog.7=The local file systems path must not be empty
+PathMappingDialog.8=The specified local file system path doesn't exist
+PathMappingDialog.9=The local file system path must be a directory
+PathMappingDialog.10=The local file system path must be absolute
+PathMappingDialog.11=Modify the path mappings
+PathMappingDialog.12=Name:
+PathMappingDialog.13=&Add...
+PathMappingDialog.14=&Edit...
+PathMappingDialog.15=Re&move
+PathMappingDialog.16=Path Mappings
+RemoveAction.0=Re&move
+SourceContainerWorkbenchAdapter.0=Path Mapping:
+UpAction.0=U&p
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/UpAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/UpAction.java
new file mode 100644
index 00000000000..168b558936f
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/UpAction.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.sourcelookup;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * The action used to move source containers up in the list
+ */
+public class UpAction extends SourceContainerAction {
+
+ public UpAction() {
+ super(SourceLookupUIMessages.getString( "UpAction.0" )); //$NON-NLS-1$
+ }
+ /**
+ * Moves all selected entries up one position (if possible).
+ *
+ * @see IAction#run()
+ */
+ public void run() {
+ List targets = getOrderedSelection();
+ if (targets.isEmpty()) {
+ return;
+ }
+ int top = 0;
+ int index = 0;
+ List list = getEntriesAsList();
+ Iterator entries = targets.iterator();
+ while (entries.hasNext()) {
+ Object target = entries.next();
+ index = list.indexOf(target);
+ if (index > top) {
+ top = index - 1;
+ Object temp = list.get(top);
+ list.set(top, target);
+ list.set(index, temp);
+ }
+ top = index;
+ }
+ setEntries(list);
+ }
+
+ /**
+ * @see SelectionListenerAction#updateSelection(IStructuredSelection)
+ */
+ protected boolean updateSelection(IStructuredSelection selection) {
+ //check that something is selected, it's not first in the list, and it is a root tree node.
+ return !selection.isEmpty() && !isIndexSelected(selection, 0) && getViewer().getTree().getSelection()[0].getParentItem()==null;
+ }
+
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
index 06971aabf49..28660aa2912 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
@@ -20,6 +20,7 @@ import org.eclipse.cdt.debug.internal.ui.ColorManager;
import org.eclipse.cdt.debug.internal.ui.EvaluationContextManager;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
import org.eclipse.cdt.debug.ui.sourcelookup.DefaultSourceLocator;
+import org.eclipse.cdt.debug.ui.sourcelookup.OldDefaultSourceLocator;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
@@ -230,14 +231,14 @@ public class CDebugUIPlugin extends AbstractUIPlugin {
}
public static String getDefaultSourceLocatorID() {
- return DefaultSourceLocator.ID_DEFAULT_SOURCE_LOCATOR;
+ return OldDefaultSourceLocator.ID_DEFAULT_SOURCE_LOCATOR;
}
/*
* to support old launch configurations
*/
public static String getDefaultSourceLocatorOldID() {
- return DefaultSourceLocator.ID_OLD_DEFAULT_SOURCE_LOCATOR;
+ return OldDefaultSourceLocator.ID_OLD_DEFAULT_SOURCE_LOCATOR;
}
/*
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/DefaultSourceLocator.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/DefaultSourceLocator.java
index 54c48b3e132..caf6d805f61 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/DefaultSourceLocator.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/DefaultSourceLocator.java
@@ -1,382 +1,95 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
+ * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
+ *
+ * Contributors:
* QNX Software Systems - Initial API and implementation
- ***********************************************************************/
-package org.eclipse.cdt.debug.ui.sourcelookup;
+ ***********************************************************************/
+package org.eclipse.cdt.debug.ui.sourcelookup;
-import java.io.IOException;
-import java.io.StringReader;
-import java.text.MessageFormat;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.debug.core.CDebugUtils;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.debug.core.model.ICStackFrame;
+import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
-import org.eclipse.cdt.debug.core.sourcelookup.SourceLookupFactory;
-import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
-import org.eclipse.cdt.debug.internal.ui.CDebugImages;
-import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
-import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
-import org.eclipse.cdt.debug.internal.ui.editors.NoSymbolOrSourceElement;
-import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
-import org.eclipse.cdt.utils.ui.controls.ControlFactory;
-import org.eclipse.core.resources.IFile;
+import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.model.IPersistableSourceLocator;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ListDialog;
-import org.w3c.dom.Document;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
import org.w3c.dom.Element;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
+
/**
- * Default source locator.
+ * The replacement of the old default source locator. Used only for migration purposes.
*/
-public class DefaultSourceLocator implements IPersistableSourceLocator, IAdaptable {
-
- public class SourceSelectionDialog extends ListDialog {
-
- private SelectionButtonDialogField fAlwaysUseThisFileButton = new SelectionButtonDialogField( SWT.CHECK );
-
- public SourceSelectionDialog( Shell parent ) {
- super( parent );
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
- */
- protected Control createDialogArea( Composite parent ) {
- Composite comp = ControlFactory.createComposite( parent, 1 );
- super.createDialogArea( comp );
- Composite comp1 = ControlFactory.createComposite( comp, 1 );
- fAlwaysUseThisFileButton.setLabelText( SourceLookupMessages.getString( "DefaultSourceLocator.0" ) ); //$NON-NLS-1$
- fAlwaysUseThisFileButton.doFillIntoGrid( comp1, 1 );
- return comp;
- }
-
- public boolean alwaysMapToSelection() {
- return fAlwaysUseThisFileButton.isSelected();
- }
- }
-
- public class SourceElementLabelProvider extends LabelProvider {
-
- protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
-
- public SourceElementLabelProvider() {
- super();
- }
-
- public String getText( Object element ) {
- if ( element instanceof IFile )
- return ((IFile)element).getFullPath().toString();
- if ( element instanceof FileStorage )
- return ((FileStorage)element).getFullPath().toOSString();
- return super.getText( element );
- }
-
- public Image getImage( Object element ) {
- if ( element instanceof IFile )
- return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_WORKSPACE_SOURCE_FILE );
- if ( element instanceof FileStorage )
- return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_EXTERNAL_SOURCE_FILE );
- return super.getImage( element );
- }
- }
-
- /**
- * Identifier for the 'Default C/C++ Source Locator' extension (value <code>"org.eclipse.cdt.debug.ui.DefaultSourceLocator"</code>).
- */
- public static final String ID_DEFAULT_SOURCE_LOCATOR = CDebugUIPlugin.getUniqueIdentifier() + ".DefaultSourceLocator"; //$NON-NLS-1$
-
- // to support old configurations
- public static final String ID_OLD_DEFAULT_SOURCE_LOCATOR = "org.eclipse.cdt.launch" + ".DefaultSourceLocator"; //$NON-NLS-1$ //$NON-NLS-2$
-
- private static final String ELEMENT_NAME = "PromptingSourceLocator"; //$NON-NLS-1$
-
- private static final String ATTR_PROJECT = "project"; //$NON-NLS-1$
-
- private static final String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
-
- /**
- * Underlying source locator.
- */
- private ICSourceLocator fSourceLocator;
-
- private HashMap fFramesToSource = null;
-
- private HashMap fNamesToSource = null;
-
- public DefaultSourceLocator() {
- super();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
- */
- public String getMemento() throws CoreException {
- if ( getCSourceLocator() != null ) {
- Document document = null;
- Throwable ex = null;
- try {
- document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
- Element element = document.createElement( ELEMENT_NAME );
- document.appendChild( element );
- element.setAttribute( ATTR_PROJECT, getCSourceLocator().getProject().getName() );
- IPersistableSourceLocator psl = getPersistableSourceLocator();
- if ( psl != null ) {
- element.setAttribute( ATTR_MEMENTO, psl.getMemento() );
- }
- return CDebugUtils.serializeDocument( document );
- }
- catch( ParserConfigurationException e ) {
- ex = e;
- }
- catch( IOException e ) {
- ex = e;
- }
- catch( TransformerException e ) {
- ex = e;
- }
- abort( SourceLookupMessages.getString( "DefaultSourceLocator.1" ), ex ); //$NON-NLS-1$
- }
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(java.lang.String)
- */
- public void initializeFromMemento( String memento ) throws CoreException {
- Exception ex = null;
- try {
- Element root = null;
- DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- StringReader reader = new StringReader( memento );
- InputSource source = new InputSource( reader );
- root = parser.parse( source ).getDocumentElement();
- if ( !root.getNodeName().equalsIgnoreCase( ELEMENT_NAME ) ) {
- abort( SourceLookupMessages.getString( "DefaultSourceLocator.2" ), null ); //$NON-NLS-1$
- }
- String projectName = root.getAttribute( ATTR_PROJECT );
- String data = root.getAttribute( ATTR_MEMENTO );
- if ( isEmpty( projectName ) ) {
- abort( SourceLookupMessages.getString( "DefaultSourceLocator.3" ), null ); //$NON-NLS-1$
- }
- IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
- if ( getCSourceLocator() == null )
- setCSourceLocator( SourceLookupFactory.createSourceLocator( project ) );
- if ( getCSourceLocator().getProject() != null && !getCSourceLocator().getProject().equals( project ) )
- return;
- if ( project == null || !project.exists() || !project.isOpen() )
- abort( MessageFormat.format( SourceLookupMessages.getString( "DefaultSourceLocator.4" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
- IPersistableSourceLocator psl = getPersistableSourceLocator();
- if ( psl != null )
- psl.initializeFromMemento( data );
- else
- abort( SourceLookupMessages.getString( "DefaultSourceLocator.5" ), null ); //$NON-NLS-1$
- return;
- }
- catch( ParserConfigurationException e ) {
- ex = e;
- }
- catch( SAXException e ) {
- ex = e;
- }
- catch( IOException e ) {
- ex = e;
- }
- abort( SourceLookupMessages.getString( "DefaultSourceLocator.6" ), ex ); //$NON-NLS-1$
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration)
- */
- public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException {
- setCSourceLocator( SourceLookupFactory.createSourceLocator( getProject( configuration ) ) );
- String memento = configuration.getAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, "" ); //$NON-NLS-1$
- if ( !isEmpty( memento ) )
- initializeFromMemento( memento );
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
- */
- public Object getAdapter( Class adapter ) {
- if ( getCSourceLocator() instanceof IAdaptable ) {
- if ( adapter.equals( ICSourceLocator.class ) ) {
- return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
- }
- if ( adapter.equals( IResourceChangeListener.class ) ) {
- return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
- }
- }
- return null;
- }
+public class DefaultSourceLocator extends CSourceLookupDirector {
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector#initializeFromMemento(java.lang.String, org.eclipse.debug.core.ILaunchConfiguration)
*/
- public Object getSourceElement( IStackFrame stackFrame ) {
- Object res = cacheLookup( stackFrame );
- if ( res == null ) {
- res = getCSourceLocator().getSourceElement( stackFrame );
- if ( res instanceof List ) {
- List list = (List)res;
- if ( list.size() != 0 ) {
- SourceSelectionDialog dialog = createSourceSelectionDialog( list );
- dialog.open();
- Object[] objs = dialog.getResult();
- res = (objs != null && objs.length > 0) ? objs[0] : null;
- if ( res != null )
- cacheSourceElement( stackFrame, res, dialog.alwaysMapToSelection() );
- }
- else
- res = null;
- }
- }
- if ( res == null ) {
- if ( stackFrame instanceof ICStackFrame && !isEmpty( ((ICStackFrame)stackFrame).getFile() ) ) {
- res = new FileNotFoundElement( stackFrame );
- }
- else // don't show in editor
- {
- res = new NoSymbolOrSourceElement( stackFrame );
- }
- }
- return res;
- }
-
- protected void saveChanges( ILaunchConfiguration configuration, IPersistableSourceLocator locator ) {
- try {
- ILaunchConfigurationWorkingCopy copy = configuration.copy( configuration.getName() );
- copy.setAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, locator.getMemento() );
- copy.doSave();
- }
- catch( CoreException e ) {
- CDebugUIPlugin.errorDialog( e.getMessage(), (IStatus)null );
- }
- }
-
- private SourceSelectionDialog createSourceSelectionDialog( List list ) {
- SourceSelectionDialog dialog = new SourceSelectionDialog( CDebugUIPlugin.getActiveWorkbenchShell() );
- dialog.setInput( list.toArray() );
- dialog.setContentProvider( new ArrayContentProvider() );
- dialog.setLabelProvider( new SourceElementLabelProvider() );
- dialog.setTitle( SourceLookupMessages.getString( "DefaultSourceLocator.7" ) ); //$NON-NLS-1$
- dialog.setMessage( SourceLookupMessages.getString( "DefaultSourceLocator.8" ) ); //$NON-NLS-1$
- dialog.setInitialSelections( new Object[]{ list.get( 0 ) } );
- return dialog;
- }
-
- private void cacheSourceElement( IStackFrame frame, Object sourceElement, boolean alwaysMapToSelection ) {
- if ( alwaysMapToSelection ) {
- String name = getFileName( frame );
- if ( name != null ) {
- if ( fNamesToSource == null )
- fNamesToSource = new HashMap();
- fNamesToSource.put( name, sourceElement );
- }
+ public void initializeFromMemento( String memento, ILaunchConfiguration configuration ) throws CoreException {
+ Element rootElement = DebugPlugin.parseDocument( memento );
+ if ( rootElement.getNodeName().equalsIgnoreCase( OldDefaultSourceLocator.ELEMENT_NAME ) ) {
+ initializeFromOldMemento( memento, configuration );
}
else {
- if ( fFramesToSource == null )
- fFramesToSource = new HashMap();
- fFramesToSource.put( frame, sourceElement );
- }
- }
-
- private Object cacheLookup( IStackFrame frame ) {
- String name = getFileName( frame );
- if ( name != null && fNamesToSource != null ) {
- Object result = fNamesToSource.get( name );
- if ( result != null )
- return result;
- }
- return (fFramesToSource != null) ? fFramesToSource.get( frame ) : null;
- }
-
- private String getFileName( IStackFrame frame ) {
- if ( frame instanceof ICStackFrame ) {
- String name = ((ICStackFrame)frame).getFile();
- if ( !isEmpty( name ) )
- return name.trim();
- }
- return null;
- }
-
- private ICSourceLocator getCSourceLocator() {
- return fSourceLocator;
- }
-
- private void setCSourceLocator( ICSourceLocator locator ) {
- fSourceLocator = locator;
- }
-
- private IPersistableSourceLocator getPersistableSourceLocator() {
- ICSourceLocator sl = getCSourceLocator();
- return (sl instanceof IPersistableSourceLocator) ? (IPersistableSourceLocator)sl : null;
- }
-
- /**
- * Throws an internal error exception
- */
- private void abort( String message, Throwable e ) throws CoreException {
- IStatus s = new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), 0, message, e );
- throw new CoreException( s );
- }
-
- private boolean isEmpty( String string ) {
- return string == null || string.trim().length() == 0;
- }
-
- private IProject getProject( ILaunchConfiguration configuration ) throws CoreException {
- String projectName = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null );
- if ( !isEmpty( projectName ) ) {
- IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
- if ( project.exists() ) {
- return project;
+ super.initializeFromMemento( memento, configuration );
+ }
+ }
+
+ private void initializeFromOldMemento( String memento, ILaunchConfiguration configuration ) throws CoreException {
+ dispose();
+ setLaunchConfiguration( configuration );
+ OldDefaultSourceLocator old = new OldDefaultSourceLocator();
+ old.initializeFromMemento( memento );
+ ICSourceLocator csl = (ICSourceLocator)old.getAdapter( ICSourceLocator.class );
+ setFindDuplicates( csl.searchForDuplicateFiles() );
+ ICSourceLocation[] locations = csl.getSourceLocations();
+
+ // Check if the old source locator includes all referenced projects.
+ // If so, DefaultSpourceContainer should be used.
+ IProject project = csl.getProject();
+ List list = CDebugUtils.getReferencedProjects( project );
+ HashSet names = new HashSet( list.size() + 1 );
+ names.add( project.getName() );
+ Iterator it = list.iterator();
+ while( it.hasNext() ) {
+ names.add( ((IProject)it.next()).getName() );
+ }
+ boolean includesDefault = true;
+ for( int i = 0; i < locations.length; ++i ) {
+ if ( locations[i] instanceof IProjectSourceLocation && ((IProjectSourceLocation)locations[i]).isGeneric() ) {
+ if ( !names.contains( ((IProjectSourceLocation)locations[i]).getProject().getName() ) ) {
+ includesDefault = false;
+ break;
+ }
}
}
- abort( MessageFormat.format( SourceLookupMessages.getString( "DefaultSourceLocator.9" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
- return null;
+
+ // Generate an array of new source containers including DefaultSourceContainer
+ ArrayList locs = new ArrayList( locations.length );
+ for ( int i = 0; i < locations.length; ++i ) {
+ if ( !includesDefault || !( locations[i] instanceof IProjectSourceLocation && names.contains( ((IProjectSourceLocation)locations[i]).getProject().getName() ) ) )
+ locs.add( locations[i] );
+ }
+
+ ISourceContainer[] containers = SourceUtils.convertSourceLocations( (ICSourceLocation[])locs.toArray( new ICSourceLocation[locs.size()] ) );
+ ArrayList cons = new ArrayList( Arrays.asList( containers ) );
+ if ( includesDefault ) {
+ DefaultSourceContainer defaultContainer = new DefaultSourceContainer();
+ defaultContainer.init( this );
+ cons.add( 0, defaultContainer );
+ }
+ setSourceContainers( (ISourceContainer[])cons.toArray( new ISourceContainer[cons.size()] ) );
}
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/OldDefaultSourceLocator.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/OldDefaultSourceLocator.java
new file mode 100644
index 00000000000..0f7b6d90b0a
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/sourcelookup/OldDefaultSourceLocator.java
@@ -0,0 +1,382 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ ***********************************************************************/
+package org.eclipse.cdt.debug.ui.sourcelookup;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.cdt.core.resources.FileStorage;
+import org.eclipse.cdt.debug.core.CDebugUtils;
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
+import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
+import org.eclipse.cdt.debug.core.sourcelookup.SourceLookupFactory;
+import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
+import org.eclipse.cdt.debug.internal.ui.CDebugImages;
+import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
+import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
+import org.eclipse.cdt.debug.internal.ui.editors.NoSymbolOrSourceElement;
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.cdt.utils.ui.controls.ControlFactory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.model.IPersistableSourceLocator;
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Old default source locator. We keep it for migration purposes.
+ */
+public class OldDefaultSourceLocator implements IPersistableSourceLocator, IAdaptable {
+
+ public class SourceSelectionDialog extends ListDialog {
+
+ private SelectionButtonDialogField fAlwaysUseThisFileButton = new SelectionButtonDialogField( SWT.CHECK );
+
+ public SourceSelectionDialog( Shell parent ) {
+ super( parent );
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createDialogArea( Composite parent ) {
+ Composite comp = ControlFactory.createComposite( parent, 1 );
+ super.createDialogArea( comp );
+ Composite comp1 = ControlFactory.createComposite( comp, 1 );
+ fAlwaysUseThisFileButton.setLabelText( SourceLookupMessages.getString( "OldDefaultSourceLocator.0" ) ); //$NON-NLS-1$
+ fAlwaysUseThisFileButton.doFillIntoGrid( comp1, 1 );
+ return comp;
+ }
+
+ public boolean alwaysMapToSelection() {
+ return fAlwaysUseThisFileButton.isSelected();
+ }
+ }
+
+ public class SourceElementLabelProvider extends LabelProvider {
+
+ protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
+
+ public SourceElementLabelProvider() {
+ super();
+ }
+
+ public String getText( Object element ) {
+ if ( element instanceof IFile )
+ return ((IFile)element).getFullPath().toString();
+ if ( element instanceof FileStorage )
+ return ((FileStorage)element).getFullPath().toOSString();
+ return super.getText( element );
+ }
+
+ public Image getImage( Object element ) {
+ if ( element instanceof IFile )
+ return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_WORKSPACE_SOURCE_FILE );
+ if ( element instanceof FileStorage )
+ return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_EXTERNAL_SOURCE_FILE );
+ return super.getImage( element );
+ }
+ }
+
+ /**
+ * Identifier for the 'Default C/C++ Source Locator' extension (value <code>"org.eclipse.cdt.debug.ui.DefaultSourceLocator"</code>).
+ */
+ public static final String ID_DEFAULT_SOURCE_LOCATOR = CDebugUIPlugin.getUniqueIdentifier() + ".DefaultSourceLocator"; //$NON-NLS-1$
+
+ // to support old configurations
+ public static final String ID_OLD_DEFAULT_SOURCE_LOCATOR = "org.eclipse.cdt.launch" + ".DefaultSourceLocator"; //$NON-NLS-1$ //$NON-NLS-2$
+
+ protected static final String ELEMENT_NAME = "PromptingSourceLocator"; //$NON-NLS-1$
+
+ private static final String ATTR_PROJECT = "project"; //$NON-NLS-1$
+
+ private static final String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
+
+ /**
+ * Underlying source locator.
+ */
+ private ICSourceLocator fSourceLocator;
+
+ private HashMap fFramesToSource = null;
+
+ private HashMap fNamesToSource = null;
+
+ public OldDefaultSourceLocator() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
+ */
+ public String getMemento() throws CoreException {
+ if ( getCSourceLocator() != null ) {
+ Document document = null;
+ Throwable ex = null;
+ try {
+ document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ Element element = document.createElement( ELEMENT_NAME );
+ document.appendChild( element );
+ element.setAttribute( ATTR_PROJECT, getCSourceLocator().getProject().getName() );
+ IPersistableSourceLocator psl = getPersistableSourceLocator();
+ if ( psl != null ) {
+ element.setAttribute( ATTR_MEMENTO, psl.getMemento() );
+ }
+ return CDebugUtils.serializeDocument( document );
+ }
+ catch( ParserConfigurationException e ) {
+ ex = e;
+ }
+ catch( IOException e ) {
+ ex = e;
+ }
+ catch( TransformerException e ) {
+ ex = e;
+ }
+ abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.1" ), ex ); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(java.lang.String)
+ */
+ public void initializeFromMemento( String memento ) throws CoreException {
+ Exception ex = null;
+ try {
+ Element root = null;
+ DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ StringReader reader = new StringReader( memento );
+ InputSource source = new InputSource( reader );
+ root = parser.parse( source ).getDocumentElement();
+ if ( !root.getNodeName().equalsIgnoreCase( ELEMENT_NAME ) ) {
+ abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.2" ), null ); //$NON-NLS-1$
+ }
+ String projectName = root.getAttribute( ATTR_PROJECT );
+ String data = root.getAttribute( ATTR_MEMENTO );
+ if ( isEmpty( projectName ) ) {
+ abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.3" ), null ); //$NON-NLS-1$
+ }
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
+ if ( getCSourceLocator() == null )
+ setCSourceLocator( SourceLookupFactory.createSourceLocator( project ) );
+ if ( getCSourceLocator().getProject() != null && !getCSourceLocator().getProject().equals( project ) )
+ return;
+ if ( project == null || !project.exists() || !project.isOpen() )
+ abort( MessageFormat.format( SourceLookupMessages.getString( "OldDefaultSourceLocator.4" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
+ IPersistableSourceLocator psl = getPersistableSourceLocator();
+ if ( psl != null )
+ psl.initializeFromMemento( data );
+ else
+ abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.5" ), null ); //$NON-NLS-1$
+ return;
+ }
+ catch( ParserConfigurationException e ) {
+ ex = e;
+ }
+ catch( SAXException e ) {
+ ex = e;
+ }
+ catch( IOException e ) {
+ ex = e;
+ }
+ abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.6" ), ex ); //$NON-NLS-1$
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration)
+ */
+ public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException {
+ setCSourceLocator( SourceLookupFactory.createSourceLocator( getProject( configuration ) ) );
+ String memento = configuration.getAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, "" ); //$NON-NLS-1$
+ if ( !isEmpty( memento ) )
+ initializeFromMemento( memento );
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ public Object getAdapter( Class adapter ) {
+ if ( getCSourceLocator() instanceof IAdaptable ) {
+ if ( adapter.equals( ICSourceLocator.class ) ) {
+ return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
+ }
+ if ( adapter.equals( IResourceChangeListener.class ) ) {
+ return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
+ */
+ public Object getSourceElement( IStackFrame stackFrame ) {
+ Object res = cacheLookup( stackFrame );
+ if ( res == null ) {
+ res = getCSourceLocator().getSourceElement( stackFrame );
+ if ( res instanceof List ) {
+ List list = (List)res;
+ if ( list.size() != 0 ) {
+ SourceSelectionDialog dialog = createSourceSelectionDialog( list );
+ dialog.open();
+ Object[] objs = dialog.getResult();
+ res = (objs != null && objs.length > 0) ? objs[0] : null;
+ if ( res != null )
+ cacheSourceElement( stackFrame, res, dialog.alwaysMapToSelection() );
+ }
+ else
+ res = null;
+ }
+ }
+ if ( res == null ) {
+ if ( stackFrame instanceof ICStackFrame && !isEmpty( ((ICStackFrame)stackFrame).getFile() ) ) {
+ res = new FileNotFoundElement( stackFrame );
+ }
+ else // don't show in editor
+ {
+ res = new NoSymbolOrSourceElement( stackFrame );
+ }
+ }
+ return res;
+ }
+
+ protected void saveChanges( ILaunchConfiguration configuration, IPersistableSourceLocator locator ) {
+ try {
+ ILaunchConfigurationWorkingCopy copy = configuration.copy( configuration.getName() );
+ copy.setAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, locator.getMemento() );
+ copy.doSave();
+ }
+ catch( CoreException e ) {
+ CDebugUIPlugin.errorDialog( e.getMessage(), (IStatus)null );
+ }
+ }
+
+ private SourceSelectionDialog createSourceSelectionDialog( List list ) {
+ SourceSelectionDialog dialog = new SourceSelectionDialog( CDebugUIPlugin.getActiveWorkbenchShell() );
+ dialog.setInput( list.toArray() );
+ dialog.setContentProvider( new ArrayContentProvider() );
+ dialog.setLabelProvider( new SourceElementLabelProvider() );
+ dialog.setTitle( SourceLookupMessages.getString( "OldDefaultSourceLocator.7" ) ); //$NON-NLS-1$
+ dialog.setMessage( SourceLookupMessages.getString( "OldDefaultSourceLocator.8" ) ); //$NON-NLS-1$
+ dialog.setInitialSelections( new Object[]{ list.get( 0 ) } );
+ return dialog;
+ }
+
+ private void cacheSourceElement( IStackFrame frame, Object sourceElement, boolean alwaysMapToSelection ) {
+ if ( alwaysMapToSelection ) {
+ String name = getFileName( frame );
+ if ( name != null ) {
+ if ( fNamesToSource == null )
+ fNamesToSource = new HashMap();
+ fNamesToSource.put( name, sourceElement );
+ }
+ }
+ else {
+ if ( fFramesToSource == null )
+ fFramesToSource = new HashMap();
+ fFramesToSource.put( frame, sourceElement );
+ }
+ }
+
+ private Object cacheLookup( IStackFrame frame ) {
+ String name = getFileName( frame );
+ if ( name != null && fNamesToSource != null ) {
+ Object result = fNamesToSource.get( name );
+ if ( result != null )
+ return result;
+ }
+ return (fFramesToSource != null) ? fFramesToSource.get( frame ) : null;
+ }
+
+ private String getFileName( IStackFrame frame ) {
+ if ( frame instanceof ICStackFrame ) {
+ String name = ((ICStackFrame)frame).getFile();
+ if ( !isEmpty( name ) )
+ return name.trim();
+ }
+ return null;
+ }
+
+ private ICSourceLocator getCSourceLocator() {
+ return fSourceLocator;
+ }
+
+ private void setCSourceLocator( ICSourceLocator locator ) {
+ fSourceLocator = locator;
+ }
+
+ private IPersistableSourceLocator getPersistableSourceLocator() {
+ ICSourceLocator sl = getCSourceLocator();
+ return (sl instanceof IPersistableSourceLocator) ? (IPersistableSourceLocator)sl : null;
+ }
+
+ /**
+ * Throws an internal error exception
+ */
+ private void abort( String message, Throwable e ) throws CoreException {
+ IStatus s = new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), 0, message, e );
+ throw new CoreException( s );
+ }
+
+ private boolean isEmpty( String string ) {
+ return string == null || string.trim().length() == 0;
+ }
+
+ private IProject getProject( ILaunchConfiguration configuration ) throws CoreException {
+ String projectName = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null );
+ if ( !isEmpty( projectName ) ) {
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
+ if ( project.exists() ) {
+ return project;
+ }
+ }
+ abort( MessageFormat.format( SourceLookupMessages.getString( "OldDefaultSourceLocator.9" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
+ return null;
+ }
+}

Back to the top