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.code;
  
  import org.eclipse.jface.dialogs.Dialog;
  import org.eclipse.jface.preference.IPreferenceStore;
  import org.eclipse.jface.resource.JFaceResources;
  import org.eclipse.jface.text.Document;
  import org.eclipse.jface.text.DocumentEvent;
  import org.eclipse.jface.text.IDocumentListener;
  import org.eclipse.ltk.core.refactoring.RefactoringStatus;
  import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
  import org.eclipse.swt.SWT;
  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.Control;
  import org.eclipse.swt.widgets.Label;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.ReplaceInvocationsRefactoring;
  import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
  import org.eclipse.wst.jsdt.internal.ui.javaeditor.JavaSourceViewer;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.RefactoringMessages;
  import org.eclipse.wst.jsdt.internal.ui.util.PixelConverter;
  import org.eclipse.wst.jsdt.ui.JavaScriptElementLabels;
  import org.eclipse.wst.jsdt.ui.PreferenceConstants;
  import org.eclipse.wst.jsdt.ui.text.JavaScriptSourceViewerConfiguration;
  
  public class ReplaceInvocationsInputPage extends UserInputWizardPage {
  
  	public static final String PAGE_NAME= "ReplaceInvocationsInputPage";//$NON-NLS-1$
  
  	private ReplaceInvocationsRefactoring fRefactoring;
  
  	private static final long LABEL_FLAGS= JavaScriptElementLabels.M_PRE_TYPE_PARAMETERS | JavaScriptElementLabels.M_PRE_RETURNTYPE | JavaScriptElementLabels.M_PARAMETER_TYPES | JavaScriptElementLabels.M_PARAMETER_NAMES | JavaScriptElementLabels.M_EXCEPTIONS;
  	
  	public ReplaceInvocationsInputPage() {
  		super(PAGE_NAME);
  	}
  
  	public void createControl(Composite parent) {
  		initializeDialogUnits(parent);
  		fRefactoring= (ReplaceInvocationsRefactoring) getRefactoring();
  		
  		Composite result= new Composite(parent, SWT.NONE);
  		setControl(result);
  		GridLayout layout= new GridLayout();
  		result.setLayout(layout);
  
  		createMethodSignature(result);
  		
  		Label separator= new Label(parent, SWT.NONE);
  		GridData gridData= new GridData(SWT.FILL, SWT.FILL, false, false);
  		gridData.heightHint= 5;
  		separator.setLayoutData(gridData);
  		
  		Label bodyLabel= new Label(result, SWT.NONE);
  		bodyLabel.setText(RefactoringMessages.ReplaceInvocationsInputPage_replaceInvocationsBy);
  		
  		createBody(result);
  		
  		Button replaceAll= new Button(result, SWT.CHECK);
  		replaceAll.setText(RefactoringMessages.ReplaceInvocationsInputPage_replaceAll);
  		boolean canSingle= fRefactoring.canReplaceSingle();
  //		replaceAll.setEnabled(canSingle);
  		replaceAll.setEnabled(false); // does not work for now...
  		replaceAll.setSelection(! canSingle);
  		replaceAll.addSelectionListener(new SelectionAdapter() {
  			public void widgetSelected(SelectionEvent event) {
  				boolean all= ((Button) event.widget).getSelection();
  				changeMode(all ? ReplaceInvocationsRefactoring.Mode.REPLACE_ALL : ReplaceInvocationsRefactoring.Mode.REPLACE_SINGLE);
  			}
  		});
  		
  		Dialog.applyDialogFont(result);
  	}
  
  	private void createMethodSignature(Composite parent) {
  		IPreferenceStore store= JavaScriptPlugin.getDefault().getCombinedPreferenceStore();
  		JavaSourceViewer signatureViewer= new JavaSourceViewer(parent, null, null, false, SWT.READ_ONLY | SWT.WRAP /*| SWT.BORDER*/, store);
  		signatureViewer.configure(new JavaScriptSourceViewerConfiguration(JavaScriptPlugin.getDefault().getJavaTextTools().getColorManager(), store, null, null));
  		signatureViewer.getTextWidget().setFont(JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
  		signatureViewer.getTextWidget().setBackground(parent.getBackground());
  		String signatureLabel= JavaScriptElementLabels.getElementLabel(fRefactoring.getMethod(), LABEL_FLAGS);
  		signatureViewer.setDocument(new Document(signatureLabel));
  		signatureViewer.setEditable(false);
  		
  		Control signatureControl= signatureViewer.getControl();
  		PixelConverter pixelConverter= new PixelConverter(signatureControl);
  		GridData gdata= new GridData(GridData.FILL_HORIZONTAL);
  		gdata.widthHint= pixelConverter.convertWidthInCharsToPixels(50);
  		signatureControl.setLayoutData(gdata);
  	}
  
  	private void createBody(Composite parent) {
  		IPreferenceStore store= JavaScriptPlugin.getDefault().getCombinedPreferenceStore();
  		JavaSourceViewer bodyEditor= new JavaSourceViewer(parent, null, null, false, SWT.V_SCROLL | SWT.WRAP | SWT.BORDER, store);
  		bodyEditor.configure(new JavaScriptSourceViewerConfiguration(JavaScriptPlugin.getDefault().getJavaTextTools().getColorManager(), store, null, null));
  		bodyEditor.getTextWidget().setFont(JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
  		Document bodyDocument= new Document(getInitialBody());
  		bodyEditor.setDocument(bodyDocument);
  		bodyEditor.setEditable(true);
  		
  		Control bodyControl= bodyEditor.getControl();
  		PixelConverter pixelConverter= new PixelConverter(bodyControl);
  		GridData gdata= new GridData(GridData.FILL_BOTH);
  		gdata.widthHint= pixelConverter.convertWidthInCharsToPixels(50);
  		gdata.minimumHeight= pixelConverter.convertHeightInCharsToPixels(5);
  		bodyControl.setLayoutData(gdata);
  		bodyControl.setFocus();
  		
  		bodyDocument.addDocumentListener(new IDocumentListener() {
  			public void documentAboutToBeChanged(DocumentEvent event) {
  			}
  			public void documentChanged(DocumentEvent event) {
  				try {
  					fRefactoring.setBody(event.getDocument().get(), fRefactoring.getMethod().getParameterNames());
  				} catch (JavaScriptModelException ex) {
  					// TODO Auto-generated catch block
  					JavaScriptPlugin.log(ex);
  				}
  			}
  		});
  	}
  	
  	private String getInitialBody() {
  		//TODO
  		return ""; //$NON-NLS-1$
  		
  	}
  
  	private void changeMode(ReplaceInvocationsRefactoring.Mode mode) {
  		RefactoringStatus status;
  		try {
  			status= fRefactoring.setCurrentMode(mode);
  		} catch (JavaScriptModelException e) {
  			status= RefactoringStatus.createFatalErrorStatus(e.getMessage());
  		}
  		setPageComplete(status);
  	}	
  }
  