blob: f25033ce9b56b67d505fa98e9c8caa92e2256bd1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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 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.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.jface.window.Window;
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.IntroduceFactoryRefactoring;
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.util.SWTUtil;
/**
* @author rfuhrer
*/
public class IntroduceFactoryInputPage extends UserInputWizardPage {
/**
* The name of the factory method to be created.
*/
private Text fMethodName;
private RefactoringStatus fMethodNameStatus;
private RefactoringStatus fDestinationStatus;
/**
* Constructor for IntroduceFactoryInputPage.
* @param name the name of the page
*/
public IntroduceFactoryInputPage(String name) {
super(name);
}
private Text createTextInputField(Composite result) {
final Text textField = new Text(result, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
textField.selectAll();
TextFieldNavigationHandler.install(textField);
return textField;
}
/**
* @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.IntroduceFactoryInputPage_method_name);
fMethodName= createTextInputField(result);
GridData gd= new GridData(GridData.FILL_HORIZONTAL);
fMethodName.setLayoutData(gd);
fMethodName.setText(getUseFactoryRefactoring().getNewMethodName());
final Label factoryTypeLabel= new Label(result, SWT.NONE);
factoryTypeLabel.setText(RefactoringMessages.IntroduceFactoryInputPage_factoryClassLabel);
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));
final Text factoryTypeName= createTextInputField(inner);
factoryTypeName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Button browseTypes= new Button(inner, SWT.PUSH);
browseTypes.setText(RefactoringMessages.IntroduceFactoryInputPage_browseLabel);
gd= new GridData();
gd.horizontalAlignment= GridData.END;
gd.widthHint = SWTUtil.getButtonWidthHint(browseTypes);
browseTypes.setLayoutData(gd);
final Button protectCtorCB= new Button(result, SWT.CHECK);
protectCtorCB.setText(RefactoringMessages.IntroduceFactoryInputPage_protectConstructorLabel);
gd= new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan= 2;
protectCtorCB.setLayoutData(gd);
fMethodName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
fMethodNameStatus = getUseFactoryRefactoring().setNewMethodName(fMethodName.getText());
validateInput(true);
/*
boolean nameOk= status.isOK();
if (status.hasFatalError()) {
IntroduceFactoryInputPage.this.setPageComplete(false);
}
IntroduceFactoryInputPage.this.setPageComplete(!status.hasFatalError());
IntroduceFactoryInputPage.this.setErrorMessage(nameOk ?
"" : //$NON-NLS-1$
status.getMessageMatchingSeverity(RefactoringStatus.ERROR));
*/
}
});
protectCtorCB.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean isChecked = protectCtorCB.getSelection();
getUseFactoryRefactoring().setProtectConstructor(isChecked);
}
});
factoryTypeName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
fDestinationStatus= getUseFactoryRefactoring().setFactoryClass(factoryTypeName.getText());
validateInput(false);
/*
boolean nameOk= status.isOK();
IntroduceFactoryInputPage.this.setPageComplete(nameOk);
IntroduceFactoryInputPage.this.setErrorMessage(nameOk ? "" : //$NON-NLS-1$
status.getMessageMatchingSeverity(RefactoringStatus.ERROR));
*/
}
});
browseTypes.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IType factoryType= chooseFactoryClass();
if (factoryType == null)
return;
RefactoringStatus status= getUseFactoryRefactoring().setFactoryClass(factoryType.getFullyQualifiedName());
boolean nameOk= status.isOK();
factoryTypeName.setText(factoryType.getFullyQualifiedName());
IntroduceFactoryInputPage.this.setPageComplete(nameOk);
IntroduceFactoryInputPage.this.setErrorMessage(nameOk ? "" : //$NON-NLS-1$
status.getMessageMatchingSeverity(RefactoringStatus.ERROR));
}
});
// Set up the initial state of the various dialog options.
if (getUseFactoryRefactoring().canProtectConstructor())
protectCtorCB.setSelection(true);
else {
protectCtorCB.setSelection(false);
protectCtorCB.setEnabled(false);
getUseFactoryRefactoring().setProtectConstructor(false);
}
factoryTypeName.setText(getUseFactoryRefactoring().getFactoryClassName());
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.INTRODUCE_FACTORY_WIZARD_PAGE);
}
private IType chooseFactoryClass() {
IJavaProject proj= getUseFactoryRefactoring().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.IntroduceFactoryInputPage_chooseFactoryClass_title);
dialog.setMessage(RefactoringMessages.IntroduceFactoryInputPage_chooseFactoryClass_message);
if (dialog.open() == Window.OK) {
return (IType) dialog.getFirstResult();
}
return null;
}
private IntroduceFactoryRefactoring getUseFactoryRefactoring() {
return (IntroduceFactoryRefactoring) getRefactoring();
}
private void validateInput(boolean methodName) {
RefactoringStatus merged= new RefactoringStatus();
if (fMethodNameStatus != null && (methodName || fMethodNameStatus.hasError()))
merged.merge(fMethodNameStatus);
if (fDestinationStatus != null && (!methodName || fDestinationStatus.hasError()))
merged.merge(fDestinationStatus);
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$
}
}
}