/*******************************************************************************
* 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.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.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.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.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 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.NotationPackage;
import fr.inria.atlanmod.collaboro.ui.Controller;
public class NewHistoryWizard extends Wizard implements INewWizard {
private static final String DEFAULT_FILENAME = "defaultHistoryFileName";
protected IStructuredSelection selection;
protected IWorkbench workbench;
protected HistoryNewFileCreationPage newFileCreationPage;
protected HistoryNewUsers newUsersPage;
public class HistoryNewFileCreationPage extends WizardNewFileCreationPage {
public HistoryNewFileCreationPage(String pageId, IStructuredSelection selection) {
super(pageId, selection);
}
@Override
protected boolean validatePage() {
if (super.validatePage()) {
String extension = new Path(getFileName()).getFileExtension();
if (extension == null || !Controller.HISTORY_EXTENSION.equals(extension)) {
setErrorMessage("Extension must be '" + Controller.HISTORY_EXTENSION + "'");
return false;
}
return true;
}
return false;
}
public IFile getModelFile() {
return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));
}
}
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() {
newFileCreationPage = new HistoryNewFileCreationPage("Creating history model", selection);
newFileCreationPage.setTitle("Collaboro Model");
newFileCreationPage.setDescription("Create a new Collaboro Model");
newFileCreationPage.setFileName("history" + "." + Controller.HISTORY_EXTENSION);
addPage(newFileCreationPage);
if (selection != null && !selection.isEmpty()) {
Object selectedElement = selection.iterator().next();
if (selectedElement instanceof IResource) {
String defaultFileName = DEFAULT_FILENAME;
// Get the resource parent, if its a file.
IResource selectedResource = (IResource) selectedElement;
if (selectedResource.getType() == IResource.FILE) {
defaultFileName = selectedResource.getName().substring(0, selectedResource.getName().lastIndexOf("."));
selectedResource = selectedResource.getParent();
}
if (selectedResource instanceof IFolder || selectedResource instanceof IProject) {
// Set this for the container.
newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());
// Make up a unique new name here.
String defaultModelBaseFilename = defaultFileName;
String defaultModelFilenameExtension = Controller.HISTORY_EXTENSION;
String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;
System.out.println("-----> " + modelFilename);
newFileCreationPage.setFileName(modelFilename);
}
}
}
newUsersPage = new HistoryNewUsers("Adding users");
newUsersPage.setTitle("Community Users");
newUsersPage.setDescription("Add new users to the community");
addPage(newUsersPage);
}
public NewHistoryWizard() {
// TODO Auto-generated constructor stub
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.workbench = workbench;
this.selection = selection;
}
@Override
public boolean performFinish() {
final IFile file = newFileCreationPage.getModelFile();
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor progressMonitor) {
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());
URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
Resource res = rset.createResource(fileURI);
History historyModel = createInitialHistoryModel();
res.getContents().add(historyModel);
List<User> users = newUsersPage.getUsers();
if(users != null)
historyModel.getUsers().addAll(users);
try {
res.save(null);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
progressMonitor.done();
}
}
};
try {
getContainer().run(false, false, operation);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
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;
}
}