From 3f794a608f256105bb7ee38132fb33fe391ad18f Mon Sep 17 00:00:00 2001 From: Emanuel Graf Date: Tue, 14 Apr 2009 07:02:16 +0000 Subject: [PATCH] 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 --- .../refactoring/GenerateGettersAndSetters.rts | 40 ++-- .../GenerateGettersAndSettersInputPage.java | 174 +++++++++++++----- .../GetterAndSetterContext.java | 49 +++-- .../GetterSetterInsertEditProvider.java | 23 ++- .../GetterSetterLabelProvider.java | 36 ++++ .../gettersandsetters/Messages.java | 5 + .../gettersandsetters/messages.properties | 7 +- 7 files changed, 252 insertions(+), 82 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterLabelProvider.java diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts index b3d095c8bd3..05b04619d77 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts @@ -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; }; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersInputPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersInputPage.java index cd8bcffead5..d821a6c587e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersInputPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersInputPage.java @@ -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 checkedFunctions = new ArrayList(); - 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 checkedFunctions = new ArrayList(); - 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 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 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 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 checkedFunctions = context.selectedFunctions; + for (Object currentElement : variableSelectionView.getCheckedElements()) { + if (currentElement instanceof GetterSetterInsertEditProvider) { + GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement; + checkedFunctions.add(editProvider); + } + } + } + }); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterAndSetterContext.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterAndSetterContext.java index 89755aee7d5..de70972b4d2 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterAndSetterContext.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterAndSetterContext.java @@ -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 existingFields = new ArrayList(); public ArrayList existingFunctionDefinitions = new ArrayList(); public ArrayList existingFunctionDeclarations = new ArrayList(); - public ArrayList selectedFunctions = new ArrayList(); + public SortedSet selectedFunctions = new TreeSet(); private IASTTranslationUnit unit; public IASTName selectedName; + private ArrayList wrappedFields; public Object[] getChildren(Object parentElement) { ArrayList children = new ArrayList(); 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 getWrappedFields() { - ArrayList wrappedFields = new ArrayList(); - 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(); + 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 childNodes = new ArrayList(2); @Override public String toString(){ return field.getDeclarators()[0].getName().toString(); } + public ArrayList getChildNodes() { + return childNodes; + } + public boolean missingGetterOrSetter() { return !getter.exists() || !setter.exists(); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterInsertEditProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterInsertEditProvider.java index 444f2f17c4b..6a0c29dfe73 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterInsertEditProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterInsertEditProvider.java @@ -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{ + 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()); + } + + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterLabelProvider.java new file mode 100644 index 00000000000..d5a3dc510e5 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GetterSetterLabelProvider.java @@ -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; + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/Messages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/Messages.java index cc5a1bf11b9..39c329fd7e0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/Messages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/Messages.java @@ -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; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/messages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/messages.properties index 932218380d4..ed091bf4007 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/messages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/messages.properties @@ -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.