1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 273529. Configurable name style for getters setters and file names.

This commit is contained in:
Sergey Prigogin 2011-04-25 19:11:53 +00:00
parent fbcf246a20
commit ae1e9fa9b4
27 changed files with 1803 additions and 322 deletions

View file

@ -592,8 +592,8 @@ int gooo = 1;
//#org.eclipse.cdt.ui.tests.refactoring.gettersandsetters.GenerateGettersAndSettersTest
//@.config
filename=GaS.h
getters=i,isOk
setters=i,isOk
getters=i,ok
setters=i,ok
inHeader=true
//@GaS.cpp
#include "Getters.h"
@ -612,8 +612,8 @@ class GaS {
public:
GaS();
virtual ~GaS();
bool /*$*/isOk/*$$*/;
void methode2();
bool /*$*/ok/*$$*/;
void method2();
private:
int i;
@ -629,16 +629,16 @@ class GaS {
public:
GaS();
virtual ~GaS();
bool isOk;
void methode2();
bool ok;
void method2();
int getI() const
{
return i;
}
bool getIsOk() const
bool isOk() const
{
return isOk;
return ok;
}
void setI(int i)
@ -646,9 +646,9 @@ public:
this->i = i;
}
void setIsOk(bool isOk)
void setOk(bool ok)
{
this->isOk = isOk;
this->ok = ok;
}
private:

View file

@ -0,0 +1,58 @@
/*******************************************************************************
* Copyright (c) 2010 Marc-Andre Laperle 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:
* Marc-Andre Laperle - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.utils;
import junit.framework.TestCase;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterNameGenerator;
public class AccessorNameGeneratorTest extends TestCase {
public void testTrimFieldName() {
assertEquals("f", GetterSetterNameGenerator.trimFieldName("f_"));
assertEquals("F", GetterSetterNameGenerator.trimFieldName("F_"));
assertEquals("oo", GetterSetterNameGenerator.trimFieldName("F_oo"));
assertEquals("o", GetterSetterNameGenerator.trimFieldName("f_o"));
assertEquals("M", GetterSetterNameGenerator.trimFieldName("a_M_"));
assertEquals("bs", GetterSetterNameGenerator.trimFieldName("a_bs_"));
assertEquals("foo_bar", GetterSetterNameGenerator.trimFieldName("foo_bar"));
assertEquals("foo_bar", GetterSetterNameGenerator.trimFieldName("foo_bar_"));
assertEquals("foo_b", GetterSetterNameGenerator.trimFieldName("foo_b_"));
assertEquals("foo", GetterSetterNameGenerator.trimFieldName("foo"));
assertEquals("foo", GetterSetterNameGenerator.trimFieldName("_foo"));
assertEquals("bar", GetterSetterNameGenerator.trimFieldName("_f_bar"));
assertEquals("f", GetterSetterNameGenerator.trimFieldName("f__"));
assertEquals("f", GetterSetterNameGenerator.trimFieldName("__f"));
assertEquals("O__b", GetterSetterNameGenerator.trimFieldName("fO__b"));
assertEquals("Oo", GetterSetterNameGenerator.trimFieldName("fOo"));
assertEquals("O", GetterSetterNameGenerator.trimFieldName("fO"));
assertEquals("MyStatic", GetterSetterNameGenerator.trimFieldName("sMyStatic"));
assertEquals("MyMember", GetterSetterNameGenerator.trimFieldName("mMyMember"));
assertEquals("8", GetterSetterNameGenerator.trimFieldName("_8"));
assertEquals("8bar", GetterSetterNameGenerator.trimFieldName("_8bar_"));
assertEquals("8bar_8", GetterSetterNameGenerator.trimFieldName("_8bar_8"));
assertEquals("8bAr", GetterSetterNameGenerator.trimFieldName("_8bAr"));
assertEquals("b8Ar", GetterSetterNameGenerator.trimFieldName("_b8Ar"));
assertEquals("Id", GetterSetterNameGenerator.trimFieldName("Id"));
assertEquals("ID", GetterSetterNameGenerator.trimFieldName("ID"));
assertEquals("IDS", GetterSetterNameGenerator.trimFieldName("IDS"));
assertEquals("ID", GetterSetterNameGenerator.trimFieldName("bID"));
assertEquals("Id", GetterSetterNameGenerator.trimFieldName("MId"));
assertEquals("IdA", GetterSetterNameGenerator.trimFieldName("IdA"));
}
}

View file

@ -7,7 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.utils;
@ -16,7 +16,6 @@ import junit.framework.TestSuite;
/**
* @author Thomas Corbat
*
*/
public class IdentifierHelperTest extends TestSuite {
@ -31,7 +30,7 @@ public class IdentifierHelperTest extends TestSuite {
suite.addTest(new EmptyCaseTest());
suite.addTest(new IllegalCharCaseTest());
suite.addTest(new KeywordCaseTest());
suite.addTestSuite(NameHelperTest.class);
suite.addTestSuite(AccessorNameGeneratorTest.class);
return suite;
}
}

View file

@ -0,0 +1,47 @@
/*******************************************************************************
* Copyright (c) 2011 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.ui.tests.refactoring.utils;
import org.eclipse.cdt.ui.PreferenceConstants;
import junit.framework.TestCase;
import org.eclipse.cdt.internal.ui.util.NameComposer;
public class NameComposerTest extends TestCase {
private static final int CAPITALIZATION_ORIGINAL = PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL;
private static final int CAPITALIZATION_UPPER_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_UPPER_CASE;
private static final int CAPITALIZATION_LOWER_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CASE;
private static final int CAPITALIZATION_CAMEL_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_CAMEL_CASE;
private static final int CAPITALIZATION_LOWER_CAMEL_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CAMEL_CASE;
public void testTrimFieldName() {
NameComposer composer = new NameComposer(CAPITALIZATION_ORIGINAL, "", "", ".h");
assertEquals("MyClass.h", composer.compose("MyClass"));
composer = new NameComposer(CAPITALIZATION_LOWER_CASE, "-", "", ".cc");
assertEquals("my-class.cc", composer.compose("MyClass"));
composer = new NameComposer(CAPITALIZATION_UPPER_CASE, "_", "", "");
assertEquals("MY_CONSTANT", composer.compose("MyConstant"));
composer = new NameComposer(CAPITALIZATION_CAMEL_CASE, "", "get", "");
assertEquals("getMyField", composer.compose("myField"));
assertEquals("getMyField", composer.compose("my_field_"));
composer = new NameComposer(CAPITALIZATION_LOWER_CAMEL_CASE, "", "", "");
assertEquals("myField", composer.compose("MyField"));
composer = new NameComposer(CAPITALIZATION_LOWER_CASE, "_", "", "_");
assertEquals("my_field_", composer.compose("MyField"));
composer = new NameComposer(CAPITALIZATION_ORIGINAL, "_", "", "");
assertEquals("red_Green_blue", composer.compose("_red_Green_blue"));
composer = new NameComposer(CAPITALIZATION_CAMEL_CASE, "", "", "");
assertEquals("RgbValue", composer.compose("RGBValue"));
composer = new NameComposer(CAPITALIZATION_ORIGINAL, "_", "", "");
assertEquals("RGB_Value", composer.compose("RGBValue"));
}
}

View file

@ -1,58 +0,0 @@
/*******************************************************************************
* Copyright (c) 2010 Marc-Andre Laperle 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:
* Marc-Andre Laperle - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.utils;
import junit.framework.TestCase;
import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper;
public class NameHelperTest extends TestCase {
public void testTrimFieldName() {
assertEquals("f", NameHelper.trimFieldName("f_"));
assertEquals("F", NameHelper.trimFieldName("F_"));
assertEquals("oo", NameHelper.trimFieldName("F_oo"));
assertEquals("o", NameHelper.trimFieldName("f_o"));
assertEquals("M", NameHelper.trimFieldName("a_M_"));
assertEquals("bs", NameHelper.trimFieldName("a_bs_"));
assertEquals("foo_bar", NameHelper.trimFieldName("foo_bar"));
assertEquals("foo_bar", NameHelper.trimFieldName("foo_bar_"));
assertEquals("foo_b", NameHelper.trimFieldName("foo_b_"));
assertEquals("foo", NameHelper.trimFieldName("foo"));
assertEquals("foo", NameHelper.trimFieldName("_foo"));
assertEquals("bar", NameHelper.trimFieldName("_f_bar"));
assertEquals("f", NameHelper.trimFieldName("f__"));
assertEquals("f", NameHelper.trimFieldName("__f"));
assertEquals("O__b", NameHelper.trimFieldName("fO__b"));
assertEquals("Oo", NameHelper.trimFieldName("fOo"));
assertEquals("O", NameHelper.trimFieldName("fO"));
assertEquals("MyStatic", NameHelper.trimFieldName("sMyStatic"));
assertEquals("MyMember", NameHelper.trimFieldName("mMyMember"));
assertEquals("8", NameHelper.trimFieldName("_8"));
assertEquals("8bar", NameHelper.trimFieldName("_8bar_"));
assertEquals("8bar_8", NameHelper.trimFieldName("_8bar_8"));
assertEquals("8bAr", NameHelper.trimFieldName("_8bAr"));
assertEquals("b8Ar", NameHelper.trimFieldName("_b8Ar"));
assertEquals("Id", NameHelper.trimFieldName("Id"));
assertEquals("ID", NameHelper.trimFieldName("ID"));
assertEquals("IDS", NameHelper.trimFieldName("IDS"));
assertEquals("ID", NameHelper.trimFieldName("bID"));
assertEquals("IdA", NameHelper.trimFieldName("IdA"));
}
}

View file

@ -8,6 +8,7 @@
*
* Contributors:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.utils;
@ -27,6 +28,7 @@ public class UtilTestSuite extends TestSuite {
suite.addTest(RefactoringTester.suite("TranslationUnitHelperTest", "resources/refactoring/TranslationunitHelper.rts")); //$NON-NLS-1$ //$NON-NLS-2$
suite.addTest(RefactoringTester.suite("DefinitionFinderTest", "resources/refactoring/DefinitionFinder.rts")); //$NON-NLS-1$ //$NON-NLS-2$
suite.addTestSuite(PseudoNameGeneratorTest.class);
suite.addTestSuite(NameComposerTest.class);
return suite;
}
}

View file

@ -187,6 +187,7 @@ CPluginGlobalBuildLogPreferencePage.name=Logging
CPluginFileTypesPreferencePage.name=File Types
CodeFormatterPreferencePage.name=Code Style
codeTemplatePreferencePage.name=Code Templates
nameStylePreferencePage.name=Name Style
CodeAssistPreferencePage.name=Content Assist
CodeAssistAdvancedPreferencePage.name=Advanced
SmartTypingPreferencePage.name=Typing
@ -548,6 +549,7 @@ workingSetConfigurationsExtensionPoint=Working Set Configurations
preferenceKeywords.common=c cpp cplusplus cdt
preferenceKeywords.codestyle=profile codestyle project specific comment indentation brace white space blank line new control statement wrapping tab parenthesis bracket
preferenceKeywords.codetemplates=comment code constructor method file type content
preferenceKeywords.namestyle=name file getter setter
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

View file

@ -745,6 +745,14 @@
<keywordReference id="org.eclipse.cdt.ui.codetemplates"/>
<keywordReference id="org.eclipse.cdt.ui.common"/>
</page>
<page
name="%nameStylePreferencePage.name"
category="org.eclipse.cdt.ui.preferences.CodeFormatterPreferencePage"
class="org.eclipse.cdt.internal.ui.preferences.NameStylePreferencePage"
id="org.eclipse.cdt.ui.preferences.NameStylePreferencePage">
<keywordReference id="org.eclipse.cdt.ui.namestyle"/>
<keywordReference id="org.eclipse.cdt.ui.common"/>
</page>
<page
name="%markOccurrencesPreferencePage.name"
category="org.eclipse.cdt.ui.preferences.CEditorPreferencePage"
@ -795,6 +803,9 @@
<keyword
label="%preferenceKeywords.codetemplates"
id="org.eclipse.cdt.ui.codetemplates"/>
<keyword
label="%preferenceKeywords.namestyle"
id="org.eclipse.cdt.ui.namestyle"/>
<keyword
label="%preferenceKeywords.todo"
id="org.eclipse.cdt.ui.todo"/>

View file

@ -86,6 +86,7 @@ public interface ICHelpContextIds {
public static final String APPEARANCE_PREFERENCE_PAGE = PREFIX + "appearance_preference_page_context"; //$NON-NLS-1$
public static final String SPELLING_CONFIGURATION_BLOCK= PREFIX + "spelling_configuration_block_context"; //$NON-NLS-1$
public static final String CODE_TEMPLATES_PREFERENCE_PAGE = PREFIX + "code_templates_preference_context"; //$NON-NLS-1$
public static final String NAME_STYLE_PREFERENCE_PAGE = PREFIX + "name_style_preference_context"; //$NON-NLS-1$
// Console view
public static final String CLEAR_CONSOLE_ACTION = PREFIX + "clear_console_action_context"; //$NON-NLS-1$

View file

@ -0,0 +1,653 @@
/*******************************************************************************
* Copyright (c) 2011 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.preferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Image;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.util.NameComposer;
import org.eclipse.cdt.internal.ui.viewsupport.ProjectTemplateStore;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField;
/**
* The preference block for configuring styles of names.
*/
public class NameStyleBlock extends OptionsConfigurationBlock {
// private static final String EXAMPLE_CONSTANT_NAME = "MY_CONSTANT"; //$NON-NLS-1$
private static final String EXAMPLE_CLASS_NAME = "MyClass"; //$NON-NLS-1$
private static final String EXAMPLE_FIELD_NAME = "myField"; //$NON-NLS-1$
private final String[] CAPITALIZATION_VALUES = {
String.valueOf(PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL),
String.valueOf(PreferenceConstants.NAME_STYLE_CAPITALIZATION_UPPER_CASE),
String.valueOf(PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CASE),
String.valueOf(PreferenceConstants.NAME_STYLE_CAPITALIZATION_CAMEL_CASE),
String.valueOf(PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CAMEL_CASE),
};
private final String[] CAPITALIZATION_LABELS = {
String.valueOf(PreferencesMessages.NameStyleBlock_capitalization_original),
String.valueOf(PreferencesMessages.NameStyleBlock_capitalization_upper_case),
String.valueOf(PreferencesMessages.NameStyleBlock_capitalization_lower_case),
String.valueOf(PreferencesMessages.NameStyleBlock_capitalization_camel_case),
String.valueOf(PreferencesMessages.NameStyleBlock_capitalization_lower_camel_case),
};
private static final Key KEY_CONSTANT_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_CONSTANT_CAPITALIZATION);
private static final Key KEY_CONSTANT_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_CONSTANT_WORD_DELIMITER);
private static final Key KEY_CONSTANT_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CONSTANT_PREFIX);
private static final Key KEY_CONSTANT_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CONSTANT_SUFFIX);
private static final Key KEY_FIELD_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_FIELD_CAPITALIZATION);
private static final Key KEY_FIELD_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_FIELD_WORD_DELIMITER);
private static final Key KEY_FIELD_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_FIELD_PREFIX);
private static final Key KEY_FIELD_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_FIELD_SUFFIX);
private static final Key KEY_GETTER_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_GETTER_CAPITALIZATION);
private static final Key KEY_GETTER_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_GETTER_WORD_DELIMITER);
private static final Key KEY_GETTER_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_GETTER_PREFIX);
private static final Key KEY_GETTER_PREFIX_FOR_BOOLEAN = getCDTUIKey(PreferenceConstants.NAME_STYLE_GETTER_PREFIX_FOR_BOOLEAN);
private static final Key KEY_GETTER_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_GETTER_SUFFIX);
private static final Key KEY_SETTER_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_SETTER_CAPITALIZATION);
private static final Key KEY_SETTER_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_SETTER_WORD_DELIMITER);
private static final Key KEY_SETTER_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_SETTER_PREFIX);
private static final Key KEY_SETTER_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_SETTER_SUFFIX);
private static final Key KEY_CPP_SOURCE_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_SOURCE_CAPITALIZATION);
private static final Key KEY_CPP_SOURCE_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_SOURCE_WORD_DELIMITER);
private static final Key KEY_CPP_SOURCE_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_SOURCE_PREFIX);
private static final Key KEY_CPP_SOURCE_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_SOURCE_SUFFIX);
private static final Key KEY_CPP_HEADER_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_HEADER_CAPITALIZATION);
private static final Key KEY_CPP_HEADER_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_HEADER_WORD_DELIMITER);
private static final Key KEY_CPP_HEADER_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_HEADER_PREFIX);
private static final Key KEY_CPP_HEADER_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_HEADER_SUFFIX);
private static final Key KEY_CPP_TEST_CAPITALIZATION = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_TEST_CAPITALIZATION);
private static final Key KEY_CPP_TEST_WORD_DELIMITER = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_TEST_WORD_DELIMITER);
private static final Key KEY_CPP_TEST_PREFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_TEST_PREFIX);
private static final Key KEY_CPP_TEST_SUFFIX = getCDTUIKey(PreferenceConstants.NAME_STYLE_CPP_TEST_SUFFIX);
private static final IdentifierValidator IDENTIFIER_VALIDATOR = new IdentifierValidator();
private static final FilenameValidator FILENAME_VALIDATOR = new FilenameValidator();
private static Key[] getAllKeys() {
return new Key[] {
KEY_CONSTANT_CAPITALIZATION,
KEY_CONSTANT_WORD_DELIMITER,
KEY_CONSTANT_PREFIX,
KEY_CONSTANT_SUFFIX,
KEY_FIELD_CAPITALIZATION,
KEY_FIELD_WORD_DELIMITER,
KEY_FIELD_PREFIX,
KEY_FIELD_SUFFIX,
KEY_GETTER_CAPITALIZATION,
KEY_GETTER_WORD_DELIMITER,
KEY_GETTER_PREFIX,
KEY_GETTER_PREFIX_FOR_BOOLEAN,
KEY_GETTER_SUFFIX,
KEY_SETTER_CAPITALIZATION,
KEY_SETTER_WORD_DELIMITER,
KEY_SETTER_PREFIX,
KEY_SETTER_SUFFIX,
KEY_CPP_SOURCE_CAPITALIZATION,
KEY_CPP_SOURCE_WORD_DELIMITER,
KEY_CPP_SOURCE_PREFIX,
KEY_CPP_SOURCE_SUFFIX,
KEY_CPP_HEADER_CAPITALIZATION,
KEY_CPP_HEADER_WORD_DELIMITER,
KEY_CPP_HEADER_PREFIX,
KEY_CPP_HEADER_SUFFIX,
KEY_CPP_TEST_CAPITALIZATION,
KEY_CPP_TEST_WORD_DELIMITER,
KEY_CPP_TEST_PREFIX,
KEY_CPP_TEST_SUFFIX,
};
}
private final Category[] rootCategories;
private TreeListDialogField<Category> categoryTree;
private PixelConverter pixelConverter;
private StackLayout editorAreaStack;
private Category selectedCategory;
public NameStyleBlock(IStatusChangeListener context, IProject project,
IWorkbenchPreferenceContainer container) {
super(context, project, getAllKeys(), container);
rootCategories = createCategories();
}
private static Category[] createCategories() {
Category codeCategory = new Category(PreferencesMessages.NameStyleBlock_code_node);
// new Category(PreferencesMessages.NameStyleBlock_constant_node,
// PreferencesMessages.NameStyleBlock_constant_node_description, EXAMPLE_CONSTANT_NAME,
// null)
// .setCapitalizationKey(KEY_CONSTANT_CAPITALIZATION)
// .setWordDelimiterKey(KEY_CONSTANT_WORD_DELIMITER)
// .setPrefixKey(KEY_CONSTANT_PREFIX)
// .setSuffixKey(KEY_CONSTANT_SUFFIX)
// .setNameValidator(IDENTIFIER_VALIDATOR);
// TODO(sprigogin): Unhide the field name style category
Category fieldCategory = new Category(PreferencesMessages.NameStyleBlock_field_node,
PreferencesMessages.NameStyleBlock_field_node_description, EXAMPLE_FIELD_NAME,
null) // Hidden for now.
.setCapitalizationKey(KEY_FIELD_CAPITALIZATION)
.setWordDelimiterKey(KEY_FIELD_WORD_DELIMITER)
.setPrefixKey(KEY_FIELD_PREFIX)
.setSuffixKey(KEY_FIELD_SUFFIX)
.setNameValidator(IDENTIFIER_VALIDATOR);
new Category(PreferencesMessages.NameStyleBlock_getter_node,
PreferencesMessages.NameStyleBlock_getter_node_description, EXAMPLE_FIELD_NAME,
codeCategory)
.setCapitalizationKey(KEY_GETTER_CAPITALIZATION)
.setWordDelimiterKey(KEY_GETTER_WORD_DELIMITER)
.setPrefixKey(KEY_GETTER_PREFIX)
.setAlternativePrefixKey(KEY_GETTER_PREFIX_FOR_BOOLEAN)
.setSuffixKey(KEY_GETTER_SUFFIX)
.setSeedNameGenerator(fieldCategory)
.setNameValidator(IDENTIFIER_VALIDATOR);
new Category(PreferencesMessages.NameStyleBlock_setter_node,
PreferencesMessages.NameStyleBlock_setter_node_description, EXAMPLE_FIELD_NAME,
codeCategory)
.setCapitalizationKey(KEY_SETTER_CAPITALIZATION)
.setWordDelimiterKey(KEY_SETTER_WORD_DELIMITER)
.setPrefixKey(KEY_SETTER_PREFIX)
.setSuffixKey(KEY_SETTER_SUFFIX)
.setSeedNameGenerator(fieldCategory)
.setNameValidator(IDENTIFIER_VALIDATOR);
Category fileCategory = new Category(PreferencesMessages.NameStyleBlock_files_node);
new Category(PreferencesMessages.NameStyleBlock_cpp_source_node,
PreferencesMessages.NameStyleBlock_cpp_source_node_description, EXAMPLE_CLASS_NAME,
fileCategory)
.setCapitalizationKey(KEY_CPP_SOURCE_CAPITALIZATION)
.setWordDelimiterKey(KEY_CPP_SOURCE_WORD_DELIMITER)
.setPrefixKey(KEY_CPP_SOURCE_PREFIX)
.setSuffixKey(KEY_CPP_SOURCE_SUFFIX)
.setNameValidator(FILENAME_VALIDATOR);
new Category(PreferencesMessages.NameStyleBlock_cpp_header_node,
PreferencesMessages.NameStyleBlock_cpp_header_node_description, EXAMPLE_CLASS_NAME,
fileCategory)
.setCapitalizationKey(KEY_CPP_HEADER_CAPITALIZATION)
.setWordDelimiterKey(KEY_CPP_HEADER_WORD_DELIMITER)
.setPrefixKey(KEY_CPP_HEADER_PREFIX)
.setSuffixKey(KEY_CPP_HEADER_SUFFIX)
.setNameValidator(FILENAME_VALIDATOR);
// TODO(sprigogin): Unhide the test name style category
new Category(PreferencesMessages.NameStyleBlock_cpp_test_node,
PreferencesMessages.NameStyleBlock_cpp_test_node_description, EXAMPLE_CLASS_NAME,
null) // Hidden for now.
.setCapitalizationKey(KEY_CPP_TEST_CAPITALIZATION)
.setWordDelimiterKey(KEY_CPP_TEST_WORD_DELIMITER)
.setPrefixKey(KEY_CPP_TEST_PREFIX)
.setSuffixKey(KEY_CPP_TEST_SUFFIX)
.setNameValidator(FILENAME_VALIDATOR);
return new Category[] { codeCategory, fileCategory };
}
public void postSetSelection(Object element) {
categoryTree.postSetSelection(new StructuredSelection(element));
}
@Override
public boolean hasProjectSpecificOptions(IProject project) {
if (super.hasProjectSpecificOptions(project))
return true;
if (project != null) {
return ProjectTemplateStore.hasProjectSpecificTempates(project);
}
return false;
}
@Override
protected Control createContents(Composite parent) {
pixelConverter = new PixelConverter(parent);
setShell(parent.getShell());
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
NameStyleAdapter adapter = new NameStyleAdapter();
categoryTree = new TreeListDialogField<Category>(adapter, null, new NameStyleLabelProvider());
categoryTree.setDialogFieldListener(adapter);
categoryTree.setLabelText(PreferencesMessages.NameStyleBlock_categories_label);
categoryTree.setViewerComparator(adapter);
createCategories();
for (Category category : rootCategories) {
categoryTree.addElement(category);
}
Label label = categoryTree.getLabelControl(composite);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.verticalAlignment = GridData.BEGINNING;
label.setLayoutData(gd);
Control tree = categoryTree.getTreeControl(composite);
gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
gd.verticalAlignment = GridData.FILL;
gd.grabExcessVerticalSpace = false;
gd.widthHint = pixelConverter.convertWidthInCharsToPixels(50);
gd.heightHint = pixelConverter.convertHeightInCharsToPixels(12);
tree.setLayoutData(gd);
createCategoryEditorArea(composite);
categoryTree.setTreeExpansionLevel(2);
categoryTree.selectFirstElement();
updateControls();
return composite;
}
private void createCategoryEditorArea(Composite parent) {
Composite editorArea = new Composite(parent, SWT.NONE);
editorArea.setLayoutData(new GridData(GridData.FILL_BOTH));
editorArea.setFont(parent.getFont());
editorAreaStack = new StackLayout();
editorArea.setLayout(editorAreaStack);
for (Category category : rootCategories) {
createCategoryEditor(editorArea, category);
}
}
private void createCategoryEditor(Composite parent, Category category) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = pixelConverter.convertHeightInCharsToPixels(1);
layout.marginWidth = 0;
composite.setLayout(layout);
composite.setFont(parent.getFont());
if (category.isConcrete()) {
Group group = ControlFactory.createGroup(composite, category.description, 1);
Composite envelope = new Composite(group, SWT.NONE);
layout = new GridLayout(4, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
envelope.setLayout(layout);
Control control = addComboBox(envelope, PreferencesMessages.NameStyleBlock_capitalization_label,
category.getCapitalizationKey(), CAPITALIZATION_VALUES,
CAPITALIZATION_LABELS, 0);
LayoutUtil.setHorizontalSpan(getLabel(control), 1);
LayoutUtil.setHorizontalSpan(control, 3);
control = addTextField(envelope, PreferencesMessages.NameStyleBlock_word_delimiter_label,
category.getWordDelimiterKey(), 0, pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalSpan(control, 3);
LayoutUtil.setHorizontalAlignment(control, SWT.BEGINNING);
control = addTextField(envelope, PreferencesMessages.NameStyleBlock_prefix_label,
category.getPrefixKey(), 0, pixelConverter.convertWidthInCharsToPixels(10));
boolean getter = PreferencesMessages.NameStyleBlock_getter_node.equals(category.name);
LayoutUtil.setHorizontalSpan(control, getter ? 1 : 3);
LayoutUtil.setHorizontalAlignment(control, SWT.BEGINNING);
if (getter) {
control = addTextField(envelope, PreferencesMessages.NameStyleBlock_prefix_for_boolean_label,
category.getAlternativePrefixKey(), pixelConverter.convertWidthInCharsToPixels(2),
pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalSpan(control, 1);
LayoutUtil.setHorizontalAlignment(control, SWT.BEGINNING);
}
control = addTextField(envelope, PreferencesMessages.NameStyleBlock_suffix_label,
category.getSuffixKey(), 0, pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalSpan(control, 3);
LayoutUtil.setHorizontalAlignment(control, SWT.BEGINNING);
ControlFactory.insertSpace(envelope, 4, pixelConverter.convertHeightInCharsToPixels(1));
ControlFactory.createLabel(envelope, PreferencesMessages.NameStyleBlock_preview_label);
Text previewText = ControlFactory.createTextField(envelope, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
LayoutUtil.setWidthHint(previewText, pixelConverter.convertWidthInCharsToPixels(35));
LayoutUtil.setHorizontalSpan(previewText, 3);
category.setPreviewControl(previewText);
} else {
ControlFactory.createLabel(composite, PreferencesMessages.NameStyleBlock_select_concrete_category);
}
category.setEditorArea(composite);
for (Category child : category.getChildren()) {
createCategoryEditor(parent, child);
}
}
@Override
protected void updateControls() {
super.updateControls();
updatePreview();
}
private void updateConfigurationBlock(List<Object> selection) {
if (selection.size() == 0)
return;
selectedCategory = (Category) selection.get(0);
editorAreaStack.topControl = selectedCategory.getEditorArea();
editorAreaStack.topControl.getParent().layout();
updatePreview();
}
private void updatePreview() {
Text text = selectedCategory.getPreviewControl();
if (text != null) {
text.setText(selectedCategory.composeExampleName(this));
}
}
@Override
public void performDefaults() {
super.performDefaults();
// Refresh
categoryTree.refresh();
updateConfigurationBlock(categoryTree.getSelectedElements());
}
@Override
public boolean performOk() {
return super.performOk();
}
@Override
protected void validateSettings(Key changedKey, String oldValue, String newValue) {
StatusInfo status = new StatusInfo();
if (selectedCategory != null) {
NameValidator validator = selectedCategory.getNameValidator();
if (changedKey.equals(selectedCategory.getPrefixKey()) ||
changedKey.equals(selectedCategory.getAlternativePrefixKey())) {
if (!validator.isValidStart(newValue)) {
status.setError(PreferencesMessages.NameStyleBlock_invalid_prefix);
}
} else if (changedKey.equals(selectedCategory.getWordDelimiterKey())) {
if (!validator.isValidPart(newValue)) {
status.setError(PreferencesMessages.NameStyleBlock_invalid_word_delimiter);
}
} else if (changedKey.equals(selectedCategory.getSuffixKey())) {
if (!validator.isValidPart(newValue)) {
status.setError(PreferencesMessages.NameStyleBlock_invalid_suffix);
}
}
}
updatePreview();
fContext.statusChanged(status);
}
/**
* Represents a category of settings.
*/
private final static class Category {
public final String name;
public final String description;
public final Category parent;
public final int index; // Index in the siblings list
private final List<Category> children;
private Key capitalizationKey;
private Key wordDelimiterKey;
private Key prefixKey;
private Key alternativePrefixKey;
private Key suffixKey;
private String seedName;
private Category seedNameGenerator;
private NameValidator nameValidator;
private Text previewText;
private Composite editorArea;
Category(String name, String description, String seedName, Category parent) {
this.name = name;
this.description = description;
this.seedName = seedName;
this.parent = parent;
children = new ArrayList<Category>();
index = parent != null ? parent.addChild(this) : 0;
}
/**
* @param name Category name
*/
Category(String name) {
this(name, null, null, null);
}
private int addChild(Category category) {
children.add(category);
return children.size() - 1;
}
Category[] getChildren() {
return children.toArray(new Category[children.size()]);
}
boolean hasChildren() {
return !children.isEmpty();
}
@Override
public String toString() {
return name;
}
Key getCapitalizationKey() {
return capitalizationKey;
}
Category setCapitalizationKey(Key capitalizationKey) {
this.capitalizationKey = capitalizationKey;
return this;
}
Key getWordDelimiterKey() {
return wordDelimiterKey;
}
Category setWordDelimiterKey(Key wordDelimiterKey) {
this.wordDelimiterKey = wordDelimiterKey;
return this;
}
Key getPrefixKey() {
return prefixKey;
}
Category setPrefixKey(Key prefixKey) {
this.prefixKey = prefixKey;
return this;
}
Key getAlternativePrefixKey() {
return alternativePrefixKey;
}
Category setAlternativePrefixKey(Key alternativePrefixKey) {
this.alternativePrefixKey = alternativePrefixKey;
return this;
}
Key getSuffixKey() {
return suffixKey;
}
Category setSuffixKey(Key suffixKey) {
this.suffixKey = suffixKey;
return this;
}
boolean isConcrete() {
return capitalizationKey != null;
}
Composite getEditorArea() {
return editorArea;
}
Category setEditorArea(Composite editorArea) {
this.editorArea = editorArea;
return this;
}
Text getPreviewControl() {
return previewText;
}
Category setPreviewControl(Text previewText) {
this.previewText = previewText;
return this;
}
NameValidator getNameValidator() {
return nameValidator;
}
Category setNameValidator(NameValidator nameValidator) {
this.nameValidator = nameValidator;
return this;
}
Category setSeedNameGenerator(Category seedNameGenerator) {
this.seedNameGenerator = seedNameGenerator;
return this;
}
String composeExampleName(NameStyleBlock settings) {
int capitalization = Integer.parseInt(settings.getValue(capitalizationKey));
String wordDelimiter = settings.getValue(wordDelimiterKey);
String prefix = settings.getValue(prefixKey);
String suffix = settings.getValue(suffixKey);
NameComposer composer = new NameComposer(capitalization, wordDelimiter, prefix, suffix);
String name = seedNameGenerator != null ?
seedNameGenerator.composeExampleName(settings) : seedName;
return composer.compose(name);
}
}
private abstract static class NameValidator {
boolean isValidStart(String prefix) {
for (int i = 0; i < prefix.length(); i++) {
if (i == 0 ? !isValidStart(prefix.charAt(i)) : !isValidPart(prefix.charAt(i)))
return false;
}
return true;
}
boolean isValidPart(String part) {
for (int i = 0; i < part.length(); i++) {
if (!isValidPart(part.charAt(i)))
return false;
}
return true;
}
abstract boolean isValidStart(char ch);
abstract boolean isValidPart(char ch);
}
private static class IdentifierValidator extends NameValidator {
@Override
boolean isValidStart(char ch) {
return Character.isJavaIdentifierStart(ch);
}
@Override
boolean isValidPart(char ch) {
return Character.isJavaIdentifierPart(ch);
}
}
private static class FilenameValidator extends NameValidator {
@Override
boolean isValidStart(char ch) {
return isValidPart(ch);
}
@Override
boolean isValidPart(char ch) {
return "\\/:*?<>|\" ".indexOf(ch) == -1; //$NON-NLS-1$
}
}
private class NameStyleAdapter extends ViewerComparator
implements ITreeListAdapter<Category>, IDialogFieldListener {
public void selectionChanged(TreeListDialogField<Category> field) {
updateConfigurationBlock(field.getSelectedElements());
}
public void customButtonPressed(TreeListDialogField<Category> field, int index) {
}
public void doubleClicked(TreeListDialogField<Category> field) {
}
public Category[] getChildren(TreeListDialogField<Category> field, Object element) {
return ((Category) element).getChildren();
}
public Category getParent(TreeListDialogField<Category> field, Object element) {
return ((Category) element).parent;
}
public boolean hasChildren(TreeListDialogField<Category> field, Object element) {
return ((Category) element).hasChildren();
}
public void dialogFieldChanged(DialogField field) {
}
public void keyPressed(TreeListDialogField<Category> field, KeyEvent event) {
}
@Override
public int category(Object element) {
return ((Category) element).index;
}
}
private static class NameStyleLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
return null;
}
@Override
public String getText(Object element) {
return ((Category) element).name;
}
}
}

View file

@ -0,0 +1,116 @@
/*******************************************************************************
* Copyright (c) 2011 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.preferences;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.dialogs.StatusUtil;
/*
* The preference page for configuring styles of names.
*/
public class NameStylePreferencePage extends PropertyAndPreferencePage {
public static final String PREF_ID= "org.eclipse.cdt.ui.preferences.NameStylePreferencePage"; //$NON-NLS-1$
public static final String PROP_ID= "org.eclipse.cdt.ui.propertyPages.NameStylePreferencePage"; //$NON-NLS-1$
private NameStyleBlock fConfigurationBlock;
public NameStylePreferencePage() {
setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
// Only used when the page is shown programmatically.
setTitle(PreferencesMessages.NameStylePreferencePage_title);
}
@Override
public void createControl(Composite parent) {
IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer) getContainer();
fConfigurationBlock= new NameStyleBlock(getNewStatusChangedListener(),
getProject(), container);
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
ICHelpContextIds.NAME_STYLE_PREFERENCE_PAGE);
}
@Override
protected Control createPreferenceContent(Composite composite) {
return fConfigurationBlock.createContents(composite);
}
@Override
protected void enableProjectSpecificSettings(boolean useProjectSpecificSettings) {
super.enableProjectSpecificSettings(useProjectSpecificSettings);
if (fConfigurationBlock != null) {
fConfigurationBlock.useProjectSpecificSettings(useProjectSpecificSettings);
}
}
@Override
public boolean performOk() {
if (fConfigurationBlock != null) {
return fConfigurationBlock.performOk();
}
return true;
}
@Override
protected void performDefaults() {
super.performDefaults();
if (fConfigurationBlock != null) {
fConfigurationBlock.performDefaults();
}
}
@Override
public void dispose() {
if (fConfigurationBlock != null) {
fConfigurationBlock.dispose();
}
super.dispose();
}
public void statusChanged(IStatus status) {
setValid(!status.matches(IStatus.ERROR));
StatusUtil.applyToStatusLine(this, status);
}
@Override
public void performApply() {
if (fConfigurationBlock != null) {
fConfigurationBlock.performApply();
}
}
@Override
protected boolean hasProjectSpecificOptions(IProject project) {
return fConfigurationBlock.hasProjectSpecificOptions(project);
}
@Override
protected String getPreferencePageID() {
return PREF_ID;
}
@Override
protected String getPropertyPageID() {
return null;
// TODO(sprigogin): Project specific settings
// return PROP_ID;
}
}

View file

@ -181,7 +181,8 @@ public abstract class OptionsConfigurationBlock {
private int fRebuildCount; // used to prevent multiple dialogs that ask for a rebuild
public OptionsConfigurationBlock(IStatusChangeListener context, IProject project, Key[] allKeys, IWorkbenchPreferenceContainer container) {
public OptionsConfigurationBlock(IStatusChangeListener context, IProject project, Key[] allKeys,
IWorkbenchPreferenceContainer container) {
fContext= context;
fProject= project;
fAllKeys= allKeys;
@ -336,7 +337,8 @@ public abstract class OptionsConfigurationBlock {
return checkBox;
}
protected Button addCheckBoxWithLink(Composite parent, String label, Key key, String[] values, int indent, int widthHint, SelectionListener listener) {
protected Button addCheckBoxWithLink(Composite parent, String label, Key key, String[] values,
int indent, int widthHint, SelectionListener listener) {
ControlData data= new ControlData(key, values);
GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false);
@ -378,8 +380,9 @@ public abstract class OptionsConfigurationBlock {
return checkBox;
}
protected Combo addComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
GridData gd= new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
protected Combo addComboBox(Composite parent, String label, Key key, String[] values,
String[] valueLabels, int indent) {
GridData gd= new GridData(GridData.FILL, GridData.CENTER, false, false, 2, 1);
gd.horizontalIndent= indent;
Label labelControl= new Label(parent, SWT.LEFT);
@ -395,7 +398,8 @@ public abstract class OptionsConfigurationBlock {
return comboBox;
}
protected Combo addInversedComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
protected Combo addInversedComboBox(Composite parent, String label, Key key, String[] values,
String[] valueLabels, int indent) {
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent= indent;
gd.horizontalSpan= 3;
@ -439,30 +443,37 @@ public abstract class OptionsConfigurationBlock {
}
protected Text addTextField(Composite parent, String label, Key key, int indent, int widthHint) {
return addTextField(parent, label, key, indent, widthHint, SWT.NONE);
}
protected Text addTextField(Composite parent, String label, Key key, int indent, int widthHint,
int extraStyle) {
Label labelControl= new Label(parent, SWT.WRAP);
labelControl.setText(label);
labelControl.setFont(JFaceResources.getDialogFont());
labelControl.setLayoutData(new GridData());
GridData data= new GridData();
data.horizontalIndent= indent;
labelControl.setLayoutData(data);
Text textBox= new Text(parent, SWT.BORDER | SWT.SINGLE);
Text textBox= new Text(parent, SWT.BORDER | SWT.SINGLE | extraStyle);
textBox.setData(key);
textBox.setLayoutData(new GridData());
makeScrollableCompositeAware(textBox);
fLabels.put(textBox, labelControl);
String currValue= getValue(key);
if (currValue != null) {
textBox.setText(currValue);
if (key != null) {
String currValue= getValue(key);
if (currValue != null) {
textBox.setText(currValue);
}
textBox.addModifyListener(getTextModifyListener());
}
textBox.addModifyListener(getTextModifyListener());
GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
if (widthHint != 0) {
data.widthHint= widthHint;
}
data.horizontalIndent= indent;
data.horizontalSpan= 2;
textBox.setLayoutData(data);
@ -570,9 +581,9 @@ public abstract class OptionsConfigurationBlock {
ControlData data= (ControlData) widget.getData();
String newValue= null;
if (widget instanceof Button) {
newValue= data.getValue(((Button)widget).getSelection());
newValue= data.getValue(((Button) widget).getSelection());
} else if (widget instanceof Combo) {
newValue= data.getValue(((Combo)widget).getSelectionIndex());
newValue= data.getValue(((Combo) widget).getSelectionIndex());
} else {
return;
}
@ -582,9 +593,11 @@ public abstract class OptionsConfigurationBlock {
protected void textChanged(Text textControl) {
Key key= (Key) textControl.getData();
String number= textControl.getText();
String oldValue= setValue(key, number);
validateSettings(key, oldValue, number);
if (key != null) {
String newValue= textControl.getText();
String oldValue= setValue(key, newValue);
validateSettings(key, oldValue, newValue);
}
}
protected boolean checkValue(Key key, String value) {
@ -631,7 +644,6 @@ public abstract class OptionsConfigurationBlock {
*/
protected abstract void validateSettings(Key changedKey, String oldValue, String newValue);
protected String[] getTokens(String text, String separator) {
StringTokenizer tok= new StringTokenizer(text, separator);
int nTokens= tok.countTokens();
@ -815,10 +827,11 @@ public abstract class OptionsConfigurationBlock {
protected void updateText(Text curr) {
Key key= (Key) curr.getData();
String currValue= getValue(key);
if (currValue != null) {
curr.setText(currValue);
if (key != null) {
String currValue= getValue(key);
if (currValue != null) {
curr.setText(currValue);
}
}
}
@ -871,6 +884,10 @@ public abstract class OptionsConfigurationBlock {
return null;
}
protected Control getLabel(Control control) {
return fLabels.get(control);
}
protected void setComboEnabled(Key key, boolean enabled) {
Combo combo= getComboBox(key);
Label label= fLabels.get(combo);

View file

@ -20,13 +20,6 @@ package org.eclipse.cdt.internal.ui.preferences;
import org.eclipse.osgi.util.NLS;
public final class PreferencesMessages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.ui.preferences.PreferencesMessages";//$NON-NLS-1$
private PreferencesMessages() {
// Do not instantiate
}
public static String CodeAssistAdvancedConfigurationBlock_default_table_category_column_title;
public static String CodeAssistAdvancedConfigurationBlock_default_table_description;
public static String CodeAssistAdvancedConfigurationBlock_default_table_keybinding_column_title;
@ -377,6 +370,40 @@ public final class PreferencesMessages extends NLS {
public static String CodeTemplateBlock_export_error_hidden;
public static String CodeTemplateBlock_export_error_canNotWrite;
public static String NameStylePreferencePage_title;
public static String NameStyleBlock_code_node;
public static String NameStyleBlock_files_node;
public static String NameStyleBlock_constant_node;
public static String NameStyleBlock_constant_node_description;
public static String NameStyleBlock_field_node;
public static String NameStyleBlock_field_node_description;
public static String NameStyleBlock_getter_node;
public static String NameStyleBlock_getter_node_description;
public static String NameStyleBlock_setter_node;
public static String NameStyleBlock_setter_node_description;
public static String NameStyleBlock_cpp_source_node;
public static String NameStyleBlock_cpp_source_node_description;
public static String NameStyleBlock_cpp_header_node;
public static String NameStyleBlock_cpp_header_node_description;
public static String NameStyleBlock_cpp_test_node;
public static String NameStyleBlock_cpp_test_node_description;
public static String NameStyleBlock_categories_label;
public static String NameStyleBlock_capitalization_label;
public static String NameStyleBlock_capitalization_original;
public static String NameStyleBlock_capitalization_upper_case;
public static String NameStyleBlock_capitalization_lower_case;
public static String NameStyleBlock_capitalization_camel_case;
public static String NameStyleBlock_capitalization_lower_camel_case;
public static String NameStyleBlock_word_delimiter_label;
public static String NameStyleBlock_prefix_label;
public static String NameStyleBlock_prefix_for_boolean_label;
public static String NameStyleBlock_suffix_label;
public static String NameStyleBlock_preview_label;
public static String NameStyleBlock_select_concrete_category;
public static String NameStyleBlock_invalid_prefix;
public static String NameStyleBlock_invalid_word_delimiter;
public static String NameStyleBlock_invalid_suffix;
public static String EditTemplateDialog_error_noname;
public static String EditTemplateDialog_error_invalidName;
public static String EditTemplateDialog_title_new;
@ -417,7 +444,11 @@ public final class PreferencesMessages extends NLS {
public static String ScalabilityPreferencePage_preferenceOnlyForNewEditors;
public static String ScalabilityPreferencePage_contentAssist_autoActivation;
private PreferencesMessages() {
// Do not instantiate
}
static {
NLS.initializeMessages(BUNDLE_NAME, PreferencesMessages.class);
NLS.initializeMessages(PreferencesMessages.class.getName(), PreferencesMessages.class);
}
}

View file

@ -432,6 +432,41 @@ CodeTemplateBlock_export_error_title= Export Templates
CodeTemplateBlock_export_error_hidden= Export failed.\n{0} is a hidden file.
CodeTemplateBlock_export_error_canNotWrite= Export failed.\n{0} cannot be modified.
NameStylePreferencePage_title=Name Style
NameStyleBlock_code_node=Code
NameStyleBlock_files_node=Files
NameStyleBlock_constant_node=Constant
NameStyleBlock_constant_node_description=Constant name
NameStyleBlock_field_node=Class field
NameStyleBlock_field_node_description=Class field name
NameStyleBlock_getter_node=Getter Method
NameStyleBlock_getter_node_description=Getter name based on the field name
NameStyleBlock_setter_node=Setter Method
NameStyleBlock_setter_node_description=Setter name based on the field name
NameStyleBlock_cpp_source_node=C++ Source File
NameStyleBlock_cpp_source_node_description=C++ source file name based on the class name
NameStyleBlock_cpp_header_node=C++ Header File
NameStyleBlock_cpp_header_node_description=C++ header file name based on the class name
NameStyleBlock_cpp_test_node=C++ Test File
NameStyleBlock_cpp_test_node_description=C++ test file name based on the class name
NameStyleBlock_categories_label=Name &Categories:
NameStyleBlock_capitalization_label=C&apitalization:
NameStyleBlock_capitalization_original=Original
NameStyleBlock_capitalization_upper_case=Upper Case
NameStyleBlock_capitalization_lower_case=Lower Case
NameStyleBlock_capitalization_camel_case=Camel Case
NameStyleBlock_capitalization_lower_camel_case=Lower Camel Case
NameStyleBlock_word_delimiter_label=Word &Delimiter:
NameStyleBlock_prefix_label=&Prefix:
NameStyleBlock_prefix_for_boolean_label=For &Boolean:
NameStyleBlock_suffix_label=&Suffix:
NameStyleBlock_preview_label=Pre&view:
NameStyleBlock_select_concrete_category=Select a specific name category
NameStyleBlock_invalid_prefix=Invalid prefix
NameStyleBlock_invalid_word_delimiter=Invalid word delimiter
NameStyleBlock_invalid_suffix=Invalid suffix
# edit template dialog
EditTemplateDialog_error_noname=Template name cannot be empty.
EditTemplateDialog_error_invalidName=Template name contains invalid characters.

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
* Copyright (c) 2008, 2011 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@ -8,6 +8,7 @@
*
* Contributors:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
@ -37,43 +38,40 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTReturnStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration;
import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper;
public class FunctionFactory {
public static IASTFunctionDefinition createGetterDefinition(String varName,
public static IASTFunctionDefinition createGetterDefinition(IASTName fieldName,
IASTSimpleDeclaration fieldDeclaration, ICPPASTQualifiedName name) {
IASTFunctionDefinition getter = new CPPASTFunctionDefinition();
getter.setDeclSpecifier(fieldDeclaration.getDeclSpecifier().copy(CopyStyle.withLocations));
IASTDeclarator getterDeclarator = getGetterDeclarator(varName, fieldDeclaration, name);
IASTDeclarator getterDeclarator = getGetterDeclarator(fieldName, fieldDeclaration, name);
// IASTFunctionDefinition. expects the outermost IASTFunctionDeclarator in declarator hierarchy
while (!(getterDeclarator instanceof IASTFunctionDeclarator)) {
getterDeclarator = getterDeclarator.getNestedDeclarator();
}
getter.setDeclarator((IASTFunctionDeclarator) getterDeclarator);
getter.setBody(getGetterBody(varName));
getter.setBody(getGetterBody(fieldName));
return getter;
}
private static CPPASTCompoundStatement getGetterBody(String varName) {
private static CPPASTCompoundStatement getGetterBody(IASTName fieldName) {
CPPASTCompoundStatement compound = new CPPASTCompoundStatement();
CPPASTReturnStatement returnStatement = new CPPASTReturnStatement();
CPPASTIdExpression idExpr = new CPPASTIdExpression();
CPPASTName returnVal = new CPPASTName();
returnVal.setName(varName.toCharArray());
returnVal.setName(fieldName.toCharArray());
idExpr.setName(returnVal);
returnStatement.setReturnValue(idExpr);
compound.addStatement(returnStatement);
return compound;
}
private static IASTDeclarator getGetterDeclarator(String varName,
private static IASTDeclarator getGetterDeclarator(IASTName fieldName,
IASTSimpleDeclaration fieldDeclaration, ICPPASTQualifiedName name) {
CPPASTName getterName = new CPPASTName();
String varPartOfGetterName = NameHelper.makeFirstCharUpper(NameHelper.trimFieldName(varName));
getterName.setName("get".concat(varPartOfGetterName).toCharArray()); //$NON-NLS-1$
getterName.setName(GetterSetterNameGenerator.generateGetterName(fieldName).toCharArray());
// copy declarator hierarchy
IASTDeclarator topDeclarator = fieldDeclaration.getDeclarators()[0].copy(CopyStyle.withLocations);
@ -106,12 +104,12 @@ public class FunctionFactory {
return topDeclarator;
}
}
public static IASTFunctionDefinition createSetterDefinition(String varName,
public static IASTFunctionDefinition createSetterDefinition(IASTName fieldName,
IASTSimpleDeclaration fieldDeclaration, ICPPASTQualifiedName name) {
IASTFunctionDefinition setter = new CPPASTFunctionDefinition();
setter.setDeclSpecifier(getVoidDeclSpec());
setter.setDeclarator(getSetterDeclarator(varName, fieldDeclaration, name));
setter.setDeclarator(getSetterDeclarator(fieldName, fieldDeclaration, name));
setter.setBody(getSetterBody(fieldDeclaration));
return setter;
}
@ -141,11 +139,10 @@ public class FunctionFactory {
return compound;
}
private static CPPASTFunctionDeclarator getSetterDeclarator(String varName,
private static CPPASTFunctionDeclarator getSetterDeclarator(IASTName fieldName,
IASTSimpleDeclaration fieldDeclaration, ICPPASTQualifiedName name) {
CPPASTName setterName = new CPPASTName();
String varPartOfSetterName = NameHelper.makeFirstCharUpper(NameHelper.trimFieldName(varName));
setterName.setName("set".concat(varPartOfSetterName).toCharArray()); //$NON-NLS-1$
setterName.setName(GetterSetterNameGenerator.generateSetterName(fieldName).toCharArray());
CPPASTFunctionDeclarator declarator = new CPPASTFunctionDeclarator();
if (name != null) {
name.addName(setterName);
@ -167,20 +164,19 @@ public class FunctionFactory {
return declSpecifier;
}
public static IASTSimpleDeclaration createGetterDeclaration(String name,
public static IASTSimpleDeclaration createGetterDeclaration(IASTName fieldName,
IASTSimpleDeclaration fieldDeclaration) {
IASTSimpleDeclaration getter = new CPPASTSimpleDeclaration();
getter.setDeclSpecifier(fieldDeclaration.getDeclSpecifier().copy(CopyStyle.withLocations));
getter.addDeclarator(getGetterDeclarator(name, fieldDeclaration, null));
getter.addDeclarator(getGetterDeclarator(fieldName, fieldDeclaration, null));
return getter;
}
public static IASTSimpleDeclaration createSetterDeclaration(String name,
public static IASTSimpleDeclaration createSetterDeclaration(IASTName fieldName,
IASTSimpleDeclaration fieldDeclaration) {
IASTSimpleDeclaration setter = new CPPASTSimpleDeclaration();
setter.setDeclSpecifier(getVoidDeclSpec());
setter.addDeclarator(getSetterDeclarator(name, fieldDeclaration, null));
setter.addDeclarator(getSetterDeclarator(fieldName, fieldDeclaration, null));
return setter;
}
}

View file

@ -28,7 +28,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterAndSetterContext.FieldWrapper;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.AccessorKind;
public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
private GetterAndSetterContext context;
@ -115,7 +115,7 @@ public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
selectGetter.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
selectMethods(Type.getter);
selectMethods(AccessorKind.GETTER);
}
});
@ -124,14 +124,14 @@ public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
selectSetter.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
selectMethods(Type.setter);
selectMethods(AccessorKind.SETTER);
}
});
return btComp;
}
private void selectMethods(Type type) {
private void selectMethods(AccessorKind type) {
Object[] items = context.getElements(null);
Set<GetterSetterInsertEditProvider> checked = context.selectedFunctions;
for (Object treeItem : items) {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
* Copyright (c) 2008, 2011 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@ -8,6 +8,7 @@
*
* Contributors:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
@ -23,8 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.AccessorKind;
public class GetterAndSetterContext implements ITreeContentProvider {
public ArrayList<IASTSimpleDeclaration> existingFields = new ArrayList<IASTSimpleDeclaration>();
@ -54,13 +54,13 @@ public class GetterAndSetterContext implements ITreeContentProvider {
}
public GetterSetterInsertEditProvider createGetterInserter(IASTSimpleDeclaration simpleDeclaration) {
String varName = getFieldDeclarationName(simpleDeclaration).toString();
return new GetterSetterInsertEditProvider(varName, simpleDeclaration, Type.getter);
IASTName fieldName = getFieldDeclarationName(simpleDeclaration);
return new GetterSetterInsertEditProvider(fieldName, simpleDeclaration, AccessorKind.GETTER);
}
public GetterSetterInsertEditProvider createSetterInserter(IASTSimpleDeclaration simpleDeclaration) {
String varName = getFieldDeclarationName(simpleDeclaration).toString();
return new GetterSetterInsertEditProvider(varName, simpleDeclaration, Type.setter);
IASTName fieldName = getFieldDeclarationName(simpleDeclaration);
return new GetterSetterInsertEditProvider(fieldName, simpleDeclaration, AccessorKind.SETTER);
}
public Object getParent(Object element) {
@ -111,10 +111,8 @@ public class GetterAndSetterContext implements ITreeContentProvider {
private FunctionWrapper getGetterForField(IASTSimpleDeclaration currentField) {
FunctionWrapper wrapper = new FunctionWrapper();
String trimmedName = NameHelper.trimFieldName(getFieldDeclarationName(currentField).toString());
String getterName = "get" + NameHelper.makeFirstCharUpper(trimmedName); //$NON-NLS-1$
setFunctionToWrapper(wrapper, getterName);
String name = GetterSetterNameGenerator.generateGetterName(getFieldDeclarationName(currentField));
setFunctionToWrapper(wrapper, name);
return wrapper;
}
@ -128,10 +126,8 @@ public class GetterAndSetterContext implements ITreeContentProvider {
private FunctionWrapper getSetterForField(IASTSimpleDeclaration currentField) {
FunctionWrapper wrapper = new FunctionWrapper();
String trimmedName = NameHelper.trimFieldName(getFieldDeclarationName(currentField).toString());
String setterName = "set" + NameHelper.makeFirstCharUpper(trimmedName); //$NON-NLS-1$
setFunctionToWrapper(wrapper, setterName);
String name = GetterSetterNameGenerator.generateSetterName(getFieldDeclarationName(currentField));
setFunctionToWrapper(wrapper, name);
return wrapper;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
* Copyright (c) 2008, 2011 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@ -8,12 +8,14 @@
*
* Contributors:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNode.CopyStyle;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
@ -22,28 +24,29 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName;
public class GetterSetterInsertEditProvider implements Comparable<GetterSetterInsertEditProvider> {
public enum Type {
getter,
setter;
public enum AccessorKind {
GETTER,
SETTER;
}
private IASTSimpleDeclaration functionDeclaration;
private Type type;
private String name;
private AccessorKind kind;
private IASTName fieldName;
private IASTSimpleDeclaration fieldDeclaration;
public GetterSetterInsertEditProvider(String name, IASTSimpleDeclaration fieldDeclaration, Type type) {
switch (type) {
case getter:
this.functionDeclaration = FunctionFactory.createGetterDeclaration(name, fieldDeclaration);
public GetterSetterInsertEditProvider(IASTName fieldName, IASTSimpleDeclaration fieldDeclaration,
AccessorKind kind) {
switch (kind) {
case GETTER:
this.functionDeclaration = FunctionFactory.createGetterDeclaration(fieldName, fieldDeclaration);
break;
case setter:
this.functionDeclaration = FunctionFactory.createSetterDeclaration(name, fieldDeclaration);
case SETTER:
this.functionDeclaration = FunctionFactory.createSetterDeclaration(fieldName, fieldDeclaration);
break;
}
this.type = type;
this.name = name;
this.kind = kind;
this.fieldName = fieldName;
this.fieldDeclaration = fieldDeclaration;
}
@ -65,12 +68,12 @@ public class GetterSetterInsertEditProvider implements Comparable<GetterSetterIn
qname = null;
}
switch (type) {
case getter:
definition = FunctionFactory.createGetterDefinition(name, fieldDeclaration, qname);
switch (kind) {
case GETTER:
definition = FunctionFactory.createGetterDefinition(fieldName, fieldDeclaration, qname);
break;
case setter:
definition = FunctionFactory.createSetterDefinition(name, fieldDeclaration, qname);
case SETTER:
definition = FunctionFactory.createSetterDefinition(fieldName, fieldDeclaration, qname);
break;
}
return definition;
@ -92,8 +95,8 @@ public class GetterSetterInsertEditProvider implements Comparable<GetterSetterIn
return functionDeclaration;
}
public Type getType() {
return type;
public AccessorKind getType() {
return kind;
}
public int compareTo(GetterSetterInsertEditProvider o) {

View file

@ -0,0 +1,123 @@
/*******************************************************************************
* Copyright (c) 2010, 2011 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.refactoring.gettersandsetters;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import com.ibm.icu.text.BreakIterator;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.ui.text.CBreakIterator;
import org.eclipse.cdt.internal.ui.util.NameComposer;
public class GetterSetterNameGenerator {
// Do not instantiate.
private GetterSetterNameGenerator() {
}
public static String generateGetterName(IASTName fieldName) {
IPreferencesService preferences = Platform.getPreferencesService();
int capitalization = preferences.getInt(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_GETTER_CAPITALIZATION,
PreferenceConstants.NAME_STYLE_CAPITALIZATION_CAMEL_CASE, null);
String wordDelimiter = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_GETTER_WORD_DELIMITER, "", null); //$NON-NLS-1$
String prefix = isBooleanDecaratorName(fieldName) ?
preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_GETTER_PREFIX_FOR_BOOLEAN, "is", null) : //$NON-NLS-1$
preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_GETTER_PREFIX, "get", null); //$NON-NLS-1$
String suffix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_GETTER_SUFFIX, "", null); //$NON-NLS-1$
NameComposer composer = new NameComposer(capitalization, wordDelimiter, prefix, suffix);
String name = GetterSetterNameGenerator.trimFieldName(fieldName.toString());
return composer.compose(name);
}
private static boolean isBooleanDecaratorName(IASTName name) {
if (IASTDeclarator.DECLARATOR_NAME.equals(name.getPropertyInParent())) {
IASTDeclarator declarator = (IASTDeclarator) name.getParent();
IType type = CPPVisitor.createType(declarator);
if (type instanceof IBasicType && ((IBasicType) type).getKind() == IBasicType.Kind.eBoolean) {
return true;
}
}
return false;
}
public static String generateSetterName(IASTName fieldName) {
IPreferencesService preferences = Platform.getPreferencesService();
int capitalization = preferences.getInt(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_SETTER_CAPITALIZATION,
PreferenceConstants.NAME_STYLE_CAPITALIZATION_CAMEL_CASE, null);
String wordDelimiter = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_SETTER_WORD_DELIMITER, "", null); //$NON-NLS-1$
String prefix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_SETTER_PREFIX, "set", null); //$NON-NLS-1$
String suffix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_SETTER_SUFFIX, "", null); //$NON-NLS-1$
NameComposer composer = new NameComposer(capitalization, wordDelimiter, prefix, suffix);
String name = GetterSetterNameGenerator.trimFieldName(fieldName.toString());
return composer.compose(name);
}
/**
* Returns the trimmed field name. Leading and trailing non-alphanumeric characters are trimmed.
* If the first word of the name consists of a single letter and the name contains more than
* one word, the first word is removed.
*
* @param fieldName a field name to trim
* @return the trimmed field name
*/
public static String trimFieldName(String fieldName){
CBreakIterator iterator = new CBreakIterator();
iterator.setText(fieldName);
int firstWordStart = -1;
int firstWordEnd = -1;
int secondWordStart = -1;
int lastWordEnd = -1;
int end;
for (int start = iterator.first(); (end = iterator.next()) != BreakIterator.DONE; start = end) {
if (Character.isLetterOrDigit(fieldName.charAt(start))) {
int pos = end;
while (--pos >= start && !Character.isLetterOrDigit(fieldName.charAt(pos))) {
}
lastWordEnd = pos + 1;
if (firstWordStart < 0) {
firstWordStart = start;
firstWordEnd = lastWordEnd;
} else if (secondWordStart < 0) {
secondWordStart = start;
}
}
}
// Skip the first word if it consists of a single letter and the name contains more than
// one word.
if (firstWordStart >= 0 && firstWordStart + 1 == firstWordEnd && secondWordStart >= 0) {
firstWordStart = secondWordStart;
}
if (firstWordStart < 0) {
return fieldName;
} else {
return fieldName.substring(firstWordStart, lastWordEnd);
}
}
}

View file

@ -7,10 +7,11 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Institute for Software - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.utils;
import java.util.Arrays;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.CoreException;
@ -35,14 +36,12 @@ import org.eclipse.cdt.internal.ui.refactoring.RefactoringASTCache;
* Helps with IASTNames.
*
* @author Mirko Stocker
*
*/
public class NameHelper {
private static final String localVariableRegexp = "[a-z_A-Z]\\w*"; //$NON-NLS-1$
private static final Pattern localVariableRegexp = Pattern.compile("[a-z_A-Z]\\w*"); //$NON-NLS-1$
public static boolean isValidLocalVariableName(String name) {
boolean valid = Pattern.compile(localVariableRegexp).matcher(name).matches();
return valid;
return localVariableRegexp.matcher(name).matches();
}
public static boolean isKeyword(String name) {
@ -54,28 +53,33 @@ public class NameHelper {
}
/**
* Constructs the fully qualified name from the given parameters. The file and offset parameters are used to determine
* the namespace at the declaration position and the target namespace at the target position.
* Constructs the fully qualified name from the given parameters. The file and offset parameters
* are used to determine the namespace at the declaration position and the target namespace at
* the target position.
*
* @param declaratorName of the method or function
* @param declarationTu translation unit of the method or function declaration
* @param insertFileTu translation unit of the file where the implementation is being inserted
* @param selectionOffset the offset in the declarationFile, usually the position or selection of the declaration
* @param selectionOffset the offset in the declarationFile, usually the position or selection
* of the declaration
* @param insertLocation
* @return the correct name for the target
* @throws CoreException
*/
public static ICPPASTQualifiedName createQualifiedNameFor(IASTName declaratorName, ITranslationUnit declarationTu, int selectionOffset, ITranslationUnit insertFileTu, int insertLocation, RefactoringASTCache astCache)
throws CoreException {
public static ICPPASTQualifiedName createQualifiedNameFor(IASTName declaratorName,
ITranslationUnit declarationTu, int selectionOffset, ITranslationUnit insertFileTu,
int insertLocation, RefactoringASTCache astCache) throws CoreException {
ICPPASTQualifiedName qname = new CPPASTQualifiedName();
IASTName[] declarationNames = NamespaceHelper.getSurroundingNamespace(declarationTu, selectionOffset, astCache).getNames();
IASTName[] implementationNames = NamespaceHelper.getSurroundingNamespace(insertFileTu, insertLocation, astCache).getNames();
IASTName[] declarationNames = NamespaceHelper.getSurroundingNamespace(declarationTu,
selectionOffset, astCache).getNames();
IASTName[] implementationNames = NamespaceHelper.getSurroundingNamespace(insertFileTu,
insertLocation, astCache).getNames();
for (int i = 0; i < declarationNames.length; i++) {
if (i >= implementationNames.length) {
qname.addName(declarationNames[i]);
} else if (!String.valueOf(declarationNames[i].toCharArray()).equals(String.valueOf(implementationNames[i].toCharArray()))) {
} else if (!Arrays.equals(declarationNames[i].toCharArray(), implementationNames[i].toCharArray())) {
qname.addName(declarationNames[i]);
}
}
@ -84,63 +88,6 @@ public class NameHelper {
return qname;
}
/**
* Returns the trimmed field name. Leading and trailing non-letters-digits are trimmed.
* If the first letter-digit is in lower case and the next is in upper case,
* the first letter is trimmed.
*
* @param fieldName Complete, unmodified name of the field to trim
* @return Trimmed field
*/
public static String trimFieldName(String fieldName){
char[] letters = fieldName.toCharArray();
int start = 0;
int end = letters.length - 1;
try {
// Trim, non-letters at the beginning
while (!Character.isLetterOrDigit(letters[start]) && start < end) {
++start;
}
// If the next character is not a letter or digit,
// look ahead because the first letter might not be needed
if (start + 1 <= end
&& !Character.isLetterOrDigit(letters[start + 1])) {
int lookAhead = 1;
while (start + lookAhead <= end) {
// Only change the start if something is found after the non-letters
if (Character.isLetterOrDigit(letters[start + lookAhead])) {
start += lookAhead;
break;
}
lookAhead++;
}
}
// Sometimes, a one letter lower case prefix is used to add some info
// Example: mMyMember, sMyStatic
// Trim the first letter
else if (!Character.isUpperCase(letters[start]) && start + 1 <= end && Character.isUpperCase(letters[start + 1])) {
start++;
}
// Trim, non-letters at the end
while ((!Character.isLetter(letters[end]) && !Character.isDigit(letters[end])) && start < end) {
--end;
}
} catch (IndexOutOfBoundsException e) {
}
return new String(letters, start, end - start + 1);
}
public static String makeFirstCharUpper(String name) {
if (Character.isLowerCase(name.charAt(0))){
name = Character.toUpperCase(name.charAt(0)) + name.substring(1);
}
return name;
}
public static String getTypeName(IASTParameterDeclaration parameter) {
IASTName name = parameter.getDeclarator().getName();
IBinding binding = name.resolveBinding();

View file

@ -0,0 +1,149 @@
/*******************************************************************************
* Copyright (c) 2011 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.util;
import java.util.ArrayList;
import java.util.List;
import com.ibm.icu.text.BreakIterator;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.internal.ui.text.CBreakIterator;
/**
* Composes names according to a particular style. A seed name is split into
* words at non-alphanumeric characters and camel case boundaries. The resulting
* words are capitalized according to the given capitalization style, joined
* using the given delimiter and combined with the given prefix and suffix.
*/
public class NameComposer {
private static final int CAPITALIZATION_ORIGINAL = PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL;
private static final int CAPITALIZATION_UPPER_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_UPPER_CASE;
private static final int CAPITALIZATION_LOWER_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CASE;
private static final int CAPITALIZATION_CAMEL_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_CAMEL_CASE;
private static final int CAPITALIZATION_LOWER_CAMEL_CASE = PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CAMEL_CASE;
private final int capitalization;
private final String wordDelimiter;
private final String prefix;
private final String suffix;
/**
* Creates a name composer for a given style.
*
* @param capitalization capitalization transformation applied to name. Possible values: <ul>
* <li>PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL,</li>
* <li>PreferenceConstants.NAME_STYLE_CAPITALIZATION_UPPER_CASE,</li>
* <li>PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CASE,</li>
* <li>PreferenceConstants.NAME_STYLE_CAPITALIZATION_CAMEL_CASE,</li>
* <li>PreferenceConstants.NAME_STYLE_CAPITALIZATION_LOWER_CAMEL_CASE.</li>
* </ul>
* @param wordDelimiter delimiter inserted between words
* @param prefix prefix prepended to the name
* @param suffix suffix appended to the name
*/
public NameComposer(int capitalization, String wordDelimiter, String prefix, String suffix) {
this.capitalization = capitalization;
this.wordDelimiter = wordDelimiter;
this.prefix = prefix;
this.suffix = suffix;
}
/**
* Composes a name according to the composer's style based on a seed name.
*
* @param seedName the name used as an inspiration
* @return the composed name
*/
public String compose(String seedName) {
List<CharSequence> words = splitIntoWords(seedName);
return compose(words);
}
/**
* Composes a name according to the composer's style based on a seed words.
*
* @param words the words that that should be combined to form the name
* @return the composed name
*/
public String compose(List<CharSequence> words) {
StringBuilder buf = new StringBuilder();
buf.append(prefix);
for (int i = 0; i < words.size(); i++) {
if (i > 0) {
buf.append(wordDelimiter);
}
CharSequence word = words.get(i);
switch (capitalization) {
case CAPITALIZATION_ORIGINAL:
buf.append(word);
break;
case CAPITALIZATION_UPPER_CASE:
appendUpperCase(buf, word);
break;
case CAPITALIZATION_LOWER_CASE:
appendLowerCase(buf, word);
break;
case CAPITALIZATION_CAMEL_CASE:
appendTitleCase(buf, word);
break;
case CAPITALIZATION_LOWER_CAMEL_CASE:
if (i == 0) {
appendLowerCase(buf, word);
} else {
appendTitleCase(buf, word);
}
break;
}
}
buf.append(suffix);
return buf.toString();
}
/**
* Splits a name into words at non-alphanumeric characters and camel case boundaries.
*/
public List<CharSequence> splitIntoWords(CharSequence name) {
List<CharSequence> words = new ArrayList<CharSequence>();
CBreakIterator iterator = new CBreakIterator();
iterator.setText(name);
int end;
for (int start = iterator.first(); (end = iterator.next()) != BreakIterator.DONE; start = end) {
if (Character.isLetterOrDigit(name.charAt(start))) {
int pos = end;
while (--pos >= start && !Character.isLetterOrDigit(name.charAt(pos))) {
}
words.add(name.subSequence(start, pos + 1));
}
}
return words;
}
private void appendUpperCase(StringBuilder buf, CharSequence word) {
for (int i = 0; i < word.length(); i++) {
buf.append(Character.toUpperCase(word.charAt(i)));
}
}
private void appendLowerCase(StringBuilder buf, CharSequence word) {
for (int i = 0; i < word.length(); i++) {
buf.append(Character.toLowerCase(word.charAt(i)));
}
}
private void appendTitleCase(StringBuilder buf, CharSequence word) {
for (int i = 0; i < word.length(); i++) {
buf.append(i == 0 ?
Character.toUpperCase(word.charAt(i)) : Character.toLowerCase(word.charAt(i)));
}
}
}

View file

@ -63,7 +63,6 @@ import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider;
import org.eclipse.cdt.internal.ui.wizards.filewizard.NewSourceFileGenerator;
public class NewClassWizardUtil {
@ -257,28 +256,6 @@ public class NewClassWizardUtil {
return null;
}
/**
* Creates a header file name from the given class name. This is the file name
* to be used when the class is created. eg. "MyClass" -> "MyClass.h"
*
* @param className the class name
* @return the header file name for the given class
*/
public static String createHeaderFileName(String className) {
return NewSourceFileGenerator.generateHeaderFileNameFromClass(className);
}
/**
* Creates a source file name from the given class name. This is the file name
* to be used when the class is created. eg. "MyClass" -> "MyClass.cpp"
*
* @param className the class name
* @return the source file name for the given class
*/
public static String createSourceFileName(String className) {
return NewSourceFileGenerator.generateSourceFileNameFromClass(className);
}
/**
* Returns the workspace root.
*
@ -289,7 +266,7 @@ public class NewClassWizardUtil {
}
/**
* Resolve the location of the given class.
* Resolves the location of the given class.
*
* @param type the class to resolve
* @param context the runnable context

View file

@ -16,6 +16,7 @@ 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.Layout;
public class LayoutUtil {
@ -23,11 +24,20 @@ public class LayoutUtil {
* Calculates the number of columns needed by field editors
*/
public static int getNumberOfColumns(DialogField[] editors) {
int nCulumns= 0;
int nColumns= 0;
for (int i= 0; i < editors.length; i++) {
nCulumns= Math.max(editors[i].getNumberOfControls(), nCulumns);
nColumns= Math.max(editors[i].getNumberOfControls(), nColumns);
}
return nCulumns;
return nColumns;
}
/**
* Returns the number of columns in the layout of a composite,
* or 1 if the composite doesn't have a grid layout.
*/
public static int getNumberOfColumns(Composite composite) {
Layout layout = composite.getLayout();
return layout instanceof GridLayout ? ((GridLayout) layout).numColumns : 1;
}
/**
@ -44,7 +54,8 @@ public class LayoutUtil {
* @param minWidth The minimal width of the composite
* @param minHeight The minimal height of the composite
*/
public static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop, int minWidth, int minHeight) {
public static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop,
int minWidth, int minHeight) {
doDefaultLayout(parent, editors, labelOnTop, minWidth, minHeight, 0, 0);
}
@ -55,10 +66,9 @@ public class LayoutUtil {
* @param minHeight The minimal height of the composite
* @param marginWidth The margin width to be used by the composite
* @param marginHeight The margin height to be used by the composite
* @deprecated
*/
@Deprecated
public static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop, int minWidth, int minHeight, int marginWidth, int marginHeight) {
private static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop,
int minWidth, int minHeight, int marginWidth, int marginHeight) {
int nCulumns= getNumberOfColumns(editors);
Control[][] controls= new Control[editors.length][];
for (int i= 0; i < editors.length; i++) {
@ -91,7 +101,7 @@ public class LayoutUtil {
public static void setHorizontalSpan(Control control, int span) {
Object ld= control.getLayoutData();
if (ld instanceof GridData) {
((GridData)ld).horizontalSpan= span;
((GridData) ld).horizontalSpan= span;
} else if (span != 1) {
GridData gd= new GridData();
gd.horizontalSpan= span;
@ -105,7 +115,7 @@ public class LayoutUtil {
public static void setWidthHint(Control control, int widthHint) {
Object ld= control.getLayoutData();
if (ld instanceof GridData) {
((GridData)ld).widthHint= widthHint;
((GridData) ld).widthHint= widthHint;
}
}
@ -115,7 +125,7 @@ public class LayoutUtil {
public static void setHeightHint(Control control, int heigthHint) {
Object ld= control.getLayoutData();
if (ld instanceof GridData) {
((GridData)ld).heightHint= heigthHint;
((GridData) ld).heightHint= heigthHint;
}
}
@ -125,18 +135,27 @@ public class LayoutUtil {
public static void setHorizontalIndent(Control control, int horizontalIndent) {
Object ld= control.getLayoutData();
if (ld instanceof GridData) {
((GridData)ld).horizontalIndent= horizontalIndent;
((GridData) ld).horizontalIndent= horizontalIndent;
}
}
/**
* Sets the horizontal indent of a control. Assumes that GridData is used.
* Sets the horizontal alignment of a control. Assumes that GridData is used.
*/
public static void setHorizontalAlignment(Control control, int horizontalAlignment) {
Object ld= control.getLayoutData();
if (ld instanceof GridData) {
((GridData) ld).horizontalAlignment= horizontalAlignment;
}
}
/**
* Makes a control grab all available horizontal space. Assumes that GridData is used.
*/
public static void setHorizontalGrabbing(Control control) {
Object ld= control.getLayoutData();
if (ld instanceof GridData) {
((GridData)ld).grabExcessHorizontalSpace= true;
((GridData) ld).grabExcessHorizontalSpace= true;
}
}
}
}

View file

@ -15,6 +15,10 @@ import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.internal.ui.util.NameComposer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceStatus;
@ -23,23 +27,55 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.ui.dialogs.ContainerGenerator;
public class NewSourceFileGenerator {
//TODO these should all be configurable in prefs
private static final String HEADER_EXT = ".h"; //$NON-NLS-1$
private static final String SOURCE_EXT = ".cpp"; //$NON-NLS-1$
/**
* Creates a header file name from the given class name. This is the file name
* to be used when the class is created. eg. "MyClass" -> "MyClass.h"
*
* @param className the class name
* @return the header file name for the given class
*/
public static String generateHeaderFileNameFromClass(String className) {
//TODO eventually make this a prefs option - filename pattern
return className + HEADER_EXT;
IPreferencesService preferences = Platform.getPreferencesService();
int capitalization = preferences.getInt(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_HEADER_CAPITALIZATION,
PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL, null);
String wordDelimiter = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_HEADER_WORD_DELIMITER, "", null); //$NON-NLS-1$
String prefix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_HEADER_PREFIX, "", null); //$NON-NLS-1$
String suffix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_HEADER_SUFFIX, ".h", null); //$NON-NLS-1$
NameComposer composer = new NameComposer(capitalization, wordDelimiter, prefix, suffix);
return composer.compose(className);
}
/**
* Creates a source file name from the given class name. This is the file name
* to be used when the class is created. e.g. "MyClass" -> "MyClass.cpp"
*
* @param className the class name
* @return the source file name for the given class
*/
public static String generateSourceFileNameFromClass(String className) {
//TODO eventually make this a prefs option - filename pattern
return className + SOURCE_EXT;
IPreferencesService preferences = Platform.getPreferencesService();
int capitalization = preferences.getInt(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_SOURCE_CAPITALIZATION,
PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL, null);
String wordDelimiter = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_SOURCE_WORD_DELIMITER, "", null); //$NON-NLS-1$
String prefix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_SOURCE_PREFIX, "", null); //$NON-NLS-1$
String suffix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_CPP_SOURCE_SUFFIX, ".cpp", null); //$NON-NLS-1$
NameComposer composer = new NameComposer(capitalization, wordDelimiter, prefix, suffix);
return composer.compose(className);
}
public static IFile createHeaderFile(IPath filePath, boolean force, IProgressMonitor monitor) throws CoreException {

View file

@ -1507,6 +1507,298 @@ public class PreferenceConstants {
* @since 5.2
*/
public static final int CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_PATH = 2;
/**
* A named preference that controls how capitalization of a constant name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CONSTANT_CAPITALIZATION = "nameStyle.constant.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of a constant name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CONSTANT_PREFIX = "nameStyle.constant.prefix"; //$NON-NLS-1$
/**
* A named preference that controls suffix of a constant name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CONSTANT_SUFFIX = "nameStyle.constant.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* of a constant name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CONSTANT_WORD_DELIMITER = "nameStyle.constant.wordDelimiter"; //$NON-NLS-1$
/**
* A named preference that controls how capitalization of a field name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_FIELD_CAPITALIZATION = "nameStyle.field.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of a field name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_FIELD_PREFIX = "nameStyle.field.prefix"; //$NON-NLS-1$
/**
* A named preference that controls suffix of a field name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_FIELD_SUFFIX = "nameStyle.field.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* of a field name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_FIELD_WORD_DELIMITER = "nameStyle.field.wordDelimiter"; //$NON-NLS-1$
/**
* A named preference that controls how capitalization of the getter name
* depends on capitalization of the field name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_GETTER_CAPITALIZATION = "nameStyle.getter.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of the getter name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_GETTER_PREFIX = "nameStyle.getter.prefix"; //$NON-NLS-1$
/**
* A named preference that controls prefix of the getter name for a boolean field.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_GETTER_PREFIX_FOR_BOOLEAN = "nameStyle.getter.prefixForBoolean"; //$NON-NLS-1$
/**
* A named preference that controls suffix of the getter name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_GETTER_SUFFIX = "nameStyle.getter.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* when composing the getter name from the field name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_GETTER_WORD_DELIMITER = "nameStyle.getter.wordDelimiter"; //$NON-NLS-1$
/**
* A named preference that controls how capitalization of the setter name
* depends on capitalization of the field name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_SETTER_CAPITALIZATION = "nameStyle.setter.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of the setter name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_SETTER_PREFIX = "nameStyle.setter.prefix"; //$NON-NLS-1$
/**
* A named preference that controls suffix of the setter name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_SETTER_SUFFIX = "nameStyle.setter.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* when composing the setter name from the field name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_SETTER_WORD_DELIMITER = "nameStyle.setter.wordDelimiter"; //$NON-NLS-1$
/**
* A named preference that controls how capitalization of the C++ source file name
* depends on capitalization of the class name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_SOURCE_CAPITALIZATION = "nameStyle.cpp.source.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of the C++ source file name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_SOURCE_PREFIX = "nameStyle.cpp.source.prefix"; //$NON-NLS-1$
/**
* A named preference that controls suffix of the C++ source file name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_SOURCE_SUFFIX = "nameStyle.cpp.source.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* when composing the C++ source file name from the class name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_SOURCE_WORD_DELIMITER = "nameStyle.cpp.source.wordDelimiter"; //$NON-NLS-1$
/**
* A named preference that controls how capitalization of the C++ header file name
* depends on capitalization of the class name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_HEADER_CAPITALIZATION = "nameStyle.cpp.header.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of the C++ header file name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_HEADER_PREFIX = "nameStyle.cpp.header.prefix"; //$NON-NLS-1$
/**
* A named preference that controls suffix of the C++ header file name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_HEADER_SUFFIX = "nameStyle.cpp.header.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* when composing the C++ header file name from the class name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_HEADER_WORD_DELIMITER = "nameStyle.cpp.header.wordDelimiter"; //$NON-NLS-1$
/**
* A named preference that controls how capitalization of the C++ test file name
* depends on capitalization of the class name.
* <p>
* Value is of type <code>Integer</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_TEST_CAPITALIZATION = "nameStyle.cpp.test.capitalization"; //$NON-NLS-1$
/**
* A named preference that controls prefix of the C++ test file name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_TEST_PREFIX = "nameStyle.cpp.test.prefix"; //$NON-NLS-1$
/**
* A named preference that controls suffix of the C++ test file name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_TEST_SUFFIX = "nameStyle.cpp.test.suffix"; //$NON-NLS-1$
/**
* A named preference that controls delimiter that is inserted between words
* when composing the C++ test file name from the class name.
* <p>
* Value is of type <code>String</code>.
*
* @since 5.3
*/
public static final String NAME_STYLE_CPP_TEST_WORD_DELIMITER = "nameStyle.cpp.test.wordDelimiter"; //$NON-NLS-1$
/**
* The value of <code>NAME_STYLE_*_CAPITALIZATION</code> specifying that the name
* is to be derived from the class or the variable name without changing
* capitalization.
*
* @since 5.3
*/
public static final int NAME_STYLE_CAPITALIZATION_ORIGINAL = 0;
/**
* The value of <code>NAME_STYLE_*_CAPITALIZATION</code> specifying that the name
* is to be derived from the class or the variable name by converting it to upper
* case.
*
* @since 5.3
*/
public static final int NAME_STYLE_CAPITALIZATION_UPPER_CASE = 1;
/**
* The value of <code>NAME_STYLE_*_CAPITALIZATION</code> specifying that the name
* is to be derived from the class or the variable name by converting it to lower
* case.
*
* @since 5.3
*/
public static final int NAME_STYLE_CAPITALIZATION_LOWER_CASE = 2;
/**
* The value of <code>NAME_STYLE_*_CAPITALIZATION</code> specifying that the name
* is to be derived from the class or the variable name by capitalizing first
* letter of every word.
*
* @since 5.3
*/
public static final int NAME_STYLE_CAPITALIZATION_CAMEL_CASE = 3;
/**
* The value of <code>NAME_STYLE_*_CAPITALIZATION</code> specifying that the name
* is to be derived from the class or the variable name by capitalizing first
* letter of every word except the first one.
*
* @since 5.3
*/
public static final int NAME_STYLE_CAPITALIZATION_LOWER_CAMEL_CASE = 4;
/**
* Returns the CDT-UI preference store.
@ -1682,7 +1974,7 @@ public class PreferenceConstants {
store.setDefault(PreferenceConstants.SPELLING_PROPOSAL_THRESHOLD, 20);
store.setDefault(PreferenceConstants.SPELLING_PROBLEMS_THRESHOLD, 100);
/*
* XXX: This is currently disabled because the spelling engine
* TODO: This is currently disabled because the spelling engine
* cannot return word proposals but only correction proposals.
*/
store.setToDefault(PreferenceConstants.SPELLING_ENABLE_CONTENTASSIST);
@ -1708,6 +2000,37 @@ public class PreferenceConstants {
// Code Templates
store.setDefault(PreferenceConstants.CODE_TEMPLATES_INCLUDE_GUARD_SCHEME,
CODE_TEMPLATES_INCLUDE_GUARD_SCHEME_FILE_NAME);
// Name Style
store.setDefault(NAME_STYLE_FIELD_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_LOWER_CAMEL_CASE);
store.setDefault(NAME_STYLE_FIELD_PREFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_FIELD_SUFFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_FIELD_WORD_DELIMITER, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CONSTANT_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_UPPER_CASE);
store.setDefault(NAME_STYLE_CONSTANT_PREFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CONSTANT_SUFFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CONSTANT_WORD_DELIMITER, "_"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_GETTER_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_CAMEL_CASE);
store.setDefault(NAME_STYLE_GETTER_PREFIX, "get"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_GETTER_PREFIX_FOR_BOOLEAN, "is"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_GETTER_SUFFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_GETTER_WORD_DELIMITER, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_SETTER_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_CAMEL_CASE);
store.setDefault(NAME_STYLE_SETTER_PREFIX, "set"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_SETTER_SUFFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_SETTER_WORD_DELIMITER, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_HEADER_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_ORIGINAL);
store.setDefault(NAME_STYLE_CPP_HEADER_PREFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_HEADER_SUFFIX, ".h"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_HEADER_WORD_DELIMITER, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_SOURCE_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_ORIGINAL);
store.setDefault(NAME_STYLE_CPP_SOURCE_PREFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_SOURCE_SUFFIX, ".cpp"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_SOURCE_WORD_DELIMITER, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_TEST_CAPITALIZATION, NAME_STYLE_CAPITALIZATION_ORIGINAL);
store.setDefault(NAME_STYLE_CPP_TEST_PREFIX, ""); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_TEST_SUFFIX, "_test.cpp"); //$NON-NLS-1$
store.setDefault(NAME_STYLE_CPP_TEST_WORD_DELIMITER, ""); //$NON-NLS-1$
}
/**

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2009 QNX Software Systems and others.
* Copyright (c) 2004, 2011 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
@ -60,7 +60,6 @@ import org.eclipse.cdt.core.browser.TypeSearchScope;
import org.eclipse.cdt.core.browser.TypeUtil;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICContainer;
@ -103,9 +102,9 @@ import org.eclipse.cdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFie
import org.eclipse.cdt.internal.ui.wizards.dialogfields.Separator;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.StringDialogField;
import org.eclipse.cdt.internal.ui.wizards.filewizard.NewSourceFileGenerator;
public class NewClassCreationWizardPage extends NewElementWizardPage {
protected final static String PAGE_NAME = "NewClassWizardPage"; //$NON-NLS-1$
protected static final int MAX_FIELD_CHARS = 50;
@ -141,9 +140,9 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
protected IStatus fSourceFileStatus;
protected final IStatus STATUS_OK = new StatusInfo();
protected IFile fCreatedSourceFile = null;
protected IFile fCreatedHeaderFile = null;
protected ICElement fCreatedClass = null;
protected IFile fCreatedSourceFile;
protected IFile fCreatedHeaderFile;
protected ICElement fCreatedClass;
/**
* This flag isFirstTime is used to keep a note
@ -1307,20 +1306,20 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
String sourceName = null;
if (folder == null) {
headerName = NewClassWizardUtil.createHeaderFileName(className);
sourceName = NewClassWizardUtil.createSourceFileName(className);
headerName = NewSourceFileGenerator.generateHeaderFileNameFromClass(className);
sourceName = NewSourceFileGenerator.generateSourceFileNameFromClass(className);
} else {
// make sure the file names are unique
String currName = className;
int count = 0;
String separator = ""; //$NON-NLS-1$
if (Character.isDigit(className.charAt(className.length()-1)))
if (Character.isDigit(className.charAt(className.length() - 1)))
separator = "_"; //$NON-NLS-1$
while (count < MAX_UNIQUE_CLASSNAME) {
String header = NewClassWizardUtil.createHeaderFileName(currName);
String header = NewSourceFileGenerator.generateHeaderFileNameFromClass(currName);
IPath path = folder.append(header);
if (!path.toFile().exists()) {
String source = NewClassWizardUtil.createSourceFileName(currName);
String source = NewSourceFileGenerator.generateSourceFileNameFromClass(currName);
path = folder.append(source);
if (!path.toFile().exists()) {
headerName = header;

View file

@ -93,7 +93,7 @@ public class ControlFactory {
*
* @param parent the parent of the new composite
* @param color the separator color
* @return preferedThickness - the prefered thickness of separator (or 2 if SWT.DEFAULT)
* @return preferedThickness - the preferred thickness of separator (or 2 if SWT.DEFAULT)
*/
public static Composite createCompositeSeparator(Composite parent, Color color, int preferedHeight) {
Composite separator = createComposite(parent, 1);
@ -206,8 +206,8 @@ public class ControlFactory {
* @param style - control style
* @return the new label
*/
public static Label createLabel(Composite parent, String text, int widthHint, int heightHint, int style) {
public static Label createLabel(Composite parent, String text, int widthHint, int heightHint,
int style) {
Label label = new Label(parent, style);
label.setFont(parent.getFont());
label.setText(text);
@ -241,11 +241,11 @@ public class ControlFactory {
* @return the new label
*/
public static Label createBoldLabel(Composite parent, String text) {
Label label = createLabel( parent, text );
Label label = createLabel(parent, text);
FontData[] fd = label.getFont().getFontData();
fd[0].setStyle( SWT.BOLD );
Font font = new Font( Display.getCurrent(), fd[0] );
label.setFont( font );
fd[0].setStyle(SWT.BOLD);
Font font = new Font(Display.getCurrent(), fd[0]);
label.setFont(font);
return label;
}
@ -310,7 +310,8 @@ public class ControlFactory {
* @param value the string to identify radiobutton
* @return the new checkbox
*/
public static Button createRadioButton(Composite group, String label, String value, SelectionListener listener) {
public static Button createRadioButton(Composite group, String label, String value,
SelectionListener listener) {
Button button = new Button(group, SWT.RADIO | SWT.LEFT);
button.setFont(group.getFont());
button.setText(label);
@ -574,7 +575,8 @@ public class ControlFactory {
return createSelectCCombo(parent, strdata, selData, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
}
public static CCombo createSelectCCombo(Composite parent, String[] strdata, String selData, int style) {
public static CCombo createSelectCCombo(Composite parent, String[] strdata, String selData,
int style) {
CCombo combo = new CCombo(parent, style);
combo.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
@ -657,7 +659,7 @@ public class ControlFactory {
int n_sel = combo.indexOf(selData);
if (0 > n_sel) {
if ((combo.getStyle() & SWT.READ_ONLY) == 0) {
combo.setText( selData );
combo.setText(selData);
return;
}
n_sel = 0;
@ -668,39 +670,36 @@ public class ControlFactory {
/**
* Create a dialog shell, child to the top level workbench shell.
*
* @return The new Shell useable for a dialog.
*
* @return The new Shell usable for a dialog.
*/
public static Shell createDialogShell() {
Shell parent = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getShell();
return new Shell( parent, SWT.DIALOG_TRIM );
Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
return new Shell(parent, SWT.DIALOG_TRIM);
}
public static Composite insertSpace(Composite parent, int nSpan, int height) {
Composite space = ControlFactory.createCompositeSeparator(parent, parent.getBackground(),
(SWT.DEFAULT != height ? height : 5));
((GridData)space.getLayoutData()).horizontalSpan = nSpan;
((GridData) space.getLayoutData()).horizontalSpan = nSpan;
return space;
}
public static MessageBox createDialog( String title, String message, int style ) {
MessageBox box = new MessageBox( createDialogShell(), style | SWT.APPLICATION_MODAL );
box.setText( title );
box.setMessage( message );
public static MessageBox createDialog(String title, String message, int style) {
MessageBox box = new MessageBox(createDialogShell(), style | SWT.APPLICATION_MODAL);
box.setText(title);
box.setMessage(message);
return box;
}
public static MessageBox createYesNoDialog( String title, String message ) {
return createDialog( title, message, SWT.YES | SWT.NO | SWT.ICON_QUESTION );
public static MessageBox createYesNoDialog(String title, String message) {
return createDialog(title, message, SWT.YES | SWT.NO | SWT.ICON_QUESTION);
}
public static MessageBox createOkDialog( String title, String message ) {
return createDialog( title, message, SWT.OK | SWT.ICON_INFORMATION );
public static MessageBox createOkDialog(String title, String message) {
return createDialog(title, message, SWT.OK | SWT.ICON_INFORMATION);
}
public static MessageBox createOkCancelDialog( String title, String message ) {
return createDialog( title, message, SWT.OK | SWT.CANCEL | SWT.ICON_INFORMATION );
public static MessageBox createOkCancelDialog(String title, String message) {
return createDialog(title, message, SWT.OK | SWT.CANCEL | SWT.ICON_INFORMATION);
}
}