blob: 61f7960a3522ca9794f815b4f10d84ae8b0b9d99 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] remember selected access modifier - https://bugs.eclipse.org/bugs/show_bug.cgi?id=101233
*******************************************************************************/
package org.eclipse.dltk.javascript.internal.ui.refactoring.code;
import java.util.Iterator;
import java.util.List;
import org.eclipse.dltk.internal.javascript.corext.refactoring.ParameterInfo;
import org.eclipse.dltk.internal.javascript.corext.refactoring.code.ExtractMethodRefactoring;
import org.eclipse.dltk.internal.ui.dialogs.TextFieldNavigationHandler;
import org.eclipse.dltk.internal.ui.editor.ScriptSourceViewer;
import org.eclipse.dltk.internal.ui.refactoring.RefactoringMessages;
import org.eclipse.dltk.internal.ui.util.RowLayouter;
import org.eclipse.dltk.javascript.core.JavaScriptNature;
import org.eclipse.dltk.javascript.internal.ui.refactoring.ChangeParametersControl;
import org.eclipse.dltk.javascript.internal.ui.refactoring.IParameterListChangeListener;
import org.eclipse.dltk.javascript.internal.ui.text.JavascriptSourceViewerConfiguration;
import org.eclipse.dltk.ui.DLTKPluginImages;
import org.eclipse.dltk.ui.DLTKUILanguageManager;
import org.eclipse.dltk.ui.IDLTKUILanguageToolkit;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.Document;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
public class ExtractMethodInputPage extends UserInputWizardPage {
public static final String PAGE_NAME = "ExtractMethodInputPage";//$NON-NLS-1$
private ExtractMethodRefactoring fRefactoring;
private Text fTextField;
private boolean fFirstTime;
private ScriptSourceViewer fSignaturePreview;
private Document fSignaturePreviewDocument;
private IDialogSettings fSettings;
private static final String DESCRIPTION = RefactoringMessages.ExtractMethodInputPage_description;
private static final String THROW_RUNTIME_EXCEPTIONS = "ThrowRuntimeExceptions"; //$NON-NLS-1$
private static final String GENERATE_JAVADOC = "GenerateJavadoc"; //$NON-NLS-1$
private static final String ACCESS_MODIFIER = "AccessModifier"; //$NON-NLS-1$
public ExtractMethodInputPage() {
super(PAGE_NAME);
setImageDescriptor(DLTKPluginImages.DESC_WIZBAN_REFACTOR_CU);
setDescription(DESCRIPTION);
fFirstTime = true;
fSignaturePreviewDocument = new Document();
}
public void createControl(Composite parent) {
fRefactoring = (ExtractMethodRefactoring) getRefactoring();
loadSettings();
Composite result = new Composite(parent, SWT.NONE);
setControl(result);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
result.setLayout(layout);
RowLayouter layouter = new RowLayouter(2);
GridData gd = null;
initializeDialogUnits(result);
Label label = new Label(result, SWT.NONE);
label.setText(getLabelText());
fTextField = createTextInputField(result, SWT.BORDER);
fTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
layouter.perform(label, fTextField, 1);
/*
* Node[] destinations = fRefactoring.getDestinations(); if
* (destinations.length > 1) { label = new Label(result, SWT.NONE);
* label
* .setText(RefactoringMessages.ExtractMethodInputPage_destination_type
* ); final Combo combo = new Combo(result, SWT.READ_ONLY |
* SWT.DROP_DOWN); SWTUtil.setDefaultVisibleItemCount(combo); for (int i
* = 0; i < destinations.length; i++) { Node declaration =
* destinations[i]; combo.add(getLabel(declaration)); } combo.select(0);
* combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
* combo.addSelectionListener(new SelectionAdapter() { public void
* widgetSelected(SelectionEvent e) {
* fRefactoring.setDestination(combo.getSelectionIndex());
* updatePreview(getText()); } }); }
*/
// label = new Label(result, SWT.NONE);
// label.setText(RefactoringMessages.ExtractMethodInputPage_access_Modifiers);
Composite group = new Composite(result, SWT.NONE);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
layout = new GridLayout();
layout.numColumns = 4;
layout.marginWidth = 0;
group.setLayout(layout);
/*
* String[] labels = new String[] {
* RefactoringMessages.ExtractMethodInputPage_public,
* RefactoringMessages.ExtractMethodInputPage_protected,
* RefactoringMessages.ExtractMethodInputPage_default,
* RefactoringMessages.ExtractMethodInputPage_private }; Integer[] data
* = new Integer[] { new Integer(Modifier.PUBLIC), new
* Integer(Modifier.PROTECTED), new Integer(Modifier.NONE), new
* Integer(Modifier.PRIVATE) }; Integer visibility = new
* Integer(fRefactoring.getVisibility()); for (int i = 0; i <
* labels.length; i++) { Button radio = new Button(group, SWT.RADIO);
* radio.setText(labels[i]); radio.setData(data[i]); if
* (data[i].equals(visibility)) radio.setSelection(true);
* radio.addSelectionListener(new SelectionAdapter() { public void
* widgetSelected(SelectionEvent event) { final Integer selectedModifier
* = (Integer) event.widget .getData(); fSettings.put(ACCESS_MODIFIER,
* selectedModifier.intValue()); setVisibility(selectedModifier); } });
* }
*/
layouter.perform(label, group, 1);
if (!fRefactoring.getParameterInfos().isEmpty()) {
ChangeParametersControl cp = new ChangeParametersControl(result,
SWT.NONE,
RefactoringMessages.ExtractMethodInputPage_parameters,
new IParameterListChangeListener() {
public void parameterChanged(ParameterInfo parameter) {
parameterModified();
}
public void parameterListChanged() {
parameterModified();
}
public void parameterAdded(ParameterInfo parameter) {
updatePreview(getText());
}
}, ChangeParametersControl.Mode.EXTRACT_METHOD);
gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 2;
cp.setLayoutData(gd);
cp.setInput(fRefactoring.getParameterInfos());
}
/*
* Button checkBox = new Button(result, SWT.CHECK);
* checkBox.setText(RefactoringMessages
* .ExtractMethodInputPage_throwRuntimeExceptions);
* checkBox.setSelection
* (fSettings.getBoolean(THROW_RUNTIME_EXCEPTIONS));
* checkBox.addSelectionListener(new SelectionAdapter() { public void
* widgetSelected(SelectionEvent e) {
* setRethrowRuntimeException(((Button) e.widget).getSelection()); } });
* layouter.perform(checkBox);
*
* checkBox = new Button(result, SWT.CHECK);
* checkBox.setText(RefactoringMessages
* .ExtractMethodInputPage_generateJavadocComment); boolean generate =
* computeGenerateJavadoc(); setGenerateJavadoc(generate);
* checkBox.setSelection(generate); checkBox.addSelectionListener(new
* SelectionAdapter() { public void widgetSelected(SelectionEvent e) {
* setGenerateJavadoc(((Button) e.widget).getSelection()); } });
* layouter.perform(checkBox);
*
* int duplicates = fRefactoring.getNumberOfDuplicates(); checkBox = new
* Button(result, SWT.CHECK); if (duplicates == 0) {
* checkBox.setText(RefactoringMessages
* .ExtractMethodInputPage_duplicates_none); } else if (duplicates == 1)
* { checkBox.setText(RefactoringMessages.
* ExtractMethodInputPage_duplicates_single); } else {
* checkBox.setText(Messages
* .format(RefactoringMessages.ExtractMethodInputPage_duplicates_multi,
* new Integer(duplicates))); }
* checkBox.setSelection(fRefactoring.getReplaceDuplicates());
* checkBox.setEnabled(duplicates > 0);
* checkBox.addSelectionListener(new SelectionAdapter() { public void
* widgetSelected(SelectionEvent e) {
* fRefactoring.setReplaceDuplicates(((Button) e.widget)
* .getSelection()); } }); layouter.perform(checkBox);
*/
label = new Label(result, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
layouter.perform(label);
createSignaturePreview(result, layouter);
Dialog.applyDialogFont(result);
/*
* PlatformUI .getWorkbench() .getHelpSystem() .setHelp(getControl(),
* IJavaHelpContextIds.EXTRACT_METHOD_WIZARD_PAGE);
*/
}
/*
* private String getLabel(ASTNode node) { if (node instanceof
* AbstractTypeDeclaration) { return ((AbstractTypeDeclaration)
* node).getName().getIdentifier(); } else if (node instanceof
* AnonymousClassDeclaration) { if (node.getLocationInParent() ==
* ClassInstanceCreation.ANONYMOUS_CLASS_DECLARATION_PROPERTY) {
* ClassInstanceCreation creation = (ClassInstanceCreation) node
* .getParent(); return Messages
* .format(RefactoringMessages.ExtractMethodInputPage_anonymous_type_label,
* BasicElementLabels.getJavaElementName(ASTNodes
* .asString(creation.getType()))); } else if (node.getLocationInParent() ==
* EnumConstantDeclaration.ANONYMOUS_CLASS_DECLARATION_PROPERTY) {
* EnumConstantDeclaration decl = (EnumConstantDeclaration) node
* .getParent(); return decl.getName().getIdentifier(); } } return
* "UNKNOWN"; //$NON-NLS-1$ }
*/
private Text createTextInputField(Composite parent, int style) {
Text result = new Text(parent, style);
result.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
textModified(getText());
}
});
TextFieldNavigationHandler.install(result);
return result;
}
private String getText() {
if (fTextField == null)
return null;
return fTextField.getText();
}
private String getLabelText() {
return RefactoringMessages.ExtractMethodInputPage_label_text;
}
/*
* private void setVisibility(Integer visibility) {
* fRefactoring.setVisibility(visibility.intValue());
* updatePreview(getText()); }
*
* private void setRethrowRuntimeException(boolean value) {
* fSettings.put(THROW_RUNTIME_EXCEPTIONS, value);
* fRefactoring.setThrowRuntimeExceptions(value); updatePreview(getText());
* }
*
* private boolean computeGenerateJavadoc() { boolean result =
* fRefactoring.getGenerateJavadoc(); if (result) return result; return
* fSettings.getBoolean(GENERATE_JAVADOC); }
*
* private void setGenerateJavadoc(boolean value) {
* fSettings.put(GENERATE_JAVADOC, value);
* fRefactoring.setGenerateJavadoc(value); }
*/
private void createSignaturePreview(Composite composite,
RowLayouter layouter) {
Label previewLabel = new Label(composite, SWT.NONE);
previewLabel
.setText(RefactoringMessages.ExtractMethodInputPage_signature_preview);
layouter.perform(previewLabel);
IDLTKUILanguageToolkit toolkit = DLTKUILanguageManager
.getLanguageToolkit(JavaScriptNature.NATURE_ID);
IPreferenceStore store = toolkit.getCombinedPreferenceStore();
fSignaturePreview = new ScriptSourceViewer(composite, null, null,
false,
SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP /* | SWT.BORDER */,
store);
fSignaturePreview.configure(new JavascriptSourceViewerConfiguration(
toolkit.getTextTools().getColorManager(), store, null, null));
// fSignaturePreview.getTextWidget().setFont(
// JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
fSignaturePreview.getTextWidget().setBackground(
composite.getBackground());
fSignaturePreview.setDocument(fSignaturePreviewDocument);
fSignaturePreview.setEditable(false);
// Layouting problems with wrapped text: see
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=9866
Control signaturePreviewControl = fSignaturePreview.getControl();
PixelConverter pixelConverter = new PixelConverter(
signaturePreviewControl);
GridData gdata = new GridData(GridData.FILL_BOTH);
gdata.widthHint = pixelConverter.convertWidthInCharsToPixels(50);
gdata.heightHint = pixelConverter.convertHeightInCharsToPixels(2);
signaturePreviewControl.setLayoutData(gdata);
layouter.perform(signaturePreviewControl);
}
private void updatePreview(String text) {
if (fSignaturePreview == null)
return;
if (text.length() == 0)
text = "someMethodName"; //$NON-NLS-1$
int top = fSignaturePreview.getTextWidget().getTopPixel();
String signature;
try {
signature = fRefactoring.getSignature(text);
} catch (IllegalArgumentException e) {
signature = ""; //$NON-NLS-1$
}
fSignaturePreviewDocument.set(signature);
fSignaturePreview.getTextWidget().setTopPixel(top);
}
private void loadSettings() {
fSettings = getDialogSettings().getSection(
ExtractMethodWizard.DIALOG_SETTING_SECTION);
if (fSettings == null) {
fSettings = getDialogSettings().addNewSection(
ExtractMethodWizard.DIALOG_SETTING_SECTION);
/*
* fSettings.put(THROW_RUNTIME_EXCEPTIONS, false); fSettings
* .put(GENERATE_JAVADOC, JavaPreferencesSettings
* .getCodeGenerationSettings(fRefactoring .getCompilationUnit()
* .getJavaProject()).createComments);
* fSettings.put(ACCESS_MODIFIER, Modifier.PRIVATE);
*/
}
/*
* fRefactoring.setThrowRuntimeExceptions(fSettings
* .getBoolean(THROW_RUNTIME_EXCEPTIONS)); final String accessModifier =
* fSettings.get(ACCESS_MODIFIER); if (accessModifier != null) {
* fRefactoring.setVisibility(Integer.parseInt(accessModifier)); }
*/
}
// ---- Input validation
// ------------------------------------------------------
@Override
public void setVisible(boolean visible) {
if (visible) {
if (fFirstTime) {
fFirstTime = false;
setPageComplete(false);
updatePreview(getText());
fTextField.setFocus();
} else {
setPageComplete(validatePage(true));
}
}
super.setVisible(visible);
}
private void textModified(String text) {
fRefactoring.setMethodName(text);
RefactoringStatus status = validatePage(true);
if (!status.hasFatalError()) {
updatePreview(text);
} else {
fSignaturePreviewDocument.set(""); //$NON-NLS-1$
}
setPageComplete(status);
}
private void parameterModified() {
updatePreview(getText());
setPageComplete(validatePage(false));
}
private RefactoringStatus validatePage(boolean text) {
RefactoringStatus result = new RefactoringStatus();
if (text) {
result.merge(validateMethodName());
result.merge(validateParameters());
} else {
result.merge(validateParameters());
result.merge(validateMethodName());
}
return result;
}
private RefactoringStatus validateMethodName() {
RefactoringStatus result = new RefactoringStatus();
String text = getText();
if ("".equals(text)) { //$NON-NLS-1$
result.addFatalError(RefactoringMessages.ExtractMethodInputPage_validation_emptyMethodName);
return result;
}
result.merge(fRefactoring.checkMethodName());
return result;
}
private RefactoringStatus validateParameters() {
RefactoringStatus result = new RefactoringStatus();
List parameters = fRefactoring.getParameterInfos();
for (Iterator iter = parameters.iterator(); iter.hasNext();) {
ParameterInfo info = (ParameterInfo) iter.next();
if ("".equals(info.getNewName())) { //$NON-NLS-1$
result.addFatalError(RefactoringMessages.ExtractMethodInputPage_validation_emptyParameterName);
return result;
}
}
result.merge(fRefactoring.checkParameterNames());
// result.merge(fRefactoring.checkVarargOrder());
return result;
}
}