/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation 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: * 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; } }