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
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;
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;
26 import org.eclipse.jface.dialogs.Dialog;
27 import org.eclipse.jface.dialogs.IDialogSettings;
28 import org.eclipse.jface.preference.IPreferenceStore;
30 import org.eclipse.jface.text.Document;
32 import org.eclipse.ui.PlatformUI;
34 import org.eclipse.ltk.core.refactoring.RefactoringStatus;
35 import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
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;
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;
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;
59 public class ExtractMethodInputPage extends UserInputWizardPage {
61 public static final String PAGE_NAME= "ExtractMethodInputPage";//$NON-NLS-1$
63 public ExtractMethodRefactoring fRefactoring;
64 private Text fTextField;
65 private boolean fFirstTime;
66 public JavaSourceViewer fSignaturePreview;
67 public Document fSignaturePreviewDocument;
68 public IDialogSettings fSettings;
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$
75 public ExtractMethodInputPage() {
77 setImageDescriptor(JavaPluginImages.DESC_WIZBAN_REFACTOR_CU);
78 setDescription(DESCRIPTION);
80 fSignaturePreviewDocument= new Document();
83 public void createControl(Composite parent) {
84 fRefactoring= (ExtractMethodRefactoring)getRefactoring();
87 Composite result= new Composite(parent, SWT.NONE);
89 GridLayout layout= new GridLayout();
91 result.setLayout(layout);
92 RowLayouter layouter= new RowLayouter(2);
95 initializeDialogUnits(result);
97 Label label= new Label(result, SWT.NONE);
98 label.setText(getLabelText());
100 fTextField= createTextInputField(result, SWT.BORDER);
101 fTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
103 layouter.perform(label, fTextField, 1);
105 fRefactoring.generated_3646515038667707624(this, result, layouter);
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() {
112 public void widgetSelected(SelectionEvent e) {
113 setRethrowRuntimeException(((Button)e.widget).getSelection());
116 layouter.perform(checkBox);
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() {
125 public void widgetSelected(SelectionEvent e) {
126 setGenerateJavadoc(((Button)e.widget).getSelection());
129 layouter.perform(checkBox);
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);
138 checkBox.setText(Messages.format(
139 RefactoringMessages.ExtractMethodInputPage_duplicates_multi,
140 new Integer(duplicates)));
142 checkBox.setSelection(fRefactoring.getReplaceDuplicates());
143 checkBox.setEnabled(duplicates > 0);
144 checkBox.addSelectionListener(new SelectionAdapter() {
146 public void widgetSelected(SelectionEvent e) {
147 fRefactoring.setReplaceDuplicates(((Button)e.widget).getSelection());
150 layouter.perform(checkBox);
152 label= new Label(result, SWT.SEPARATOR | SWT.HORIZONTAL);
153 label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
154 layouter.perform(label);
156 createSignaturePreview(result, layouter);
158 Dialog.applyDialogFont(result);
159 PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.EXTRACT_METHOD_WIZARD_PAGE);
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();
176 return "UNKNOWN"; //$NON-NLS-1$
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());
186 TextFieldNavigationHandler.install(result);
190 public String getText() {
191 if (fTextField == null)
193 return fTextField.getText();
196 private String getLabelText(){
197 return RefactoringMessages.ExtractMethodInputPage_label_text;
200 public void setVisibility(Integer visibility) {
201 fRefactoring.setVisibility(visibility.intValue());
202 updatePreview(getText());
205 private void setRethrowRuntimeException(boolean value) {
206 fSettings.put(THROW_RUNTIME_EXCEPTIONS, value);
207 fRefactoring.setThrowRuntimeExceptions(value);
208 updatePreview(getText());
211 private boolean computeGenerateJavadoc() {
212 boolean result= fRefactoring.getGenerateJavadoc();
215 return fSettings.getBoolean(GENERATE_JAVADOC);
218 private void setGenerateJavadoc(boolean value) {
219 fSettings.put(GENERATE_JAVADOC, value);
220 fRefactoring.setGenerateJavadoc(value);
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);
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);
233 public void updatePreview(String text) {
234 if (fSignaturePreview == null)
237 if (text.length() == 0)
238 text= "someMethodName"; //$NON-NLS-1$
240 fSignaturePreview.generated_7703893380234708108(this, text);
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);
251 fRefactoring.generated_7319098909960398224(this);
256 //---- Input validation ------------------------------------------------------
259 public void setVisible(boolean visible) {
263 setPageComplete(false);
264 updatePreview(getText());
265 fTextField.setFocus();
267 setPageComplete(validatePage(true));
270 super.setVisible(visible);
273 private void textModified(String text) {
274 fRefactoring.setMethodName(text);
275 RefactoringStatus status= validatePage(true);
276 if (!status.hasFatalError()) {
279 fSignaturePreviewDocument.set(""); //$NON-NLS-1$
281 setPageComplete(status);
284 public void parameterModified() {
285 updatePreview(getText());
286 setPageComplete(validatePage(false));
289 private RefactoringStatus validatePage(boolean text) {
290 RefactoringStatus result= new RefactoringStatus();
292 result.merge(validateMethodName());
293 result.merge(validateParameters());
295 result.merge(validateParameters());
296 result.merge(validateMethodName());
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);
308 result.merge(fRefactoring.checkMethodName());
312 private RefactoringStatus validateParameters() {
313 RefactoringStatus result= new RefactoringStatus();
314 return fRefactoring.generated_3344829956599166741(result);