1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 08:46:02 +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; const int socSecNo;
Person myFriend; Person myFriend;
int getSystemId() const
{
return systemId;
}
void setSystemId(int systemId)
{
this->systemId = systemId;
}
char *getName() const char *getName() const
{ {
return name; return name;
} }
int getSystemId() const
{
return systemId;
}
void setName(char *name) void setName(char *name)
{ {
this->name = name; this->name = name;
} }
void setSystemId(int systemId)
{
this->systemId = systemId;
}
Person(int socSecNo); // contructor Person(int socSecNo); // contructor
~Person(); // destructor ~Person(); // destructor
@ -624,26 +624,26 @@ public:
virtual ~GaS(); virtual ~GaS();
bool isOk; bool isOk;
void methode2(); void methode2();
bool getIsOk() const
{
return isOk;
}
void setIsOk(bool isOk)
{
this->isOk = isOk;
}
int getI() const int getI() const
{ {
return i; return i;
} }
bool getIsOk() const
{
return isOk;
}
void setI(int i) void setI(int i)
{ {
this->i = i; this->i = i;
} }
void setIsOk(bool isOk)
{
this->isOk = isOk;
}
private: private:
int i; int i;
}; };

View file

@ -11,23 +11,30 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters; 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.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage; import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT; 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.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.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer; 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.GetterAndSetterContext.FieldWrapper;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
public class GenerateGettersAndSettersInputPage extends UserInputWizardPage { public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
private GetterAndSetterContext context; private GetterAndSetterContext context;
private ContainerCheckedTreeViewer variableSelectionView;
private GetterSetterLabelProvider labelProvider;
public GenerateGettersAndSettersInputPage(GetterAndSetterContext context) { public GenerateGettersAndSettersInputPage(GetterAndSetterContext context) {
super(Messages.GettersAndSetters_Name); super(Messages.GettersAndSetters_Name);
@ -36,55 +43,140 @@ public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
public void createControl(Composite parent) { public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE ); 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); 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); setControl(comp);
} }
private void createTree(Composite comp) { private Composite createButtonComposite(Composite comp) {
final ContainerCheckedTreeViewer variableSelectionView = new ContainerCheckedTreeViewer(comp, SWT.BORDER); Composite btComp = new Composite(comp, SWT.NONE);
for(IASTSimpleDeclaration currentField : context.existingFields){ FillLayout layout = new FillLayout(SWT.VERTICAL);
if(currentField.getDeclarators().length == 0){ layout.spacing = 4;
continue; btComp.setLayout(layout);
}
Button selectAll = new Button(btComp, SWT.PUSH);
variableSelectionView.setContentProvider(context); selectAll.setText(Messages.GenerateGettersAndSettersInputPage_SelectAll);
variableSelectionView.setAutoExpandLevel(3); selectAll.addSelectionListener(new SelectionAdapter(){
variableSelectionView.setInput(""); //$NON-NLS-1$ @Override
if(context.selectedName != null) { public void widgetSelected(SelectionEvent e) {
String rawSignature = context.selectedName.getRawSignature(); Object[] items = context.getElements(null);
for(Object obj : variableSelectionView.getVisibleExpandedElements()) { SortedSet<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
if (obj instanceof FieldWrapper){ for (Object treeItem : items) {
variableSelectionView.setChecked(treeItem, true);
if(obj.toString().contains(rawSignature)){ Object[] childs = context.getChildren(treeItem);
variableSelectionView.setSubtreeChecked(obj, true); for(Object currentElement : childs){
}
}
}
}
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()){
if (currentElement instanceof GetterSetterInsertEditProvider) { if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement; GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider); 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; package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer; 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.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; 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; import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper;
public class GetterAndSetterContext implements ITreeContentProvider{ public class GetterAndSetterContext implements ITreeContentProvider{
@ -28,23 +31,26 @@ public class GetterAndSetterContext implements ITreeContentProvider{
public ArrayList<IASTSimpleDeclaration> existingFields = new ArrayList<IASTSimpleDeclaration>(); public ArrayList<IASTSimpleDeclaration> existingFields = new ArrayList<IASTSimpleDeclaration>();
public ArrayList<IASTFunctionDefinition> existingFunctionDefinitions = new ArrayList<IASTFunctionDefinition>(); public ArrayList<IASTFunctionDefinition> existingFunctionDefinitions = new ArrayList<IASTFunctionDefinition>();
public ArrayList<IASTSimpleDeclaration> existingFunctionDeclarations = new ArrayList<IASTSimpleDeclaration>(); public ArrayList<IASTSimpleDeclaration> existingFunctionDeclarations = new ArrayList<IASTSimpleDeclaration>();
public ArrayList<GetterSetterInsertEditProvider> selectedFunctions = new ArrayList<GetterSetterInsertEditProvider>(); public SortedSet<GetterSetterInsertEditProvider> selectedFunctions = new TreeSet<GetterSetterInsertEditProvider>();
private IASTTranslationUnit unit; private IASTTranslationUnit unit;
public IASTName selectedName; public IASTName selectedName;
private ArrayList<FieldWrapper> wrappedFields;
public Object[] getChildren(Object parentElement) { public Object[] getChildren(Object parentElement) {
ArrayList<GetterSetterInsertEditProvider> children = new ArrayList<GetterSetterInsertEditProvider>(); ArrayList<GetterSetterInsertEditProvider> children = new ArrayList<GetterSetterInsertEditProvider>();
if (parentElement instanceof FieldWrapper) { if (parentElement instanceof FieldWrapper) {
FieldWrapper wrapper = (FieldWrapper) parentElement; FieldWrapper wrapper = (FieldWrapper) parentElement;
if(!wrapper.getter.exists()){ if(wrapper.getChildNodes().isEmpty()) {
children.add(createGetterInserter(wrapper.field)); if(!wrapper.getter.exists()){
} wrapper.childNodes.add(createGetterInserter(wrapper.field));
if(!wrapper.setter.exists() && !wrapper.field.getDeclSpecifier().isConst()){ }
if(!wrapper.setter.exists() && !wrapper.field.getDeclSpecifier().isConst()){
children.add(createSetterInserter(wrapper.field)); wrapper.childNodes.add(createSetterInserter(wrapper.field));
}
} }
children = wrapper.getChildNodes();
} }
return children.toArray(); return children.toArray();
} }
@ -53,14 +59,14 @@ public class GetterAndSetterContext implements ITreeContentProvider{
String varName = simpleDeclaration.getDeclarators()[0].getName().toString(); String varName = simpleDeclaration.getDeclarators()[0].getName().toString();
IASTFunctionDefinition getter = FunctionFactory.createGetter(varName, simpleDeclaration); IASTFunctionDefinition getter = FunctionFactory.createGetter(varName, simpleDeclaration);
getter.setParent(unit); getter.setParent(unit);
return new GetterSetterInsertEditProvider(getter); return new GetterSetterInsertEditProvider(getter, Type.getter);
} }
public GetterSetterInsertEditProvider createSetterInserter(IASTSimpleDeclaration simpleDeclaration) { public GetterSetterInsertEditProvider createSetterInserter(IASTSimpleDeclaration simpleDeclaration) {
String varName = simpleDeclaration.getDeclarators()[0].getName().toString(); String varName = simpleDeclaration.getDeclarators()[0].getName().toString();
IASTFunctionDefinition setter = FunctionFactory.createSetter(varName, simpleDeclaration); IASTFunctionDefinition setter = FunctionFactory.createSetter(varName, simpleDeclaration);
setter.setParent(unit); setter.setParent(unit);
return new GetterSetterInsertEditProvider(setter); return new GetterSetterInsertEditProvider(setter, Type.setter);
} }
public Object getParent(Object element) { public Object getParent(Object element) {
@ -95,14 +101,16 @@ public class GetterAndSetterContext implements ITreeContentProvider{
} }
private ArrayList<FieldWrapper> getWrappedFields() { private ArrayList<FieldWrapper> getWrappedFields() {
ArrayList<FieldWrapper> wrappedFields = new ArrayList<FieldWrapper>(); if(wrappedFields == null) {
for(IASTSimpleDeclaration currentField : existingFields){ wrappedFields = new ArrayList<FieldWrapper>();
FieldWrapper wrapper = new FieldWrapper(); for(IASTSimpleDeclaration currentField : existingFields){
wrapper.field = currentField; FieldWrapper wrapper = new FieldWrapper();
wrapper.getter = getGetterForField(currentField); wrapper.field = currentField;
wrapper.setter = getSetterForField(currentField); wrapper.getter = getGetterForField(currentField);
if(wrapper.missingGetterOrSetter()){ wrapper.setter = getSetterForField(currentField);
wrappedFields.add(wrapper); if(wrapper.missingGetterOrSetter()){
wrappedFields.add(wrapper);
}
} }
} }
return wrappedFields; return wrappedFields;
@ -146,12 +154,17 @@ public class GetterAndSetterContext implements ITreeContentProvider{
protected IASTSimpleDeclaration field; protected IASTSimpleDeclaration field;
protected FunctionWrapper getter; protected FunctionWrapper getter;
protected FunctionWrapper setter; protected FunctionWrapper setter;
protected ArrayList<GetterSetterInsertEditProvider> childNodes = new ArrayList<GetterSetterInsertEditProvider>(2);
@Override @Override
public String toString(){ public String toString(){
return field.getDeclarators()[0].getName().toString(); return field.getDeclarators()[0].getName().toString();
} }
public ArrayList<GetterSetterInsertEditProvider> getChildNodes() {
return childNodes;
}
public boolean missingGetterOrSetter() { public boolean missingGetterOrSetter() {
return !getter.exists() || !setter.exists(); 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; 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 IASTFunctionDefinition function;
private Type type;
public GetterSetterInsertEditProvider(IASTFunctionDefinition function){
public GetterSetterInsertEditProvider(IASTFunctionDefinition function, Type type){
this.function = function; this.function = function;
this.type = type;
} }
@Override @Override
@ -30,4 +39,14 @@ public class GetterSetterInsertEditProvider {
public IASTFunctionDefinition getFunction() { public IASTFunctionDefinition getFunction() {
return function; 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 // 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_NoCassDefFound;
public static String GenerateGettersAndSettersRefactoring_NoFields; public static String GenerateGettersAndSettersRefactoring_NoFields;
public static String GettersAndSetters_Name; public static String GettersAndSetters_Name;

View file

@ -9,6 +9,11 @@
# Contributors: # Contributors:
# Institute for Software - initial API and implementation # 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_NoCassDefFound=No class definition found
GenerateGettersAndSettersRefactoring_NoFields=The class does not contain any fields. GenerateGettersAndSettersRefactoring_NoFields=The class does not contain any fields.