Index: core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java,v retrieving revision 1.14 diff -u -r1.14 AddGetterSetterOperation.java --- core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java 14 Mar 2003 14:39:58 -0000 1.14 +++ core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java 6 May 2003 10:22:09 -0000 @@ -18,7 +18,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; - import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; @@ -27,20 +26,27 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.NamingConventions; import org.eclipse.jdt.core.Signature; - -import org.eclipse.jdt.ui.CodeGeneration; - import org.eclipse.jdt.internal.corext.util.JavaModelUtil; +import org.eclipse.jdt.internal.corext.util.JdtFlags; +import org.eclipse.jdt.ui.CodeGeneration; /** * For given fields, method stubs for getters and setters are created. */ public class AddGetterSetterOperation implements IWorkspaceRunnable { + private IJavaElement fInsertPosition; + private int fVisibility; + private boolean fSort; + private boolean fSynchronized; + private boolean fNative; + private boolean fFinal; + private final String[] EMPTY= new String[0]; private IField[] fGetterFields; private IField[] fSetterFields; + private IField[] fGetterSetterFields; private List fCreatedAccessors; private IRequestQuery fSkipExistingQuery; @@ -59,18 +65,20 @@ * @param skipExistingQuery Callback to ask if setter / getters that already exist can be skipped. * Argument of the query is the existing method. null is a valid input and stands for skip all. */ - public AddGetterSetterOperation(IField[] fields, CodeGenerationSettings settings, IRequestQuery skipFinalSettersQuery, IRequestQuery skipExistingQuery) { - this(fields, fields, settings, skipFinalSettersQuery, skipExistingQuery); + public AddGetterSetterOperation(IField[] fields, CodeGenerationSettings settings, IRequestQuery skipFinalSettersQuery, IRequestQuery skipExistingQuery, IJavaElement elementPosition) { + this(fields, fields, fields, settings, skipFinalSettersQuery, skipExistingQuery, elementPosition); } - public AddGetterSetterOperation(IField[] getterFields, IField[] setterFields, CodeGenerationSettings settings, IRequestQuery skipFinalSettersQuery, IRequestQuery skipExistingQuery) { + public AddGetterSetterOperation(IField[] getterFields, IField[] setterFields, IField[] getterSetterFields, CodeGenerationSettings settings, IRequestQuery skipFinalSettersQuery, IRequestQuery skipExistingQuery, IJavaElement elementPosition) { super(); fGetterFields= getterFields; fSetterFields= setterFields; + fGetterSetterFields= getterSetterFields; fSkipExistingQuery= skipExistingQuery; fSkipFinalSettersQuery= skipFinalSettersQuery; fSettings= settings; fCreatedAccessors= new ArrayList(); + fInsertPosition= elementPosition; } /** @@ -88,6 +96,17 @@ fSkipAllFinalSetters= (fSkipFinalSettersQuery == null); fSkipAllExisting= (fSkipExistingQuery == null); + // create pairs first: http://bugs.eclipse.org/bugs/show_bug.cgi?id=35870 + if (!fSort) { + for (int i= 0; i < fGetterSetterFields.length; i++) { + generateGetter(fGetterSetterFields[i]); + generateSetter(fGetterSetterFields[i]); + monitor.worked(1); + if (monitor.isCanceled()){ + throw new OperationCanceledException(); + } + } + } for (int i= 0; i < fGetterFields.length; i++) { generateGetter(fGetterFields[i]); monitor.worked(1); @@ -101,13 +120,24 @@ if (monitor.isCanceled()){ throw new OperationCanceledException(); } - } - + } } finally { monitor.done(); } } + private IField[] getValidElementForSort() { + if (fGetterSetterFields.length > 0) + return fGetterSetterFields; + if (fGetterFields.length > 0) + return fGetterFields; + if (fSetterFields.length > 0) + return fSetterFields; + else + return null; + + } + private boolean querySkipFinalSetters(IField field) throws OperationCanceledException { if (!fSkipAllFinalSetters) { switch (fSkipFinalSettersQuery.doQuery(field)) { @@ -163,10 +193,19 @@ buf.append('\n'); } } - buf.append("public "); //$NON-NLS-1$ + + buf.append(JdtFlags.getVisibilityString(fVisibility)); + buf.append(' '); if (isStatic) { buf.append("static "); //$NON-NLS-1$ } + if (fSynchronized) + buf.append("synchronized "); //$NON-NLS-1$ + if (fFinal) + buf.append("final "); //$NON-NLS-1$ + if (fNative) + buf.append("native "); //$NON-NLS-1$ + buf.append(typeName); buf.append(' '); buf.append(getterName); buf.append("() {\nreturn "); buf.append(fieldName); buf.append(";\n}\n"); //$NON-NLS-2$ //$NON-NLS-1$ @@ -175,13 +214,15 @@ if (existingGetter != null) { sibling= StubUtility.findNextSibling(existingGetter); existingGetter.delete(false, null); - } - + } + else + sibling= getInsertPosition(); + String formattedContent= StubUtility.codeFormat(buf.toString(), indent, lineDelim) + lineDelim; fCreatedAccessors.add(parentType.createMethod(formattedContent, sibling, true, null)); } } - + private void generateSetter(IField field) throws CoreException, OperationCanceledException { String fieldName= field.getElementName(); IJavaProject project= field.getJavaProject(); @@ -219,10 +260,18 @@ buf.append('\n'); } } - buf.append("public "); //$NON-NLS-1$ + buf.append(JdtFlags.getVisibilityString(fVisibility)); + buf.append(' '); if (isStatic) { buf.append("static "); //$NON-NLS-1$ } + if (fSynchronized) + buf.append("synchronized "); //$NON-NLS-1$ + if (fFinal) + buf.append("final "); //$NON-NLS-1$ + if (fNative) + buf.append("native "); //$NON-NLS-1$ + buf.append("void "); buf.append(setterName); //$NON-NLS-1$ buf.append('('); buf.append(typeName); buf.append(' '); buf.append(argname); buf.append(") {\n"); //$NON-NLS-1$ @@ -241,6 +290,8 @@ sibling= StubUtility.findNextSibling(existingSetter); existingSetter.delete(false, null); } + else + sibling= getInsertPosition(); String formattedContent= StubUtility.codeFormat(buf.toString(), indent, lineDelim) + lineDelim; fCreatedAccessors.add(parentType.createMethod(formattedContent, sibling, true, null)); @@ -253,4 +304,46 @@ public IMethod[] getCreatedAccessors() { return (IMethod[]) fCreatedAccessors.toArray(new IMethod[fCreatedAccessors.size()]); } + + /** + * @param fSort + */ + public void setSort(boolean sort) { + fSort = sort; + } + + /** + * @param fVisibility + */ + public void setVisibility(int visibility) { + fVisibility = visibility; + } + + /** + * @param syncSet + */ + public void setSynchronized(boolean syncSet) { + fSynchronized = syncSet; + } + + /** + * @param finalSet + */ + public void setFinal(boolean finalSet) { + fFinal = finalSet; + } + /** + * @return + */ + public IJavaElement getInsertPosition() { + return fInsertPosition; + } + + /** + * @param nativeSet + */ + public void setNative(boolean nativeSet) { + fNative= nativeSet; + } + } Index: ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties,v retrieving revision 1.75 diff -u -r1.75 ActionMessages.properties --- ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties 18 Mar 2003 19:00:56 -0000 1.75 +++ ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties 6 May 2003 10:22:11 -0000 @@ -73,17 +73,17 @@ OverrideMethodsAction.error.type_removed_in_editor=Input type has been removed in editor. OverrideMethodsAction.not_applicable=Operation not applicable to current text selection. Please position the cursor inside a type. -AddGetterSetterAction.label=Gene&rate Getter and Setter... +AddGetterSetterAction.label=Gene&rate Getters and Setters... AddGetterSetterAction.description=Generate Getter and Setter methods for type's fields -AddGetterSetterAction.tooltip=Generate Getter and Setter methods for the Type's Fields +AddGetterSetterAction.tooltip=Generate Getter and Setter methods for the type's Fields -AddGetterSetterAction.error.title=Generate Getter and Setter -AddGetterSetterAction.error.actionfailed=Generating Getter and Setter Failed. +AddGetterSetterAction.error.title=Generate Getters and Setters +AddGetterSetterAction.error.actionfailed=Generating Getters and Setters Failed. AddGetterSetterAction.error.fieldNotExisting=The field ''{0}'' has been removed in the editor. AddGetterSetterAction.not_applicable=Operation not applicable to current text selection. A field has to be selected or a type that declares fields. AddGetterSetterAction.read_only=The compilation unit in which the field ''{0}'' is declared is read only. -AddGetterSetterAction.QueryDialog.title=Generate Getter and Setter +AddGetterSetterAction.QueryDialog.title=Generate Getters and Setters AddGetterSetterAction.SkipSetterForFinalDialog.message=Field ''{0}'' is final.\nOK to skip creation of the setter method? AddGetterSetterAction.SkipExistingDialog.message=Method ''{0}'' already exists.\nSkip creation? AddGetterSetterAction.SkipExistingDialog.skip.label=&Skip @@ -95,6 +95,15 @@ AddGetterSetterAction.methods_selected={0} methods selected. AddGettSetterAction.typeContainsNoFields.message=The type contains no fields or all fields have getters/setters already. +GetterSetterTreeSelectionDialog.select_getters=Select &Getters +GetterSetterTreeSelectionDialog.select_setters=Select &Setters +GetterSetterTreeSelectionDialog.alpha_pair_sort=Fields in getter/setter pairs +GetterSetterTreeSelectionDialog.alpha_method_sort=Method names alphabetically +GetterSetterTreeSelectionDialog.modifier_label=&Modfiers: +GetterSetterTreeSelectionDialog.sort_label=S&ort by: +GetterSetterTreeSelectionDialog.enterAt_label=&Insert point: +GetterSetterTreeSelectionDialog.cursor_position=Current cursor position +GetterSetterTreeSelectionDialog.first_method=First method AddUnimplementedConstructorsAction.label=Add &Constructors from Superclass AddUnimplementedConstructorsAction.description=Evaluate and add constructors from superclass @@ -230,6 +239,7 @@ PullUpAction.problem.message=Operation not possible. OverrideMethodQuery.groupMethodsByTypes=Group methods by &types +OverrideMethodQuery.createComment=Generate method &comment OverrideMethodQuery.dialog.title=Override/Implement Methods OverrideMethodQuery.dialog.description=&Select methods to override or implement: OverrideMethodQuery.selectioninfo.one={0} method selected. Index: ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java,v retrieving revision 1.18 diff -u -r1.18 SelectionConverter.java --- ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java 10 Mar 2003 21:56:44 -0000 1.18 +++ ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java 6 May 2003 10:22:11 -0000 @@ -217,7 +217,7 @@ return EMPTY_RESULT; } - private static IJavaElement getElementAtOffset(IJavaElement input, ITextSelection selection) throws JavaModelException { + public static IJavaElement getElementAtOffset(IJavaElement input, ITextSelection selection) throws JavaModelException { if (input instanceof ICompilationUnit) { ICompilationUnit cunit= (ICompilationUnit)input; if (cunit.isWorkingCopy()) { Index: ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java,v retrieving revision 1.33 diff -u -r1.33 AddGetterSetterAction.java --- ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java 10 Mar 2003 21:56:48 -0000 1.33 +++ ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java 6 May 2003 10:22:13 -0000 @@ -12,48 +12,28 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.text.IRewriteTarget; -import org.eclipse.jface.text.ITextSelection; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog; -import org.eclipse.ui.dialogs.ISelectionStatusValidator; -import org.eclipse.ui.help.WorkbenchHelp; - import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.Signature; - -import org.eclipse.jdt.ui.JavaElementImageDescriptor; -import org.eclipse.jdt.ui.JavaElementLabelProvider; -import org.eclipse.jdt.ui.JavaElementSorter; - +import org.eclipse.jdt.core.dom.Modifier; +import org.eclipse.jdt.internal.corext.SourceRange; import org.eclipse.jdt.internal.corext.codemanipulation.AddGetterSetterOperation; import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings; import org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil; @@ -68,11 +48,45 @@ import org.eclipse.jdt.internal.ui.dialogs.StatusInfo; import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor; import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility; +import org.eclipse.jdt.internal.ui.javaeditor.selectionactions.GoToNextPreviousMemberAction; import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings; +import org.eclipse.jdt.internal.ui.refactoring.IVisibilityChangeListener; +import org.eclipse.jdt.internal.ui.refactoring.VisibilityControlUtil; import org.eclipse.jdt.internal.ui.util.ElementValidator; import org.eclipse.jdt.internal.ui.util.ExceptionHandler; import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; import org.eclipse.jdt.internal.ui.viewsupport.JavaElementLabels; +import org.eclipse.jdt.ui.JavaElementImageDescriptor; +import org.eclipse.jdt.ui.JavaElementLabelProvider; +import org.eclipse.jdt.ui.JavaElementSorter; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.text.IRewriteTarget; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.TextSelection; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchSite; +import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog; +import org.eclipse.ui.dialogs.ISelectionStatusValidator; +import org.eclipse.ui.help.WorkbenchHelp; /** * Creates getter and setter methods for a type's fields. Opens a dialog @@ -94,6 +108,11 @@ */ public class AddGetterSetterAction extends SelectionDispatchAction { + private int fVisibility; + private boolean fSort; + private boolean fSynchronized; + private boolean fFinal; + private boolean fNative; private CompilationUnitEditor fEditor; private static final String dialogTitle= ActionMessages.getString("AddGetterSetterAction.error.title"); //$NON-NLS-1$ @@ -120,6 +139,7 @@ this(editor.getEditorSite()); fEditor= editor; setEnabled(SelectionConverter.getInputAsCompilationUnit(editor) != null); + fEditor.getEditorSite(); } //---- Structured Viewer ----------------------------------------------------------- @@ -149,6 +169,7 @@ return; } Object firstElement= selection.getFirstElement(); + if (firstElement instanceof IType) run((IType)firstElement, new IField[0], false); else if (firstElement instanceof ICompilationUnit) @@ -186,21 +207,20 @@ return fields != null && fields.length > 0; } - private void run(IType type, IField[] preselected, boolean editor) throws CoreException { + private void run(IType type, IField[] preselected, boolean editor) throws CoreException { if (!ElementValidator.check(type, getShell(), dialogTitle, editor)) return; if (!ActionUtil.isProcessable(getShell(), type)) return; - CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings(); ILabelProvider lp= new AddGetterSetterLabelProvider(); - Map entries= createGetterSetterMapping(type, settings); + Map entries= createGetterSetterMapping(type); if (entries.isEmpty()){ MessageDialog.openInformation(getShell(), dialogTitle, ActionMessages.getString("AddGettSetterAction.typeContainsNoFields.message")); //$NON-NLS-1$ return; } ITreeContentProvider cp= new AddGetterSetterContentProvider(entries); - CheckedTreeSelectionDialog dialog= new CheckedTreeSelectionDialog(getShell(), lp, cp); + GetterSetterTreeSelectionDialog dialog= new GetterSetterTreeSelectionDialog(getShell(), lp, cp, fEditor); dialog.setSorter(new JavaElementSorter()); dialog.setTitle(dialogTitle); String message= ActionMessages.getString("AddGetterSetterAction.dialog.title");//$NON-NLS-1$ @@ -215,11 +235,87 @@ Object[] result= dialog.getResult(); if (result == null) return; - IField[] getterFields= getGetterFields(result); - IField[] setterFields= getSetterFields(result); - generate(getterFields, setterFields); + fSort= dialog.getSort(); + fVisibility= dialog.getVisibility(); + fSynchronized= dialog.getSynchronized(); + fNative= dialog.getNative(); + fFinal= dialog.getFinal(); + IField[] getterFields, setterFields, getterSetterFields; + if (fSort) { + getterFields= getGetterFields(result); + setterFields= getSetterFields(result); + getterSetterFields= new IField[0]; + } + else { + getterFields= getGetterOnlyFields(result); + setterFields= getSetterOnlyFields(result); + getterSetterFields= getGetterSetterFields(result); + } + IField[][] allFields= new IField[][] {preselected, getterFields, setterFields, getterSetterFields}; + + IJavaElement elementPosition= calculateElementPosition(dialog.getInsertionIndex(), allFields); + + generate(getterFields, setterFields, getterSetterFields, elementPosition); } + private boolean isEditorAvailable() { + return fEditor != null; + } + + private IMethod asFirstMethod(IField[][] allFields) { + try { + for (int i=0; i < allFields.length; i++) { + if (allFields[i].length > 0) { + IMethod methods[]= allFields[i][0].getDeclaringType().getMethods(); + return methods[0]; + } + } + } catch (JavaModelException e) { + } + return null; + } + + private IMethod atMethodPosition(IField[][] allFields, int index) { + try { + for (int i=0; i < allFields.length; i++) { + if (allFields[i].length > 0) { + IMethod methods[]= allFields[i][0].getDeclaringType().getMethods(); + return methods[index-1]; + } + } + } catch (JavaModelException e) { + } + return null; + } + /* + * Determine where in the file to enter the newly created methods. Result depends + * on whether to enter at the current cursor position or to enter at a chosen + * method. + */ + private IJavaElement calculateElementPosition(int comboBoxIndex, IField[][] allFields) { + try { + if (isEditorAvailable()) { + if (comboBoxIndex == 0) { // at cursor position + return setElementPosition(SelectionConverter.getElementAtOffset(fEditor)); + } + else if (comboBoxIndex == 1) // as first method + return asFirstMethod(allFields); + else // method position + return atMethodPosition(allFields, comboBoxIndex-1); + } + else { // run from a view part + if (comboBoxIndex == 0) // as first method + return asFirstMethod(allFields); + else { // method position + return atMethodPosition(allFields, comboBoxIndex); + } + } + } + catch (JavaModelException e) { + } + return null; + } + private static ISelectionStatusValidator createValidator() { return new ISelectionStatusValidator(){ public IStatus validate(Object[] selection) { @@ -245,50 +341,142 @@ }; } + // returns a list of fields with setter entries checked + private static IField[] getSetterFields(Object[] result){ + Collection list= new ArrayList(0); + Object each= null; + GetterSetterEntry entry= null; + for (int i = 0; i < result.length; i++) { + each= result[i]; + if ((each instanceof GetterSetterEntry)){ + entry= (GetterSetterEntry)each; + if (! entry.isGetterEntry) { + list.add(entry.field); + } + } + } + return (IField[]) list.toArray(new IField[list.size()]); + } + + // returns a list of fields with getter entries checked private static IField[] getGetterFields(Object[] result){ Collection list= new ArrayList(0); + Object each= null; + GetterSetterEntry entry= null; for (int i = 0; i < result.length; i++) { - Object each= result[i]; + each= result[i]; if ((each instanceof GetterSetterEntry)){ - GetterSetterEntry entry= (GetterSetterEntry)each; - if (entry.isGetterEntry) + entry= (GetterSetterEntry)each; + if (entry.isGetterEntry) { list.add(entry.field); - } + } + } } return (IField[]) list.toArray(new IField[list.size()]); } - private static IField[] getSetterFields(Object[] result){ + // returns a list of fields with only getter entires checked + private static IField[] getGetterOnlyFields(Object[] result){ Collection list= new ArrayList(0); + Object each= null; + GetterSetterEntry entry= null; + boolean getterSet= false; for (int i = 0; i < result.length; i++) { - Object each= result[i]; + each= result[i]; if ((each instanceof GetterSetterEntry)){ - GetterSetterEntry entry= (GetterSetterEntry)each; - if (! entry.isGetterEntry) + entry= (GetterSetterEntry)each; + if (entry.isGetterEntry) { list.add(entry.field); - } + getterSet= true; + } + if ((! entry.isGetterEntry) && (getterSet == true)) { + list.remove(entry.field); + getterSet= false; + } + } + else + getterSet= false; + } + return (IField[]) list.toArray(new IField[list.size()]); + } + + // returns a list of fields with only setter entries checked + private static IField[] getSetterOnlyFields(Object[] result){ + Collection list= new ArrayList(0); + Object each= null; + GetterSetterEntry entry= null; + boolean getterSet= false; + for (int i = 0; i < result.length; i++) { + each= result[i]; + if ((each instanceof GetterSetterEntry)){ + entry= (GetterSetterEntry)each; + if (entry.isGetterEntry) { + getterSet= true; + } + if ((! entry.isGetterEntry) && (getterSet != true)) { + list.add(entry.field); + getterSet= false; + } + } + else + getterSet= false; + } + return (IField[]) list.toArray(new IField[list.size()]); + } + + // returns a list of fields with both entries checked + private static IField[] getGetterSetterFields(Object[] result){ + Collection list= new ArrayList(0); + Object each= null; + GetterSetterEntry entry= null; + boolean getterSet= false; + for (int i = 0; i < result.length; i++) { + each= result[i]; + if ((each instanceof GetterSetterEntry)){ + entry= (GetterSetterEntry)each; + if (entry.isGetterEntry) { + getterSet= true; + } + if ((! entry.isGetterEntry) && (getterSet == true)) { + list.add(entry.field); + getterSet= false; + } + } + else + getterSet= false; } return (IField[]) list.toArray(new IField[list.size()]); } - private void generate(IField[] getterFields, IField[] setterFields) throws CoreException{ - if (getterFields.length == 0 && setterFields.length == 0) + private void generate(IField[] getterFields, IField[] setterFields, IField[] getterSetterFields, IJavaElement elementPosition) throws CoreException{ + if (getterFields.length == 0 && setterFields.length == 0 && getterSetterFields.length == 0) return; ICompilationUnit cu= null; if (getterFields.length != 0) cu= getterFields[0].getCompilationUnit(); - else + else if (setterFields.length != 0) cu= setterFields[0].getCompilationUnit(); + else + cu= getterSetterFields[0].getCompilationUnit(); //open the editor, forces the creation of a working copy IEditorPart editor= EditorUtility.openInEditor(cu); IField[] workingCopyGetterFields= getWorkingCopyFields(getterFields); IField[] workingCopySetterFields= getWorkingCopyFields(setterFields); - if (workingCopyGetterFields != null && workingCopySetterFields != null) - run(workingCopyGetterFields, workingCopySetterFields, editor); + IField[] workingCopyGetterSetterFields= getWorkingCopyFields(getterSetterFields); + IJavaElement workingCopyElementPosition= getWorkingCopy(elementPosition); + + if (workingCopyGetterFields != null && workingCopySetterFields != null && workingCopyGetterSetterFields != null) + run(workingCopyGetterFields, workingCopySetterFields, workingCopyGetterSetterFields, editor, workingCopyElementPosition); } + private static IJavaElement getWorkingCopy(IJavaElement elementPosition) { + if(elementPosition instanceof IMember) + return JavaModelUtil.toWorkingCopy((IMember)elementPosition); + return elementPosition; + } + private IField[] getWorkingCopyFields(IField[] fields) throws CoreException{ if (fields.length == 0) return new IField[0]; @@ -342,6 +530,7 @@ return; } IJavaElement element= SelectionConverter.getElementAtOffset(fEditor); + if (element != null){ IType type= (IType)element.getAncestor(IJavaElement.TYPE); if (type != null){ @@ -360,13 +549,19 @@ //---- Helpers ------------------------------------------------------------------- - private void run(IField[] getterFields, IField[] setterFields, IEditorPart editor) { + private void run(IField[] getterFields, IField[] setterFields, IField[] getterSetterFields, IEditorPart editor, IJavaElement elementPosition) { IRewriteTarget target= (IRewriteTarget) editor.getAdapter(IRewriteTarget.class); if (target != null) { target.beginCompoundChange(); } try { - AddGetterSetterOperation op= createAddGetterSetterOperation(getterFields, setterFields); + AddGetterSetterOperation op= createAddGetterSetterOperation(getterFields, setterFields, getterSetterFields, elementPosition); + // Set the status fields corresponding to the visibility and modifiers set + op.setSort(fSort); + op.setVisibility(fVisibility); + op.setSynchronized(fSynchronized); + op.setFinal(fFinal); + op.setNative(fNative); new ProgressMonitorDialog(getShell()).run(false, true, new WorkbenchRunnableAdapter(op)); IMethod[] createdMethods= op.getCreatedAccessors(); @@ -385,11 +580,11 @@ } } - private AddGetterSetterOperation createAddGetterSetterOperation(IField[] getterFields, IField[] setterFields) { + private AddGetterSetterOperation createAddGetterSetterOperation(IField[] getterFields, IField[] setterFields, IField[] getterSetterFields, IJavaElement elementPosition) { IRequestQuery skipSetterForFinalQuery= skipSetterForFinalQuery(); IRequestQuery skipReplaceQuery= skipReplaceQuery(); CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings(); - return new AddGetterSetterOperation(getterFields, setterFields, settings, skipSetterForFinalQuery, skipReplaceQuery); + return new AddGetterSetterOperation(getterFields, setterFields, getterSetterFields, settings, skipSetterForFinalQuery, skipReplaceQuery, elementPosition); } private IRequestQuery skipSetterForFinalQuery() { @@ -488,15 +683,6 @@ return null; } - private static class GetterSetterEntry { - public final IField field; - public final boolean isGetterEntry; - GetterSetterEntry(IField field, boolean isGetterEntry){ - this.field= field; - this.isGetterEntry= isGetterEntry; - } - } - private static class AddGetterSetterLabelProvider extends JavaElementLabelProvider { AddGetterSetterLabelProvider() { @@ -545,7 +731,7 @@ /** * @return map IField -> GetterSetterEntry[] */ - private static Map createGetterSetterMapping(IType type, CodeGenerationSettings settings) throws JavaModelException{ + private static Map createGetterSetterMapping(IType type) throws JavaModelException{ IField[] fields= type.getFields(); Map result= new HashMap(); for (int i= 0; i < fields.length; i++) { @@ -563,8 +749,9 @@ } private static class AddGetterSetterContentProvider implements ITreeContentProvider{ + private boolean fsortAlphabetically; private static final Object[] EMPTY= new Object[0]; - private Map fGetterSetterEntries; + private Map fGetterSetterEntries;//IField -> Object[] (with 0 to 2 elements of type GetterSetterEntry) public AddGetterSetterContentProvider(Map entries) throws JavaModelException { fGetterSetterEntries= entries; } @@ -595,14 +782,20 @@ public boolean hasChildren(Object element) { return getChildren(element).length > 0; } - + + /* Enter the getter/setter methods alphabetically into file */ + public void enterAlphabetically(boolean alpha) { + fsortAlphabetically= alpha; + } + /* * @see IStructuredContentProvider#getElements(Object) */ public Object[] getElements(Object inputElement) { return fGetterSetterEntries.keySet().toArray(); } - + + /* * @see IContentProvider#dispose() */ @@ -616,6 +809,245 @@ */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } + } + + private static class GetterSetterTreeSelectionDialog extends CheckedTreeSelectionDialog { + + private boolean fSort; + private int fVisibility; + private boolean fNative; + private boolean fFinal; + private boolean fSynchronized; + private int fInsertionIndex; + private CompilationUnitEditor fEditor; + + public GetterSetterTreeSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider, CompilationUnitEditor editor) { + super(parent, labelProvider, contentProvider); + fEditor= editor; + } + + public int getInsertionIndex() { + return fInsertionIndex; + } + + public int getVisibility() { + return fVisibility; + } + + public boolean getSort() { + return fSort; + } + + public boolean getFinal() { + return fFinal; + } + + public boolean getNative() { + return fNative; + } + + public boolean getSynchronized() { + return fSynchronized; + } + + private boolean isEditorAvailable() { + return fEditor != null; + } + + /** + * Adds the Select Getters and Select Setters buttons. + * Adds modifiers radio buttons and alphabetical order radio buttons. + * + * @param composite the parent composite + */ + protected Composite createSelectionButtons(Composite composite) { + Composite buttonComposite = super.createSelectionButtons(composite); + + addGetSetSelectButtons(buttonComposite); + addOrderEntryChoices(buttonComposite); + addVisibilityAndModifiersChoices(buttonComposite); + + ((GridLayout) buttonComposite.getLayout()).numColumns= 4; + return buttonComposite; + } + + private Composite addGetSetSelectButtons(Composite buttonComposite) { + // Add buttons for selecting getters or setters only: http://bugs.eclipse.org/bugs/show_bug.cgi?id=35870 + int id = IDialogConstants.CLIENT_ID + 1; + Button gettersButton = createButton(buttonComposite, id++, ActionMessages.getString("GetterSetterTreeSelectionDialog.select_getters"), false); //$NON-NLS-1$ + + SelectionListener listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + getTreeViewer().setCheckedElements(getGetterSetterElements(true)); + updateOKStatus(); + } + }; + gettersButton.addSelectionListener(listener); + + Button settersButton = createButton(buttonComposite, id++, ActionMessages.getString("GetterSetterTreeSelectionDialog.select_setters"), false); //$NON-NLS-1$ + + listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + getTreeViewer().setCheckedElements(getGetterSetterElements(false)); + updateOKStatus(); + } + }; + settersButton.addSelectionListener(listener); + + return buttonComposite; + } + + private Composite addVisibilityAndModifiersChoices(Composite buttonComposite) { + // Add visibility and modifiers buttons: http://bugs.eclipse.org/bugs/show_bug.cgi?id=35870 + IVisibilityChangeListener visibilityChangeListener = new IVisibilityChangeListener(){ + public void visibilityChanged(int newVisibility) { + fVisibility= newVisibility; + } + public void modifierChanged(int modifier, boolean isChecked) { + switch (modifier) { + case Modifier.FINAL: fFinal= isChecked; return; + case Modifier.SYNCHRONIZED: fSynchronized= isChecked; return; + case Modifier.NATIVE: fNative= isChecked; return; + default: return; + } + } + }; + int correctVisibility= Modifier.PUBLIC; + int[] availableVisibilities= new int[]{Modifier.PUBLIC, Modifier.PROTECTED, Modifier.PRIVATE, Modifier.NONE}; + int[] availableModifiers= new int[] {Modifier.FINAL, Modifier.SYNCHRONIZED, Modifier.NATIVE}; + + Composite visibilityComposite= VisibilityControlUtil.createVisibilityControlAndModifiers(buttonComposite, visibilityChangeListener, availableVisibilities, correctVisibility, availableModifiers); + ((GridData)visibilityComposite.getLayoutData()).horizontalSpan = 4; + + return visibilityComposite; + } + + private Composite addOrderEntryChoices(Composite buttonComposite) { + // Add order entry choices: http://bugs.eclipse.org/bugs/show_bug.cgi?id=35870 + Label enterLabel= new Label(buttonComposite, SWT.NONE); + enterLabel.setText(ActionMessages.getString("GetterSetterTreeSelectionDialog.enterAt_label")); //$NON-NLS-1$ + GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.horizontalSpan= 1; + enterLabel.setLayoutData(gd); + + final Combo enterCombo= new Combo(buttonComposite, SWT.READ_ONLY); + fillWithPossibleInsertPositions(enterCombo); + //enterCombo.setText(enterCombo.getItem(0)); + gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.horizontalSpan= 3; + enterCombo.setLayoutData(gd); + enterCombo.addSelectionListener(new SelectionAdapter(){ + public void widgetSelected(SelectionEvent e) { + fInsertionIndex= enterCombo.getSelectionIndex(); + } + }); + + Label label= new Label(buttonComposite, SWT.NONE); + label.setText(ActionMessages.getString("GetterSetterTreeSelectionDialog.sort_label")); //$NON-NLS-1$ + gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.horizontalSpan= 1; + label.setLayoutData(gd); + + final Combo combo= new Combo(buttonComposite, SWT.READ_ONLY); + combo.setItems(new String[]{ActionMessages.getString("GetterSetterTreeSelectionDialog.alpha_pair_sort"), //$NON-NLS-1$ + ActionMessages.getString("GetterSetterTreeSelectionDialog.alpha_method_sort")}); //$NON-NLS-1$ + final int methodIndex= 1; // Hard-coded. Change this if the list gets more complicated. + combo.setText(combo.getItem(0)); + gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.horizontalSpan= 3; + combo.setLayoutData(gd); + combo.addSelectionListener(new SelectionAdapter(){ + public void widgetSelected(SelectionEvent e) { + fSort= (combo.getSelectionIndex() == methodIndex); + } + }); + + return buttonComposite; + } + private void fillWithPossibleInsertPositions(Combo combo) { + Object allFields[]= getContentProvider().getElements(null); + IField field= (IField)allFields[0]; + + if (isEditorAvailable()) + combo.add(ActionMessages.getString("GetterSetterTreeSelectionDialog.cursor_position")); //$NON-NLS-1$ + + combo.add(ActionMessages.getString("GetterSetterTreeSelectionDialog.first_method")); //$NON-NLS-1$ + try { + IMethod[] methods= field.getDeclaringType().getMethods(); + for (int i= 0; i < methods.length; i++) { + combo.add(JavaElementLabels.getElementLabel(methods[i], JavaElementLabels.M_PARAMETER_TYPES)); + } + } catch (JavaModelException e) { + } + combo.select(0); + } + + private Object[] getGetterSetterElements(boolean isGetter){ + Object[] allFields= getContentProvider().getElements(null); + Set result= new HashSet(); + for (int i = 0; i < allFields.length; i++) { + IField field= (IField)allFields[i]; + GetterSetterEntry[] entries= getEntries(field); + for (int j = 0; j < entries.length; j++) { + AddGetterSetterAction.GetterSetterEntry entry= entries[j]; + if (entry.isGetterEntry == isGetter) + result.add(entry); + } + } + return result.toArray(); + } + + private GetterSetterEntry[] getEntries(IField field) { + List result= Arrays.asList(getContentProvider().getChildren(field)); + return (GetterSetterEntry[]) result.toArray(new GetterSetterEntry[result.size()]); + } + + } + + private static class GetterSetterEntry { + public final IField field; + public final boolean isGetterEntry; + + GetterSetterEntry(IField field, boolean isGetterEntry){ + this.field= field; + this.isGetterEntry= isGetterEntry; + } + } + + /** + * Sets the location where the new getter/setter methods will be entered. + */ + private IJavaElement setElementPosition(IJavaElement element) { + try { + if (element == null) { + return null; + } + int type = element.getElementType(); + if (type == IJavaElement.METHOD || type == IJavaElement.FIELD) + return element; + else { + ITextSelection textSelect= (ITextSelection)fEditor.getSelectionProvider().getSelection(); + GoToNextPreviousMemberAction action= GoToNextPreviousMemberAction.newGoToNextMemberAction(fEditor); + ISourceRange sourceRange= action.getNewSelectionRange(createSourceRange(textSelect), null); + IJavaElement nextElement= SelectionConverter.getElementAtOffset(SelectionConverter.getInput(fEditor), createTextSelection(sourceRange)); + type= nextElement.getElementType(); + if (type == IJavaElement.METHOD || type == IJavaElement.FIELD) + return nextElement; + else // end of file + return null; + + } + } catch (JavaModelException e) { + } + return null; + } + + private static ISourceRange createSourceRange(ITextSelection textSelection){ + return new SourceRange(textSelection.getOffset(), textSelection.getLength()); + } + + private static ITextSelection createTextSelection(ISourceRange sourceRange){ + return new TextSelection(sourceRange.getOffset(), sourceRange.getLength()); } } Index: ui refactoring/org/eclipse/jdt/internal/ui/refactoring/IVisibilityChangeListener.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/IVisibilityChangeListener.java,v retrieving revision 1.2 diff -u -r1.2 IVisibilityChangeListener.java --- ui refactoring/org/eclipse/jdt/internal/ui/refactoring/IVisibilityChangeListener.java 10 Mar 2003 21:56:47 -0000 1.2 +++ ui refactoring/org/eclipse/jdt/internal/ui/refactoring/IVisibilityChangeListener.java 6 May 2003 10:22:14 -0000 @@ -11,4 +11,5 @@ package org.eclipse.jdt.internal.ui.refactoring; public interface IVisibilityChangeListener{ void visibilityChanged(int newVisibility); + void modifierChanged(int modifier, boolean isChecked); } Index: ui refactoring/org/eclipse/jdt/internal/ui/refactoring/VisibilityControlUtil.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/VisibilityControlUtil.java,v retrieving revision 1.4 diff -u -r1.4 VisibilityControlUtil.java --- ui refactoring/org/eclipse/jdt/internal/ui/refactoring/VisibilityControlUtil.java 10 Mar 2003 21:56:47 -0000 1.4 +++ ui refactoring/org/eclipse/jdt/internal/ui/refactoring/VisibilityControlUtil.java 6 May 2003 10:22:14 -0000 @@ -13,22 +13,21 @@ import java.util.ArrayList; import java.util.List; +import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; 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.Group; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages; - -class VisibilityControlUtil { +public class VisibilityControlUtil { private VisibilityControlUtil(){} - public static Composite createVisibilityControl(Composite parent, final IVisibilityChangeListener visibilityChangeListener, int[] availableVisibilities, int currectVisibility) { + public static Composite createVisibilityControl(Composite parent, final IVisibilityChangeListener visibilityChangeListener, int[] availableVisibilities, int correctVisibility) { List allowedVisibilities= convertToIntegerList(availableVisibilities); if (allowedVisibilities.size() == 1) return null; @@ -38,6 +37,7 @@ GridData gd= new GridData(GridData.FILL_HORIZONTAL); group.setLayoutData(gd); GridLayout layout= new GridLayout(); + layout.makeColumnsEqualWidth= true; layout.numColumns= 4; layout.marginWidth= 0; group.setLayout(layout); @@ -52,7 +52,7 @@ new Integer(Modifier.PROTECTED), new Integer(Modifier.NONE), new Integer(Modifier.PRIVATE)}; - Integer initialVisibility= new Integer(currectVisibility); + Integer initialVisibility= new Integer(correctVisibility); for (int i= 0; i < labels.length; i++) { Button radio= new Button(group, SWT.RADIO); Integer visibilityCode= data[i]; @@ -69,6 +69,53 @@ group.setLayoutData((new GridData(GridData.FILL_HORIZONTAL))); return group; } + + public static Composite createVisibilityControlAndModifiers(Composite parent, final IVisibilityChangeListener visibilityChangeListener, int[] availableVisibilities, int correctVisibility, int[] availableModifiers) { + Composite visibilityComposite= createVisibilityControl(parent, visibilityChangeListener, availableVisibilities, correctVisibility); + + List allowedModifiers= convertToIntegerList(availableModifiers); + if (allowedModifiers.size() == 1) + return null; + + String[] labels= new String[] { + RefactoringMessages.getString("VisibilityControlUtil.abstract"), //$NON-NLS-1$ + RefactoringMessages.getString("VisibilityControlUtil.static"), //$NON-NLS-1$ + RefactoringMessages.getString("VisibilityControlUtil.final"), //$NON-NLS-1$ + RefactoringMessages.getString("VisibilityControlUtil.synchronized"), //$NON-NLS-1$ + RefactoringMessages.getString("VisibilityControlUtil.native"), //$NON-NLS-1$ + }; + Integer[] data= new Integer[] { + new Integer(Modifier.ABSTRACT), + new Integer(Modifier.STATIC), + new Integer(Modifier.FINAL), + new Integer(Modifier.SYNCHRONIZED), + new Integer(Modifier.NATIVE)}; + + for (int i=0; i < labels.length; i++) { + if (allowedModifiers.contains(data[i])) { + Button checkboxButton= new Button(visibilityComposite, SWT.CHECK); + checkboxButton.setText(labels[i]); + GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + checkboxButton.setLayoutData(gd); + checkboxButton.setData(data[i]); + checkboxButton.setEnabled(true); + checkboxButton.setSelection(false); + checkboxButton.addSelectionListener(new SelectionListener() { + private Object modifiers; + + public void widgetSelected(SelectionEvent event) { + visibilityChangeListener.modifierChanged(((Integer)event.widget.getData()).intValue(), ((Button) event.widget).getSelection()); + } + + public void widgetDefaultSelected(SelectionEvent event) { + widgetSelected(event); + } + }); + } + } + return visibilityComposite; + } + private static List convertToIntegerList(int[] array) { List result= new ArrayList(array.length); for (int i= 0; i < array.length; i++) { Index: ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties,v retrieving revision 1.95 diff -u -r1.95 refactoringui.properties --- ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties 15 Apr 2003 09:16:52 -0000 1.95 +++ ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties 6 May 2003 10:22:14 -0000 @@ -386,6 +386,11 @@ VisibilityControlUtil.Access_modifier=Access modifier VisibilityControlUtil.defa&ult_4=de&fault +VisibilityControlUtil.abstract=&abstract +VisibilityControlUtil.final=f&inal +VisibilityControlUtil.static=stati&c +VisibilityControlUtil.synchronized=s&ynchronized +VisibilityControlUtil.native=&native PullUpInputPage1.pull_up=pull up PullUpInputPage1.declare_abstract=declare abstract in destination