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

Bug 419399 - Preference for Format with no selection

The user now has a choice between formatting the entire file and
formatting the statement on the current line.

This patch depends on the change in platform.text
https://git.eclipse.org/r/#/c/31337/

Change-Id: I6ae5b925a8ebdce0eec7ff34f7b3f84da0d9c326
Signed-off-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
Reviewed-on: https://git.eclipse.org/r/31338
This commit is contained in:
Sergey Prigogin 2014-08-08 18:26:30 -07:00
parent f9f0d4c3da
commit 27f00a30d8
14 changed files with 404 additions and 27 deletions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2011 QNX Software Systems and others.
* Copyright (c) 2000, 2014 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -9,6 +9,7 @@
* QNX Software Systems - Initial API and implementation
* Sergey Prigogin (Google)
* Anton Leherbauer (Wind River Systems)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.core.formatter;
@ -55,6 +56,18 @@ public class DefaultCodeFormatterConstants {
*/
public static final String FORMATTER_TRANSLATION_UNIT = CCorePlugin.PLUGIN_ID + ".formatter.current_translation_unit"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option that tells the formatter that the formatting region should be
* extended to the enclosing statement boundaries.
* - option id: "org.eclipse.cdt.core.formatter.statement_scope"
* - possible values: object of class {@link Boolean} or {@code null}
* - default: null
* </pre>
* @since 5.9
*/
public static final String FORMATTER_STATEMENT_SCOPE = CCorePlugin.PLUGIN_ID + ".formatter.statement_scope"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Value to set a brace location at the end of a line.

View file

@ -17,6 +17,13 @@ import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.formatter.CodeFormatter;
@ -33,6 +40,8 @@ import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IncludeFileContentProvider;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.util.TextUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
@ -185,6 +194,11 @@ public class CCodeFormatter extends CodeFormatter {
IASTTranslationUnit ast) {
for (int i = 0; i < regions.length; i++) {
IRegion region = regions[i];
if (region.getLength() == 0) {
// An empty region is replaced by the region containing the line corresponding to
// the offset and all statements overlapping with that line.
region = getLineOrStatementRegion(source, region.getOffset(), ast);
}
CodeFormatterVisitor codeFormatter =
new CodeFormatterVisitor(preferences, region.getOffset(), region.getLength());
edits[i] = codeFormatter.format(source, ast);
@ -195,6 +209,74 @@ public class CCodeFormatter extends CodeFormatter {
}
}
/**
* Returns the smallest region containing the line corresponding to the given offset and all
* statements overlapping with that line.
*/
private IRegion getLineOrStatementRegion(String source, int offset, IASTTranslationUnit ast) {
int start = TextUtil.getLineStart(source, offset);
int end = TextUtil.skipToNextLine(source, offset);
IASTNode node = findOverlappingPreprocessorStatement(start, end, ast);
if (node != null) {
IASTFileLocation location = node.getFileLocation();
int nodeOffset = location.getNodeOffset();
if (nodeOffset < start)
start = nodeOffset;
int nodeEnd = nodeOffset + location.getNodeLength();
if (nodeEnd > end)
end = nodeEnd;
return new Region(start, end - start);
}
IASTNodeSelector nodeSelector = ast.getNodeSelector(null);
for (int pos = start; pos < end;) {
node = nodeSelector.findFirstContainedNode(pos, end - pos);
if (node != null) {
IASTNode containedNode = node;
node = CPPVisitor.findAncestorWithType(containedNode, IASTStatement.class);
if (node == null)
node = CPPVisitor.findAncestorWithType(containedNode, IASTDeclaration.class);
if (node == null)
node = CPPVisitor.findAncestorWithType(containedNode, IASTPreprocessorMacroExpansion.class);
}
if (node == null)
break;
IASTFileLocation location = node.getFileLocation();
int nodeOffset = location.getNodeOffset();
if (nodeOffset < start)
start = nodeOffset;
int nodeEnd = nodeOffset + location.getNodeLength();
if (nodeEnd > end)
end = nodeEnd;
pos = nodeEnd;
}
return new Region(start, end - start);
}
private IASTNode findOverlappingPreprocessorStatement(int start, int end, IASTTranslationUnit ast) {
IASTPreprocessorStatement[] statements = ast.getAllPreprocessorStatements();
int low = 0;
int high = statements.length;
while (low < high) {
int mid = (low + high) >>> 1;
IASTPreprocessorStatement statement = statements[mid];
IASTFileLocation location = statement.getFileLocation();
if (location == null) {
low = mid + 1;
} else {
int statementOffset = location.getNodeOffset();
if (statementOffset >= end) {
high = mid;
} else if (statementOffset + location.getNodeLength() <= start) {
low = mid + 1;
} else {
return statement;
}
}
}
return null;
}
private ITranslationUnit getTranslationUnit(String source) {
ITranslationUnit tu= (ITranslationUnit) options.get(DefaultCodeFormatterConstants.FORMATTER_TRANSLATION_UNIT);
if (tu == null) {

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.ui; singleton:=true
Bundle-Version: 5.8.1.qualifier
Bundle-Version: 5.9.0.qualifier
Bundle-Activator: org.eclipse.cdt.ui.CUIPlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin

View file

@ -589,7 +589,7 @@ preferenceKeywords.organizeincludes=include includes organize
preferenceKeywords.todo=case sensitive task tag todo xxx fix fixme project comments
preferenceKeywords.indexer=index skip references type macro search build configuration cache memory performance
preferenceKeywords.ceditor=editor appearance navigation colors smart caret positioning highlight matching bracket inactive code foreground background save trailing whitespace newline doxygen
preferenceKeywords.ceditor=editor appearance navigation colors smart caret positioning highlight matching bracket inactive code foreground background save trailing whitespace newline doxygen format formatting statement
preferenceKeywords.contentassist=editor content code assist complete completion insert overwrite single proposal common prefix automatically auto activation trigger category categories separate specific word hippie template
preferenceKeywords.saveactions=editor save trailing whitespace white space end file newline
preferenceKeywords.scalability=editor mode large file lines disable performance

View file

@ -4878,6 +4878,8 @@
<key name="content_assist_disabled_computers"/>
<key name="content_assist_category_order"/>
<key name="ensureNewlineAtEOF"/>
<key name="formattingScopeForEmptySelection"/>
<key name="formattingConfirmScopeForEmptySelection"/>
<key name="removeTrailingWhitespace"/>
<key name="removeTrailingWhitespaceEditedLines"/>
<key name="Refactoring.savealleditors"/>

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath>
</parent>
<version>5.8.1-SNAPSHOT</version>
<version>5.9.0-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.ui</artifactId>
<packaging>eclipse-plugin</packaging>
</project>

View file

@ -0,0 +1,103 @@
/*******************************************************************************
* Copyright (c) 2014 Google, Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.dialogs;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
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.swt.widgets.Shell;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
/**
* Asks user how formatting of an empty selection should be interpreted.
*/
public class FormattingScopeDialog extends StatusDialog {
private Button fDoNotAskAgainCheckBox;
private Button fScopeFileRadio;
private Button fScopeStatementRadio;
private IPreferenceStore preferenceStore;
public FormattingScopeDialog(Shell shell) {
super(shell);
setTitle(Messages.FormattingScopeDialog_title);
setHelpAvailable(false);
preferenceStore = CUIPlugin.getDefault().getPreferenceStore();
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
PixelConverter converter = new PixelConverter(composite);
createLabel(composite, Messages.FormattingScopeDialog_message);
int indent = converter.convertHorizontalDLUsToPixels(8);
fScopeFileRadio =
createRadioButton(composite, Messages.FormattingScopeDialog_format_file, indent);
fScopeStatementRadio =
createRadioButton(composite, Messages.FormattingScopeDialog_format_statement, indent);
createLabel(composite, ""); // Separator //$NON-NLS-1$
fDoNotAskAgainCheckBox =
createCheckBox(composite, Messages.FormattingScopeDialog_do_not_ask_again);
String scope = preferenceStore.getString(PreferenceConstants.FORMATTING_SCOPE_FOR_EMPTY_SELECTION);
if (PreferenceConstants.FORMATTING_SCOPE_DOCUMENT.equals(scope)) {
fScopeFileRadio.setSelection(true);
} else {
fScopeStatementRadio.setSelection(true);
}
applyDialogFont(composite);
return composite;
}
@Override
protected void okPressed() {
String scope = fScopeFileRadio.getSelection() ?
PreferenceConstants.FORMATTING_SCOPE_DOCUMENT : PreferenceConstants.FORMATTING_SCOPE_STATEMENT;
preferenceStore.setValue(PreferenceConstants.FORMATTING_SCOPE_FOR_EMPTY_SELECTION, scope);
if (fDoNotAskAgainCheckBox.getSelection()) {
preferenceStore.setValue(PreferenceConstants.FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION, false);
}
super.okPressed();
}
private Button createRadioButton(Composite container, String text, int indent) {
return createButton(SWT.RADIO, container, text, indent);
}
private Button createCheckBox(Composite container, String text) {
return createButton(SWT.CHECK, container, text, 0);
}
private Button createButton(int style, Composite container, String text, int indent) {
Button button = new Button(container, style);
GridData layoutData = new GridData();
layoutData.horizontalIndent = indent;
button.setLayoutData(layoutData);
button.setText(text);
return button;
}
private Label createLabel(Composite container, String text) {
Label label = new Label(container, SWT.NONE);
label.setLayoutData(new GridData());
label.setText(text);
return label;
}
}

View file

@ -0,0 +1,29 @@
/*******************************************************************************
* Copyright (c) 2014 Google, Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.dialogs;
import org.eclipse.osgi.util.NLS;
class Messages extends NLS {
public static String FormattingScopeDialog_do_not_ask_again;
public static String FormattingScopeDialog_format_file;
public static String FormattingScopeDialog_format_statement;
public static String FormattingScopeDialog_message;
public static String FormattingScopeDialog_title;
static {
// Initialize resource bundle.
NLS.initializeMessages(Messages.class.getName(), Messages.class);
}
private Messages() {
}
}

View file

@ -0,0 +1,15 @@
###############################################################################
# Copyright (c) 2014 Google, Inc and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
# Sergey Prigogin (Google) - initial API and implementation
###############################################################################
FormattingScopeDialog_title=Select Formatting Scope
FormattingScopeDialog_format_file=The entire &file
FormattingScopeDialog_format_statement=The &statement on the current line
FormattingScopeDialog_message=No code is selected. Choose the scope of formatting.
FormattingScopeDialog_do_not_ask_again=&Remember this choice and do not ask again

View file

@ -37,9 +37,11 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.help.IContext;
import org.eclipse.help.IContextProvider;
import org.eclipse.jface.action.GroupMarker;
@ -48,6 +50,7 @@ import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
@ -112,6 +115,7 @@ 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.window.Window;
import org.eclipse.search.ui.actions.TextSearchGroup;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
@ -213,6 +217,7 @@ import org.eclipse.cdt.internal.ui.actions.StructureSelectNextAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectPreviousAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectionAction;
import org.eclipse.cdt.internal.ui.actions.SurroundWithActionGroup;
import org.eclipse.cdt.internal.ui.dialogs.FormattingScopeDialog;
import org.eclipse.cdt.internal.ui.search.IOccurrencesFinder;
import org.eclipse.cdt.internal.ui.search.IOccurrencesFinder.OccurrenceLocation;
import org.eclipse.cdt.internal.ui.search.OccurrencesFinder;
@ -358,8 +363,23 @@ public class CEditor extends TextEditor implements ICEditor, ISelectionChangedLi
return super.requestWidgetToken(requester, priority);
}
// This method is called only when the Platform version is below 4.5.
// TODO(sprigogin): Remove this override once compatibility with Platform 4.4 is no longer
// required.
@Override
public IFormattingContext createFormattingContext() {
protected IFormattingContext createFormattingContext() {
Point selectedRange = getSelectedRange();
return createFormattingContext(selectedRange.x, selectedRange.y, false);
}
// This method is called when the Platform version is 4.5 or higher.
// @Override
protected IFormattingContext createFormattingContext(int selectionOffset, int selectionLength) {
return createFormattingContext(selectionOffset, selectionLength, true);
}
private IFormattingContext createFormattingContext(int selectionOffset, int selectionLength,
boolean formattingScopeForEmptySelectionSupported) {
IFormattingContext context= new FormattingContext();
Map<String, Object> preferences;
@ -383,6 +403,30 @@ public class CEditor extends TextEditor implements ICEditor, ISelectionChangedLi
preferences.put(DefaultCodeFormatterConstants.FORMATTER_TRANSLATION_UNIT, tu);
preferences.put(DefaultCodeFormatterConstants.FORMATTER_LANGUAGE, language);
preferences.put(DefaultCodeFormatterConstants.FORMATTER_CURRENT_FILE, tu.getResource());
boolean formatWholeDocument = false;
if (formattingScopeForEmptySelectionSupported && selectionLength == 0) {
// The selection is empty. Determine how it should be interpreted.
IPreferencesService preferenceService = Platform.getPreferencesService();
boolean showDialog = preferenceService.getBoolean(CUIPlugin.PLUGIN_ID,
PreferenceConstants.FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION, true, null);
if (showDialog) {
if (!confirmFormattingScope()) {
// The user clicked Cancel. Abort the formatting operation.
context.dispose();
return null;
}
}
String scope = preferenceService.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.FORMATTING_SCOPE_FOR_EMPTY_SELECTION,
PreferenceConstants.FORMATTING_SCOPE_DOCUMENT, null);
if (PreferenceConstants.FORMATTING_SCOPE_DOCUMENT.equals(scope)) {
formatWholeDocument = true;
}
}
if (!formatWholeDocument) {
context.setProperty(FormattingContextProperties.CONTEXT_REGION,
new Region(selectionOffset, selectionLength));
}
}
if (cProject == null) {
@ -396,6 +440,22 @@ public class CEditor extends TextEditor implements ICEditor, ISelectionChangedLi
return context;
}
private boolean confirmFormattingScope() {
int redrawCount = 0;
while (!redraws()) {
redrawCount++;
setRedraw(true);
}
try {
Dialog dialog = new FormattingScopeDialog(getSite().getShell());
return dialog.open() == Window.OK;
} finally {
while (--redrawCount >= 0) {
setRedraw(false);
}
}
}
}
private class ExitPolicy implements IExitPolicy {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2011 IBM Corporation and others.
* Copyright (c) 2005, 2014 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
@ -10,11 +10,18 @@
* QNX Software System
* Anton Leherbauer (Wind River Systems)
* Andrew Ferguson (Symbian)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.preferences;
import static org.eclipse.cdt.ui.PreferenceConstants.FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION;
import static org.eclipse.cdt.ui.PreferenceConstants.FORMATTING_SCOPE_DOCUMENT;
import static org.eclipse.cdt.ui.PreferenceConstants.FORMATTING_SCOPE_FOR_EMPTY_SELECTION;
import static org.eclipse.cdt.ui.PreferenceConstants.FORMATTING_SCOPE_STATEMENT;
import java.util.ArrayList;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.preference.IPreferenceStore;
@ -37,6 +44,8 @@ import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.osgi.framework.Bundle;
import org.osgi.framework.Version;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.ui.dialogs.DocCommentOwnerComposite;
@ -50,11 +59,10 @@ import org.eclipse.cdt.internal.ui.text.c.hover.SourceViewerInformationControl;
import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference;
import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager;
/*
* The page for setting the editor options.
/**
* The preference page for setting the editor options.
*/
public class CEditorPreferencePage extends AbstractPreferencePage {
protected final String[][] fAppearanceColorListModel = new String[][] {
{PreferencesMessages.CEditorPreferencePage_behaviorPage_matchingBracketColor, CEditor.MATCHING_BRACKETS_COLOR, null },
{PreferencesMessages.CEditorPreferencePage_behaviorPage_inactiveCodeColor, CEditor.INACTIVE_CODE_COLOR, null },
@ -69,14 +77,19 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
private ColorSelector fAppearanceColorEditor;
private Button fAppearanceColorDefault;
private DocCommentOwnerComposite fDocCommentOwnerComposite;
// TODO(sprigogin): Remove once compatibility with Platform 4.4 is no longer required.
private final boolean formattingScopeForEmptySelectionSupported;
public CEditorPreferencePage() {
super();
Bundle jfaceText = Platform.getBundle("org.eclipse.jface.text"); //$NON-NLS-1$
formattingScopeForEmptySelectionSupported =
jfaceText.getVersion().compareTo(new Version(3, 10, 0)) >= 0;
}
@Override
protected OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
ArrayList<OverlayKey> overlayKeys = new ArrayList<OverlayKey>();
ArrayList<OverlayKey> overlayKeys = new ArrayList<>();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CEditor.SUB_WORD_NAVIGATION));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_EVALUATE_TEMPORARY_PROBLEMS));
@ -90,6 +103,10 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_FOREGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR_SYSTEM_DEFAULT));
if (formattingScopeForEmptySelectionSupported) {
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, FORMATTING_SCOPE_FOR_EMPTY_SELECTION));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION));
}
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
@ -100,22 +117,21 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
store.setDefault(CEditor.SUB_WORD_NAVIGATION, true);
store.setDefault(CEditor.MATCHING_BRACKETS, true);
PreferenceConverter.setDefault(store, CEditor.MATCHING_BRACKETS_COLOR, new RGB(170,170,170));
PreferenceConverter.setDefault(store, CEditor.MATCHING_BRACKETS_COLOR, new RGB(170, 170, 170));
store.setDefault(CEditor.INACTIVE_CODE_ENABLE, true);
PreferenceConverter.setDefault(store, CEditor.INACTIVE_CODE_COLOR, new RGB(224, 224, 224));
}
/*
* @see PreferencePage#createControl(Composite)
*/
@Override
public void createControl(Composite parent) {
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ICHelpContextIds.C_EDITOR_PREF_PAGE);
}
// sets enabled flag for a control and all its sub-tree
/**
* Sets enabled flag for a control and all its sub-tree.
*/
protected static void setEnabled(Control control, boolean enable) {
control.setEnabled(enable);
if (control instanceof Composite) {
@ -133,6 +149,8 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
layout.numColumns = 2;
behaviorComposite.setLayout(layout);
int indent = convertHorizontalDLUsToPixels(8);
String label= PreferencesMessages.CEditorPreferencePage_behaviorPage_subWordNavigation;
addCheckBox(behaviorComposite, label, CEditor.SUB_WORD_NAVIGATION, 0);
@ -145,6 +163,23 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
label = PreferencesMessages.CEditorPreferencePage_behaviorPage_inactiveCode;
addCheckBox(behaviorComposite, label, CEditor.INACTIVE_CODE_ENABLE, 0);
if (formattingScopeForEmptySelectionSupported) {
Label l = new Label(behaviorComposite, SWT.LEFT);
l.setText(PreferencesMessages.CEditorPreferencePage_behaviorPage_formattingWithEmptySelection);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
l.setLayoutData(gd);
label = PreferencesMessages.CEditorPreferencePage_behaviorPage_formatFile;
addRadioButton(behaviorComposite, label, FORMATTING_SCOPE_FOR_EMPTY_SELECTION, FORMATTING_SCOPE_DOCUMENT, indent);
label = PreferencesMessages.CEditorPreferencePage_behaviorPage_formatStatement;
addRadioButton(behaviorComposite, label, FORMATTING_SCOPE_FOR_EMPTY_SELECTION, FORMATTING_SCOPE_STATEMENT, indent);
label = PreferencesMessages.CEditorPreferencePage_behaviorPage_confirmFormattingScope;
addCheckBox(behaviorComposite, label, FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION, indent);
}
Label l = new Label(behaviorComposite, SWT.LEFT);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
@ -257,7 +292,7 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
String text = PreferencesMessages.CEditorPreferencePage_link;
Link link = new Link(parent, SWT.NONE);
link.setText(text);
link.addListener (SWT.Selection, new Listener () {
link.addListener (SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
String u = event.text;
@ -274,9 +309,6 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
return link;
}
/*
* @see PreferencePage#createContents(Composite)
*/
@Override
protected Control createContents(Composite parent) {
fOverlayStore.load();
@ -319,9 +351,6 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
});
}
/*
* @see org.eclipse.cdt.internal.ui.preferences.AbstractPreferencePage#performOk()
*/
@Override
public boolean performOk() {
DocCommentOwnerManager.getInstance().setWorkspaceCommentOwner(fDocCommentOwnerComposite.getSelectedDocCommentOwner());
@ -341,9 +370,6 @@ public class CEditorPreferencePage extends AbstractPreferencePage {
}
}
/*
* @see org.eclipse.cdt.internal.ui.preferences.AbstractPreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
super.performDefaults();

View file

@ -100,6 +100,10 @@ public final class PreferencesMessages extends NLS {
public static String CEditorPreferencePage_behaviorPage_matchingBrackets;
public static String CEditorPreferencePage_behaviorPage_subWordNavigation;
public static String CEditorPreferencePage_behaviorPage_inactiveCode;
public static String CEditorPreferencePage_behaviorPage_formattingWithEmptySelection;
public static String CEditorPreferencePage_behaviorPage_formatFile;
public static String CEditorPreferencePage_behaviorPage_formatStatement;
public static String CEditorPreferencePage_behaviorPage_confirmFormattingScope;
public static String CEditorPreferencePage_behaviorPage_appearanceColorOptions;
public static String CEditorPreferencePage_behaviorPage_matchingBracketColor;
public static String CEditorPreferencePage_behaviorPage_inactiveCodeColor;

View file

@ -103,6 +103,10 @@ CEditorPreferencePage_colorPage_systemDefault=S&ystem Default
CEditorPreferencePage_behaviorPage_matchingBrackets=Highlight &matching brackets
CEditorPreferencePage_behaviorPage_subWordNavigation=Smart &caret positioning in identifiers
CEditorPreferencePage_behaviorPage_inactiveCode=Highlight &inactive code
CEditorPreferencePage_behaviorPage_formattingWithEmptySelection=When formatting code with an empty selection:
CEditorPreferencePage_behaviorPage_formatFile=Format the entire &file
CEditorPreferencePage_behaviorPage_formatStatement=Format the &statement on the current line
CEditorPreferencePage_behaviorPage_confirmFormattingScope=&Ask for confirmation
CEditorPreferencePage_behaviorPage_appearanceColorOptions=Appearance color options:
CEditorPreferencePage_behaviorPage_matchingBracketColor=Matching brackets highlight
CEditorPreferencePage_behaviorPage_inactiveCodeColor=Inactive code highlight

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* Copyright (c) 2005, 2014 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
@ -930,6 +930,41 @@ public class PreferenceConstants {
*/
public static final String FORMATTER_PROFILE = "formatter_profile"; //$NON-NLS-1$
/**
* Preference key determining the scope of formatting when the selection is empty.
* <p>
* Value is of type {@code String}.
*
* @since 5.9
*/
public final static String FORMATTING_SCOPE_FOR_EMPTY_SELECTION = "formattingScopeForEmptySelection"; //$NON-NLS-1$
/**
* The value of {@link #FORMATTING_SCOPE_FOR_EMPTY_SELECTION} specifying that the formatting
* applies to the whole document.
*
* @since 5.9
*/
public static final String FORMATTING_SCOPE_DOCUMENT = "document"; //$NON-NLS-1$
/**
* The value of {@link #FORMATTING_SCOPE_FOR_EMPTY_SELECTION} specifying that the formatting
* applies to the containing statement.
*
* @since 5.9
*/
public static final String FORMATTING_SCOPE_STATEMENT = "statement"; //$NON-NLS-1$
/**
* Preference key for whether to ask user for how formatting of an empty selection
* should be interpreted.
* <p>
* Value is of type {@code Boolean}. The default is {@code true}.
*
* @since 5.9
*/
public final static String FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION = "formattingConfirmScopeForEmptySelection"; //$NON-NLS-1$
/**
* Preference key for whether to ensure a newline at the end of files when saving.
*
@ -2159,6 +2194,10 @@ public class PreferenceConstants {
// Formatter profile
store.setDefault(FORMATTER_PROFILE, FormatterProfileManager.DEFAULT_PROFILE);
// Formatting behavior.
store.setDefault(FORMATTING_SCOPE_FOR_EMPTY_SELECTION, FORMATTING_SCOPE_DOCUMENT);
store.setDefault(FORMATTING_CONFIRM_SCOPE_FOR_EMPTY_SELECTION, true);
// Content assist
store.setDefault(CODEASSIST_EXCLUDED_CATEGORIES, "org.eclipse.cdt.ui.textProposalCategory\0"); //$NON-NLS-1$
store.setDefault(CODEASSIST_CATEGORY_ORDER, "org.eclipse.cdt.ui.parserProposalCategory:65539\0org.eclipse.cdt.ui.textProposalCategory:65541\0org.eclipse.cdt.ui.templateProposalCategory:2\0org.eclipse.cdt.ui.helpProposalCategory:5\0"); //$NON-NLS-1$