1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00

Patch from Anton Leherbauer, Formatter and preferences, bug 126617.

This commit is contained in:
Markus Schorn 2006-05-09 16:07:11 +00:00
parent 68c96e4c2b
commit 4f434d0f92

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 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
@ -8,21 +8,22 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Qnx Software System
* Anton Leherbauer (Wind River Systems) - Fixed bug 126617
*******************************************************************************/
package org.eclipse.cdt.internal.corext.template.c;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.formatter.CodeFormatter;
import org.eclipse.cdt.internal.corext.util.CodeFormatterUtil;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.util.Strings;
import org.eclipse.cdt.ui.CUIPlugin;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
@ -40,7 +41,7 @@ import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
/**
* A template editor using the Java formatter to format a template buffer.
* A template editor using the C/C++ formatter to format a template buffer.
*/
public class CFormatter {
@ -52,7 +53,7 @@ public class CFormatter {
/** The initial indent level */
private final int fInitialIndentLevel;
/** The java partitioner */
/** Flag indicating whether to use the code formatter or not. */
private boolean fUseCodeFormatter;
public CFormatter(String lineDelimiter, int initialIndentLevel, boolean useCodeFormatter) {
@ -207,22 +208,13 @@ public class CFormatter {
MultiTextEdit root= new MultiTextEdit(0, document.getLength());
root.addChildren((TextEdit[]) positions.toArray(new TextEdit[positions.size()]));
boolean useSpaces=
CUIPlugin.getDefault().getCombinedPreferenceStore().getBoolean(CEditor.SPACES_FOR_TABS);
String indent;
if (useSpaces) {
int iSpaceIndent =
CUIPlugin.getDefault().getCombinedPreferenceStore().getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
IPreferenceStore store = CUIPlugin.getDefault().getCombinedPreferenceStore();
boolean useSpaces = store.getBoolean(CEditor.SPACES_FOR_TABS);
int tabWidth = store
.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
int indentWidth = tabWidth;
String indent = createIndentString(fInitialIndentLevel * indentWidth, tabWidth, useSpaces);
StringBuffer mystringbuf = new StringBuffer();
for ( int i=fInitialIndentLevel * iSpaceIndent; i>0; i-- )
mystringbuf.append ( ' ' );
indent = mystringbuf.toString();
}
else {
indent = Strings.createIndentString(fInitialIndentLevel);
}
// first line
int offset= document.getLineOffset(0);
TextEdit edit= new InsertEdit(offset, indent);
@ -236,15 +228,11 @@ public class CFormatter {
for (int line= 1; line < lineCount; line++) {
IRegion region= document.getLineInformation(line);
offset= region.getOffset();
int nws = offset;
for (int i = offset; i < region.getLength(); ++i) {
if (! Character.isWhitespace(document.getChar(i))) {
nws = i;
break;
}
}
edit= new ReplaceEdit(offset, nws - offset, indent);
String lineContent= document.get(region.getOffset(), region.getLength());
String lineIndent= Strings.getIndentString(lineContent, tabWidth);
int lineIndentLevel= Strings.computeIndent(lineIndent, tabWidth);
indent= createIndentString((fInitialIndentLevel + lineIndentLevel) * indentWidth, tabWidth, useSpaces);
edit= new ReplaceEdit(region.getOffset(), lineIndent.length(), indent);
root.addChild(edit);
root.apply(document, TextEdit.UPDATE_REGIONS);
root.removeChild(edit);
@ -301,6 +289,61 @@ public class CFormatter {
return document.get();
}
/**
* Create an indent string suitable as line prefix using the given
* formatting options.
*
* @param displayedWidth
* the desired displayed width (in char units)
* @param tabWidth
* the displayed tab width
* @param useSpaces
* if <code>true</code>, only spaces are used for the indent
* string, otherwise, the indent string will contain mixed tabs
* and spaces.
* @return the new indent string
*/
private static String createIndentString(int displayedWidth,
int tabWidth, boolean useSpaces) {
return appendIndentString(new StringBuffer(displayedWidth),
displayedWidth, tabWidth, useSpaces, 0).toString();
}
/**
* Append an indent string to the given buffer so that the resulting string
* ends at the desired column.
*
* @param buffer
* the StringBuffer to append to
* @param displayedWidth
* the desired displayed width (in char units)
* @param tabWidth
* the displayed tab width
* @param useSpaces
* if <code>true</code>, only spaces are used for the indent
* string, otherwise, the indent string will contain mixed tabs
* and spaces.
* @param startColumn
* the displayed starting column to correctly identify the tab
* stops
* @return the same StringBuffer as provided
*/
private static StringBuffer appendIndentString(StringBuffer buffer,
int displayedWidth, int tabWidth, boolean useSpaces, int startColumn) {
int tabStop= startColumn - startColumn % tabWidth;
int tabs= useSpaces ? 0 : (displayedWidth - tabStop) / tabWidth;
for (int i= 0; i < tabs; ++i) {
buffer.append('\t');
tabStop += tabWidth;
startColumn= tabStop;
}
int spaces= displayedWidth - startColumn;
for (int i= 0; i < spaces; ++i) {
buffer.append(' ');
}
return buffer;
}
private static List variablesToPositions(TemplateVariable[] variables) {
List positions= new ArrayList(5);
for (int i= 0; i != variables.length; i++) {