ソースを参照

Make new generator model wizard more generic to support different content types

malknet42 12 年 前
コミット
7cd8e7a611

+ 3 - 5
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/CoreGenerator.java

@@ -22,8 +22,8 @@ import org.yakindu.sct.generator.core.extensions.GeneratorExtensions.GeneratorDe
  */
 public enum CoreGenerator {
 
-	Java("yakindu::java"), C("yakindu::c"), Cpp("yakindu::cpp"), GenericJava(
-			"yakindu::generic"), Xpand("yakindu::xpand");
+	Java("yakindu::java"), C("yakindu::c"), Cpp("yakindu::cpp"), GenericJava("yakindu::generic"), Xpand(
+			"yakindu::xpand");
 
 	private String id;
 
@@ -51,8 +51,7 @@ public enum CoreGenerator {
 		if (Xpand.id.equals(id)) {
 			return Xpand;
 		}
-		throw new IllegalArgumentException(String.format(
-				"No such generator id '%s'", id));
+		throw new IllegalArgumentException(String.format("No such generator id '%s'", id));
 	}
 
 	/**
@@ -76,7 +75,6 @@ public enum CoreGenerator {
 			}
 			int result = Integer.valueOf(a).compareTo(b);
 			if (result == 0) {
-				//FIXME NullPointerCheck: sth could be null
 				result = o1.getName().compareTo(o2.getName());
 			}
 			return result;

+ 28 - 44
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/ModelCreator.java

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2011 committers of YAKINDU and others.
+ * Copyright (c) 2013 committers of YAKINDU 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
@@ -14,12 +14,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.yakindu.sct.generator.core.extensions.GeneratorExtensions;
-import org.yakindu.sct.generator.core.extensions.LibraryExtensions;
 import org.yakindu.sct.generator.core.extensions.GeneratorExtensions.GeneratorDescriptor;
+import org.yakindu.sct.generator.core.extensions.LibraryExtensions;
 import org.yakindu.sct.generator.core.extensions.LibraryExtensions.LibraryDescriptor;
 import org.yakindu.sct.generator.core.features.IDefaultFeatureValueProvider;
 import org.yakindu.sct.model.sgen.FeatureConfiguration;
@@ -28,43 +28,42 @@ import org.yakindu.sct.model.sgen.FeatureTypeLibrary;
 import org.yakindu.sct.model.sgen.GeneratorEntry;
 import org.yakindu.sct.model.sgen.GeneratorModel;
 import org.yakindu.sct.model.sgen.SGenFactory;
-import org.yakindu.sct.model.sgraph.Statechart;
 
 import com.google.common.collect.Lists;
 
 /**
  * 
  * @author muelder
- * 
+ * @author oliver bohl
  */
 public class ModelCreator {
 
 	private final SGenFactory factory = SGenFactory.eINSTANCE;
-	private final String generatorId;
-	private final List<Statechart> statecharts;
+	private final GeneratorDescriptor descriptor;
+
+	private final List<EObject> eobjects;
 
-	public ModelCreator(String generatorId, List<Statechart> statecharts) {
-		this.generatorId = generatorId;
-		this.statecharts = statecharts;
+	public ModelCreator(GeneratorDescriptor selectedGenerator, List<EObject> objects) {
+		this.descriptor = selectedGenerator;
+		this.eobjects = objects;
 	}
 
 	public GeneratorModel create() {
 		GeneratorModel model = factory.createGeneratorModel();
-		model.setGeneratorId(generatorId);
-		for (Statechart statechart : statecharts) {
-			model.getEntries().add(createGeneratorEntry(statechart));
+		model.setGeneratorId(descriptor.getId());
+		for (EObject object : eobjects) {
+			model.getEntries().add(createGeneratorEntry(object));
 		}
 		return model;
 	}
 
-	private GeneratorEntry createGeneratorEntry(Statechart statechart) {
+	private GeneratorEntry createGeneratorEntry(EObject eobject) {
 		GeneratorEntry entry = factory.createGeneratorEntry();
-		entry.setContentType("statechart");
-		entry.setElementRef(statechart);
-		List<FeatureType> featureTypes = getFeatureTypes(generatorId);
+		entry.setContentType(descriptor.getContentType());
+		entry.setElementRef(eobject);
+		List<FeatureType> featureTypes = getFeatureTypes(descriptor);
 		for (FeatureType featureType : featureTypes) {
-			FeatureConfiguration config = createFeatureConfiguration(
-					statechart, featureType);
+			FeatureConfiguration config = createFeatureConfiguration(eobject, featureType);
 			if (config != null && !config.getParameterValues().isEmpty()) {
 				entry.getFeatures().add(config);
 			}
@@ -72,41 +71,26 @@ public class ModelCreator {
 		return entry;
 	}
 
-	private FeatureConfiguration createFeatureConfiguration(
-			Statechart statechart, FeatureType featureType) {
-		
-		GeneratorDescriptor generatorDescriptor = GeneratorExtensions
-				.getGeneratorDescriptorForId(generatorId);
-		
-		Iterable<LibraryDescriptor> libraryDescriptor = LibraryExtensions
-				.getLibraryDescriptors(generatorDescriptor.getLibraryIDs());
-		
+	private FeatureConfiguration createFeatureConfiguration(EObject object, FeatureType featureType) {
+		Iterable<LibraryDescriptor> libraryDescriptor = LibraryExtensions.getLibraryDescriptors(descriptor
+				.getLibraryIDs());
 		for (LibraryDescriptor desc : libraryDescriptor) {
-			IDefaultFeatureValueProvider defaultProvider = desc
-					.createFeatureValueProvider();
-			if (defaultProvider != null
-					&& defaultProvider.isProviderFor(featureType.getLibrary())) {
-				return defaultProvider.createDefaultFeatureConfiguration(
-						featureType, statechart);
+			IDefaultFeatureValueProvider defaultProvider = desc.createFeatureValueProvider();
+			if (defaultProvider != null && defaultProvider.isProviderFor(featureType.getLibrary())) {
+				return defaultProvider.createDefaultFeatureConfiguration(featureType, object);
 			}
 		}
 		return null;
 	}
 
-	public static List<FeatureType> getFeatureTypes(String generatorId) {
+	public static List<FeatureType> getFeatureTypes(GeneratorDescriptor descriptor) {
 		ArrayList<FeatureType> features = Lists.newArrayList();
-		
-		GeneratorDescriptor generatorDescriptor = GeneratorExtensions
-				.getGeneratorDescriptorForId(generatorId);
-		
-		Iterable<LibraryDescriptor> libraryDescriptor = LibraryExtensions
-				.getLibraryDescriptors(generatorDescriptor.getLibraryIDs());
-		
+		Iterable<LibraryDescriptor> libraryDescriptor = LibraryExtensions.getLibraryDescriptors(descriptor
+				.getLibraryIDs());
 		for (LibraryDescriptor desc : libraryDescriptor) {
 			ResourceSet set = new ResourceSetImpl();
 			Resource resource = set.getResource(desc.getURI(), true);
-			FeatureTypeLibrary lib = (FeatureTypeLibrary) resource
-					.getContents().get(0);
+			FeatureTypeLibrary lib = (FeatureTypeLibrary) resource.getContents().get(0);
 			EList<FeatureType> types = lib.getTypes();
 			// Only add the required features to the default model
 			for (FeatureType featureType : types) {

+ 21 - 26
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/SGenNewFileWizard.java

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2011 committers of YAKINDU and others.
+ * Copyright (c) 2013 committers of YAKINDU 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
@@ -23,6 +23,7 @@ import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.jface.operation.IRunnableWithProgress;
@@ -37,10 +38,11 @@ import org.eclipse.ui.actions.WorkspaceModifyOperation;
 import org.eclipse.ui.part.FileEditorInput;
 import org.yakindu.sct.builder.nature.SCTNature;
 import org.yakindu.sct.builder.nature.ToggleSCTNatureAction;
+import org.yakindu.sct.generator.core.extensions.GeneratorExtensions.GeneratorDescriptor;
 import org.yakindu.sct.model.sgen.GeneratorModel;
-import org.yakindu.sct.model.sgraph.Statechart;
 
 import com.google.inject.Inject;
+import com.google.inject.Injector;
 
 /**
  * 
@@ -61,6 +63,8 @@ public class SGenNewFileWizard extends Wizard implements INewWizard {
 
 	@Inject
 	private ResourceSet resourceSet;
+	@Inject
+	private Injector injector;
 
 	public void init(IWorkbench workbench, IStructuredSelection selection) {
 		this.selection = selection;
@@ -72,16 +76,13 @@ public class SGenNewFileWizard extends Wizard implements INewWizard {
 	@Override
 	public void addPages() {
 		modelFilePage = new SGenWizardPage1("fileName", selection, "sgen");
-		modelFilePage.setTitle("YAKINDU Statechart Generator Model");
-		modelFilePage
-				.setDescription("Create a new YAKINDU Statechart Generator Model");
+		modelFilePage.setTitle("YAKINDU Generator Model");
+		modelFilePage.setDescription("Create a new YAKINDU Generator Model");
 		addPage(modelFilePage);
-		generatorConfigPage = new SGenWizardPage2("Statecharts", modelFilePage,
-				selection);
-		generatorConfigPage
-				.setTitle("YAKINDU Statechart Generator Model Configuration");
-		generatorConfigPage
-				.setDescription("Select the Statecharts and the Generator type");
+		generatorConfigPage = new SGenWizardPage2("content", modelFilePage, selection);
+		injector.injectMembers(generatorConfigPage);
+		generatorConfigPage.setTitle("YAKINDU Generator model configuration");
+		generatorConfigPage.setDescription("Select the generator type and the content");
 		addPage(generatorConfigPage);
 	}
 
@@ -89,8 +90,7 @@ public class SGenNewFileWizard extends Wizard implements INewWizard {
 	public boolean performFinish() {
 		IRunnableWithProgress op = new WorkspaceModifyOperation(null) {
 			@Override
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InterruptedException {
+			protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException {
 				ensureSCTNature(getProject(modelFilePage.getContainerFullPath()));
 				Resource resource = createDefaultModel(modelFilePage.getURI());
 				openModel(resource);
@@ -104,16 +104,13 @@ public class SGenNewFileWizard extends Wizard implements INewWizard {
 		}
 		return true;
 	}
-	
+
 	protected boolean openModel(Resource model) throws PartInitException {
 		String path = model.getURI().toPlatformString(true);
-		IResource workspaceResource = ResourcesPlugin.getWorkspace().getRoot()
-				.findMember(new Path(path));
+		IResource workspaceResource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
 		if (workspaceResource instanceof IFile) {
-			IWorkbenchPage page = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage();
-			return null != page.openEditor(new FileEditorInput(
-					(IFile) workspaceResource), SGEN_EDITOR_ID);
+			IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+			return null != page.openEditor(new FileEditorInput((IFile) workspaceResource), SGEN_EDITOR_ID);
 		}
 		return false;
 	}
@@ -128,15 +125,13 @@ public class SGenNewFileWizard extends Wizard implements INewWizard {
 		if (containerFullPath.segmentCount() == 1) {
 			return ResourcesPlugin.getWorkspace().getRoot().getProject(containerFullPath.lastSegment());
 		}
-		return ResourcesPlugin.getWorkspace().getRoot()
-				.getFolder(containerFullPath).getProject();
+		return ResourcesPlugin.getWorkspace().getRoot().getFolder(containerFullPath).getProject();
 	}
 
 	private Resource createDefaultModel(URI uri) {
-		List<Statechart> statecharts = generatorConfigPage.getStatecharts();
-		String generatorId = generatorConfigPage.getGeneratorId();
-
-		ModelCreator creator = new ModelCreator(generatorId, statecharts);
+		List<EObject> selectedObjects = generatorConfigPage.getSelectedElements();
+		GeneratorDescriptor selectedGenerator = generatorConfigPage.getSelectedGenerator();
+		ModelCreator creator = new ModelCreator(selectedGenerator, selectedObjects);
 		GeneratorModel model = creator.create();
 
 		Resource resource = resourceSet.createResource(uri);

+ 88 - 330
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/SGenWizardPage2.java

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2011 committers of YAKINDU and others.
+ * Copyright (c) 2013 committers of YAKINDU 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
@@ -10,36 +10,37 @@
  */
 package org.yakindu.sct.generator.genmodel.ui.wizard;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TreeMap;
 
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTreeViewer;
 import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
@@ -47,21 +48,10 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
 import org.yakindu.sct.generator.core.extensions.FileExtensions;
-import org.yakindu.sct.generator.core.extensions.FileExtensions.FileExtensionDescriptor;
 import org.yakindu.sct.generator.core.extensions.GeneratorExtensions;
 import org.yakindu.sct.generator.core.extensions.GeneratorExtensions.GeneratorDescriptor;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
-import org.yakindu.sct.model.sgraph.Statechart;
-import org.yakindu.sct.ui.editor.StatechartImages;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 
 /**
@@ -69,92 +59,30 @@ import com.google.common.collect.Lists;
  * @author holger willebrandt - Initial contribution and API
  * @author andreas muelder - extension point for contribution of file extensions
  *         added
+ * @author oliver bohl - changed for more generic
+ * 
  */
 public class SGenWizardPage2 extends WizardPage {
 
-	// protected static final String STATECHART_FILE_EXTENSION = "sct";
-
-	static Map<String, CoreGenerator> natureDefaultGenerators = new TreeMap<String, CoreGenerator>();
+	private final static Map<String, CoreGenerator> PROJECT_NATURES = new TreeMap<String, CoreGenerator>();
 	static {
-		natureDefaultGenerators.put("org.eclipse.cdt.core.cnature",
-				CoreGenerator.C);
-		natureDefaultGenerators.put("org.eclipse.cdt.core.ccnature",
-				CoreGenerator.Cpp);
-		natureDefaultGenerators.put(JavaCore.NATURE_ID,
-				CoreGenerator.Java);
+		PROJECT_NATURES.put("org.eclipse.cdt.core.cnature", CoreGenerator.C);
+		PROJECT_NATURES.put("org.eclipse.cdt.core.ccnature", CoreGenerator.Cpp);
+		PROJECT_NATURES.put(JavaCore.NATURE_ID, CoreGenerator.Java);
 	}
-	private ComboViewer generatorCombo;
-	protected CheckboxTreeViewer stateChartTree;
-	private final SGenWizardPage1 fileSelectionPage;
-
-	private static final ITreeContentProvider treeContentProvider = new ITreeContentProvider() {
-
-		public Object[] getElements(Object inputElement) {
-			if (inputElement instanceof TreeNode) {
-				return ((TreeNode) inputElement).children.toArray();
-			}
-			return new Object[] {};
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof TreeNode) {
-				return !((TreeNode) element).children.isEmpty();
-			}
-			return false;
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof TreeNode) {
-				return ((TreeNode) parentElement).children.toArray();
-			}
-			return new Object[] {};
-		}
 
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// not handled
-		}
-
-		public void dispose() {
-			// not handled
-		}
-
-		public Object getParent(Object element) {
-			return null;
-		}
-
-	};
-	private static final LabelProvider treeLabelProvider = new LabelProvider() {
+	private ComboViewer generatorCombo;
 
-		@Override
-		public Image getImage(Object element) {
-			if (element instanceof TreeNode) {
-				TreeNode treeNode = (TreeNode) element;
-				if (isStatechartResource(treeNode.resource)) {
-					return StatechartImages.LOGO.image();
-				} else if (treeNode.resource.getType() == IResource.FOLDER) {
-					return PlatformUI.getWorkbench().getSharedImages()
-							.getImage(ISharedImages.IMG_OBJ_FOLDER);
-				} else if (treeNode.resource.getType() == IResource.PROJECT) {
-					return PlatformUI.getWorkbench().getSharedImages()
-							.getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
-				}
-			}
-			return super.getImage(element);
-		}
+	protected CheckboxTreeViewer resourceTree;
 
-		@Override
-		public String getText(Object element) {
-			if (element instanceof TreeNode) {
-				return ((TreeNode) element).resource.getName();
-			}
-			return super.getText(element);
-		}
-	};
+	private final SGenWizardPage1 fileSelectionPage;
 
+	@SuppressWarnings("unused")
 	private final IStructuredSelection selection;
 
-	protected SGenWizardPage2(String pageName,
-			SGenWizardPage1 fileSelectionPage, IStructuredSelection selection) {
+	private Label lblNewLabel;
+
+	protected SGenWizardPage2(String pageName, SGenWizardPage1 fileSelectionPage, IStructuredSelection selection) {
 		super(pageName);
 		this.fileSelectionPage = fileSelectionPage;
 		this.selection = selection;
@@ -165,287 +93,118 @@ public class SGenWizardPage2 extends WizardPage {
 		setControl(container);
 		container.setLayout(new GridLayout(1, false));
 		createGeneratorCombo(container);
-		createStatechartTree(container);
-		checkComplete();
+		createObjectTree(container);
+		refreshInput();
 	}
 
-	private void createStatechartTree(Composite container) {
-		Label lblNewLabel = new Label(container, SWT.NONE);
-		lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true,
-				false, 1, 1));
-		lblNewLabel.setText("Statecharts");
+	private void createObjectTree(Composite container) {
+		lblNewLabel = new Label(container, SWT.NONE);
+		lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
+		lblNewLabel.setText("Choose: " + getSelectedGenerator().getContentType());
+
+		resourceTree = new CheckboxTreeViewer(container, SWT.BORDER);
+		resourceTree.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
 
-		stateChartTree = new CheckboxTreeViewer(container, SWT.BORDER);
-		stateChartTree.getTree().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+		resourceTree.setContentProvider(new SGenWizardPage2ContentProvider());
+		resourceTree.setLabelProvider(new SGenWizardPage2LabelProvider());
 
-		stateChartTree.setContentProvider(treeContentProvider);
-		stateChartTree.setLabelProvider(treeLabelProvider);
-		TreePropagatingCheckStateListener checkStateListener = new TreePropagatingCheckStateListener(
-				stateChartTree) {
+		TreePropagatingCheckStateListener checkStateListener = new TreePropagatingCheckStateListener(resourceTree) {
 			@Override
 			public void checkStateChanged(CheckStateChangedEvent event) {
 				super.checkStateChanged(event);
-				checkComplete();
 			}
 		};
-		stateChartTree.addCheckStateListener(checkStateListener);
-		stateChartTree
-				.addDoubleClickListener(new TreeExpandingDoubleClickListener(
-						stateChartTree, checkStateListener));
-		stateChartTree.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
+		resourceTree.addCheckStateListener(checkStateListener);
+		resourceTree.addDoubleClickListener(new TreeExpandingDoubleClickListener(resourceTree, checkStateListener));
+		resourceTree.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
+		resourceTree.setFilters(new ViewerFilter[] { new ViewerFilter() {
+			@Override
+			public boolean select(Viewer viewer, Object parentElement, Object element) {
+				// TODO: Filter by common navigator filter instead of supressing
+				// '.' prefixed folder
+				if (element instanceof IFolder) {
+					return !((IFolder) element).getName().startsWith(".");
+				}
+				return true;
+			}
+		} });
 	}
 
 	private void createGeneratorCombo(Composite container) {
 		Label lblGenerator = new Label(container, SWT.NONE);
 		lblGenerator.setText("Generator");
 		generatorCombo = new ComboViewer(container, SWT.READ_ONLY);
-		generatorCombo.getCombo().setLayoutData(
-				new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+		generatorCombo.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
 		generatorCombo.setLabelProvider(new GeneratorDescriptorLabelProvider());
 		generatorCombo.setContentProvider(new ArrayContentProvider());
-		List<GeneratorDescriptor> descriptors = Lists
-				.newArrayList(GeneratorExtensions.getGeneratorDescriptors());
+		List<GeneratorDescriptor> descriptors = Lists.newArrayList(GeneratorExtensions.getGeneratorDescriptors());
 		Collections.sort(descriptors, CoreGenerator.generatorOrder);
 		generatorCombo.setInput(descriptors);
 		generatorCombo.getCombo().select(0);
-	}
-
-	public List<Statechart> getStatecharts() {
-		List<Statechart> statecharts = Lists.newArrayList();
-		Object[] checkedElements = stateChartTree.getCheckedElements();
-		for (Object object : checkedElements) {
-			if (object instanceof TreeNode) {
-				IResource resource = ((TreeNode) object).resource;
-				if (isStatechartResource(resource)) {
-					statecharts.add(loadStatechart(resource));
-				}
+		generatorCombo.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				refreshInput();
 			}
-		}
-		return statecharts;
+		});
 	}
 
-	private static Statechart loadStatechart(IResource resource) {
-		Resource emfResource = toEmfResource(resource);
-		Statechart statechart = (Statechart) EcoreUtil.getObjectByType(
-				emfResource.getContents(), SGraphPackage.Literals.STATECHART);
-		return statechart;
+	protected void refreshInput() {
+		lblNewLabel.setText("Choose: " + getSelectedGenerator().getContentType());
+		((SGenWizardPage2ContentProvider) resourceTree.getContentProvider()).setFileExtension(FileExtensions
+				.getFileExtension(getSelectedGenerator().getId()));
+		resourceTree.setInput(getSelectedProject());
 	}
 
-	private static Resource toEmfResource(IResource iResource) {
-		URI uri = URI.createPlatformResourceURI(iResource.getFullPath()
-				.toString(), true);
-		ResourceSet resourceSet = new ResourceSetImpl();
-		return resourceSet.getResource(uri, true);
+	protected IProject getSelectedProject() {
+		IPath containerPath = fileSelectionPage.getFilePath();
+		IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(containerPath);
+		return folder.getProject();
 	}
 
-	public String getGeneratorId() {
-		return ((GeneratorDescriptor) ((StructuredSelection) generatorCombo
-				.getSelection()).getFirstElement()).getId();
-	}
-
-	@Override
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			IPath containerPath = fileSelectionPage.getFilePath();
-			IFolder folder = ResourcesPlugin.getWorkspace().getRoot()
-					.getFolder(containerPath);
-			try {
-				TreeNode projectTree = new TreeNode(folder.getProject());
-				projectTree.children.add(buildTree(folder.getProject()));
-				stateChartTree.setInput(projectTree);
-				applyPreselection(projectTree);
-			} catch (CoreException e) {
-				// input will be empty
-			}
-			preselectGenerator(folder);
-			checkComplete();
-		}
-	}
-
-	private void preselectGenerator(IFolder folder) {
-		String generatorId = CoreGenerator.Java.getId();
-		IProject project = folder.getProject();
-		try {
-			for (Entry<String, CoreGenerator> entry : natureDefaultGenerators
-					.entrySet()) {
-				if (project.getNature(entry.getKey()) != null) {
-					generatorId = entry.getValue().getId();
-				}
+	public List<EObject> getSelectedElements() {
+		List<EObject> selectedElements = Lists.newArrayList();
+		Object[] checkedElements = resourceTree.getCheckedElements();
+		for (Object object : checkedElements) {
+			if (object instanceof IFile) {
+				selectedElements.add(loadReferencedObject((IResource) object));
 			}
-		} catch (CoreException e) {
-			// nothing will be pre-selected
-		}
-		GeneratorDescriptor descriptor = generatorId != null ? GeneratorExtensions
-				.getGeneratorDescriptorForId(generatorId) : null;
-		if (descriptor != null) {
-			generatorCombo.setSelection(new StructuredSelection(
-					new Object[] { descriptor }), true);
-		}
-	}
-
-	private void applyPreselection(TreeNode treeNode) {
-		if (treeNode.isPreselected()) {
-			stateChartTree.setChecked(treeNode, true);
-		}
-		for (TreeNode child : treeNode.children) {
-			applyPreselection(child);
 		}
+		return selectedElements;
 	}
 
-	protected void checkComplete() {
-		setPageComplete(validatePage());
-	}
+	protected EObject loadReferencedObject(IResource resource) {
+		URI uri = URI.createPlatformResourceURI(resource.getFullPath().toString(), true);
+		ResourceSet resourceSet = new ResourceSetImpl();
+		Resource emfResource = resourceSet.getResource(uri, true);
 
-	protected boolean validatePage() {
-		return stateChartSelected() && !generatorCombo.getSelection().isEmpty();
-	}
+		GeneratorDescriptor desc = getSelectedGenerator();
+		String className = desc.getElementRefType();
 
-	protected boolean stateChartSelected() {
-		if (stateChartTree.getCheckedElements().length > 0) {
-			for (Object element : stateChartTree.getCheckedElements()) {
-				if (element instanceof TreeNode
-						&& isStatechartResource(((TreeNode) element).resource)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
+		TreeIterator<EObject> content = emfResource.getAllContents();
+		List<EObject> contentList = Lists.newArrayList(content);
 
-	private TreeNode buildTree(IResource resource) throws CoreException {
-		final TreeNode root = new TreeNode(resource);
-		List<IResource> statecharts = Lists.newArrayList();
-		resource.accept(new StatechartVisitor(resource, statecharts));
-		if (!statecharts.isEmpty()) {
-			Iterables.addAll(root.children, Iterables.transform(
-					Iterables.transform(statecharts, toTreeNode),
-					preselect(selection)));
+		for (EObject obj : contentList) {
+			if (obj.eClass().getInstanceClassName().equals(className))
+				return obj;
 		}
-		List<IResource> folders = Lists.newArrayList();
-		resource.accept(new FolderVisitor(resource, folders));
-		for (IResource folder : folders) {
-			TreeNode subtree = buildTree(folder);
-			if (!subtree.isEmpty()) {
-				root.children.add(subtree);
-			}
-		}
-		return root;
-	}
-
-	private Function<TreeNode, TreeNode> preselect(
-			final IStructuredSelection selection) {
 
-		return new Function<TreeNode, TreeNode>() {
-
-			public TreeNode apply(TreeNode from) {
-				if (Iterators.contains(selection.iterator(), from.resource)) {
-					from.setPreselected(true);
+		for (EObject obj : contentList) {
+			List<EClass> superClasses = obj.eClass().getEAllSuperTypes();
+			for (EClass superClass : superClasses) {
+				if (superClass.getInstanceClassName().equals(className)) {
+					return obj;
 				}
-				return from;
 			}
-		};
-	}
-
-	protected static boolean isStatechartResource(IResource resource) {
-		List<String> registeredExtensions = new ArrayList<String>();
-		Iterable<FileExtensionDescriptor> fileExtensions = FileExtensions
-				.getFileExtensions();
-		for (FileExtensionDescriptor desc : fileExtensions) {
-			registeredExtensions.add(desc.getExtension());
 		}
-		return resource.getType() == IResource.FILE
-				&& registeredExtensions.contains(resource.getFileExtension());
+		return null;
 	}
 
-	private static final Function<IResource, TreeNode> toTreeNode = new Function<IResource, TreeNode>() {
-
-		public TreeNode apply(IResource from) {
-			return new TreeNode(from);
-		}
-	};
-
-	private static class TreeNode {
-		final IResource resource;
-		private boolean preselected;
-		final List<TreeNode> children = Lists.newArrayList();
-
-		public TreeNode(IResource project) {
-			this.resource = project;
-		}
-
-		public boolean isEmpty() {
-			return resource.getType() == IResource.FOLDER
-					&& (children.isEmpty() || Iterables.all(children, isEmpty));
-		}
-
-		public boolean isPreselected() {
-			return preselected;
-		}
-
-		public void setPreselected(boolean preselect) {
-			this.preselected = preselect;
-		}
-
-		static final Predicate<TreeNode> isEmpty = new Predicate<TreeNode>() {
-			public boolean apply(TreeNode input) {
-				return input.isEmpty();
-			}
-		};
-	}
-
-	private class FolderVisitor implements IResourceVisitor {
-		final List<IResource> matches;
-		private final IResource rootFolder;
-
-		public FolderVisitor(IResource rootFolder, List<IResource> matches) {
-			super();
-			this.rootFolder = rootFolder;
-			this.matches = matches;
-		}
-
-		public boolean visit(IResource resource) throws CoreException {
-			if (rootFolder.equals(resource)) {
-				return true;
-			}
-			if (resource.getType() == IResource.FOLDER && !resource.isDerived()) {
-				matches.add(resource);
-			}
-			return resource.getType() == IResource.PROJECT;
-		}
-
-	}
-
-	private class StatechartVisitor implements IResourceVisitor {
-
-		final List<IResource> matches;
-		private final IResource rootResource;
-
-		public StatechartVisitor(IResource rootResource, List<IResource> matches) {
-			super();
-			this.rootResource = rootResource;
-			this.matches = matches;
-		}
-
-		public boolean visit(IResource resource) throws CoreException {
-			if (rootResource.equals(resource)
-					&& resource.getType() == IResource.FOLDER) {
-				return true;
-			}
-			if (isStatechartResource(resource)) {
-				matches.add(resource);
-			}
-			return resource.getType() == IResource.PROJECT;
-		}
+	public GeneratorDescriptor getSelectedGenerator() {
+		return (GeneratorDescriptor) ((StructuredSelection) generatorCombo.getSelection()).getFirstElement();
 	}
 
 	private static class GeneratorDescriptorLabelProvider extends LabelProvider {
 
-		GeneratorDescriptorLabelProvider() {
-			super();
-		}
-
 		@Override
 		public String getText(Object element) {
 			if (element instanceof GeneratorDescriptor) {
@@ -461,6 +220,5 @@ public class SGenWizardPage2 extends WizardPage {
 			}
 			return super.getImage(element);
 		}
-
 	}
 }

+ 123 - 0
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/SGenWizardPage2ContentProvider.java

@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2013 committers of YAKINDU 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.generator.genmodel.ui.wizard;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * 
+ * @author oliver bohl - Initial contribution and API
+ * 
+ */
+public class SGenWizardPage2ContentProvider implements ITreeContentProvider {
+
+	protected String fileExtension;
+
+	public Object[] getElements(Object inputElement) {
+		if (inputElement instanceof IContainer) {
+			IContainer container = (IContainer) inputElement;
+			try {
+				return filterForContent(container.members());
+			} catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
+		return new Object[] {};
+	}
+
+	public boolean hasChildren(Object element) {
+		return element instanceof IContainer;
+	}
+
+	public Object[] getChildren(Object parentElement) {
+		Object[] result = getElements(parentElement);
+		try {
+			return filterForContent(result);
+		} catch (CoreException e) {
+			e.printStackTrace();
+			return new Object[0];
+		}
+	}
+
+	public boolean containsFile(IFolder folder) throws CoreException {
+		if (folder.members() != null) {
+			for (Object member : folder.members()) {
+				if (member instanceof IFile && ((IFile) member).getFileExtension().equals(fileExtension)) {
+					return true;
+				} else if (member instanceof IFolder) {
+					return containsFile((IFolder) member);
+				}
+			}
+		}
+		return false;
+	}
+
+	public Object[] filterForContent(Object[] inputElements) throws CoreException {
+		final Set<Object> result = new HashSet<Object>();
+		for (final Object obj : inputElements) {
+			((IResource) obj).accept(new IResourceVisitor() {
+				public boolean visit(IResource resource) throws CoreException {
+					if (resource instanceof IFile && resource.getFileExtension().equals(fileExtension)) {
+						if (!containsErrors(resource))
+							result.add(obj);
+						return true;
+					} else if (resource instanceof IFolder && containsFile((IFolder) resource)) {
+						result.add(obj);
+						return true;
+					}
+					return false;
+				}
+			});
+		}
+		return result.toArray(new IResource[0]);
+	}
+
+	public boolean containsErrors(IResource resource) {
+		int maxSeverity;
+		try {
+			maxSeverity = resource.findMaxProblemSeverity(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
+			return maxSeverity == IMarker.SEVERITY_ERROR;
+		} catch (CoreException e) {
+			return true;
+		}
+	}
+
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		// not handled
+	}
+
+	public void dispose() {
+		// not handled
+	}
+
+	public Object getParent(Object element) {
+		return null;
+	}
+
+	public String getFileExtension() {
+		return fileExtension;
+	}
+
+	public void setFileExtension(String fileExtension) {
+		this.fileExtension = fileExtension;
+	}
+}

+ 51 - 0
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/SGenWizardPage2LabelProvider.java

@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2013 committers of YAKINDU 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.generator.genmodel.ui.wizard;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.yakindu.sct.generator.core.extensions.FileExtensions;
+import org.yakindu.sct.generator.core.extensions.GeneratorExtensions;
+import org.yakindu.sct.generator.core.extensions.GeneratorExtensions.GeneratorDescriptor;
+
+/**
+ * 
+ * @author oliver bohl - Initial contribution and API
+ * 
+ */
+class SGenWizardPage2LabelProvider extends LabelProvider {
+
+	@Override
+	public Image getImage(Object element) {
+		if (element instanceof IFolder) {
+			return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+		} else if (element instanceof IProject) {
+			return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
+		} else if (element instanceof IFile) {
+			String generatorID = FileExtensions.getGeneratorForFileExtension(((IFile) element).getFileExtension());
+			GeneratorDescriptor genDesc = GeneratorExtensions.getGeneratorDescriptorForId(generatorID);
+			return genDesc.getImage();
+		}
+		return super.getImage(element);
+	}
+
+	@Override
+	public String getText(Object element) {
+		return ((IResource) element).getName();
+	}
+};