blob: d76c883fd7dd711dd5b5183fa68a9551752278bf [file] [log] [blame]
/*
* Copyright (c) 2011, 2012, 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:
* Martin Fluegge - initial API and implementation
*/
package org.eclipse.emf.cdo.dawn.ecoretools.diagram.part;
import org.eclipse.emf.cdo.dawn.preferences.PreferenceConstants;
import org.eclipse.emf.cdo.dawn.ui.wizards.dialogs.CDOResourceNodeSelectionDialog;
import org.eclipse.emf.cdo.view.CDOView;
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.ecoretools.diagram.part.EcoreCreationWizardPage;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import java.lang.reflect.Field;
/**
* @author Martin Fluegge
*/
public class DawnEcoreCreationWizardPage extends EcoreCreationWizardPage
{
private final CDOView view;
private URI semanticModelURI;
public DawnEcoreCreationWizardPage(String pageName, IStructuredSelection selection, CDOView view)
{
super(pageName, selection);
this.view = view;
}
@Override
public void createControl(Composite parent)
{
super.createControl(parent);
final Text nameFd = (Text)getField("nameFd");
// nameFd.setEnabled(false);
nameFd.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
Text directoryFd = (Text)getField("directoryFd");
semanticModelURI = URI.createURI(directoryFd.getText() + nameFd.getText());
setPageComplete(validatePage());
}
});
URI domainModelURI = getDomainModelURI();
setModelURI(domainModelURI);
}
@Override
protected void handleDirectoryChoose()
{
CDOResourceNodeSelectionDialog dialog = new CDOResourceNodeSelectionDialog(getShell(), view);
if (dialog.open() == Window.OK)
{
semanticModelURI = dialog.getResults();
if (semanticModelURI != null)
{
setModelURI(semanticModelURI);
loadModelFile();
}
}
}
private void setModelURI(URI semanticModelURI)
{
Text directoryFd = (Text)getField("directoryFd");
directoryFd.setText(semanticModelURI.toString().replace(semanticModelURI.lastSegment(), ""));
Text nameFd = (Text)getField("nameFd");
nameFd.setText(semanticModelURI.lastSegment());
}
@Override
protected void handleModelChoose()
{
CDOResourceNodeSelectionDialog dialog = new CDOResourceNodeSelectionDialog(getShell(), view, true);
if (dialog.open() == Window.OK)
{
semanticModelURI = dialog.getResults();
if (semanticModelURI != null)
{
Text modelFd = (Text)getField("modelFd");
modelFd.setText(semanticModelURI.toString());
loadModelFile();
}
}
}
@Override
protected boolean loadModelFile()
{
if (semanticModelURI == null)
{
return false;
}
Resource resource = getResourceSet().getResource(semanticModelURI, true);
if (resource != null)
{
ComposedAdapterFactory adapterFactory = getAdapterFactory();
TreeViewer viewer = (TreeViewer)getField("viewer");
// Set the tree providers of the domain file contents
AdapterFactoryContentProvider adapterContentProvider = new AdapterFactoryContentProvider(adapterFactory);
adapterContentProvider.inputChanged(viewer, null, null);
viewer.setContentProvider(new WizardContentProvider(adapterContentProvider));
viewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
viewer.setInput(resource.getContents());
viewer.refresh();
viewer.setSelection(new StructuredSelection(resource.getContents()), true);
return true;
}
return false;
}
@Override
protected ResourceSet getResourceSet()
{
return view.getResourceSet();
}
private Object getField(String name)
{
final Field fields[] = this.getClass().getSuperclass().getDeclaredFields();
for (int i = 0; i < fields.length; ++i)
{
if (name.equals(fields[i].getName()))
{
try
{
fields[i].setAccessible(true);
return fields[i].get(this);
}
catch (IllegalAccessException ex)
{
throw new RuntimeException("IllegalAccessException accessing " + name);
}
}
}
return null;
}
// TODO need to overwrite this
@Override
protected boolean validatePage()
{
// erase all previous messages
setMessage(null);
setErrorMessage(null);
if (view.hasResource(getDomainModelURI().path()))
{
setErrorMessage("Resource already exists");
return false;
}
// if (isNewModel())
// {
// return validateNewModelGroup();
// }
// else
// {
// return validateExistingModel();
// }
return true;
}
@Override
public URI getDomainModelURI()
{
if (semanticModelURI == null)
{
String authority = PreferenceConstants.getRepositoryName();
semanticModelURI = URI.createURI("cdo://" + authority + "/default.ecore");
int i = 2;
while (i < 30 && view.hasResource(semanticModelURI.path()))
{
semanticModelURI = URI.createURI("cdo://" + authority + "/" + "default" + i + ".ecore");
i++;
}
}
return semanticModelURI;
}
/**
* Return the diagram model URI
*
* @return URI
*/
@Override
public URI getDiagramModelURI()
{
return URI.createURI(semanticModelURI.toString() + "diag");
}
}