//Generated with EGF 1.5.0.qualifier
package org.eclipse.egf.emf.pattern.editor;

import org.eclipse.egf.emf.pattern.base.*;
import org.eclipse.emf.codegen.ecore.genmodel.*;
import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
import org.eclipse.emf.codegen.util.*;
import org.eclipse.emf.ecore.util.*;
import org.eclipse.emf.common.util.*;
import org.eclipse.egf.common.helper.*;
import java.util.*;
import org.eclipse.emf.ecore.*;
import org.eclipse.egf.model.pattern.*;
import org.eclipse.egf.pattern.execution.*;
import org.eclipse.egf.pattern.query.*;

public class ModelWizard extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
	protected static String nl;

	public static synchronized ModelWizard create(String lineSeparator) {
		nl = lineSeparator;
		ModelWizard result = new ModelWizard();
		nl = null;
		return result;
	}

	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
	protected final String TEXT_1 = "";
	protected final String TEXT_2 = NL + "package ";
	protected final String TEXT_3 = ";" + NL + "" + NL + "" + NL + "import java.util.ArrayList;" + NL
			+ "import java.util.Arrays;" + NL + "import java.util.Collection;" + NL + "import java.util.Collections;"
			+ NL + "import java.util.HashMap;";
	protected final String TEXT_4 = NL + "import java.util.Iterator;";
	protected final String TEXT_5 = NL + "import java.util.List;" + NL + "import java.util.Map;" + NL
			+ "import java.util.MissingResourceException;" + NL + "import java.util.StringTokenizer;" + NL;
	protected final String TEXT_6 = NL + "import org.eclipse.emf.common.CommonPlugin;" + NL;
	protected final String TEXT_7 = NL + "import org.eclipse.emf.common.util.URI;" + NL + "" + NL
			+ "import org.eclipse.emf.ecore.EClass;" + NL + "import org.eclipse.emf.ecore.EClassifier;" + NL + "" + NL
			+ "import org.eclipse.emf.ecore.resource.Resource;" + NL
			+ "import org.eclipse.emf.ecore.resource.ResourceSet;" + NL + "" + NL
			+ "import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;" + NL + "" + NL
			+ "import org.eclipse.emf.ecore.EObject;" + NL + "" + NL + "import org.eclipse.emf.ecore.xmi.XMLResource;"
			+ NL + "" + NL + "import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;" + NL;
	protected final String TEXT_8 = NL + "import org.eclipse.core.resources.IContainer;" + NL
			+ "import org.eclipse.core.resources.IFile;" + NL + "import org.eclipse.core.resources.IFolder;" + NL
			+ "import org.eclipse.core.resources.IProject;" + NL + "import org.eclipse.core.resources.IResource;" + NL
			+ "import org.eclipse.core.resources.ResourcesPlugin;" + NL;
	protected final String TEXT_9 = NL + "import org.eclipse.core.runtime.IProgressMonitor;" + NL + "" + NL
			+ "import org.eclipse.jface.dialogs.MessageDialog;" + NL + "" + NL
			+ "import org.eclipse.jface.viewers.IStructuredSelection;" + NL + "" + NL
			+ "import org.eclipse.jface.wizard.Wizard;" + NL + "import org.eclipse.jface.wizard.WizardPage;" + NL + ""
			+ NL + "import org.eclipse.swt.SWT;" + NL + "" + NL + "import org.eclipse.swt.events.ModifyListener;" + NL
			+ "import org.eclipse.swt.events.ModifyEvent;" + NL + "" + NL + "import org.eclipse.swt.layout.GridData;"
			+ NL + "import org.eclipse.swt.layout.GridLayout;" + NL + "" + NL + "import org.eclipse.swt.widgets.Combo;"
			+ NL + "import org.eclipse.swt.widgets.Composite;" + NL + "import org.eclipse.swt.widgets.Label;" + NL + ""
			+ NL + "import org.eclipse.ui.INewWizard;" + NL + "import org.eclipse.ui.IWorkbench;" + NL;
	protected final String TEXT_10 = NL + "import org.eclipse.ui.actions.WorkspaceModifyOperation;" + NL + "" + NL
			+ "import org.eclipse.ui.dialogs.WizardNewFileCreationPage;" + NL + "" + NL
			+ "import org.eclipse.ui.part.FileEditorInput;" + NL + "import org.eclipse.ui.part.ISetSelectionTarget;"
			+ NL;
	protected final String TEXT_11 = NL + "import ";
	protected final String TEXT_12 = ";";
	protected final String TEXT_13 = NL + "import ";
	protected final String TEXT_14 = ";" + NL + "import ";
	protected final String TEXT_15 = ";" + NL + NL;
	protected final String TEXT_16 = NL + NL + NL + "/**" + NL
			+ " * This is a simple wizard for creating a new model file." + NL + " * <!-- begin-user-doc -->" + NL
			+ " * <!-- end-user-doc -->" + NL + " * @generated" + NL + " */" + NL + "public class ";
	protected final String TEXT_17 = " extends Wizard implements INewWizard" + NL + "{";
	protected final String TEXT_18 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
	protected final String TEXT_19 = " copyright = ";
	protected final String TEXT_20 = ";";
	protected final String TEXT_21 = NL;
	protected final String TEXT_22 = NL + "\t/**" + NL + "\t * The supported extensions for created files." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic static final ";
	protected final String TEXT_23 = " FILE_EXTENSIONS =" + NL + "\t\tCollections.unmodifiableList(Arrays.asList(";
	protected final String TEXT_24 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_25 = "FilenameExtensions\").split(\"\\\\s*,\\\\s*\")));";
	protected final String TEXT_26 = NL + NL + "\t/**" + NL
			+ "\t * A formatted list of supported file extensions, suitable for display." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic static final String FORMATTED_FILE_EXTENSIONS =" + NL + "\t\t";
	protected final String TEXT_27 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_28 = "FilenameExtensions\").replaceAll(\"\\\\s*,\\\\s*\", \", \");";
	protected final String TEXT_29 = NL + NL + "\t/**" + NL + "\t * This caches an instance of the model package." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected ";
	protected final String TEXT_30 = " ";
	protected final String TEXT_31 = " = ";
	protected final String TEXT_32 = ".eINSTANCE;" + NL + "" + NL + "\t/**" + NL
			+ "\t * This caches an instance of the model factory." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_33 = " ";
	protected final String TEXT_34 = " = ";
	protected final String TEXT_35 = ".get";
	protected final String TEXT_36 = "();" + NL;
	protected final String TEXT_37 = NL + "\t/**" + NL + "\t * This is the file creation page." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected ";
	protected final String TEXT_38 = "NewFileCreationPage newFileCreationPage;" + NL;
	protected final String TEXT_39 = NL + "\t/**" + NL + "\t * This is the initial object creation page." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected ";
	protected final String TEXT_40 = "InitialObjectCreationPage initialObjectCreationPage;" + NL + "" + NL + "\t/**"
			+ NL + "\t * Remember the selection during initialization for populating the default container." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected IStructuredSelection selection;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Remember the workbench during initialization." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprotected IWorkbench workbench;" + NL + "" + NL + "\t/**";
	protected final String TEXT_41 = NL + "\t * Caches the names of the types that can be created as the root object.";
	protected final String TEXT_42 = NL + "\t * Caches the names of the features representing global elements.";
	protected final String TEXT_43 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_44 = " initialObjectNames;" + NL + "" + NL + "\t/**" + NL
			+ "\t * This just records the information." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tpublic void init(IWorkbench workbench, IStructuredSelection selection)" + NL + "\t{" + NL
			+ "\t\tthis.workbench = workbench;" + NL + "\t\tthis.selection = selection;" + NL + "\t\tsetWindowTitle(";
	protected final String TEXT_45 = ".INSTANCE.getString(\"_UI_Wizard_label\"));";
	protected final String TEXT_46 = NL
			+ "\t\tsetDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(";
	protected final String TEXT_47 = ".INSTANCE.getImage(\"full/wizban/New";
	protected final String TEXT_48 = "\")));";
	protected final String TEXT_49 = NL + "\t}" + NL + "" + NL + "\t/**";
	protected final String TEXT_50 = NL + "\t * Returns the names of the types that can be created as the root object.";
	protected final String TEXT_51 = NL + "\t * Returns the names of the features representing global elements.";
	protected final String TEXT_52 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_53 = " getInitialObjectNames()" + NL + "\t{" + NL
			+ "\t\tif (initialObjectNames == null)" + NL + "\t\t{" + NL + "\t\t\tinitialObjectNames = new ";
	protected final String TEXT_54 = "();";
	protected final String TEXT_55 = NL + "\t\t\tfor (EClassifier eClassifier : ";
	protected final String TEXT_56 = ".getEClassifiers())";
	protected final String TEXT_57 = NL + "\t\t\tfor (Iterator classifiers = ";
	protected final String TEXT_58 = ".getEClassifiers().iterator(); classifiers.hasNext(); )";
	protected final String TEXT_59 = NL + "\t\t\t{";
	protected final String TEXT_60 = NL + "\t\t\t\tEClassifier eClassifier = (EClassifier)classifiers.next();";
	protected final String TEXT_61 = NL + "\t\t\t\tif (eClassifier instanceof EClass)" + NL + "\t\t\t\t{" + NL
			+ "\t\t\t\t\tEClass eClass = (EClass)eClassifier;" + NL + "\t\t\t\t\tif (!eClass.isAbstract())" + NL
			+ "\t\t\t\t\t{" + NL + "\t\t\t\t\t\tinitialObjectNames.add(eClass.getName());" + NL + "\t\t\t\t\t}" + NL
			+ "\t\t\t\t}" + NL + "\t\t\t}";
	protected final String TEXT_62 = NL + "\t\t\tfor (";
	protected final String TEXT_63 = " eStructuralFeature : ";
	protected final String TEXT_64 = ".INSTANCE.getAllElements(";
	protected final String TEXT_65 = ".INSTANCE.getDocumentRoot(";
	protected final String TEXT_66 = ")))";
	protected final String TEXT_67 = NL + "\t\t\tfor (Iterator elements = ";
	protected final String TEXT_68 = ".INSTANCE.getAllElements(";
	protected final String TEXT_69 = ".INSTANCE.getDocumentRoot(";
	protected final String TEXT_70 = ")).iterator(); elements.hasNext(); )";
	protected final String TEXT_71 = NL + "\t\t\t{";
	protected final String TEXT_72 = NL + "\t\t\t\t";
	protected final String TEXT_73 = " eStructuralFeature = (";
	protected final String TEXT_74 = ")elements.next();";
	protected final String TEXT_75 = NL + "\t\t\t\tif (eStructuralFeature.isChangeable())" + NL + "\t\t\t\t{" + NL
			+ "\t\t\t\t\tEClassifier eClassifier = eStructuralFeature.getEType();" + NL
			+ "\t\t\t\t\tif (eClassifier instanceof EClass)" + NL + "\t\t\t\t\t{" + NL
			+ "\t\t\t\t\t\tEClass eClass = (EClass)eClassifier;" + NL + "\t\t\t\t\t\tif (!eClass.isAbstract())" + NL
			+ "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\tinitialObjectNames.add(eStructuralFeature.getName());" + NL
			+ "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t}" + NL + "\t\t\t\t}" + NL + "\t\t\t}";
	protected final String TEXT_76 = NL + "\t\t\tCollections.sort(initialObjectNames, ";
	protected final String TEXT_77 = "CommonPlugin.INSTANCE.getComparator()";
	protected final String TEXT_78 = "java.text.Collator.getInstance()";
	protected final String TEXT_79 = ");" + NL + "\t\t}" + NL + "\t\treturn initialObjectNames;" + NL + "\t}" + NL + ""
			+ NL + "\t/**" + NL + "\t * Create a new model." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprotected EObject createInitialModel()" + NL + "\t{";
	protected final String TEXT_80 = NL + "\t\tEClass eClass = (EClass)";
	protected final String TEXT_81 = ".getEClassifier(initialObjectCreationPage.getInitialObjectName());" + NL
			+ "\t\tEObject rootObject = ";
	protected final String TEXT_82 = ".create(eClass);";
	protected final String TEXT_83 = NL + "\t\tEClass eClass = ";
	protected final String TEXT_84 = ".INSTANCE.getDocumentRoot(";
	protected final String TEXT_85 = ");" + NL
			+ "\t\tEStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(initialObjectCreationPage.getInitialObjectName());"
			+ NL + "\t\tEObject rootObject = ";
	protected final String TEXT_86 = ".create(eClass);" + NL + "\t\trootObject.eSet(eStructuralFeature, ";
	protected final String TEXT_87 = ".create((EClass)eStructuralFeature.getEType()));";
	protected final String TEXT_88 = NL + "\t\treturn rootObject;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
			+ "\t * Do the work after everything is specified." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_89 = NL + "\t@Override";
	protected final String TEXT_90 = NL + "\tpublic boolean performFinish()" + NL + "\t{" + NL + "\t\ttry" + NL
			+ "\t\t{";
	protected final String TEXT_91 = NL + "\t\t\t// Get the URI of the model file." + NL + "\t\t\t//" + NL
			+ "\t\t\tfinal URI fileURI = getModelURI();" + NL + "\t\t\tif (new ";
	protected final String TEXT_92 = "(fileURI.toFileString()).exists())" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tif (!MessageDialog.openQuestion" + NL + "\t\t\t\t\t\t(getShell()," + NL + "\t\t\t\t\t\t ";
	protected final String TEXT_93 = ".INSTANCE.getString(\"_UI_Question_title\"),";
	protected final String TEXT_94 = NL + "\t\t\t\t\t\t ";
	protected final String TEXT_95 = ".INSTANCE.getString(\"_WARN_FileConflict\", new String []{ fileURI.toFileString() })))";
	protected final String TEXT_96 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tinitialObjectCreationPage.selectFileField();"
			+ NL + "\t\t\t\t\treturn false;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\t" + NL
			+ "\t\t\t// Do the work within an operation." + NL + "\t\t\t//" + NL + "\t\t\t";
	protected final String TEXT_97 = " operation = new ";
	protected final String TEXT_98 = "()" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tpublic void run(IProgressMonitor progressMonitor)";
	protected final String TEXT_99 = NL + "\t\t\t// Remember the file." + NL + "\t\t\t//" + NL
			+ "\t\t\tfinal IFile modelFile = getModelFile();" + NL + "" + NL
			+ "\t\t\t// Do the work within an operation." + NL + "\t\t\t//" + NL
			+ "\t\t\tWorkspaceModifyOperation operation =" + NL + "\t\t\t\tnew WorkspaceModifyOperation()" + NL
			+ "\t\t\t\t{";
	protected final String TEXT_100 = NL + "\t\t\t\t\t@Override";
	protected final String TEXT_101 = NL + "\t\t\t\t\tprotected void execute(IProgressMonitor progressMonitor)";
	protected final String TEXT_102 = NL + "\t\t\t\t\t{" + NL + "\t\t\t\t\t\ttry" + NL + "\t\t\t\t\t\t{" + NL
			+ "\t\t\t\t\t\t\t// Create a resource set" + NL + "\t\t\t\t\t\t\t//" + NL
			+ "\t\t\t\t\t\t\tResourceSet resourceSet = new ResourceSetImpl();" + NL;
	protected final String TEXT_103 = NL + "\t\t\t\t\t\t\t// Get the URI of the model file." + NL + "\t\t\t\t\t\t\t//"
			+ NL
			+ "\t\t\t\t\t\t\tURI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);"
			+ NL;
	protected final String TEXT_104 = NL + "\t\t\t\t\t\t\t// Create a resource for this file." + NL + "\t\t\t\t\t\t\t//"
			+ NL + "\t\t\t\t\t\t\tResource resource = resourceSet.createResource(fileURI";
	protected final String TEXT_105 = ", ";
	protected final String TEXT_106 = ".eCONTENT_TYPE";
	protected final String TEXT_107 = ");" + NL + "" + NL
			+ "\t\t\t\t\t\t\t// Add the initial model object to the contents." + NL + "\t\t\t\t\t\t\t//" + NL
			+ "\t\t\t\t\t\t\tEObject rootObject = createInitialModel();" + NL + "\t\t\t\t\t\t\tif (rootObject != null)"
			+ NL + "\t\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t\tresource.getContents().add(rootObject);" + NL
			+ "\t\t\t\t\t\t\t}" + NL + "" + NL
			+ "\t\t\t\t\t\t\t// Save the contents of the resource to the file system." + NL + "\t\t\t\t\t\t\t//" + NL
			+ "\t\t\t\t\t\t\t";
	protected final String TEXT_108 = " options = new ";
	protected final String TEXT_109 = "();" + NL
			+ "\t\t\t\t\t\t\toptions.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());" + NL
			+ "\t\t\t\t\t\t\tresource.save(options);" + NL + "\t\t\t\t\t\t}" + NL
			+ "\t\t\t\t\t\tcatch (Exception exception)" + NL + "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\t";
	protected final String TEXT_110 = ".INSTANCE.log(exception);" + NL + "\t\t\t\t\t\t}" + NL + "\t\t\t\t\t\tfinally"
			+ NL + "\t\t\t\t\t\t{" + NL + "\t\t\t\t\t\t\tprogressMonitor.done();" + NL + "\t\t\t\t\t\t}" + NL
			+ "\t\t\t\t\t}" + NL + "\t\t\t\t};" + NL + "" + NL + "\t\t\tgetContainer().run(false, false, operation);"
			+ NL;
	protected final String TEXT_111 = NL + "\t\t\treturn ";
	protected final String TEXT_112 = ".openEditor(workbench, fileURI);\t\t\t";
	protected final String TEXT_113 = NL + "\t\t\t// Select the new file resource in the current view." + NL
			+ "\t\t\t//" + NL + "\t\t\t";
	protected final String TEXT_114 = " workbenchWindow = workbench.getActiveWorkbenchWindow();" + NL + "\t\t\t";
	protected final String TEXT_115 = " page = workbenchWindow.getActivePage();" + NL + "\t\t\tfinal ";
	protected final String TEXT_116 = " activePart = page.getActivePart();" + NL
			+ "\t\t\tif (activePart instanceof ISetSelectionTarget)" + NL + "\t\t\t{" + NL + "\t\t\t\tfinal ";
	protected final String TEXT_117 = " targetSelection = new ";
	protected final String TEXT_118 = "(modelFile);" + NL + "\t\t\t\tgetShell().getDisplay().asyncExec" + NL
			+ "\t\t\t\t\t(new Runnable()" + NL + "\t\t\t\t\t {" + NL + "\t\t\t\t\t\t public void run()" + NL
			+ "\t\t\t\t\t\t {" + NL + "\t\t\t\t\t\t\t ((ISetSelectionTarget)activePart).selectReveal(targetSelection);"
			+ NL + "\t\t\t\t\t\t }" + NL + "\t\t\t\t\t });" + NL + "\t\t\t}" + NL + "" + NL
			+ "\t\t\t// Open an editor on the new file." + NL + "\t\t\t//" + NL + "\t\t\ttry" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tpage.openEditor" + NL + "\t\t\t\t\t(new FileEditorInput(modelFile)," + NL
			+ "\t\t\t\t\t workbench.getEditorRegistry().getDefaultEditor";
	protected final String TEXT_119 = "(modelFile.getFullPath().toString()).getId());";
	protected final String TEXT_120 = NL + "\t\t\t\t\t \t(modelFile.getFullPath().toString()," + NL + "\t\t\t\t\t \t ";
	protected final String TEXT_121 = ".getContentTypeManager().getContentType(";
	protected final String TEXT_122 = ".eCONTENT_TYPE)).getId());";
	protected final String TEXT_123 = "\t\t\t\t\t \t " + NL + "\t\t\t}" + NL + "\t\t\tcatch (";
	protected final String TEXT_124 = " exception)" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tMessageDialog.openError(workbenchWindow.getShell(), ";
	protected final String TEXT_125 = ".INSTANCE.getString(\"_UI_OpenEditorError_label\"), exception.getMessage());";
	protected final String TEXT_126 = NL + "\t\t\t\treturn false;" + NL + "\t\t\t}" + NL + "" + NL
			+ "\t\t\treturn true;";
	protected final String TEXT_127 = NL + "\t\t}" + NL + "\t\tcatch (Exception exception)" + NL + "\t\t{" + NL
			+ "\t\t\t";
	protected final String TEXT_128 = ".INSTANCE.log(exception);" + NL + "\t\t\treturn false;" + NL + "\t\t}" + NL
			+ "\t}" + NL;
	protected final String TEXT_129 = NL + "\t/**" + NL + "\t * This is the one page of the wizard." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic class ";
	protected final String TEXT_130 = "NewFileCreationPage extends WizardNewFileCreationPage" + NL + "\t{" + NL
			+ "\t\t/**" + NL + "\t\t * Pass in the selection." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
	protected final String TEXT_131 = "NewFileCreationPage(String pageId, IStructuredSelection selection)" + NL
			+ "\t\t{" + NL + "\t\t\tsuper(pageId, selection);" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
			+ "\t\t * The framework calls this to see if the file is correct." + NL + "\t\t * <!-- begin-user-doc -->"
			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
	protected final String TEXT_132 = NL + "\t\t@Override";
	protected final String TEXT_133 = NL + "\t\tprotected boolean validatePage()" + NL + "\t\t{" + NL
			+ "\t\t\tif (super.validatePage())" + NL + "\t\t\t{" + NL + "\t\t\t\tString extension = new ";
	protected final String TEXT_134 = "(getFileName()).getFileExtension();" + NL
			+ "\t\t\t\tif (extension == null || !FILE_EXTENSIONS.contains(extension))" + NL + "\t\t\t\t{" + NL
			+ "\t\t\t\t\tString key = FILE_EXTENSIONS.size() > 1 ? \"_WARN_FilenameExtensions\" : \"_WARN_FilenameExtension\";";
	protected final String TEXT_135 = NL + "\t\t\t\t\tsetErrorMessage(";
	protected final String TEXT_136 = ".INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));" + NL
			+ "\t\t\t\t\treturn false;" + NL + "\t\t\t\t}" + NL + "\t\t\t\treturn true;" + NL + "\t\t\t}" + NL
			+ "\t\t\treturn false;" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tpublic IFile getModelFile()" + NL + "\t\t{" + NL
			+ "\t\t\treturn ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));"
			+ NL + "\t\t}" + NL + "\t}" + NL;
	protected final String TEXT_137 = NL + "\t/**" + NL
			+ "\t * This is the page where the type of object to create is selected." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic class ";
	protected final String TEXT_138 = "InitialObjectCreationPage extends WizardPage" + NL + "\t{";
	protected final String TEXT_139 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
	protected final String TEXT_140 = " fileField;" + NL;
	protected final String TEXT_141 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tprotected Combo initialObjectField;" + NL + "" + NL + "\t\t/**" + NL + "\t\t * @generated" + NL
			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t */" + NL
			+ "\t\tprotected ";
	protected final String TEXT_142 = " encodings;" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tprotected Combo encodingField;" + NL + "" + NL + "\t\t/**" + NL + "\t\t * Pass in the selection."
			+ NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated"
			+ NL + "\t\t */" + NL + "\t\tpublic ";
	protected final String TEXT_143 = "InitialObjectCreationPage(String pageId)" + NL + "\t\t{" + NL
			+ "\t\t\tsuper(pageId);" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tpublic void createControl(Composite parent)" + NL + "\t\t{" + NL
			+ "\t\t\tComposite composite = new Composite(parent, SWT.NONE);" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tGridLayout layout = new GridLayout();" + NL + "\t\t\t\tlayout.numColumns = 1;" + NL
			+ "\t\t\t\tlayout.verticalSpacing = 12;" + NL + "\t\t\t\tcomposite.setLayout(layout);" + NL + "" + NL
			+ "\t\t\t\tGridData data = new GridData();" + NL + "\t\t\t\tdata.verticalAlignment = GridData.FILL;" + NL
			+ "\t\t\t\tdata.grabExcessVerticalSpace = true;" + NL + "\t\t\t\tdata.horizontalAlignment = GridData.FILL;"
			+ NL + "\t\t\t\tcomposite.setLayoutData(data);" + NL + "\t\t\t}" + NL;
	protected final String TEXT_144 = "\t\t\t" + NL + "\t\t\tLabel resourceURILabel = new Label(composite, SWT.LEFT);"
			+ NL + "\t\t\t{" + NL + "\t\t\t\tresourceURILabel.setText(";
	protected final String TEXT_145 = ".INSTANCE.getString(\"_UI_File_label\"));";
	protected final String TEXT_146 = NL + NL + "\t\t\t\tGridData data = new GridData();" + NL
			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tresourceURILabel.setLayoutData(data);"
			+ NL + "\t\t\t}" + NL + "" + NL + "\t\t\tComposite fileComposite = new Composite(composite, SWT.NONE);" + NL
			+ "\t\t\t{" + NL + "\t\t\t\tGridData data = new GridData();" + NL
			+ "\t\t\t\tdata.horizontalAlignment = GridData.END;" + NL + "\t\t\t\tfileComposite.setLayoutData(data);"
			+ NL + "" + NL + "\t\t\t\tGridLayout layout = new GridLayout();" + NL
			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tlayout.marginHeight = 0;" + NL
			+ "\t\t\t\tlayout.marginWidth = 0;" + NL + "\t\t\t\tlayout.numColumns = 2;" + NL
			+ "\t\t\t\tfileComposite.setLayout(layout);" + NL + "\t\t\t}" + NL + "" + NL + "\t\t\tfileField = new ";
	protected final String TEXT_147 = "(fileComposite, SWT.BORDER);" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tGridData data = new GridData();" + NL + "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL
			+ "\t\t\t\tdata.grabExcessHorizontalSpace = true;" + NL + "\t\t\t\tdata.horizontalSpan = 1;" + NL
			+ "\t\t\t\tfileField.setLayoutData(data);" + NL + "\t\t\t}" + NL + "" + NL
			+ "\t\t\tfileField.addModifyListener(validator);" + NL;
	protected final String TEXT_148 = NL + "\t\t\t";
	protected final String TEXT_149 = " resourceURIBrowseFileSystemButton = new ";
	protected final String TEXT_150 = "(fileComposite, SWT.PUSH);" + NL
			+ "\t\t\tresourceURIBrowseFileSystemButton.setText(";
	protected final String TEXT_151 = ".INSTANCE.getString(\"_UI_Browse_label\"));";
	protected final String TEXT_152 = NL + NL + "\t\t\tresourceURIBrowseFileSystemButton.addSelectionListener" + NL
			+ "\t\t\t\t(new ";
	protected final String TEXT_153 = "()" + NL + "\t\t\t\t {";
	protected final String TEXT_154 = NL + "\t\t\t\t\t @Override";
	protected final String TEXT_155 = NL + "\t\t\t\t\t public void widgetSelected(";
	protected final String TEXT_156 = " event)" + NL + "\t\t\t\t\t {" + NL + "\t\t\t\t\t\t String[] filters = ";
	protected final String TEXT_157 = "(String[])";
	protected final String TEXT_158 = ".FILE_EXTENSION_FILTERS.toArray(new String[";
	protected final String TEXT_159 = ".FILE_EXTENSION_FILTERS.size()]);" + NL + "\t\t\t\t\t\t String[] files = ";
	protected final String TEXT_160 = ".openFilePathDialog(getShell(), ";
	protected final String TEXT_161 = ".SAVE, filters);" + NL + "\t\t\t\t\t\t if (files.length > 0)" + NL
			+ "\t\t\t\t\t\t {" + NL + "\t\t\t\t\t\t\t fileField.setText(files[0]);" + NL + "\t\t\t\t\t\t }" + NL
			+ "\t\t\t\t\t }" + NL + "\t\t\t\t });";
	protected final String TEXT_162 = NL + "\t\t\tLabel containerLabel = new Label(composite, SWT.LEFT);" + NL
			+ "\t\t\t{" + NL + "\t\t\t\tcontainerLabel.setText(";
	protected final String TEXT_163 = ".INSTANCE.getString(\"_UI_ModelObject\"));";
	protected final String TEXT_164 = NL + NL + "\t\t\t\tGridData data = new GridData();" + NL
			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tcontainerLabel.setLayoutData(data);"
			+ NL + "\t\t\t}" + NL + "" + NL + "\t\t\tinitialObjectField = new Combo(composite, SWT.BORDER);" + NL
			+ "\t\t\t{" + NL + "\t\t\t\tGridData data = new GridData();" + NL
			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL
			+ "\t\t\t\tdata.grabExcessHorizontalSpace = true;" + NL + "\t\t\t\tinitialObjectField.setLayoutData(data);"
			+ NL + "\t\t\t}" + NL;
	protected final String TEXT_165 = NL + "\t\t\tfor (String objectName : getInitialObjectNames())" + NL + "\t\t\t{"
			+ NL + "\t\t\t\tinitialObjectField.add(getLabel(objectName));" + NL + "\t\t\t}";
	protected final String TEXT_166 = NL + "\t\t\tfor (Iterator i = getInitialObjectNames().iterator(); i.hasNext(); )"
			+ NL + "\t\t\t{" + NL + "\t\t\t\tinitialObjectField.add(getLabel((String)i.next()));" + NL + "\t\t\t}";
	protected final String TEXT_167 = NL + NL + "\t\t\tif (initialObjectField.getItemCount() == 1)" + NL + "\t\t\t{"
			+ NL + "\t\t\t\tinitialObjectField.select(0);" + NL + "\t\t\t}" + NL
			+ "\t\t\tinitialObjectField.addModifyListener(validator);" + NL + "" + NL
			+ "\t\t\tLabel encodingLabel = new Label(composite, SWT.LEFT);" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tencodingLabel.setText(";
	protected final String TEXT_168 = ".INSTANCE.getString(\"_UI_XMLEncoding\"));";
	protected final String TEXT_169 = NL + NL + "\t\t\t\tGridData data = new GridData();" + NL
			+ "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL + "\t\t\t\tencodingLabel.setLayoutData(data);"
			+ NL + "\t\t\t}" + NL + "\t\t\tencodingField = new Combo(composite, SWT.BORDER);" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tGridData data = new GridData();" + NL + "\t\t\t\tdata.horizontalAlignment = GridData.FILL;" + NL
			+ "\t\t\t\tdata.grabExcessHorizontalSpace = true;" + NL + "\t\t\t\tencodingField.setLayoutData(data);" + NL
			+ "\t\t\t}" + NL;
	protected final String TEXT_170 = NL + "\t\t\tfor (String encoding : getEncodings())" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tencodingField.add(encoding);" + NL + "\t\t\t}";
	protected final String TEXT_171 = NL + "\t\t\tfor (Iterator i = getEncodings().iterator(); i.hasNext(); )" + NL
			+ "\t\t\t{" + NL + "\t\t\t\tencodingField.add((String)i.next());" + NL + "\t\t\t}";
	protected final String TEXT_172 = NL + NL + "\t\t\tencodingField.select(0);" + NL
			+ "\t\t\tencodingField.addModifyListener(validator);" + NL + "" + NL
			+ "\t\t\tsetPageComplete(validatePage());" + NL + "\t\t\tsetControl(composite);" + NL + "\t\t}" + NL + ""
			+ NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ModifyListener validator =" + NL
			+ "\t\t\tnew ModifyListener()" + NL + "\t\t\t{" + NL + "\t\t\t\tpublic void modifyText(ModifyEvent e)" + NL
			+ "\t\t\t\t{" + NL + "\t\t\t\t\tsetPageComplete(validatePage());" + NL + "\t\t\t\t}" + NL + "\t\t\t};" + NL
			+ "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected boolean validatePage()" + NL + "\t\t{";
	protected final String TEXT_173 = NL + "\t\t\tURI fileURI = getFileURI();" + NL
			+ "\t\t\tif (fileURI == null || fileURI.isEmpty())" + NL + "\t\t\t{" + NL + "\t\t\t\tsetErrorMessage(null);"
			+ NL + "\t\t\t\treturn false;" + NL + "\t\t\t}" + NL + "" + NL
			+ "\t\t\tString extension = fileURI.fileExtension();" + NL
			+ "\t\t\tif (extension == null || !FILE_EXTENSIONS.contains(extension))" + NL + "\t\t\t{" + NL
			+ "\t\t\t\tString key = FILE_EXTENSIONS.size() > 1 ? \"_WARN_FilenameExtensions\" : \"_WARN_FilenameExtension\";";
	protected final String TEXT_174 = NL + "\t\t\t\tsetErrorMessage(";
	protected final String TEXT_175 = ".INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));" + NL
			+ "\t\t\t\treturn false;" + NL + "\t\t\t}" + NL + "" + NL + "\t\t\tsetErrorMessage(null);";
	protected final String TEXT_176 = NL
			+ "\t\t\treturn getInitialObjectName() != null && getEncodings().contains(encodingField.getText());" + NL
			+ "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */";
	protected final String TEXT_177 = NL + "\t\t@Override";
	protected final String TEXT_178 = NL + "\t\tpublic void setVisible(boolean visible)" + NL + "\t\t{" + NL
			+ "\t\t\tsuper.setVisible(visible);" + NL + "\t\t\tif (visible)" + NL + "\t\t\t{";
	protected final String TEXT_179 = NL + "\t\t\t\tif (initialObjectField.getItemCount() == 1)" + NL + "\t\t\t\t{" + NL
			+ "\t\t\t\t\tinitialObjectField.clearSelection();" + NL + "\t\t\t\t\tencodingField.setFocus();" + NL
			+ "\t\t\t\t}" + NL + "\t\t\t\telse" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\tencodingField.clearSelection();"
			+ NL + "\t\t\t\t\tinitialObjectField.setFocus();" + NL + "\t\t\t\t}";
	protected final String TEXT_180 = NL + "\t\t\t\tinitialObjectField.clearSelection();" + NL
			+ "\t\t\t\tencodingField.clearSelection();" + NL + "\t\t\t\tfileField.setFocus();";
	protected final String TEXT_181 = NL + "\t\t\t}" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL
			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
			+ "\t\t */" + NL + "\t\tpublic String getInitialObjectName()" + NL + "\t\t{" + NL
			+ "\t\t\tString label = initialObjectField.getText();" + NL;
	protected final String TEXT_182 = NL + "\t\t\tfor (String name : getInitialObjectNames())";
	protected final String TEXT_183 = NL + "\t\t\tfor (Iterator i = getInitialObjectNames().iterator(); i.hasNext(); )";
	protected final String TEXT_184 = NL + "\t\t\t{";
	protected final String TEXT_185 = NL + "\t\t\t\tString name = (String)i.next();";
	protected final String TEXT_186 = NL + "\t\t\t\tif (getLabel(name).equals(label))" + NL + "\t\t\t\t{" + NL
			+ "\t\t\t\t\treturn name;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\treturn null;" + NL + "\t\t}"
			+ NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->"
			+ NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic String getEncoding()" + NL + "\t\t{" + NL
			+ "\t\t\treturn encodingField.getText();" + NL + "\t\t}";
	protected final String TEXT_187 = NL + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tpublic URI getFileURI()" + NL + "\t\t{" + NL + "\t\t\ttry" + NL + "\t\t\t{" + NL
			+ "\t\t\t\treturn URI.createFileURI(fileField.getText());" + NL + "\t\t\t}" + NL
			+ "\t\t\tcatch (Exception exception)" + NL + "\t\t\t{" + NL + "\t\t\t\t// Ignore" + NL + "\t\t\t}" + NL
			+ "\t\t\treturn null;" + NL + "\t\t}" + NL + "" + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->"
			+ NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tpublic void selectFileField()" + NL + "\t\t{" + NL + "\t\t\t\tinitialObjectField.clearSelection();"
			+ NL + "\t\t\t\tencodingField.clearSelection();" + NL + "\t\t\t\tfileField.selectAll();" + NL
			+ "\t\t\t\tfileField.setFocus();" + NL + "\t\t}\t\t";
	protected final String TEXT_188 = NL + NL + "\t\t/**" + NL + "\t\t * Returns the label for the specified ";
	protected final String TEXT_189 = " name." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL
			+ "\t\tprotected String getLabel(String ";
	protected final String TEXT_190 = "Name)" + NL + "\t\t{" + NL + "\t\t\ttry" + NL + "\t\t\t{" + NL
			+ "\t\t\t\treturn ";
	protected final String TEXT_191 = ".INSTANCE.getString(\"";
	protected final String TEXT_192 = "\" + ";
	protected final String TEXT_193 = "Name + \"_";
	protected final String TEXT_194 = "\");";
	protected final String TEXT_195 = NL + "\t\t\t}" + NL + "\t\t\tcatch(MissingResourceException mre)" + NL + "\t\t\t{"
			+ NL + "\t\t\t\t";
	protected final String TEXT_196 = ".INSTANCE.log(mre);" + NL + "\t\t\t}" + NL + "\t\t\treturn ";
	protected final String TEXT_197 = "Name;" + NL + "\t\t}";
	protected final String TEXT_198 = NL + NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
	protected final String TEXT_199 = " getEncodings()" + NL + "\t\t{" + NL + "\t\t\tif (encodings == null)" + NL
			+ "\t\t\t{" + NL + "\t\t\t\tencodings = new ";
	protected final String TEXT_200 = "();" + NL
			+ "\t\t\t\tfor (StringTokenizer stringTokenizer = new StringTokenizer(";
	protected final String TEXT_201 = ".INSTANCE.getString(\"_UI_XMLEncodingChoices\")); stringTokenizer.hasMoreTokens(); )";
	protected final String TEXT_202 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tencodings.add(stringTokenizer.nextToken());"
			+ NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t\treturn encodings;" + NL + "\t\t}" + NL + "\t}" + NL + ""
			+ NL + "\t/**" + NL + "\t * The framework calls this to create the contents of the wizard." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_203 = NL + "\t\t@Override";
	protected final String TEXT_204 = NL + "\tpublic void addPages()" + NL + "\t{";
	protected final String TEXT_205 = NL + "\t\t// Create a page, set the title, and the initial model file name." + NL
			+ "\t\t//" + NL + "\t\tnewFileCreationPage = new ";
	protected final String TEXT_206 = "NewFileCreationPage(\"Whatever\", selection);";
	protected final String TEXT_207 = NL + "\t\tnewFileCreationPage.setTitle(";
	protected final String TEXT_208 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_209 = "_label\"));";
	protected final String TEXT_210 = NL + "\t\tnewFileCreationPage.setDescription(";
	protected final String TEXT_211 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_212 = "_description\"));";
	protected final String TEXT_213 = NL + "\t\tnewFileCreationPage.setFileName(";
	protected final String TEXT_214 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_215 = "FilenameDefaultBase\") + \".\" + ";
	protected final String TEXT_216 = "(String)";
	protected final String TEXT_217 = "FILE_EXTENSIONS.get(0));";
	protected final String TEXT_218 = NL + "\t\taddPage(newFileCreationPage);" + NL + "" + NL
			+ "\t\t// Try and get the resource selection to determine a current directory for the file dialog." + NL
			+ "\t\t//" + NL + "\t\tif (selection != null && !selection.isEmpty())" + NL + "\t\t{" + NL
			+ "\t\t\t// Get the resource..." + NL + "\t\t\t//" + NL
			+ "\t\t\tObject selectedElement = selection.iterator().next();" + NL
			+ "\t\t\tif (selectedElement instanceof IResource)" + NL + "\t\t\t{" + NL
			+ "\t\t\t\t// Get the resource parent, if its a file." + NL + "\t\t\t\t//" + NL
			+ "\t\t\t\tIResource selectedResource = (IResource)selectedElement;" + NL
			+ "\t\t\t\tif (selectedResource.getType() == IResource.FILE)" + NL + "\t\t\t\t{" + NL
			+ "\t\t\t\t\tselectedResource = selectedResource.getParent();" + NL + "\t\t\t\t}" + NL + "" + NL
			+ "\t\t\t\t// This gives us a directory..." + NL + "\t\t\t\t//" + NL
			+ "\t\t\t\tif (selectedResource instanceof IFolder || selectedResource instanceof IProject)" + NL
			+ "\t\t\t\t{" + NL + "\t\t\t\t\t// Set this for the container." + NL + "\t\t\t\t\t//" + NL
			+ "\t\t\t\t\tnewFileCreationPage.setContainerFullPath(selectedResource.getFullPath());" + NL + "" + NL
			+ "\t\t\t\t\t// Make up a unique new name here." + NL + "\t\t\t\t\t//" + NL
			+ "\t\t\t\t\tString defaultModelBaseFilename = ";
	protected final String TEXT_219 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_220 = "FilenameDefaultBase\");";
	protected final String TEXT_221 = NL + "\t\t\t\t\tString defaultModelFilenameExtension = ";
	protected final String TEXT_222 = "(String)";
	protected final String TEXT_223 = "FILE_EXTENSIONS.get(0);" + NL
			+ "\t\t\t\t\tString modelFilename = defaultModelBaseFilename + \".\" + defaultModelFilenameExtension;";
	protected final String TEXT_224 = NL
			+ "\t\t\t\t\tfor (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i)" + NL
			+ "\t\t\t\t\t{" + NL
			+ "\t\t\t\t\t\tmodelFilename = defaultModelBaseFilename + i + \".\" + defaultModelFilenameExtension;";
	protected final String TEXT_225 = NL + "\t\t\t\t\t}" + NL
			+ "\t\t\t\t\tnewFileCreationPage.setFileName(modelFilename);" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL
			+ "\t\t}";
	protected final String TEXT_226 = NL + "\t\tinitialObjectCreationPage = new ";
	protected final String TEXT_227 = "InitialObjectCreationPage(\"Whatever2\");";
	protected final String TEXT_228 = NL + "\t\tinitialObjectCreationPage.setTitle(";
	protected final String TEXT_229 = ".INSTANCE.getString(\"_UI_";
	protected final String TEXT_230 = "_label\"));";
	protected final String TEXT_231 = NL + "\t\tinitialObjectCreationPage.setDescription(";
	protected final String TEXT_232 = ".INSTANCE.getString(\"_UI_Wizard_initial_object_description\"));";
	protected final String TEXT_233 = NL + "\t\taddPage(initialObjectCreationPage);" + NL + "\t}" + NL;
	protected final String TEXT_234 = NL + "\t/**" + NL + "\t * Get the URI from the page." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic URI getModelURI()" + NL + "\t{" + NL + "\t\treturn initialObjectCreationPage.getFileURI();"
			+ NL + "\t}" + NL;
	protected final String TEXT_235 = NL + "\t/**" + NL + "\t * Get the file from the page." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic IFile getModelFile()" + NL + "\t{" + NL + "\t\treturn newFileCreationPage.getModelFile();"
			+ NL + "\t}" + NL;
	protected final String TEXT_236 = NL + "}";
	protected final String TEXT_237 = NL;
	protected final String TEXT_238 = NL;
	protected final String TEXT_239 = NL;

	public ModelWizard() {
		//Here is the constructor
		StringBuffer stringBuffer = new StringBuffer();

		// add initialisation of the pattern variables (declaration has been already done).

	}

	public String generate(Object argument) throws Exception {
		final StringBuffer stringBuffer = new StringBuffer();

		InternalPatternContext ctx = (InternalPatternContext) argument;
		Map<String, String> queryCtx = null;
		IQuery.ParameterDescription paramDesc = null;
		Node.Container currentNode = ctx.getNode();

		List<Object> parameterList = null;
		//this pattern can only be called by another (i.e. it's not an entry point in execution)

		for (Object parameterParameter : parameterList) {

			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;

			if (preCondition(ctx)) {
				ctx.setNode(new Node.Container(currentNode, getClass()));
				orchestration(ctx);
			}

		}
		ctx.setNode(currentNode);
		if (ctx.useReporter()) {
			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
		}

		stringBuffer.append(TEXT_238);
		stringBuffer.append(TEXT_239);
		return stringBuffer.toString();
	}

	public String orchestration(PatternContext ctx) throws Exception {
		InternalPatternContext ictx = (InternalPatternContext) ctx;

		super.orchestration(new SuperOrchestrationContext(ictx));

		method_preGenerate(new StringBuffer(), ictx);

		method_doGenerate(new StringBuffer(), ictx);
		{
			final Map<String, Object> parameters = getParameters();
			CallbackContext ctx_callback = new CallbackContext(ictx);
			CallHelper.callBack(ctx_callback, parameters);
		}

		method_postGenerate(new StringBuffer(), ictx);

		if (ictx.useReporter()) {
			Map<String, Object> parameterValues = new HashMap<String, Object>();
			parameterValues.put("parameter", this.parameter);
			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
		}
		return null;
	}

	public Map<String, Object> getParameters() {
		final Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("parameter", this.parameter);
		return parameters;
	}

	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		GenPackage genPackage = parameter;
		targetPath = genPackage.getGenModel().getEditorDirectory();
		packageName = genPackage.getPresentationPackageName();
		className = genPackage.getModelWizardClassName();

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
	}

	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		GenPackage genPackage = parameter;
		argument = parameter;

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
	}

	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditorDirectory(), genModel,
				GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
	}

	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		/**
		 * Copyright (c) 2002-2010 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 - Initial API and implementation
		 */

		GenPackage genPackage = (GenPackage) argument;
		GenModel genModel = genPackage.getGenModel();
		stringBuffer.append(TEXT_1);
		{
			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>

			InternalPatternContext ictx = (InternalPatternContext) ctx;
			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
			stringBuffer.setLength(0);

			final Map<String, Object> callParameters = new HashMap<String, Object>();
			callParameters.put("argument", parameter);
			CallHelper.executeWithParameterInjection(
					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
					new ExecutionContext((InternalPatternContext) ctx), callParameters);
			stringBuffer.setLength(0);
		}

		String _ListOfString = "List"
				+ (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");
		String _ArrayListOfString = "ArrayList"
				+ (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");
		String _CollectionOfString = "Collection"
				+ (genModel.useGenerics() ? "<" + genModel.getImportedName("java.lang.String") + ">" : "");
		String _MapOfObjectToObject = "Map"
				+ (genModel.useGenerics()
						? "<" + genModel.getImportedName("java.lang.Object") + ", "
								+ genModel.getImportedName("java.lang.Object") + ">"
						: "");
		String _HashMapOfObjectToObject = "HashMap"
				+ (genModel.useGenerics()
						? "<" + genModel.getImportedName("java.lang.Object") + ", "
								+ genModel.getImportedName("java.lang.Object") + ">"
						: "");
		stringBuffer.append(TEXT_2);
		stringBuffer.append(genPackage.getPresentationPackageName());
		stringBuffer.append(TEXT_3);
		if (!genModel.useGenerics()) {
			stringBuffer.append(TEXT_4);
		}
		stringBuffer.append(TEXT_5);
		if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
			stringBuffer.append(TEXT_6);
		}
		stringBuffer.append(TEXT_7);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_8);
		}
		stringBuffer.append(TEXT_9);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_10);
		}
		if (!genModel.isSuppressEMFMetaData()) {
			stringBuffer.append(TEXT_11);
			stringBuffer.append(genPackage.getQualifiedFactoryInterfaceName());
			stringBuffer.append(TEXT_12);
		}
		stringBuffer.append(TEXT_13);
		stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
		stringBuffer.append(TEXT_14);
		stringBuffer.append(genPackage.getQualifiedEditPluginClassName());
		stringBuffer.append(TEXT_15);
		genModel.markImportLocation(stringBuffer);
		stringBuffer.append(TEXT_16);
		stringBuffer.append(genPackage.getModelWizardClassName());
		stringBuffer.append(TEXT_17);
		if (genModel.hasCopyrightField()) {
			stringBuffer.append(TEXT_18);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_19);
			stringBuffer.append(genModel.getCopyrightFieldLiteral());
			stringBuffer.append(TEXT_20);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_21);
		}
		stringBuffer.append(TEXT_22);
		stringBuffer.append(_ListOfString);
		stringBuffer.append(TEXT_23);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_24);
		stringBuffer.append(genPackage.getEditorClassName());
		stringBuffer.append(TEXT_25);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(genModel.getNonNLS(2));
		stringBuffer.append(TEXT_26);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_27);
		stringBuffer.append(genPackage.getEditorClassName());
		stringBuffer.append(TEXT_28);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(genModel.getNonNLS(2));
		stringBuffer.append(genModel.getNonNLS(3));
		stringBuffer.append(TEXT_29);
		stringBuffer
				.append(genModel.isSuppressEMFMetaData() ? genModel.getImportedName("org.eclipse.emf.ecore.EPackage")
						: genPackage.getPackageInterfaceName());
		stringBuffer.append(TEXT_30);
		stringBuffer.append(genPackage.getUncapPackageName());
		stringBuffer.append(TEXT_31);
		stringBuffer.append(genPackage.getPackageInterfaceName());
		stringBuffer.append(TEXT_32);
		stringBuffer
				.append(genModel.isSuppressEMFMetaData() ? genModel.getImportedName("org.eclipse.emf.ecore.EFactory")
						: genPackage.getFactoryInterfaceName());
		stringBuffer.append(TEXT_33);
		stringBuffer.append(genPackage.getUncapFactoryName());
		stringBuffer.append(TEXT_34);
		stringBuffer.append(genPackage.getUncapPackageName());
		stringBuffer.append(TEXT_35);
		stringBuffer.append(genModel.isSuppressEMFMetaData() ? "EFactoryInstance" : genPackage.getFactoryName());
		stringBuffer.append(TEXT_36);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_37);
			stringBuffer.append(genPackage.getModelWizardClassName());
			stringBuffer.append(TEXT_38);
		}
		stringBuffer.append(TEXT_39);
		stringBuffer.append(genPackage.getModelWizardClassName());
		stringBuffer.append(TEXT_40);
		if (!genPackage.hasDocumentRoot()) {
			stringBuffer.append(TEXT_41);
		} else {
			stringBuffer.append(TEXT_42);
		}
		stringBuffer.append(TEXT_43);
		stringBuffer.append(_ListOfString);
		stringBuffer.append(TEXT_44);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_45);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_46);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_47);
		stringBuffer.append(genPackage.getPrefix());
		stringBuffer.append(TEXT_48);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_49);
		if (!genPackage.hasDocumentRoot()) {
			stringBuffer.append(TEXT_50);
		} else {
			stringBuffer.append(TEXT_51);
		}
		stringBuffer.append(TEXT_52);
		stringBuffer.append(_CollectionOfString);
		stringBuffer.append(TEXT_53);
		stringBuffer.append(_ArrayListOfString);
		stringBuffer.append(TEXT_54);
		if (!genPackage.hasDocumentRoot()) {
			if (genModel.useGenerics()) {
				stringBuffer.append(TEXT_55);
				stringBuffer.append(genPackage.getUncapPackageName());
				stringBuffer.append(TEXT_56);
			} else {
				stringBuffer.append(TEXT_57);
				stringBuffer.append(genPackage.getUncapPackageName());
				stringBuffer.append(TEXT_58);
			}
			stringBuffer.append(TEXT_59);
			if (!genModel.useGenerics()) {
				stringBuffer.append(TEXT_60);
			}
			stringBuffer.append(TEXT_61);
		} else {
			if (genModel.useGenerics()) {
				stringBuffer.append(TEXT_62);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
				stringBuffer.append(TEXT_63);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
				stringBuffer.append(TEXT_64);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
				stringBuffer.append(TEXT_65);
				stringBuffer.append(genPackage.getUncapPackageName());
				stringBuffer.append(TEXT_66);
			} else {
				stringBuffer.append(TEXT_67);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
				stringBuffer.append(TEXT_68);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
				stringBuffer.append(TEXT_69);
				stringBuffer.append(genPackage.getUncapPackageName());
				stringBuffer.append(TEXT_70);
			}
			stringBuffer.append(TEXT_71);
			if (!genModel.useGenerics()) {
				stringBuffer.append(TEXT_72);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
				stringBuffer.append(TEXT_73);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature"));
				stringBuffer.append(TEXT_74);
			}
			stringBuffer.append(TEXT_75);
		}
		stringBuffer.append(TEXT_76);
		if (!genModel.isRichClientPlatform() && genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50) {
			stringBuffer.append(TEXT_77);
		} else {
			stringBuffer.append(TEXT_78);
		}
		stringBuffer.append(TEXT_79);
		if (!genPackage.hasDocumentRoot()) {
			stringBuffer.append(TEXT_80);
			stringBuffer.append(genPackage.getUncapPackageName());
			stringBuffer.append(TEXT_81);
			stringBuffer.append(genPackage.getUncapFactoryName());
			stringBuffer.append(TEXT_82);
		} else {
			stringBuffer.append(TEXT_83);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.ExtendedMetaData"));
			stringBuffer.append(TEXT_84);
			stringBuffer.append(genPackage.getUncapPackageName());
			stringBuffer.append(TEXT_85);
			stringBuffer.append(genPackage.getUncapFactoryName());
			stringBuffer.append(TEXT_86);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil"));
			stringBuffer.append(TEXT_87);
		}
		stringBuffer.append(TEXT_88);
		if (genModel.useClassOverrideAnnotation()) {
			stringBuffer.append(TEXT_89);
		}
		stringBuffer.append(TEXT_90);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_91);
			stringBuffer.append(genModel.getImportedName("java.io.File"));
			stringBuffer.append(TEXT_92);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_93);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_94);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_95);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_96);
			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.operation.IRunnableWithProgress"));
			stringBuffer.append(TEXT_97);
			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.operation.IRunnableWithProgress"));
			stringBuffer.append(TEXT_98);
		} else {
			stringBuffer.append(TEXT_99);
			if (genModel.useClassOverrideAnnotation()) {
				stringBuffer.append(TEXT_100);
			}
			stringBuffer.append(TEXT_101);
		}
		stringBuffer.append(TEXT_102);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_103);
		}
		stringBuffer.append(TEXT_104);
		if (genPackage.isContentType()) {
			stringBuffer.append(TEXT_105);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_106);
		}
		stringBuffer.append(TEXT_107);
		stringBuffer.append(_MapOfObjectToObject);
		stringBuffer.append(TEXT_108);
		stringBuffer.append(_HashMapOfObjectToObject);
		stringBuffer.append(TEXT_109);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_110);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_111);
			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName()));
			stringBuffer.append(TEXT_112);
		} else {
			stringBuffer.append(TEXT_113);
			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IWorkbenchWindow"));
			stringBuffer.append(TEXT_114);
			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IWorkbenchPage"));
			stringBuffer.append(TEXT_115);
			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.IWorkbenchPart"));
			stringBuffer.append(TEXT_116);
			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.ISelection"));
			stringBuffer.append(TEXT_117);
			stringBuffer.append(genModel.getImportedName("org.eclipse.jface.viewers.StructuredSelection"));
			stringBuffer.append(TEXT_118);
			if (!genPackage.isContentType()) {
				stringBuffer.append(TEXT_119);
			} else {
				stringBuffer.append(TEXT_120);
				stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.Platform"));
				stringBuffer.append(TEXT_121);
				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
				stringBuffer.append(TEXT_122);
			}
			stringBuffer.append(TEXT_123);
			stringBuffer.append(genModel.getImportedName("org.eclipse.ui.PartInitException"));
			stringBuffer.append(TEXT_124);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_125);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_126);
		}
		stringBuffer.append(TEXT_127);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_128);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_129);
			stringBuffer.append(genPackage.getModelWizardClassName());
			stringBuffer.append(TEXT_130);
			stringBuffer.append(genPackage.getModelWizardClassName());
			stringBuffer.append(TEXT_131);
			if (genModel.useClassOverrideAnnotation()) {
				stringBuffer.append(TEXT_132);
			}
			stringBuffer.append(TEXT_133);
			stringBuffer.append(genModel.getImportedName("org.eclipse.core.runtime.Path"));
			stringBuffer.append(TEXT_134);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(genModel.getNonNLS(2));
			stringBuffer.append(TEXT_135);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_136);
		}
		stringBuffer.append(TEXT_137);
		stringBuffer.append(genPackage.getModelWizardClassName());
		stringBuffer.append(TEXT_138);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_139);
			stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Text"));
			stringBuffer.append(TEXT_140);
		}
		stringBuffer.append(TEXT_141);
		stringBuffer.append(_ListOfString);
		stringBuffer.append(TEXT_142);
		stringBuffer.append(genPackage.getModelWizardClassName());
		stringBuffer.append(TEXT_143);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_144);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_145);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_146);
			stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Text"));
			stringBuffer.append(TEXT_147);
			if (!genModel.isRichAjaxPlatform()) {
				stringBuffer.append(TEXT_148);
				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Button"));
				stringBuffer.append(TEXT_149);
				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.widgets.Button"));
				stringBuffer.append(TEXT_150);
				stringBuffer.append(genPackage.getImportedEditorPluginClassName());
				stringBuffer.append(TEXT_151);
				stringBuffer.append(genModel.getNonNLS());
				stringBuffer.append(TEXT_152);
				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.events.SelectionAdapter"));
				stringBuffer.append(TEXT_153);
				if (genModel.useClassOverrideAnnotation()) {
					stringBuffer.append(TEXT_154);
				}
				stringBuffer.append(TEXT_155);
				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.events.SelectionEvent"));
				stringBuffer.append(TEXT_156);
				if (!genModel.useGenerics()) {
					stringBuffer.append(TEXT_157);
				}
				stringBuffer.append(genPackage.getImportedEditorClassName());
				stringBuffer.append(TEXT_158);
				stringBuffer.append(genPackage.getImportedEditorClassName());
				stringBuffer.append(TEXT_159);
				stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorAdvisorClassName()));
				stringBuffer.append(TEXT_160);
				stringBuffer.append(genModel.getImportedName("org.eclipse.swt.SWT"));
				stringBuffer.append(TEXT_161);
			}
		}
		stringBuffer.append(TEXT_162);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_163);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_164);
		if (genModel.useGenerics()) {
			stringBuffer.append(TEXT_165);
		} else {
			stringBuffer.append(TEXT_166);
		}
		stringBuffer.append(TEXT_167);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_168);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_169);
		if (genModel.useGenerics()) {
			stringBuffer.append(TEXT_170);
		} else {
			stringBuffer.append(TEXT_171);
		}
		stringBuffer.append(TEXT_172);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_173);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(genModel.getNonNLS(2));
			stringBuffer.append(TEXT_174);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_175);
		}
		stringBuffer.append(TEXT_176);
		if (genModel.useClassOverrideAnnotation()) {
			stringBuffer.append(TEXT_177);
		}
		stringBuffer.append(TEXT_178);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_179);
		} else {
			stringBuffer.append(TEXT_180);
		}
		stringBuffer.append(TEXT_181);
		if (genModel.useGenerics()) {
			stringBuffer.append(TEXT_182);
		} else {
			stringBuffer.append(TEXT_183);
		}
		stringBuffer.append(TEXT_184);
		if (!genModel.useGenerics()) {
			stringBuffer.append(TEXT_185);
		}
		stringBuffer.append(TEXT_186);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_187);
		}
		{
			String type = genPackage.hasDocumentRoot() ? "feature" : "type";
			String prefix = genPackage.hasDocumentRoot() ? "_UI_DocumentRoot_" : "_UI_";
			stringBuffer.append(TEXT_188);
			stringBuffer.append(type);
			stringBuffer.append(TEXT_189);
			stringBuffer.append(type);
			stringBuffer.append(TEXT_190);
			stringBuffer.append(genPackage.getEditPluginClassName());
			stringBuffer.append(TEXT_191);
			stringBuffer.append(prefix);
			stringBuffer.append(TEXT_192);
			stringBuffer.append(type);
			stringBuffer.append(TEXT_193);
			stringBuffer.append(type);
			stringBuffer.append(TEXT_194);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(genModel.getNonNLS(2));
			stringBuffer.append(TEXT_195);
			stringBuffer.append(genModel.getImportedName(genModel.getQualifiedEditorPluginClassName()));
			stringBuffer.append(TEXT_196);
			stringBuffer.append(type);
			stringBuffer.append(TEXT_197);
		}
		stringBuffer.append(TEXT_198);
		stringBuffer.append(_CollectionOfString);
		stringBuffer.append(TEXT_199);
		stringBuffer.append(_ArrayListOfString);
		stringBuffer.append(TEXT_200);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_201);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_202);
		if (genModel.useClassOverrideAnnotation()) {
			stringBuffer.append(TEXT_203);
		}
		stringBuffer.append(TEXT_204);
		if (!genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_205);
			stringBuffer.append(genPackage.getModelWizardClassName());
			stringBuffer.append(TEXT_206);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_207);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_208);
			stringBuffer.append(genPackage.getModelWizardClassName());
			stringBuffer.append(TEXT_209);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_210);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_211);
			stringBuffer.append(genPackage.getModelWizardClassName());
			stringBuffer.append(TEXT_212);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_213);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_214);
			stringBuffer.append(genPackage.getEditorClassName());
			stringBuffer.append(TEXT_215);
			if (!genModel.useGenerics()) {
				stringBuffer.append(TEXT_216);
			}
			stringBuffer.append(TEXT_217);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(genModel.getNonNLS(2));
			stringBuffer.append(TEXT_218);
			stringBuffer.append(genPackage.getImportedEditorPluginClassName());
			stringBuffer.append(TEXT_219);
			stringBuffer.append(genPackage.getEditorClassName());
			stringBuffer.append(TEXT_220);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_221);
			if (!genModel.useGenerics()) {
				stringBuffer.append(TEXT_222);
			}
			stringBuffer.append(TEXT_223);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_224);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_225);
		}
		stringBuffer.append(TEXT_226);
		stringBuffer.append(genPackage.getModelWizardClassName());
		stringBuffer.append(TEXT_227);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_228);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_229);
		stringBuffer.append(genPackage.getModelWizardClassName());
		stringBuffer.append(TEXT_230);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_231);
		stringBuffer.append(genPackage.getImportedEditorPluginClassName());
		stringBuffer.append(TEXT_232);
		stringBuffer.append(genModel.getNonNLS());
		stringBuffer.append(TEXT_233);
		if (genModel.isRichClientPlatform()) {
			stringBuffer.append(TEXT_234);
		} else {
			stringBuffer.append(TEXT_235);
		}
		stringBuffer.append(TEXT_236);
		genModel.emitSortedImports();
		stringBuffer.append(TEXT_237);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
	}

	public boolean preCondition(PatternContext ctx) throws Exception {
		GenPackage genPackage = parameter;
		genModel = parameter.getGenModel();
		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditorProject");
		canGenerate = canGenerate && (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard()
				&& genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT);
		return canGenerate;
	}
}