content: /*******************************************************************************
   * Copyright (c) 2000, 2008 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.wst.jsdt.internal.ui.refactoring;
  
  import org.eclipse.jface.window.Window;
  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.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.ui.PlatformUI;
  import org.eclipse.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.core.IJavaScriptProject;
  import org.eclipse.wst.jsdt.core.IType;
  import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchConstants;
  import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchScope;
  import org.eclipse.wst.jsdt.core.search.SearchEngine;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.IntroduceFactoryRefactoring;
  import org.eclipse.wst.jsdt.internal.ui.IJavaHelpContextIds;
  import org.eclipse.wst.jsdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
  import org.eclipse.wst.jsdt.internal.ui.dialogs.TextFieldNavigationHandler;
  import org.eclipse.wst.jsdt.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() {
  		IJavaScriptProject	proj= getUseFactoryRefactoring().getProject();
  
  		if (proj == null)
  			return null;
  
  		IJavaScriptElement[] elements= new IJavaScriptElement[] { proj };
  		IJavaScriptSearchScope scope= SearchEngine.createJavaSearchScope(elements);
  
  		FilteredTypesSelectionDialog dialog= new FilteredTypesSelectionDialog(
  			getShell(), false, getWizard().getContainer(), scope, IJavaScriptSearchConstants.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$
  		}
  	}
   }
  