/**
* Copyright (c) 2012 Eclipse contributors 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
*/
package org.eclipse.emf.ecore.xcore.ui.handler;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.emf.ecore.xcore.formatting.XcoreImportOrganizer;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Region;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
import org.eclipse.xtext.ui.editor.utils.EditorUtils;
import org.eclipse.xtext.util.Pair;
import org.eclipse.xtext.util.TextRegion;
import org.eclipse.xtext.util.Tuples;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
import com.google.inject.Inject;
public class XcoreOrganizeImportsHandler extends AbstractHandler
{
@Inject
private XcoreImportOrganizer xcoreImportOrganizer;
public Object execute(ExecutionEvent event) throws ExecutionException
{
XtextEditor editor = EditorUtils.getActiveXtextEditor(event);
if (editor != null)
{
IXtextDocument document = editor.getDocument();
doOrganizeImports(document);
}
return null;
}
public void doOrganizeImports(final IXtextDocument document)
{
Pair<Region, String> result =
document.readOnly
(new IUnitOfWork<Pair<Region, String>, XtextResource>()
{
public Pair<Region, String> exec(XtextResource xtextResource) throws Exception
{
TextRegion importRegion = xcoreImportOrganizer.getImportRegion(xtextResource);
if (importRegion != null)
{
final String organizedImportSection = xcoreImportOrganizer.getOrganizedImportSection(xtextResource);
if (organizedImportSection != null)
{
return Tuples.create(new Region(importRegion.getOffset(), importRegion.getLength()), organizedImportSection);
}
}
return null;
}
});
if (result != null)
{
try
{
Region region = result.getFirst();
String importSection = result.getSecond();
int offset = region.getOffset();
int length = region.getLength();
String string = document.get(offset, length);
if (!string.equals(importSection))
{
document.replace(offset, length, importSection);
}
}
catch (BadLocationException e)
{
// Ignore.
}
}
}
}