/******************************************************************************* * Copyright (c) 2008, 2012 * 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: * Javier Canovas (javier.canovas@inria.fr) *******************************************************************************/ package fr.inria.atlanmod.collaboro.ui.wizards; import java.awt.Dialog; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; 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.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; 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.xmi.impl.EcoreResourceFactoryImpl; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; import fr.inria.atlanmod.collaboro.history.History; import fr.inria.atlanmod.collaboro.history.HistoryFactory; import fr.inria.atlanmod.collaboro.history.HistoryPackage; import fr.inria.atlanmod.collaboro.history.User; import fr.inria.atlanmod.collaboro.history.Version; import fr.inria.atlanmod.collaboro.history.VersionHistory; import fr.inria.atlanmod.collaboro.history.VersionHistoryType; import fr.inria.atlanmod.collaboro.notation.Definition; import fr.inria.atlanmod.collaboro.notation.NotationFactory; import fr.inria.atlanmod.collaboro.notation.NotationPackage; import fr.inria.atlanmod.collaboro.ui.Controller; public class NewLocalCollaboroProjectWizard extends Wizard implements INewWizard { private static final String DEFAULT_FILENAME = "defaultHistoryFileName"; protected IStructuredSelection selection; protected IWorkbench workbench; protected HistoryNewUsers newUsersPage; protected WizardNewProjectCreationPage newProjectPage; public class HistoryNewUsers extends WizardPage { protected HistoryNewUsers(String pageName) { super(pageName); } private ListViewer userList; private List<User> users = new ArrayList<User>(); Text userNameText; @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); composite.setLayout(layout); layout.numColumns = 1; composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Group newUser = new Group(composite, SWT.NONE); newUser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 3; newUser.setLayout(gridLayout); newUser.setText("Add new user"); Label label = new Label(newUser, SWT.NONE); label.setText("User name:"); label.setLayoutData(new GridData(GridData.BEGINNING, GridData.FILL, false, true)); userNameText = new Text(newUser, SWT.BORDER); userNameText.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); Button addButton = new Button(newUser, SWT.NONE); addButton.setLayoutData(new GridData(GridData.END, GridData.FILL, false, true)); addButton.setText("Add"); addButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { User user = HistoryFactory.eINSTANCE.createUser(); user.setId(userNameText.getText()); users.add(user); userList.refresh(); userNameText.setText(""); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); Group listGroup = new Group(composite, SWT.NONE); listGroup.setBounds(new Rectangle(0, 0, 500, 500)); listGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout gridLayout2 = new GridLayout(); gridLayout2.numColumns = 1; listGroup.setLayout(gridLayout2); listGroup.setText("User list"); userList = new ListViewer(listGroup, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); userList.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); userList.setContentProvider(new IStructuredContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof List) { List list = (List) inputElement; return list.toArray(); } return null; } }); userList.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof User) { User user = (User) element; return user.getId(); } return "User unknown"; } }); userList.setInput(users); setControl(composite); } public List<User> getUsers() { return users; } } @Override public void addPages() { newProjectPage = new WizardNewProjectCreationPage("Creating Collaboro Project"); newProjectPage.setTitle("Creating Collaboro Project"); newProjectPage.setDescription("A new Collaboro project to develop a DSL collaboratively project will be created"); addPage(newProjectPage); newUsersPage = new HistoryNewUsers("Adding users"); newUsersPage.setTitle("Community Users"); newUsersPage.setDescription("Add new users to the community"); addPage(newUsersPage); } public NewLocalCollaboroProjectWizard() { // TODO Auto-generated constructor stub } @Override public void init(IWorkbench workbench, IStructuredSelection selection) { this.workbench = workbench; this.selection = selection; } @Override public boolean performFinish() { final String projectName = newProjectPage.getProjectName(); WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { @Override protected void execute(IProgressMonitor progressMonitor) { progressMonitor.beginTask("Creating Collaboro Project", 10); progressMonitor.subTask("Registering packages"); ResourceSet rset = new ResourceSetImpl(); rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.HISTORY_EXTENSION, new EcoreResourceFactoryImpl()); rset.getPackageRegistry().put(HistoryPackage.eNS_URI, HistoryPackage.eINSTANCE); rset.getPackageRegistry().put(NotationPackage.eNS_URI, NotationPackage.eINSTANCE); rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.MODEL_EXTENSION, new EcoreResourceFactoryImpl()); rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.NOTATION_EXTENSION, new EcoreResourceFactoryImpl()); rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.ECORE_EXTENSION, new EcoreResourceFactoryImpl()); progressMonitor.worked(1); progressMonitor.subTask("Creating the project"); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IProject project = root.getProject(projectName); try { project.create(progressMonitor); project.open(progressMonitor); } catch(Exception e) { e.printStackTrace(); MessageDialog dialog = new MessageDialog(getShell(), "Error", null, "Error when creating the project in the workspace", MessageDialog.ERROR, new String[] {"OK"}, 0); dialog.open(); progressMonitor.done(); return; } IFolder modelsFolder = project.getFolder("models"); try{ modelsFolder.create(true, true, progressMonitor); } catch(Exception e) { e.printStackTrace(); MessageDialog dialog = new MessageDialog(getShell(), "Error", null, "Error when creating the folder 'models' in the project", MessageDialog.ERROR, new String[] {"OK"}, 0); dialog.open(); progressMonitor.done(); return; } IFolder examplesFolder = project.getFolder("examples"); try { examplesFolder.create(true, true, progressMonitor); } catch(Exception e) { e.printStackTrace(); MessageDialog dialog = new MessageDialog(getShell(), "Error", null, "Error when creating the folder 'examples' in the project", MessageDialog.ERROR, new String[] {"OK"}, 0); dialog.open(); progressMonitor.done(); return; } progressMonitor.worked(1); progressMonitor.subTask("Creating initial Collaboro model"); History historyModel = createInitialHistoryModel(); List<User> users = newUsersPage.getUsers(); if(users != null) historyModel.getUsers().addAll(users); URI collaboroFile = URI.createPlatformResourceURI(modelsFolder.getFullPath().toString() + File.separator + projectName + ".history", true); Resource collaboroRes = rset.createResource(collaboroFile); collaboroRes.getContents().add(historyModel); try { collaboroRes.save(null); } catch (Exception exception) { exception.printStackTrace(); MessageDialog dialog = new MessageDialog(getShell(), "Error", null, "Error when creating initial Collaboro model", MessageDialog.ERROR, new String[] {"OK"}, 0); dialog.open(); progressMonitor.done(); return; } progressMonitor.worked(1); progressMonitor.subTask("Creating initial Ecore model"); EPackage ePackage = createInitiaEcorePackage(projectName); URI ePackageFile = URI.createPlatformResourceURI(modelsFolder.getFullPath().toString() + File.separator + projectName + ".ecore", true); Resource ePackageRes = rset.createResource(ePackageFile); ePackageRes.getContents().add(ePackage); try { ePackageRes.save(null); } catch (Exception exception) { exception.printStackTrace(); MessageDialog dialog = new MessageDialog(getShell(), "Error", null, "Error when creating initial Ecore model", MessageDialog.ERROR, new String[] {"OK"}, 0); dialog.open(); progressMonitor.done(); return; } progressMonitor.worked(1); progressMonitor.subTask("Creating initial Notation model"); Definition notation = createInitiaNotationModel(); URI notationFile = URI.createPlatformResourceURI(modelsFolder.getFullPath().toString() + File.separator + projectName + ".notation", true); Resource notationRes = rset.createResource(notationFile); notationRes.getContents().add(notation); try { notationRes.save(null); } catch (Exception exception) { exception.printStackTrace(); MessageDialog dialog = new MessageDialog(getShell(), "Error", null, "Error when creating initial Notation model", MessageDialog.ERROR, new String[] {"OK"}, 0); dialog.open(); progressMonitor.done(); return; } progressMonitor.worked(6); progressMonitor.done(); } }; try { getContainer().run(false, false, operation); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return true; } protected Definition createInitiaNotationModel() { Definition definition = NotationFactory.eINSTANCE.createDefinition(); return definition; } protected EPackage createInitiaEcorePackage(String mainName) { EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage(); ePackage.setName(mainName); ePackage.setNsURI("http://" + mainName); ePackage.setNsPrefix(mainName); return ePackage; } protected History createInitialHistoryModel() { History history = HistoryFactory.eINSTANCE.createHistory(); VersionHistory versionHistory = HistoryFactory.eINSTANCE.createVersionHistory(); versionHistory.setType(VersionHistoryType.TRUNK); history.getHistories().add(versionHistory); Version version = HistoryFactory.eINSTANCE.createVersion(); version.setId("0.1"); versionHistory.getVersions().add(version); return history; } }