//Generated on Thu Jan 12 17:21:38 CET 2012 with EGF 0.6.1.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>
		 *
		 * Copyright (c) 2002-2010 IBM Corporation and others.
		 * This program and the accompanying materials
		 * are made available under the terms of the Eclipse Public License v2.0
		 * which accompanies this distribution, and is available at
		 * https://www.eclipse.org/legal/epl-v2.0
		 *
		 * SPDX-License-Identifier: EPL-2.0
		 * 
		 * Contributors: 
		 *   IBM - Initial API and implementation
		 *
		 * </copyright>
		 */

		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());
		return canGenerate;
	}
}