<%@ jet package="comrel.refactoring" class="RefactoringWizardPage"
imports="org.eclipse.emf.refactor.refactoring.generator.core.* comrel.generator.refactoring.*"%>
<%ComrelConfig refactoringConfig = (ComrelConfig) argument; %>
/**
 * <copyright>
 * </copyright>
 *
 * $Id: RefactoringWizardPage.javajet,v 1.1 2010/07/15 13:08:44 tarendt Exp $
 */
package <%=refactoringConfig.getPackageName()%>;

import java.util.List;

import org.eclipse.emf.refactor.refactoring.runtime.ltk.ui.AbstractRefactoringWizard;
import org.eclipse.emf.refactor.refactoring.runtime.ui.IInputPageButtonCreator;
import org.eclipse.emf.refactor.refactoring.runtime.ui.InputPageButtonLoader;

import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

/**
 * Class for setting model refactoring specific parameters
 * by the user.
 * @generated
 */
public class RefactoringWizardPage extends 
				UserInputWizardPage implements Listener {
	
	/**
	 * Controller of the EMF model refactoring.
	 * @generated
	 */			
	private final RefactoringController controller;
	
<% for (ParameterInfo pc : refactoringConfig.getParameters()) { %>
	/**
	 * Label for each parameter.
	 * @generated
	 */	
	private Label <%=pc.getName()%>Label;
	
	/**
	 * TextField for each parameter.
	 * @generated
	 */
	private Text <%=pc.getName()%>Widget;
<% } %>

	/**
	 * Default constructor using a name and the controller of the 
	 * EMF model refactoring.
	 * @param name Name of the WizardPage.
	 * @param controller Controller of the EMF model refactoring.
	 * @generated
	 */
	public RefactoringWizardPage
		(String name, RefactoringController controller) {
		super(name);
		this.controller = controller;
	}

	/**
	 * @see org.eclipse.swt.widgets.Listener#
	 * handleEvent(org.eclipse.swt.widgets.Event)
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void handleEvent(Event event) {		
		getWizard().getContainer().updateButtons();

<% for (ParameterInfo pc : refactoringConfig.getParameters()) { %>				
		if (<%=pc.getName()%>Widget != null) {
			String <%=pc.getName()%> = <%=pc.getName()%>Widget.getText();
			if (!<%=pc.getName()%>.isEmpty()){
				((RefactoringDataManagement) 
						this.controller.getDataManagementObject()).
						getInPortByName("<%=pc.getName()%>").
						setValue(<%=pc.getName()%>);
			} else {
				((RefactoringDataManagement) 
						this.controller.getDataManagementObject()).
						getInPortByName("<%=pc.getName()%>").
						setValue("unspecified");
			}
		}
<% } %>

	}
	
	/**
	 * @see org.eclipse.jface.dialogs.IDialogPage#
	 * createControl(org.eclipse.swt.widgets.Composite)
	 * @generated
	 */
	@Override
	public void createControl(Composite parent) {
		Composite composite = new Composite(parent, SWT.NONE);
		GridLayout gl = new GridLayout();
		gl.numColumns = 2;
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		composite.setLayout(gl);
		
<% for (ParameterInfo pc : refactoringConfig.getParameters()) { %>	
		
		<%=pc.getName()%>Label = new Label(composite, SWT.NONE);
		<%=pc.getName()%>Label.setText("<% if (pc.getDescription() != null) {%> <%=pc.getDescription()%> <% } else { %> value of variable '<%=pc.getName()%>'<% } %>: ");		
		<%=pc.getName()%>Label.setEnabled(true);
		
		<%=pc.getName()%>Widget = new Text(composite, SWT.BORDER);
		<%=pc.getName()%>Widget.setToolTipText
				("value of variable '<%=pc.getName()%>'");
		<%=pc.getName()%>Widget.setEnabled(true);
		<%=pc.getName()%>Widget.setLayoutData(gd);
		<%=pc.getName()%>Widget.addListener(SWT.Modify, this);
		
<% } %>

		List<IInputPageButtonCreator> buttonCreators = InputPageButtonLoader.iNSTANCE.getInputPageButtonCreatorClasses();
		for(IInputPageButtonCreator creator : buttonCreators){
			creator.createButton(composite, controller, (AbstractRefactoringWizard)this.getWizard());
		}
		
		setControl(composite);
	}
	
}
	