Java tutorial
/** * 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.Collections; import java.util.List; import java.util.Map; 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.ResourcesPlugin; 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.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.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; 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.yakindu.sct.generator.core.extensions.FileExtensions; import org.yakindu.sct.generator.core.extensions.GeneratorExtensions; import org.yakindu.sct.generator.core.extensions.IGeneratorDescriptor; import org.yakindu.sct.generator.genmodel.ui.PathToImageResolver; import org.yakindu.sct.ui.wizards.AbstractWorkspaceLabelProvider; import org.yakindu.sct.ui.wizards.ModelCreationWizardPage; import org.yakindu.sct.ui.wizards.WorkspaceTreeContentProvider; 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 { private final static Map<String, CoreGenerator> PROJECT_NATURES = new TreeMap<String, CoreGenerator>(); static { 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 resourceTree; private final ModelCreationWizardPage fileSelectionPage; @SuppressWarnings("unused") private final IStructuredSelection selection; private Label lblNewLabel; protected SGenWizardPage2(String pageName, ModelCreationWizardPage fileSelectionPage, IStructuredSelection selection) { super(pageName); this.fileSelectionPage = fileSelectionPage; this.selection = selection; } public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); setControl(container); container.setLayout(new GridLayout(1, false)); createGeneratorCombo(container); createObjectTree(container); refreshInput(); } 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)); resourceTree.setContentProvider(new WorkspaceTreeContentProvider()); resourceTree.setLabelProvider(new SGenWorkspaceLabelProvider()); TreePropagatingCheckStateListener checkStateListener = new TreePropagatingCheckStateListener(resourceTree) { @Override public void checkStateChanged(CheckStateChangedEvent event) { super.checkStateChanged(event); } }; 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.setLabelProvider(new GeneratorDescriptorLabelProvider()); generatorCombo.setContentProvider(new ArrayContentProvider()); List<IGeneratorDescriptor> descriptors = Lists.newArrayList(GeneratorExtensions.getGeneratorDescriptors()); Collections.sort(descriptors, CoreGenerator.generatorOrder); generatorCombo.setInput(descriptors); generatorCombo.getCombo().select(0); generatorCombo.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { refreshInput(); } }); } protected void refreshInput() { lblNewLabel.setText("Choose: " + getSelectedGenerator().getContentType()); ((WorkspaceTreeContentProvider) resourceTree.getContentProvider()) .setFileExtension(FileExtensions.getFileExtension(getSelectedGenerator().getId())); resourceTree.setInput(getSelectedProject()); } protected IProject getSelectedProject() { IPath containerPath = fileSelectionPage.getFilePath(); IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(containerPath); return folder.getProject(); } 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)); } } return selectedElements; } protected EObject loadReferencedObject(IResource resource) { URI uri = URI.createPlatformResourceURI(resource.getFullPath().toString(), true); ResourceSet resourceSet = new ResourceSetImpl(); Resource emfResource = resourceSet.getResource(uri, true); IGeneratorDescriptor desc = getSelectedGenerator(); String className = desc.getElementRefType(); TreeIterator<EObject> content = emfResource.getAllContents(); List<EObject> contentList = Lists.newArrayList(content); for (EObject obj : contentList) { if (obj.eClass().getInstanceClassName().equals(className)) return obj; } for (EObject obj : contentList) { List<EClass> superClasses = obj.eClass().getEAllSuperTypes(); for (EClass superClass : superClasses) { if (superClass.getInstanceClassName().equals(className)) { return obj; } } } return null; } public IGeneratorDescriptor getSelectedGenerator() { return (IGeneratorDescriptor) ((StructuredSelection) generatorCombo.getSelection()).getFirstElement(); } private static class GeneratorDescriptorLabelProvider extends LabelProvider { @Override public String getText(Object element) { if (element instanceof IGeneratorDescriptor) { return ((IGeneratorDescriptor) element).getName(); } return super.getText(element); } @Override public Image getImage(Object element) { if (element instanceof IGeneratorDescriptor) { return PathToImageResolver.toImage(((IGeneratorDescriptor) element).getImagePath()); } return super.getImage(element); } } protected static class SGenWorkspaceLabelProvider extends AbstractWorkspaceLabelProvider { protected Image createImageForFile(IFile file) { String generatorID = FileExtensions.getGeneratorForFileExtension(file.getFileExtension()); IGeneratorDescriptor genDesc = GeneratorExtensions.getGeneratorDescriptor(generatorID); return PathToImageResolver.toImage(genDesc.getImagePath()); } } }