]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-after/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/code/ExtractMethodInputPage.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui refactoring / org / eclipse / jdt / internal / ui / refactoring / code / ExtractMethodInputPage.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2011 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *     Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] remember selected access modifier - https://bugs.eclipse.org/bugs/show_bug.cgi?id=101233
11  *******************************************************************************/
12 package org.eclipse.jdt.internal.ui.refactoring.code;
13
14 import org.eclipse.swt.SWT;
15 import org.eclipse.swt.events.ModifyEvent;
16 import org.eclipse.swt.events.ModifyListener;
17 import org.eclipse.swt.events.SelectionAdapter;
18 import org.eclipse.swt.events.SelectionEvent;
19 import org.eclipse.swt.layout.GridData;
20 import org.eclipse.swt.layout.GridLayout;
21 import org.eclipse.swt.widgets.Button;
22 import org.eclipse.swt.widgets.Composite;
23 import org.eclipse.swt.widgets.Label;
24 import org.eclipse.swt.widgets.Text;
25
26 import org.eclipse.jface.dialogs.Dialog;
27 import org.eclipse.jface.dialogs.IDialogSettings;
28 import org.eclipse.jface.preference.IPreferenceStore;
29
30 import org.eclipse.jface.text.Document;
31
32 import org.eclipse.ui.PlatformUI;
33
34 import org.eclipse.ltk.core.refactoring.RefactoringStatus;
35 import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
36
37 import org.eclipse.jdt.core.dom.ASTNode;
38 import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
39 import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
40 import org.eclipse.jdt.core.dom.ClassInstanceCreation;
41 import org.eclipse.jdt.core.dom.EnumConstantDeclaration;
42 import org.eclipse.jdt.core.dom.Modifier;
43
44 import org.eclipse.jdt.internal.corext.dom.ASTNodes;
45 import org.eclipse.jdt.internal.corext.refactoring.code.ExtractMethodRefactoring;
46 import org.eclipse.jdt.internal.corext.util.Messages;
47
48 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
49 import org.eclipse.jdt.internal.ui.JavaPlugin;
50 import org.eclipse.jdt.internal.ui.JavaPluginImages;
51 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
52 import org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer;
53 import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
54 import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages;
55 import org.eclipse.jdt.internal.ui.util.RowLayouter;
56 import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
57
58
59 public class ExtractMethodInputPage extends UserInputWizardPage {
60
61         public static final String PAGE_NAME= "ExtractMethodInputPage";//$NON-NLS-1$
62
63         public ExtractMethodRefactoring fRefactoring;
64         private Text fTextField;
65         private boolean fFirstTime;
66         public JavaSourceViewer fSignaturePreview;
67         public Document fSignaturePreviewDocument;
68         public IDialogSettings fSettings;
69
70         private static final String DESCRIPTION = RefactoringMessages.ExtractMethodInputPage_description;
71         public static final String THROW_RUNTIME_EXCEPTIONS= "ThrowRuntimeExceptions"; //$NON-NLS-1$
72         private static final String GENERATE_JAVADOC= "GenerateJavadoc";  //$NON-NLS-1$
73         public static final String ACCESS_MODIFIER= "AccessModifier"; //$NON-NLS-1$
74
75         public ExtractMethodInputPage() {
76                 super(PAGE_NAME);
77                 setImageDescriptor(JavaPluginImages.DESC_WIZBAN_REFACTOR_CU);
78                 setDescription(DESCRIPTION);
79                 fFirstTime= true;
80                 fSignaturePreviewDocument= new Document();
81         }
82
83         public void createControl(Composite parent) {
84                 fRefactoring= (ExtractMethodRefactoring)getRefactoring();
85                 loadSettings();
86
87                 Composite result= new Composite(parent, SWT.NONE);
88                 setControl(result);
89                 GridLayout layout= new GridLayout();
90                 layout.numColumns= 2;
91                 result.setLayout(layout);
92                 RowLayouter layouter= new RowLayouter(2);
93                 GridData gd= null;
94
95                 initializeDialogUnits(result);
96
97                 Label label= new Label(result, SWT.NONE);
98                 label.setText(getLabelText());
99
100                 fTextField= createTextInputField(result, SWT.BORDER);
101                 fTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
102
103                 layouter.perform(label, fTextField, 1);
104
105                 fRefactoring.generated_3646515038667707624(this, result, layouter);
106
107                 Button checkBox= new Button(result, SWT.CHECK);
108                 checkBox.setText(RefactoringMessages.ExtractMethodInputPage_throwRuntimeExceptions);
109                 checkBox.setSelection(fSettings.getBoolean(THROW_RUNTIME_EXCEPTIONS));
110                 checkBox.addSelectionListener(new SelectionAdapter() {
111                         @Override
112                         public void widgetSelected(SelectionEvent e) {
113                                 setRethrowRuntimeException(((Button)e.widget).getSelection());
114                         }
115                 });
116                 layouter.perform(checkBox);
117
118                 checkBox= new Button(result, SWT.CHECK);
119                 checkBox.setText(RefactoringMessages.ExtractMethodInputPage_generateJavadocComment);
120                 boolean generate= computeGenerateJavadoc();
121                 setGenerateJavadoc(generate);
122                 checkBox.setSelection(generate);
123                 checkBox.addSelectionListener(new SelectionAdapter() {
124                         @Override
125                         public void widgetSelected(SelectionEvent e) {
126                                 setGenerateJavadoc(((Button)e.widget).getSelection());
127                         }
128                 });
129                 layouter.perform(checkBox);
130
131                 int duplicates= fRefactoring.getNumberOfDuplicates();
132                 checkBox= new Button(result, SWT.CHECK);
133                 if (duplicates == 0) {
134                         checkBox.setText(RefactoringMessages.ExtractMethodInputPage_duplicates_none);
135                 } else  if (duplicates == 1) {
136                         checkBox.setText(RefactoringMessages.ExtractMethodInputPage_duplicates_single);
137                 } else {
138                         checkBox.setText(Messages.format(
139                                 RefactoringMessages.ExtractMethodInputPage_duplicates_multi,
140                                 new Integer(duplicates)));
141                 }
142                 checkBox.setSelection(fRefactoring.getReplaceDuplicates());
143                 checkBox.setEnabled(duplicates > 0);
144                 checkBox.addSelectionListener(new SelectionAdapter() {
145                         @Override
146                         public void widgetSelected(SelectionEvent e) {
147                                 fRefactoring.setReplaceDuplicates(((Button)e.widget).getSelection());
148                         }
149                 });
150                 layouter.perform(checkBox);
151
152                 label= new Label(result, SWT.SEPARATOR | SWT.HORIZONTAL);
153                 label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
154                 layouter.perform(label);
155
156                 createSignaturePreview(result, layouter);
157
158                 Dialog.applyDialogFont(result);
159                 PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.EXTRACT_METHOD_WIZARD_PAGE);
160         }
161
162         public String getLabel(ASTNode node) {
163                 if (node instanceof AbstractTypeDeclaration) {
164                         return ((AbstractTypeDeclaration)node).getName().getIdentifier();
165                 } else if (node instanceof AnonymousClassDeclaration) {
166                         if (node.getLocationInParent() == ClassInstanceCreation.ANONYMOUS_CLASS_DECLARATION_PROPERTY) {
167                                 ClassInstanceCreation creation= (ClassInstanceCreation)node.getParent();
168                                 return Messages.format(
169                                         RefactoringMessages.ExtractMethodInputPage_anonymous_type_label,
170                                         BasicElementLabels.getJavaElementName(ASTNodes.asString(creation.getType())));
171                         } else if (node.getLocationInParent() == EnumConstantDeclaration.ANONYMOUS_CLASS_DECLARATION_PROPERTY) {
172                                 EnumConstantDeclaration decl= (EnumConstantDeclaration)node.getParent();
173                                 return decl.getName().getIdentifier();
174                         }
175                 }
176                 return "UNKNOWN"; //$NON-NLS-1$
177         }
178
179         private Text createTextInputField(Composite parent, int style) {
180                 Text result= new Text(parent, style);
181                 result.addModifyListener(new ModifyListener() {
182                         public void modifyText(ModifyEvent e) {
183                                 textModified(getText());
184                         }
185                 });
186                 TextFieldNavigationHandler.install(result);
187                 return result;
188         }
189
190         public String getText() {
191                 if (fTextField == null)
192                         return null;
193                 return fTextField.getText();
194         }
195
196         private String getLabelText(){
197                 return RefactoringMessages.ExtractMethodInputPage_label_text;
198         }
199
200         public void setVisibility(Integer visibility) {
201                 fRefactoring.setVisibility(visibility.intValue());
202                 updatePreview(getText());
203         }
204
205         private void setRethrowRuntimeException(boolean value) {
206                 fSettings.put(THROW_RUNTIME_EXCEPTIONS, value);
207                 fRefactoring.setThrowRuntimeExceptions(value);
208                 updatePreview(getText());
209         }
210
211         private boolean computeGenerateJavadoc() {
212                 boolean result= fRefactoring.getGenerateJavadoc();
213                 if (result)
214                         return result;
215                 return fSettings.getBoolean(GENERATE_JAVADOC);
216         }
217
218         private void setGenerateJavadoc(boolean value) {
219                 fSettings.put(GENERATE_JAVADOC, value);
220                 fRefactoring.setGenerateJavadoc(value);
221         }
222
223         private void createSignaturePreview(Composite composite, RowLayouter layouter) {
224                 Label previewLabel= new Label(composite, SWT.NONE);
225                 previewLabel.setText(RefactoringMessages.ExtractMethodInputPage_signature_preview);
226                 layouter.perform(previewLabel);
227
228                 IPreferenceStore store= JavaPlugin.getDefault().getCombinedPreferenceStore();
229                 fSignaturePreview= new JavaSourceViewer(composite, null, null, false, SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP /*| SWT.BORDER*/, store);
230                 fSignaturePreview.generated_1537857327547168031(this, composite, layouter, store);
231         }
232
233         public void updatePreview(String text) {
234                 if (fSignaturePreview == null)
235                         return;
236
237                 if (text.length() == 0)
238                         text= "someMethodName";                  //$NON-NLS-1$
239
240                 fSignaturePreview.generated_7703893380234708108(this, text);
241         }
242
243         private void loadSettings() {
244                 fSettings= getDialogSettings().getSection(ExtractMethodWizard.DIALOG_SETTING_SECTION);
245                 if (fSettings == null) {
246                         fSettings= getDialogSettings().addNewSection(ExtractMethodWizard.DIALOG_SETTING_SECTION);
247                         fSettings.put(THROW_RUNTIME_EXCEPTIONS, false);
248                         fSettings.put(GENERATE_JAVADOC, JavaPreferencesSettings.getCodeGenerationSettings(fRefactoring.getCompilationUnit().getJavaProject()).createComments);
249                         fSettings.put(ACCESS_MODIFIER, Modifier.PRIVATE);
250                 }
251                 fRefactoring.generated_7319098909960398224(this);
252         }
253
254         
255
256         //---- Input validation ------------------------------------------------------
257
258         @Override
259         public void setVisible(boolean visible) {
260                 if (visible) {
261                         if (fFirstTime) {
262                                 fFirstTime= false;
263                                 setPageComplete(false);
264                                 updatePreview(getText());
265                                 fTextField.setFocus();
266                         } else {
267                                 setPageComplete(validatePage(true));
268                         }
269                 }
270                 super.setVisible(visible);
271         }
272
273         private void textModified(String text) {
274                 fRefactoring.setMethodName(text);
275                 RefactoringStatus status= validatePage(true);
276                 if (!status.hasFatalError()) {
277                         updatePreview(text);
278                 } else {
279                         fSignaturePreviewDocument.set(""); //$NON-NLS-1$
280                 }
281                 setPageComplete(status);
282         }
283
284         public void parameterModified() {
285                 updatePreview(getText());
286                 setPageComplete(validatePage(false));
287         }
288
289         private RefactoringStatus validatePage(boolean text) {
290                 RefactoringStatus result= new RefactoringStatus();
291                 if (text) {
292                         result.merge(validateMethodName());
293                         result.merge(validateParameters());
294                 } else {
295                         result.merge(validateParameters());
296                         result.merge(validateMethodName());
297                 }
298                 return result;
299         }
300
301         private RefactoringStatus validateMethodName() {
302                 RefactoringStatus result= new RefactoringStatus();
303                 String text= getText();
304                 if ("".equals(text)) { //$NON-NLS-1$
305                         result.addFatalError(RefactoringMessages.ExtractMethodInputPage_validation_emptyMethodName);
306                         return result;
307                 }
308                 result.merge(fRefactoring.checkMethodName());
309                 return result;
310         }
311
312         private RefactoringStatus validateParameters() {
313                 RefactoringStatus result= new RefactoringStatus();
314                 return fRefactoring.generated_3344829956599166741(result);
315         }
316 }