|
|
|
|
|
|
|
|
|
|
Re: Web editing of DSLs [message #1733021 is a reply to message #1732967] |
Mon, 23 May 2016 14:56   |
Eclipse User |
|
|
|
Hi,
i still cannot follow you
(1) create a new xtext web example with this grammar
Model:
greetings+=Greeting*;
Greeting:
'Hello' name=ID ('from' from=[Greeting])? '!';
Take the impl and bindings from the statmachine example
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="en-us">
<title>Example Web Editor</title>
<link rel="stylesheet" type="text/css" href="xtext/2.9.2/xtext-ace.css"/>
<link rel="stylesheet" type="text/css" href="style.css"/>
<script src="webjars/requirejs/2.1.20/require.min.js"></script>
<script type="text/javascript">
var baseUrl = window.location.pathname;
var fileIndex = baseUrl.indexOf("index.html");
if (fileIndex > 0)
baseUrl = baseUrl.slice(0, fileIndex);
require.config({
baseUrl: baseUrl,
paths: {
"jquery": "webjars/jquery/2.1.4/jquery.min",
"ace/ext/language_tools": "webjars/ace/1.2.0/src/ext-language_tools",
"xtext/xtext-ace": "xtext/2.9.2/xtext-ace"
}
});
require(["webjars/ace/1.2.0/src/ace"], function() {
require(["xtext/xtext-ace"], function(xtext) {
var editors = xtext.createEditor({
position: "absolute",
syntaxDefinition: "xtext-resources/generated/mode-mydsl"
});
var leftServices = editors[0].xtextServices;
var rightServices = editors[1].xtextServices;
leftServices.editorContext.addServerStateListener(function(params) {
if (!params.forceUpdate)
rightServices.update({forceUpdate: true});
});
rightServices.editorContext.addServerStateListener(function(params) {
if (!params.forceUpdate)
leftServices.update({forceUpdate: true});
});
});
});
</script>
</head>
<body>
<div class="container-left">
<div class="xtext-editor"
data-editor-resource-id="multi-resource/left.mydsl">
</div>
</div>
<div class="container-right">
<div class="xtext-editor"
data-editor-resource-id="multi-resource/right.mydsl">
</div>
</div>
</body>
</html>
body {
font: 16px Helvetica,sans-serif;
}
iframe {
width: 100%;
height: 100%;
border: 1px solid #aaa;
background-color: #f0f0f0;
}
a {
color: #22a;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
h1 {
color: #555;
font-style: italic;
}
h2 {
color: #555;
padding-left: 15px;
border-bottom: 1px solid #aab;
}
h3 {
font-size: 16px;
}
.text-container {
width: 800px;
margin: 40px;
}
.container {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 640px;
margin: 20px;
}
.container-left {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 450px;
margin: 20px;
}
.container-right {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 480px;
width: 450px;
margin: 20px;
}
.xtext-editor {
display: block;
position: absolute;
top: 0;
bottom: 30px;
left: 0;
right: 0;
padding: 4px;
border: 1px solid #aaa;
}
#xtext-editor {
display: block;
position: absolute;
top: 0;
bottom: 30px;
left: 0;
right: 0;
border: 1px solid #aaa;
}
.status-wrapper {
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 20px;
margin-top: 10px;
}
.button-wrapper {
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 640px;
margin: 20px;
}
#generator-result {
display: block;
position: absolute;
top: 20px;
bottom: 50px;
left: 680px;
right: 20px;
}
#dirty-indicator {
display: inline;
color: #e8e8e8;
padding: 1px 8px 1px 8px;
border: 1px solid #ccc;
margin-left: 10px;
}
#dirty-indicator.dirty {
background-color: #88e;
}
#status {
display: inline;
}
.output-icon {
background-image: url("images/output.gif");
background-repeat: no-repeat;
}
.InputSignal {
font-style: italic;
color: #2222ff
}
.OutputSignal {
font-style: italic;
color: #11aa11
}
class MyDslResourceSetProvider implements IWebResourceSetProvider {
static val MULTI_RESOURCE_PREFIX = 'multi-resource'
@Inject Provider<ResourceSet> provider
override get(String resourceId, IServiceContext serviceContext) {
if (resourceId !== null && resourceId.startsWith(MULTI_RESOURCE_PREFIX)) {
val pathEnd = Math.max(resourceId.indexOf('/'), MULTI_RESOURCE_PREFIX.length)
return serviceContext.session.get(ResourceSet -> resourceId.substring(0, pathEnd), [provider.get])
} else
return provider.get
}
}
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.web
import com.google.inject.Provider
import java.util.List
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import javax.servlet.annotation.WebServlet
import org.eclipse.xtext.web.server.persistence.ResourceBaseProviderImpl
import org.eclipse.xtext.web.servlet.XtextServlet
/**
* Deploy this class into a servlet container to enable DSL-specific services.
*/
@WebServlet(name = 'XtextServices', urlPatterns = '/xtext-service/*')
class MyDslServlet extends XtextServlet {
val List<ExecutorService> executorServices = newArrayList
override init() {
super.init()
val resourceBaseProvider = new ResourceBaseProviderImpl('./test-files')
val Provider<ExecutorService> executorServiceProvider = [Executors.newCachedThreadPool => [executorServices += it]]
new MyDslWebSetup(executorServiceProvider, resourceBaseProvider).createInjectorAndDoEMFRegistration()
}
override destroy() {
executorServices.forEach[shutdown()]
executorServices.clear()
super.destroy()
}
}
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.web
import com.google.inject.Binder
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.web.server.model.IWebResourceSetProvider
import org.eclipse.xtext.web.server.persistence.FileResourceHandler
import org.eclipse.xtext.web.server.persistence.IResourceBaseProvider
import org.eclipse.xtext.web.server.persistence.IServerResourceHandler
/**
* Use this class to register additional components to be used within the web application.
*/
@FinalFieldsConstructor
class MyDslWebModule extends AbstractMyDslWebModule {
val IResourceBaseProvider resourceBaseProvider
def Class<? extends IWebResourceSetProvider> bindIWebResourceSetProvider() {
return MyDslResourceSetProvider
}
def void configureResourceBaseProvider(Binder binder) {
if (resourceBaseProvider !== null) binder.bind(IResourceBaseProvider).toInstance(resourceBaseProvider)
}
def Class<? extends IServerResourceHandler> bindIServerResourceHandler() {
return FileResourceHandler
}
}
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.web
import com.google.inject.Guice
import com.google.inject.Injector
import com.google.inject.Provider
import com.google.inject.util.Modules
import java.util.concurrent.ExecutorService
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.web.server.persistence.IResourceBaseProvider
import org.xtext.example.mydsl.MyDslRuntimeModule
import org.xtext.example.mydsl.MyDslStandaloneSetup
/**
* Initialization support for running Xtext languages in web applications.
*/
@FinalFieldsConstructor
class MyDslWebSetup extends MyDslStandaloneSetup {
val Provider<ExecutorService> executorServiceProvider
val IResourceBaseProvider resourceBaseProvider
override Injector createInjector() {
val runtimeModule = new MyDslRuntimeModule()
val webModule = new MyDslWebModule(executorServiceProvider, resourceBaseProvider)
return Guice.createInjector(Modules.override(runtimeModule).with(webModule))
}
}
|
|
|
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.06119 seconds