blob: f9a6f23fb79a638ff88df8b94ca323c27577d09e [file] [log] [blame]
package org.eclipse.gmf.codegen.gwt.ui.actions
import com.google.inject.Guice
import com.google.inject.Injector
import com.google.inject.Module
import java.io.IOException
import org.eclipse.core.commands.AbstractHandler
import org.eclipse.core.commands.ExecutionEvent
import org.eclipse.core.commands.ExecutionException
import org.eclipse.core.commands.IHandler
import org.eclipse.core.resources.IFile
import org.eclipse.core.resources.ResourcesPlugin
import org.eclipse.core.runtime.IProgressMonitor
import org.eclipse.core.runtime.IStatus
import org.eclipse.core.runtime.jobs.Job
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator
import org.eclipse.gmf.codegen.gwt.ui.Activator
import org.eclipse.gmf.codegen.gwt.ui.GeneratorUiModule
import org.eclipse.jface.viewers.IStructuredSelection
import org.eclipse.ui.handlers.HandlerUtil
abstract class AbstractGeneratorHandler extends AbstractHandler implements IHandler {
override execute(ExecutionEvent event) throws ExecutionException {
switch selection: HandlerUtil.getCurrentSelection(event) {
IStructuredSelection: switch selected: selection.firstElement {
IFile: selected.generateFromFile
}
}
}
protected def getInjector(GenEditorGenerator editor) {
var Injector injector = null
val root = ResourcesPlugin.workspace.root
val mainProject = root.getProject(editor.domainGenModel.modelPluginID)
val buildProject = root.getProject(editor.plugin.ID + ".gwt.build")
if (buildProject.exists && buildProject.open) {
try {
var mainBundle = Activator.^default.context.installBundle(
mainProject.location.toFile().toURI().toURL().toExternalForm()
)
val bundle = Activator.^default.context.installBundle(
buildProject.location.toFile().toURI().toURL().toExternalForm()
)
val templModule = bundle.loadClass(editor.plugin.ID + "." + editor.modelID + "TemplateModule")
if (templModule != null) {
val inst = templModule.newInstance
injector = Guice.createInjector(inst as Module, new GeneratorUiModule)
}
bundle.uninstall
mainBundle.uninstall
} catch (Exception e) {
e.printStackTrace
}
}
if (injector == null) {
injector = Activator.^default.injector
}
injector
}
protected def generateFromFile(IFile selected) {
val uri = URI.createPlatformResourceURI(selected.getFullPath().toString(), false)
val resource = new ResourceSetImpl().createResource(uri)
try {
resource.load(null)
} catch (IOException e) {
e.printStackTrace
}
val GeneratrJob job = [IProgressMonitor m |
doGenerate(resource, m)
]
job.setUser(true)
job.schedule
null
}
protected abstract def IStatus doGenerate(Resource resource, IProgressMonitor m)
}
abstract class GeneratrJob extends Job {
new() {
super("Generate GEF-GWT")
}
}