blob: b3691d5fe8dd0a98c92de19cee6e9ca1c3c3da9e [file] [log] [blame]
/*
* Copyright (c) 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.explorer.ui.checkouts.wizards;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.eresource.CDOResourceFolder;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutContentProvider;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
/**
* @author Eike Stepper
*/
public abstract class NewWizard extends Wizard implements INewWizard
{
private final String resourceType;
private final String title;
private IStructuredSelection selection;
private CDOCheckoutContentProvider contentProvider;
private NewWizardPage page;
protected NewWizard(String resourceType, String title)
{
this.resourceType = resourceType;
this.title = title;
}
public void init(IWorkbench workbench, IStructuredSelection selection)
{
this.selection = selection;
}
public void setContentProvider(CDOCheckoutContentProvider contentProvider)
{
this.contentProvider = contentProvider;
}
public final String getResourceType()
{
return resourceType;
}
public final String getTitle()
{
return title;
}
@Override
public void addPages()
{
page = new NewWizardPage(resourceType, title, selection);
addPage(page);
}
@Override
public boolean performFinish()
{
final Object parent = page.getParent();
final String name = page.getName();
new Job(title)
{
@Override
protected IStatus run(IProgressMonitor monitor)
{
CDOResourceNode newResourceNode = createNewResourceNode();
newResourceNode.setName(name);
CDOCheckout checkout;
CDOResourceNode parentResourceNode;
if (parent instanceof CDOCheckout)
{
checkout = (CDOCheckout)parent;
parentResourceNode = (CDOResourceNode)checkout.getRootObject();
}
else
{
parentResourceNode = (CDOResourceNode)parent;
checkout = CDOExplorerUtil.getCheckout(parentResourceNode);
}
CDOTransaction transaction = checkout.openTransaction();
CDOCommitInfo commitInfo = null;
CDOID newID = null;
try
{
CDOResourceNode txParent = transaction.getObject(parentResourceNode);
if (txParent instanceof CDOResourceFolder)
{
((CDOResourceFolder)txParent).getNodes().add(newResourceNode);
}
else
{
transaction.getRootResource().getContents().add(newResourceNode);
}
commitInfo = transaction.commit();
newID = newResourceNode.cdoID();
}
catch (Exception ex)
{
OM.LOG.error(ex);
final IStatus status = new Status(IStatus.ERROR, OM.BUNDLE_ID, ex.getMessage(), ex);
UIUtil.getDisplay().asyncExec(new Runnable()
{
public void run()
{
ErrorDialog.openError(getShell(), "Error",
"An error occured while creating the " + title.toLowerCase() + ".", status);
}
});
return Status.OK_STATUS;
}
finally
{
transaction.close();
}
if (commitInfo != null && contentProvider != null)
{
CDOView view = checkout.getView();
view.waitForUpdate(commitInfo.getTimeStamp());
CDOObject newObject = view.getObject(newID);
contentProvider.selectObjects(newObject);
}
return Status.OK_STATUS;
}
}.schedule();
return true;
}
protected abstract CDOResourceNode createNewResourceNode();
}