package com.robotoworks.mechanoid.db.ui.wizards;
import java.util.Collections;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
import org.eclipse.ui.IEditorPart;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.robotoworks.mechanoid.db.services.SqliteModelGrammarAccess;
import com.robotoworks.mechanoid.db.sqliteModel.DatabaseBlock;
import com.robotoworks.mechanoid.db.sqliteModel.MigrationBlock;
import com.robotoworks.mechanoid.db.sqliteModel.Model;
import com.robotoworks.mechanoid.db.sqliteModel.SqliteModelFactory;
import com.robotoworks.mechanoid.db.sqliteModel.SqliteModelPackage;
import com.robotoworks.mechanoid.db.ui.Messages;
import com.robotoworks.mechanoid.db.ui.internal.SqliteModelActivator;
import com.robotoworks.mechanoid.ui.wizard.NewMechanoidElementPage;
import com.robotoworks.mechanoid.ui.wizard.NewMechanoidElementWizard;
public class NewMechanoidDBFileWizard extends NewMechanoidElementWizard {
private static final String MECHDB_FILE_EXTENSION = "mechdb"; //$NON-NLS-1$
@Inject XtextResourceSet mResourceSet;
@Inject SqliteModelGrammarAccess mGrammarAccess;
private NewMechanoidElementPage mNewFilePage;
private String mSelectedPackageName;
private String mSelectedElementName;
public NewMechanoidDBFileWizard() {
Injector injector = SqliteModelActivator.getInstance().getInjector(SqliteModelActivator.COM_ROBOTOWORKS_MECHANOID_DB_SQLITEMODEL);
injector.injectMembers(this);
mNewFilePage = new NewMechanoidElementPage("new_file_page") { //$NON-NLS-1$
@Override
protected String getNameFieldInfoMessage() {
return Messages.NewMechanoidDBFileWizard_Widget_Label_Message_Name;
}
};
mNewFilePage.setTitle(Messages.NewMechanoidDBFileWizard_Title);
mNewFilePage.setDescription(Messages.NewMechanoidDBFileWizard_Message);
setNeedsProgressMonitor(true);
}
@Override
public void addPages() {
super.addPages();
addPage(mNewFilePage);
}
@Override
protected IPath createNewResourceFilePath() {
return mNewFilePage.getSelectedFolderPath()
.append(mNewFilePage.getSelectedElementName())
.addFileExtension(MECHDB_FILE_EXTENSION);
}
@Override
protected void onBeforeCreateElementResource() {
mSelectedPackageName = mNewFilePage.getSelectedPackageName();
mSelectedElementName = mNewFilePage.getSelectedElementName();
}
@Override
protected IResource createElementResource(IProgressMonitor monitor, IPath path) {
try {
if(monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask(Messages.NewMechanoidDBFileWizard_Progress_Message, 2);
URI newEmfResourceURI = URI.createURI("platform:/resource" + //$NON-NLS-1$
path
.toPortableString());
Resource emfResource = mResourceSet.createResource(newEmfResourceURI);
Model model = SqliteModelFactory.eINSTANCE.createModel();
model.setPackageName(mSelectedPackageName);
emfResource.getContents().add(model);
DatabaseBlock database = (DatabaseBlock) SqliteModelFactory.eINSTANCE.createDatabaseBlock();
database.setName(mSelectedElementName);
model.setDatabase(database);
MigrationBlock migration = (MigrationBlock) SqliteModelFactory.eINSTANCE.createMigrationBlock();
database.getMigrations().add(migration);
emfResource.save(Collections.EMPTY_MAP);
monitor.worked(1);
IResource resource = ResourcesPlugin.getWorkspace()
.getRoot().findMember(newEmfResourceURI.toPlatformString(true));
monitor.worked(2);
return resource;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onNewResourceEditorOpened(IEditorPart editor) {
final XtextEditor xeditor = (XtextEditor) editor;
final IXtextDocument document = xeditor.getDocument();
xeditor.getDocument().readOnly(new IUnitOfWork.Void<XtextResource>() {
@Override
public void process(XtextResource state) throws Exception {
Model model = (Model)state.getContents().get(0);
MigrationBlock migrationBlock = model.getDatabase().getMigrations().get(0);
ILeafNode node = findFirstLeafNodeForKeyword(migrationBlock, "{"); //$NON-NLS-1$
int position = node.getOffset() + 1;
document.replace(position, 0, "\n\t\t"); //$NON-NLS-1$
xeditor.selectAndReveal(position + 3, 0);
}
});
}
public ILeafNode findFirstLeafNodeForKeyword(EObject e, String keyword) {
ICompositeNode node = NodeModelUtils.getNode(e);
for(ILeafNode leaf : node.getLeafNodes()) {
if(leaf.getGrammarElement() instanceof Keyword) {
Keyword k = (Keyword) leaf.getGrammarElement();
if(k.getValue().equals(keyword)) {
return leaf;
}
}
}
return null;
}
}