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

FIXED - bug 266726: Generate Getters and Setters could be prettier if it shared more code with JDT

https://bugs.eclipse.org/bugs/show_bug.cgi?id=266726
This commit is contained in:
Emanuel Graf 2009-04-14 07:02:16 +00:00
parent 63fbea0b0b
commit 3f794a608f
7 changed files with 252 additions and 82 deletions

View file

@ -543,26 +543,26 @@ public:
const int socSecNo;
Person myFriend;
int getSystemId() const
{
return systemId;
}
void setSystemId(int systemId)
{
this->systemId = systemId;
}
char *getName() const
{
return name;
}
int getSystemId() const
{
return systemId;
}
void setName(char *name)
{
this->name = name;
}
void setSystemId(int systemId)
{
this->systemId = systemId;
}
Person(int socSecNo); // contructor
~Person(); // destructor
@ -624,26 +624,26 @@ public:
virtual ~GaS();
bool isOk;
void methode2();
bool getIsOk() const
{
return isOk;
}
void setIsOk(bool isOk)
{
this->isOk = isOk;
}
int getI() const
{
return i;
}
bool getIsOk() const
{
return isOk;
}
void setI(int i)
{
this->i = i;
}
void setIsOk(bool isOk)
{
this->isOk = isOk;
}
private:
int i;
};

View file

@ -11,23 +11,30 @@
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import java.util.ArrayList;
import java.util.Set;
import java.util.SortedSet;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterAndSetterContext.FieldWrapper;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
private GetterAndSetterContext context;
private ContainerCheckedTreeViewer variableSelectionView;
private GetterSetterLabelProvider labelProvider;
public GenerateGettersAndSettersInputPage(GetterAndSetterContext context) {
super(Messages.GettersAndSetters_Name);
@ -36,55 +43,140 @@ public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE );
comp.setLayout(new FillLayout());
setTitle(Messages.GettersAndSetters_Name);
setMessage(Messages.GenerateGettersAndSettersInputPage_header);
comp.setLayout(new GridLayout(2, false));
createTree(comp);
GridData gd = new GridData(GridData.FILL_BOTH);
variableSelectionView.getTree().setLayoutData(gd);
Composite btComp = createButtonComposite(comp);
gd = new GridData();
gd.verticalAlignment = SWT.TOP;
btComp.setLayoutData(gd);
setControl(comp);
}
private void createTree(Composite comp) {
final ContainerCheckedTreeViewer variableSelectionView = new ContainerCheckedTreeViewer(comp, SWT.BORDER);
for(IASTSimpleDeclaration currentField : context.existingFields){
if(currentField.getDeclarators().length == 0){
continue;
}
variableSelectionView.setContentProvider(context);
variableSelectionView.setAutoExpandLevel(3);
variableSelectionView.setInput(""); //$NON-NLS-1$
if(context.selectedName != null) {
String rawSignature = context.selectedName.getRawSignature();
for(Object obj : variableSelectionView.getVisibleExpandedElements()) {
if (obj instanceof FieldWrapper){
if(obj.toString().contains(rawSignature)){
variableSelectionView.setSubtreeChecked(obj, true);
}
}
}
}
ArrayList<GetterSetterInsertEditProvider> checkedFunctions = new ArrayList<GetterSetterInsertEditProvider>();
for(Object currentElement : variableSelectionView.getCheckedElements()){
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
context.selectedFunctions = checkedFunctions;
variableSelectionView.addCheckStateListener(new ICheckStateListener(){
public void checkStateChanged(CheckStateChangedEvent event) {
ArrayList<GetterSetterInsertEditProvider> checkedFunctions = new ArrayList<GetterSetterInsertEditProvider>();
for(Object currentElement : variableSelectionView.getCheckedElements()){
private Composite createButtonComposite(Composite comp) {
Composite btComp = new Composite(comp, SWT.NONE);
FillLayout layout = new FillLayout(SWT.VERTICAL);
layout.spacing = 4;
btComp.setLayout(layout);
Button selectAll = new Button(btComp, SWT.PUSH);
selectAll.setText(Messages.GenerateGettersAndSettersInputPage_SelectAll);
selectAll.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
Object[] items = context.getElements(null);
SortedSet<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
for (Object treeItem : items) {
variableSelectionView.setChecked(treeItem, true);
Object[] childs = context.getChildren(treeItem);
for(Object currentElement : childs){
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
context.selectedFunctions = checkedFunctions;
}
});
}
});
Button deselectAll = new Button(btComp, SWT.PUSH);
deselectAll.setText(Messages.GenerateGettersAndSettersInputPage_DeselectAll);
deselectAll.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
Object[] items = context.getElements(null);
for (Object treeItem : items) {
variableSelectionView.setChecked(treeItem, false);
}
context.selectedFunctions.clear();
}
});
Button selectGetter = new Button(btComp, SWT.PUSH);
selectGetter.setText(Messages.GenerateGettersAndSettersInputPage_SelectGetters);
selectGetter.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
selectMethods(Type.getter);
}
});
Button selectSetter = new Button(btComp, SWT.PUSH);
selectSetter.setText(Messages.GenerateGettersAndSettersInputPage_SelectSetters);
selectSetter.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
selectMethods(Type.setter);
}
});
return btComp;
}
private void selectMethods(Type type) {
Object[] items = context.getElements(null);
Set<GetterSetterInsertEditProvider> checked = context.selectedFunctions;
for (Object treeItem : items) {
if (treeItem instanceof FieldWrapper) {
FieldWrapper field = (FieldWrapper) treeItem;
Object[] funtions = context.getChildren(field);
for (Object funct : funtions) {
if (funct instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider getSet = (GetterSetterInsertEditProvider) funct;
if(getSet.getType() == type) {
checked.add(getSet);
variableSelectionView.setChecked(getSet, true);
}
}
}
}
}
}
private void createTree(Composite comp) {
variableSelectionView = new ContainerCheckedTreeViewer(comp, SWT.BORDER);
labelProvider = new GetterSetterLabelProvider();
variableSelectionView.setContentProvider(context);
variableSelectionView.setLabelProvider(labelProvider);
variableSelectionView.setAutoExpandLevel(3);
variableSelectionView.setInput(""); //$NON-NLS-1$
if (context.selectedName != null) {
String rawSignature = context.selectedName.getRawSignature();
for (Object obj : variableSelectionView.getVisibleExpandedElements()) {
if (obj instanceof FieldWrapper) {
if (obj.toString().contains(rawSignature)) {
variableSelectionView.setSubtreeChecked(obj, true);
}
}
}
}
Set<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
for (Object currentElement : variableSelectionView.getCheckedElements()) {
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
variableSelectionView.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
Set<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
for (Object currentElement : variableSelectionView.getCheckedElements()) {
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
}
});
}
}

View file

@ -12,6 +12,8 @@
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
@ -21,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper;
public class GetterAndSetterContext implements ITreeContentProvider{
@ -28,23 +31,26 @@ public class GetterAndSetterContext implements ITreeContentProvider{
public ArrayList<IASTSimpleDeclaration> existingFields = new ArrayList<IASTSimpleDeclaration>();
public ArrayList<IASTFunctionDefinition> existingFunctionDefinitions = new ArrayList<IASTFunctionDefinition>();
public ArrayList<IASTSimpleDeclaration> existingFunctionDeclarations = new ArrayList<IASTSimpleDeclaration>();
public ArrayList<GetterSetterInsertEditProvider> selectedFunctions = new ArrayList<GetterSetterInsertEditProvider>();
public SortedSet<GetterSetterInsertEditProvider> selectedFunctions = new TreeSet<GetterSetterInsertEditProvider>();
private IASTTranslationUnit unit;
public IASTName selectedName;
private ArrayList<FieldWrapper> wrappedFields;
public Object[] getChildren(Object parentElement) {
ArrayList<GetterSetterInsertEditProvider> children = new ArrayList<GetterSetterInsertEditProvider>();
if (parentElement instanceof FieldWrapper) {
FieldWrapper wrapper = (FieldWrapper) parentElement;
if(!wrapper.getter.exists()){
children.add(createGetterInserter(wrapper.field));
}
if(!wrapper.setter.exists() && !wrapper.field.getDeclSpecifier().isConst()){
children.add(createSetterInserter(wrapper.field));
if(wrapper.getChildNodes().isEmpty()) {
if(!wrapper.getter.exists()){
wrapper.childNodes.add(createGetterInserter(wrapper.field));
}
if(!wrapper.setter.exists() && !wrapper.field.getDeclSpecifier().isConst()){
wrapper.childNodes.add(createSetterInserter(wrapper.field));
}
}
children = wrapper.getChildNodes();
}
return children.toArray();
}
@ -53,14 +59,14 @@ public class GetterAndSetterContext implements ITreeContentProvider{
String varName = simpleDeclaration.getDeclarators()[0].getName().toString();
IASTFunctionDefinition getter = FunctionFactory.createGetter(varName, simpleDeclaration);
getter.setParent(unit);
return new GetterSetterInsertEditProvider(getter);
return new GetterSetterInsertEditProvider(getter, Type.getter);
}
public GetterSetterInsertEditProvider createSetterInserter(IASTSimpleDeclaration simpleDeclaration) {
String varName = simpleDeclaration.getDeclarators()[0].getName().toString();
IASTFunctionDefinition setter = FunctionFactory.createSetter(varName, simpleDeclaration);
setter.setParent(unit);
return new GetterSetterInsertEditProvider(setter);
return new GetterSetterInsertEditProvider(setter, Type.setter);
}
public Object getParent(Object element) {
@ -95,14 +101,16 @@ public class GetterAndSetterContext implements ITreeContentProvider{
}
private ArrayList<FieldWrapper> getWrappedFields() {
ArrayList<FieldWrapper> wrappedFields = new ArrayList<FieldWrapper>();
for(IASTSimpleDeclaration currentField : existingFields){
FieldWrapper wrapper = new FieldWrapper();
wrapper.field = currentField;
wrapper.getter = getGetterForField(currentField);
wrapper.setter = getSetterForField(currentField);
if(wrapper.missingGetterOrSetter()){
wrappedFields.add(wrapper);
if(wrappedFields == null) {
wrappedFields = new ArrayList<FieldWrapper>();
for(IASTSimpleDeclaration currentField : existingFields){
FieldWrapper wrapper = new FieldWrapper();
wrapper.field = currentField;
wrapper.getter = getGetterForField(currentField);
wrapper.setter = getSetterForField(currentField);
if(wrapper.missingGetterOrSetter()){
wrappedFields.add(wrapper);
}
}
}
return wrappedFields;
@ -146,12 +154,17 @@ public class GetterAndSetterContext implements ITreeContentProvider{
protected IASTSimpleDeclaration field;
protected FunctionWrapper getter;
protected FunctionWrapper setter;
protected ArrayList<GetterSetterInsertEditProvider> childNodes = new ArrayList<GetterSetterInsertEditProvider>(2);
@Override
public String toString(){
return field.getDeclarators()[0].getName().toString();
}
public ArrayList<GetterSetterInsertEditProvider> getChildNodes() {
return childNodes;
}
public boolean missingGetterOrSetter() {
return !getter.exists() || !setter.exists();
}

View file

@ -14,12 +14,21 @@ package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
public class GetterSetterInsertEditProvider {
public class GetterSetterInsertEditProvider implements Comparable<GetterSetterInsertEditProvider>{
public enum Type{
getter,
setter;
}
private IASTFunctionDefinition function;
private Type type;
public GetterSetterInsertEditProvider(IASTFunctionDefinition function){
public GetterSetterInsertEditProvider(IASTFunctionDefinition function, Type type){
this.function = function;
this.type = type;
}
@Override
@ -30,4 +39,14 @@ public class GetterSetterInsertEditProvider {
public IASTFunctionDefinition getFunction() {
return function;
}
public Type getType() {
return type;
}
public int compareTo(GetterSetterInsertEditProvider o) {
return toString().compareTo(o.toString());
}
}

View file

@ -0,0 +1,36 @@
/*******************************************************************************
* Copyright (c) 2009 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
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software (IFS)- initial API and implementation
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider;
/**
* @author Emanuel Graf IFS
*
*/
public class GetterSetterLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
if(element != null) {
if (element instanceof GetterSetterInsertEditProvider) {
return CElementImageProvider.getMethodImageDescriptor(ASTAccessVisibility.PUBLIC).createImage();
}
}
return null;
}
}

View file

@ -21,6 +21,11 @@ public final class Messages extends NLS {
// Do not instantiate
}
public static String GenerateGettersAndSettersInputPage_DeselectAll;
public static String GenerateGettersAndSettersInputPage_header;
public static String GenerateGettersAndSettersInputPage_SelectAll;
public static String GenerateGettersAndSettersInputPage_SelectGetters;
public static String GenerateGettersAndSettersInputPage_SelectSetters;
public static String GenerateGettersAndSettersRefactoring_NoCassDefFound;
public static String GenerateGettersAndSettersRefactoring_NoFields;
public static String GettersAndSetters_Name;

View file

@ -9,6 +9,11 @@
# Contributors:
# Institute for Software - initial API and implementation
###############################################################################
GettersAndSetters_Name=Generate Getters and Setters
GettersAndSetters_Name=Generate getters and setters
GenerateGettersAndSettersInputPage_DeselectAll=Deselect All
GenerateGettersAndSettersInputPage_header=Select getters and setters to create:
GenerateGettersAndSettersInputPage_SelectAll=Select All
GenerateGettersAndSettersInputPage_SelectGetters=Select Getters
GenerateGettersAndSettersInputPage_SelectSetters=Select Setters
GenerateGettersAndSettersRefactoring_NoCassDefFound=No class definition found
GenerateGettersAndSettersRefactoring_NoFields=The class does not contain any fields.