1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 22:22:11 +02:00

Bug 515296: New Preferences for Source not found Editor

You now have more precise options for the Source not
Found Editor.

Change-Id: I7391e50c0a9bf7fc712a45d1946e5a24e91c4991
Signed-off-by: Pierre Sachot <sachot.pierre@laposte.net>
Signed-off-by: Yannick Mayeur <yannick.mayeur@gmail.com>
Also-by: Pierre Sachot <sachot.pierre@laposte.net>
Also-by: Yannick Mayeur <yannick.mayeur@gmail.com>
This commit is contained in:
Pierre Sachot 2017-04-21 15:13:16 +01:00 committed by Gerrit Code Review @ Eclipse.org
parent 9462c1db24
commit 10b1e6e4c7
7 changed files with 193 additions and 56 deletions

View file

@ -154,11 +154,39 @@ public class CCorePreferenceConstants {
public static final String SHOW_SOURCE_FILES_IN_BINARIES = CCorePlugin.PLUGIN_ID + ".showSourceFilesInBinaries"; //$NON-NLS-1$
/**
* Attempt to (not) show c source not found editor in debug.
* Attempt to (not) show c source not found editor in debug. String value,
* one of {@link #SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME},
* {@link #SHOW_SOURCE_NOT_FOUND_EDITOR_SOMETIMES},
* {@link #SHOW_SOURCE_NOT_FOUND_EDITOR_NEVER}
*
* @since 6.3
*/
public static final String SHOW_SOURCE_NOT_FOUND_EDITOR = CCorePlugin.PLUGIN_ID + ".showSourceNotFoundEditor"; //$NON-NLS-1$
/**
* Use to display all the time the source not found editor
* @since 6.3
*/
public static final String SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME = "all_time"; //$NON-NLS-1$
/**
* Use to display sometimes the source not found editor
* @since 6.3
*/
public static final String SHOW_SOURCE_NOT_FOUND_EDITOR_SOMETIMES = "sometimes"; //$NON-NLS-1$
/**
* Use to don't display the source not found editor
* @since 6.3
*/
public static final String SHOW_SOURCE_NOT_FOUND_EDITOR_NEVER = "never"; //$NON-NLS-1$
/**
* Use to display by default the source not found editor
* @since 6.3
*/
public static final String SHOW_SOURCE_NOT_FOUND_EDITOR_DEFAULT = SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME;
/**
* Show source roots at the top level of projects.
* @since 5.2

View file

@ -40,6 +40,7 @@ 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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
@ -64,8 +65,10 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
private PropertyChangeListener fPropertyChangeListener;
private Button fShowBinarySourceFilesButton;
private Button fShowSourceNotFoundEditor;
private Button fShowSourceNotFoundAllTime;
private Button fShowSourceNotFoundOnlyCaseSourceNotFound;
private Button fShowSourceNotFoundNever;
protected class PropertyChangeListener implements IPropertyChangeListener {
@ -124,8 +127,9 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
createSpacer(composite, 1);
createCharsetSettingPreferences(composite);
createSpacer(composite, 1);
createBinarySettings(composite);
createShowSourceNotFoundEditor(composite);
createSpacer(composite, 1);
createBinarySettings(composite);
setValues();
return composite;
}
@ -193,8 +197,11 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
fShowBinarySourceFilesButton.setSelection(Platform.getPreferencesService().getBoolean(CCorePlugin.PLUGIN_ID,
CCorePreferenceConstants.SHOW_SOURCE_FILES_IN_BINARIES, true, null));
fShowSourceNotFoundEditor.setSelection(Platform.getPreferencesService().getBoolean(CCorePlugin.PLUGIN_ID,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, true, null));
// Set the values for show source not found editor
String showEditor = Platform.getPreferencesService().getString(CCorePlugin.PLUGIN_ID,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_DEFAULT, null);
setShowEditorButtons(showEditor);
}
@Override
@ -245,11 +252,27 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
fShowBinarySourceFilesButton = createCheckButton(parent,
PreferenceMessages.getString("CDebugPreferencePage.15")); //$NON-NLS-1$
}
private void createShowSourceNotFoundEditor(Composite parent)
{
fShowSourceNotFoundEditor = createCheckButton(parent,
PreferenceMessages.getString("CDebugPreferencePage.21")); //$NON-NLS-1$
private void createShowSourceNotFoundEditor(Composite composite) {
Group buttonGroupForSourceNotFound = new Group(composite, SWT.SHADOW_ETCHED_IN);
{
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
buttonGroupForSourceNotFound.setLayout(gridLayout);
buttonGroupForSourceNotFound.setText(PreferenceMessages.getString("CDebugPreferencePage.24")); //$NON-NLS-1$
Label preferenceText = new Label(buttonGroupForSourceNotFound, SWT.READ_ONLY | SWT.WRAP);
preferenceText.setText(PreferenceMessages.getString("CDebugPreferencePage.26")); //$NON-NLS-1$
}
{
fShowSourceNotFoundAllTime = createRadioButton(buttonGroupForSourceNotFound,
PreferenceMessages.getString("CDebugPreferencePage.22")); //$NON-NLS-1$
fShowSourceNotFoundAllTime.setToolTipText(PreferenceMessages.getString("CDebugPreferencePage.25")); //$NON-NLS-1$
fShowSourceNotFoundOnlyCaseSourceNotFound = createRadioButton(buttonGroupForSourceNotFound,
PreferenceMessages.getString("CDebugPreferencePage.23")); //$NON-NLS-1$
fShowSourceNotFoundNever = createRadioButton(buttonGroupForSourceNotFound,
PreferenceMessages.getString("CDebugPreferencePage.21")); //$NON-NLS-1$
}
}
/**
@ -265,6 +288,15 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
return button;
}
private Button createRadioButton(Composite parent, String label) {
Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
button.setText(label);
// FieldEditor GridData
GridData data = new GridData();
button.setLayoutData(data);
return button;
}
protected void createSpacer(Composite composite, int columnSpan) {
Label label = new Label(composite, SWT.NONE);
GridData gd = new GridData();
@ -354,8 +386,19 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID).putBoolean(
CCorePreferenceConstants.SHOW_SOURCE_FILES_IN_BINARIES, fShowBinarySourceFilesButton.getSelection());
InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID).putBoolean(
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, fShowSourceNotFoundEditor.getSelection());
// Store the show source file editor
if (fShowSourceNotFoundAllTime.getSelection()) {
InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID)
.put(CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME);
}
if (fShowSourceNotFoundOnlyCaseSourceNotFound.getSelection()) {
InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID)
.put(CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_SOMETIMES);
}
if (fShowSourceNotFoundNever.getSelection()) {
InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID)
.put(CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_NEVER);
}
}
/**
@ -368,14 +411,32 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
setDefaultValues();
super.performDefaults();
}
private void setShowEditorButtons(String value)
{
switch (value) {
case CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_SOMETIMES:
fShowSourceNotFoundOnlyCaseSourceNotFound.setSelection(true);
break;
case CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_NEVER:
fShowSourceNotFoundNever.setSelection(true);
break;
case CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME:
default:
fShowSourceNotFoundAllTime.setSelection(true);
break;
}
}
private void setDefaultValues() {
fCharsetEditor.loadDefault();
fWideCharsetEditor.loadDefault();
fShowBinarySourceFilesButton.setSelection(DefaultScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID)
.getBoolean(CCorePreferenceConstants.SHOW_SOURCE_FILES_IN_BINARIES, true));
fShowSourceNotFoundEditor.setSelection(DefaultScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID)
.getBoolean(CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, true));
String defaultSourceShow = DefaultScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID).get(
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_DEFAULT,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME);
setShowEditorButtons(defaultSourceShow);
}
private IWorkbench getWorkbench() {

View file

@ -24,7 +24,12 @@ CDebugPreferencePage.16=Wide character encoding
CDebugPreferencePage.18=Character encoding
CDebugPreferencePage.19=The selected character encoding is not supported.
CDebugPreferencePage.20=The selected wide character encoding is not supported.
CDebugPreferencePage.21=Show the Source Not Found editor when debugger stops at an address with no debug information, or if the associated source file cannot be found.
CDebugPreferencePage.21=Never
CDebugPreferencePage.22=All the time
CDebugPreferencePage.23=Only if source file name is known but not found
CDebugPreferencePage.24=Source Not Found
CDebugPreferencePage.25=If source file name is known but not found or the debugger doesn't know the source name but knows the function name or address.
CDebugPreferencePage.26=Show the Source Not Found Editor :
SourcePreferencePage.0=Default S&ource Lookup Path:
DebuggerTypesPage.0=Select All
DebuggerTypesPage.1=Deselect All

View file

@ -15,8 +15,6 @@ package org.eclipse.cdt.debug.internal.ui.sourcelookup;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CCorePreferenceConstants;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugUtils;
@ -29,13 +27,13 @@ import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
@ -61,19 +59,22 @@ import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
/**
* Editor that lets you select a replacement for the missing source file and
* modifies the source locator accordingly.
*/
public class CSourceNotFoundEditor extends CommonSourceNotFoundEditor {
private static final String SOURCE_NOT_FOUND_PATH = "org.eclipse.cdt.debug.ui.CDebugPreferencePage" //$NON-NLS-1$
;
public final String foundMappingsContainerName = "Found Mappings"; //$NON-NLS-1$
private static final String UID_KEY = ".uid"; //$NON-NLS-1$
private static final String UID_CLASS_NAME = CSourceNotFoundEditor.class.getName();
public static final String UID_DISASSEMBLY_BUTTON = UID_CLASS_NAME + "disassemblyButton"; //$NON-NLS-1$
public static final String UID_LOCATE_FILE_BUTTON = UID_CLASS_NAME + "locateFileButton"; //$NON-NLS-1$
public static final String UID_EDIT_LOOKUP_BUTTON = UID_CLASS_NAME + "editLookupButton"; //$NON-NLS-1$
public static final String UID_SHOW_SOURCE_NOT_FOUND_EDITOR_CHECKBOX = UID_CLASS_NAME + "dontShowSourceEditorButton"; //$NON-NLS-1$
public static final String UID_OPEN_PREFERENCE_BUTTON = UID_CLASS_NAME + "preferenceButton"; //$NON-NLS-1$
private String missingFile = ""; //$NON-NLS-1$
private ILaunchConfiguration launch;
@ -88,7 +89,9 @@ public class CSourceNotFoundEditor extends CommonSourceNotFoundEditor {
private boolean isDebugElement;
private boolean isTranslationUnit;
private Text fText;
private Button dontShowSourceEditorButton;
private Text preferenceText;
private Button preferenceButton;
public CSourceNotFoundEditor() {
super();
@ -184,26 +187,6 @@ public class CSourceNotFoundEditor extends CommonSourceNotFoundEditor {
@Override
protected void createButtons(Composite parent) {
{
GridData data;
dontShowSourceEditorButton = new Button(parent, SWT.CHECK);
data = new GridData();
data.grabExcessHorizontalSpace = false;
data.grabExcessVerticalSpace = false;
dontShowSourceEditorButton.setLayoutData(data);
dontShowSourceEditorButton.setSelection(true);
dontShowSourceEditorButton.setText(SourceLookupUIMessages.CSourceNotFoundEditor_6);
dontShowSourceEditorButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID).putBoolean(
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR,
dontShowSourceEditorButton.getSelection());
};
});
dontShowSourceEditorButton.setData(UID_KEY, UID_SHOW_SOURCE_NOT_FOUND_EDITOR_CHECKBOX);
}
if (isDebugElement) {
GridData data;
@ -255,6 +238,24 @@ public class CSourceNotFoundEditor extends CommonSourceNotFoundEditor {
});
editLookupButton.setData(UID_KEY, UID_EDIT_LOOKUP_BUTTON);
}
{
Composite data = ControlFactory.createComposite(parent, 2);
((GridLayout) data.getLayout()).marginWidth = 0;
((GridLayout) data.getLayout()).marginHeight = 0;
preferenceText = new Text(data, SWT.READ_ONLY | SWT.WRAP);
preferenceButton = new Button(data, SWT.PUSH);
preferenceText.setText(SourceLookupUIMessages.CSourceNotFoundEditor_6);
preferenceButton.setText(SourceLookupUIMessages.CSourceNotFoundEditor_7);
preferenceButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PreferencesUtil.createPreferenceDialogOn(parent.getShell(), SOURCE_NOT_FOUND_PATH, null, null)
.open();
}
});
}
syncButtons();
}

View file

@ -56,6 +56,8 @@ public class SourceLookupUIMessages extends NLS {
public static String CSourceNotFoundEditor_4;
public static String CSourceNotFoundEditor_5;
public static String CSourceNotFoundEditor_6;
public static String CSourceNotFoundEditor_7;
public static String CSourceNotFoundEditor_8;
public static String CompilationDirectorySourceContainerDialog_0;
public static String CompilationDirectorySourceContainerDialog_1;
public static String CompilationDirectorySourceContainerDialog_2;

View file

@ -52,7 +52,8 @@ CSourceNotFoundEditor_2=Missing Source File
CSourceNotFoundEditor_3=No source available for \"{0}\" \n
CSourceNotFoundEditor_4=View Disassembly...
CSourceNotFoundEditor_5=Edit Source Lookup Path...
CSourceNotFoundEditor_6=Show the Source Not Found editor when debugger stops at an address with no debug information, or if the associated source file cannot be found.
CSourceNotFoundEditor_6=Configure when this editor is shown
CSourceNotFoundEditor_7=Preferences...
CompilationDirectorySourceContainerDialog_0=Directory Selection
CompilationDirectorySourceContainerDialog_1=Choose directory to add:
CompilationDirectorySourceContainerDialog_2=Compilation directory

View file

@ -53,6 +53,7 @@ import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
@ -419,20 +420,24 @@ public class DsfSourceDisplayAdapter implements ISourceDisplay, ISteppingControl
if (!page.getWorkbenchWindow().getWorkbench().isClosing()) {
try {
if (input instanceof CSourceNotFoundEditorInput) {
if (Platform.getPreferencesService().getBoolean(CCorePlugin.PLUGIN_ID,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR, true, null)) {
editor[0] = page.openEditor(input, id, false, IWorkbenchPage.MATCH_ID);
/*
* Don't open additional source not found
* editors if there is one to reuse.
*/
editor[0] = page.openEditor(input, id, false, IWorkbenchPage.MATCH_ID);
if (editor[0] instanceof IReusableEditor) {
IReusableEditor re = (IReusableEditor) editor[0];
if (!input.equals(re.getEditorInput())) {
re.setInput(input);
}
CSourceNotFoundEditorInput cSourceInput = ((CSourceNotFoundEditorInput) input);
String showEditor = Platform.getPreferencesService().getString(CCorePlugin.PLUGIN_ID,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR,
CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_DEFAULT, null);
switch (showEditor) {
case CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_SOMETIMES:
if (isSourceFileNameKnown(cSourceInput)) {
editor[0] = openCSourceNotFoundEditor(input, id);
}
break;
case CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_NEVER:
// does nothing because we don't want to
// display the source not found editor
break;
case CCorePreferenceConstants.SHOW_SOURCE_NOT_FOUND_EDITOR_ALL_THE_TIME:
default:
editor[0] = openCSourceNotFoundEditor(input, id);
break;
}
} else {
editor[0] = page.openEditor(input, id, false);
@ -441,6 +446,40 @@ public class DsfSourceDisplayAdapter implements ISourceDisplay, ISteppingControl
}
}
}
private boolean isSourceFileNameKnown(CSourceNotFoundEditorInput input) {
Object artifact = input.getArtifact();
String missingFile = null;
if (artifact instanceof CSourceNotFoundElement) {
CSourceNotFoundElement element = (CSourceNotFoundElement) artifact;
missingFile = element.getFile();
} else if (artifact instanceof ITranslationUnit) {
ITranslationUnit tunit = (ITranslationUnit) artifact;
IPath tuPath = tunit.getLocation();
if (tuPath != null)
missingFile = tuPath.toOSString();
} else {
missingFile = ""; //$NON-NLS-1$
}
if (missingFile != null && missingFile.length() > 0)
return true;
return false;
}
private IEditorPart openCSourceNotFoundEditor(IEditorInput input, String id) throws PartInitException {
IEditorPart editor = page.openEditor(input, id, false, IWorkbenchPage.MATCH_ID);
/*
* Don't open additional source not found editors if there
* is one to reuse.
*/
if (editor instanceof IReusableEditor) {
IReusableEditor re = (IReusableEditor) editor;
if (!input.equals(re.getEditorInput())) {
re.setInput(input);
}
}
return editor;
}
};
BusyIndicator.showWhile(Display.getDefault(), r);
return editor[0];