blob: df67261fb6889653bf37d37b0eabbe513194dab7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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
*******************************************************************************/
package org.eclipse.jdt.internal.ui.refactoring;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Text;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceIndirectionRefactoring;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
import org.eclipse.jdt.internal.ui.dialogs.TypeSelectionDialog2;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
import org.eclipse.jdt.internal.ui.util.SWTUtil;
/**
* @since 3.2
*/
public class IntroduceIndirectionInputPage extends UserInputWizardPage {
/**
* The name of the intermediary method to be created.
*/
private Text fIntermediaryMethodName;
private Combo fIntermediaryTypeName;
private static final int INTERMEDIARY_TYPE_COUNT= 10;
private static List fgIntermediaryTypes= new ArrayList(INTERMEDIARY_TYPE_COUNT);
/**
* Constructor for IntroduceIndirectionInputPage.
* @param name the name of the page
*/
public IntroduceIndirectionInputPage(String name) {
super(name);
}
private Text createIntermediaryNameCombo(Composite result) {
final Text textField= new Text(result, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
textField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
TextFieldNavigationHandler.install(textField);
return textField;
}
private Combo createIntermediaryTypeCombo(Composite composite) {
final Combo textCombo= new Combo(composite, SWT.SINGLE | SWT.BORDER);
textCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
textCombo.setItems((String[]) fgIntermediaryTypes.toArray(new String[fgIntermediaryTypes.size()]));
textCombo.setVisibleItemCount(INTERMEDIARY_TYPE_COUNT);
JavaTypeCompletionProcessor processor= new JavaTypeCompletionProcessor(false, false, true);
processor.setPackageFragment(getIntroduceIndirectionRefactoring().getInvocationPackage());
ControlContentAssistHelper.createComboContentAssistant(textCombo, processor);
TextFieldNavigationHandler.install(textCombo);
return textCombo;
}
/**
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
Composite result= new Composite(parent, SWT.NONE);
setControl(result);
GridLayout layout= new GridLayout();
layout.numColumns= 2;
result.setLayout(layout);
Label methNameLabel= new Label(result, SWT.NONE);
methNameLabel.setText(RefactoringMessages.IntroduceIndirectionInputPage_new_method_name);
fIntermediaryMethodName= createIntermediaryNameCombo(result);
final Label intermediaryTypeLabel= new Label(result, SWT.NONE);
intermediaryTypeLabel.setText(RefactoringMessages.IntroduceIndirectionInputPage_declaring_class);
Composite inner= new Composite(result, SWT.NONE);
GridLayout innerLayout= new GridLayout();
innerLayout.marginHeight= 0;
innerLayout.marginWidth= 0;
innerLayout.numColumns= 2;
inner.setLayout(innerLayout);
inner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fIntermediaryTypeName= createIntermediaryTypeCombo(inner);
fIntermediaryTypeName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Button browseTypes= new Button(inner, SWT.PUSH);
browseTypes.setText(RefactoringMessages.IntroduceIndirectionInputPage_browse);
GridData gd= new GridData();
gd.horizontalAlignment= GridData.END;
gd.widthHint= SWTUtil.getButtonWidthHint(browseTypes);
browseTypes.setLayoutData(gd);
final Button enableReferencesCheckBox= new Button(result, SWT.CHECK);
enableReferencesCheckBox.setText(RefactoringMessages.IntroduceIndirectionInputPage_update_references);
gd= new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan= 2;
gd.verticalIndent= 2;
enableReferencesCheckBox.setLayoutData(gd);
fIntermediaryMethodName.setText(getIntroduceIndirectionRefactoring().getIntermediaryMethodName());
fIntermediaryTypeName.setText(getIntroduceIndirectionRefactoring().getIntermediaryClassName());
fIntermediaryMethodName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateInput();
}
});
enableReferencesCheckBox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
getIntroduceIndirectionRefactoring().setEnableUpdateReferences(enableReferencesCheckBox.getSelection());
}
});
fIntermediaryTypeName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateInput();
}
});
browseTypes.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IType intermediaryType= chooseIntermediaryClass();
if (intermediaryType == null)
return;
fIntermediaryTypeName.setText(intermediaryType.getFullyQualifiedName());
}
});
if (getIntroduceIndirectionRefactoring().canEnableUpdateReferences())
enableReferencesCheckBox.setSelection(true);
else {
enableReferencesCheckBox.setSelection(false);
enableReferencesCheckBox.setEnabled(false);
getIntroduceIndirectionRefactoring().setEnableUpdateReferences(false);
}
fIntermediaryMethodName.setFocus();
fIntermediaryMethodName.selectAll();
validateInput();
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.INTRODUCE_INDIRECTION_WIZARD_PAGE);
}
private IType chooseIntermediaryClass() {
IJavaProject proj= getIntroduceIndirectionRefactoring().getProject();
if (proj == null)
return null;
IJavaElement[] elements= new IJavaElement[] { proj };
IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
TypeSelectionDialog2 dialog= new TypeSelectionDialog2(getShell(), false, getWizard().getContainer(), scope, IJavaSearchConstants.CLASS);
dialog.setTitle(RefactoringMessages.IntroduceIndirectionInputPage_dialog_choose_declaring_class);
dialog.setMessage(RefactoringMessages.IntroduceIndirectionInputPage_dialog_choose_declaring_class_long);
if (dialog.open() == Window.OK) {
return (IType) dialog.getFirstResult();
}
return null;
}
private IntroduceIndirectionRefactoring getIntroduceIndirectionRefactoring() {
return (IntroduceIndirectionRefactoring) getRefactoring();
}
private void validateInput() {
RefactoringStatus merged= new RefactoringStatus();
merged.merge(getIntroduceIndirectionRefactoring().setIntermediaryClassName(fIntermediaryTypeName.getText()));
merged.merge(getIntroduceIndirectionRefactoring().setIntermediaryMethodName(fIntermediaryMethodName.getText()));
setPageComplete(!merged.hasError());
int severity= merged.getSeverity();
String message= merged.getMessageMatchingSeverity(severity);
if (severity >= RefactoringStatus.INFO) {
setMessage(message, severity);
} else {
setMessage("", NONE); //$NON-NLS-1$
}
}
protected boolean performFinish() {
storeIntermediaryTypeName();
return super.performFinish();
}
public IWizardPage getNextPage() {
storeIntermediaryTypeName();
return super.getNextPage();
}
private void storeIntermediaryTypeName() {
String destination= fIntermediaryTypeName.getText();
if (!fgIntermediaryTypes.remove(destination) && fgIntermediaryTypes.size() >= INTERMEDIARY_TYPE_COUNT)
fgIntermediaryTypes.remove(fgIntermediaryTypes.size() - 1);
fgIntermediaryTypes.add(0, destination);
}
}